diff options
637 files changed, 95321 insertions, 40561 deletions
diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..d2e2f2940 --- /dev/null +++ b/.clang-format @@ -0,0 +1,28 @@ +BasedOnStyle: LLVM +IndentWidth: 8 +UseTab: Always +BreakBeforeBraces: Custom +Standard: Cpp03 +BraceWrapping: + AfterClass: true + AfterControlStatement: false + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterStruct: true + AfterUnion: true + BeforeCatch: false + BeforeElse: false +AllowShortIfStatementsOnASingleLine: false +IndentCaseLabels: false +AccessModifierOffset: -8 +ColumnLimit: 90 +AllowShortFunctionsOnASingleLine: Inline +SortIncludes: false +IncludeCategories: + - Regex: '^".*' + Priority: 2 + - Regex: '^<.*' + Priority: 1 +AlignAfterOpenBracket: DontAlign +ContinuationIndentWidth: 16 diff --git a/.gitignore b/.gitignore index d7e0daab4..7b5ecab67 100644 --- a/.gitignore +++ b/.gitignore @@ -22,9 +22,12 @@ tags !tags/ gtags.files .idea/* +# Codelite +*.project ## Files related to minetest development cycle /*.patch +*.diff # GNU Patch reject file *.rej @@ -43,11 +46,17 @@ gtags.files !/mods/minetest/mods_here.txt /worlds /world/ +/clientmods/* +!/clientmods/preview/ +/client/mod_storage/ ## Configuration/log files minetest.conf debug.txt +## Other files generated by minetest +screenshot_*.png + ## Doxygen files doc/Doxyfile doc/html/ @@ -74,16 +83,19 @@ locale/ *.a *.ninja .ninja* +*.gch +cmake-build-debug/ +cmake-build-release/ ## Android build files build/android/src/main/assets build/android/build build/android/deps build/android/libs +build/android/jni/lib build/android/jni/src build/android/src/main/jniLibs build/android/obj build/android/local.properties build/android/.gradle timestamp - diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..ef3b371a4 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,223 @@ +--- +# Github repository is cloned every day on Gitlab.com +# https://gitlab.com/minetest/minetest +# Pipelines URL: https://gitlab.com/minetest/minetest/pipelines + +stages: + - build + - package + - deploy + +variables: + MINETEST_GAME_REPO: "https://github.com/minetest/minetest_game.git" + +.build_template: &build_definition + stage: build + script: + - mkdir cmakebuild + - mkdir -p artifact/minetest/usr/ + - cd cmakebuild + - cmake -DCMAKE_INSTALL_PREFIX=../artifact/minetest/usr/ -DCMAKE_BUILD_TYPE=Release -DRUN_IN_PLACE=FALSE -DENABLE_GETTEXT=TRUE -DBUILD_SERVER=TRUE .. + - make -j2 + - make install + artifacts: + when: on_success + expire_in: 1h + paths: + - artifact/* + +.debpkg_template: &debpkg_template + stage: package + before_script: + - apt-get update -y + - apt-get install -y git + - mkdir -p build/deb/minetest/DEBIAN/ + - cp misc/debpkg-control build/deb/minetest/DEBIAN/control + - cp -Rp artifact/minetest/usr build/deb/minetest/ + script: + - git clone $MINETEST_GAME_REPO build/deb/minetest/usr/share/minetest/games/minetest + - rm -Rf build/deb/minetest/usr/share/minetest/games/minetest/.git + - sed -i 's/DATEPLACEHOLDER/'$(date +%y.%m.%d)'/g' build/deb/minetest/DEBIAN/control + - sed -i 's/LEVELDB_PLACEHOLDER/'$LEVELDB_PKG'/g' build/deb/minetest/DEBIAN/control + - cd build/deb/ && dpkg-deb -b minetest/ + artifacts: + when: on_success + expire_in: 30 day + paths: + - build/deb/*.deb + +.debpkg_install: &debpkg_install + stage: deploy + before_script: + - apt-get update -y + - apt-get install -y libc6 libcurl3-gnutls libfreetype6 libirrlicht1.8 $LEVELDB_PKG liblua5.1-0 libluajit-5.1-2 libopenal1 libstdc++6 libvorbisfile3 libx11-6 zlib1g + script: + - dpkg -i build/deb/*.deb + +## +## Debian +## + +# Jessie + +build:debian-8: + <<: *build_definition + image: debian:8 + before_script: + - apt-get update -y + - apt-get -y install build-essential libirrlicht-dev cmake libbz2-dev libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev + +package:debian-8: + image: debian:8 + dependencies: + - build:debian-8 + variables: + LEVELDB_PKG: libleveldb1 + <<: *debpkg_template + +deploy:debian-8: + image: debian:8 + dependencies: + - package:debian-8 + variables: + LEVELDB_PKG: libleveldb1 + <<: *debpkg_install + +# Stretch + +build:debian-9: + <<: *build_definition + image: debian:9 + before_script: + - apt-get update -y + - apt-get -y install build-essential libirrlicht-dev cmake libbz2-dev libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev + +package:debian-9: + image: debian:9 + dependencies: + - build:debian-9 + variables: + LEVELDB_PKG: libleveldb1v5 + <<: *debpkg_template + +deploy:debian-9: + image: debian:9 + dependencies: + - package:debian-9 + variables: + LEVELDB_PKG: libleveldb1v5 + <<: *debpkg_install + +## +## Ubuntu +## + +# Trusty + +build:ubuntu-14.04: + <<: *build_definition + image: ubuntu:trusty + before_script: + - apt-get update -y + - apt-get -y install build-essential libirrlicht-dev cmake libbz2-dev libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev + +package:ubuntu-14.04: + image: ubuntu:trusty + dependencies: + - build:ubuntu-14.04 + variables: + LEVELDB_PKG: libleveldb1 + <<: *debpkg_template + +deploy:ubuntu-14.04: + image: ubuntu:trusty + dependencies: + - package:ubuntu-14.04 + variables: + LEVELDB_PKG: libleveldb1 + <<: *debpkg_install + +# Xenial + +build:ubuntu-16.04: + <<: *build_definition + image: ubuntu:xenial + before_script: + - apt-get update -y + - apt-get -y install build-essential libirrlicht-dev cmake libbz2-dev libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev + +package:ubuntu-16.04: + image: ubuntu:xenial + dependencies: + - build:ubuntu-16.04 + variables: + LEVELDB_PKG: libleveldb1v5 + <<: *debpkg_template + +deploy:ubuntu-16.04: + image: ubuntu:xenial + dependencies: + - package:ubuntu-16.04 + variables: + LEVELDB_PKG: libleveldb1v5 + <<: *debpkg_install + +# Yakkety + +build:ubuntu-16.10: + <<: *build_definition + image: ubuntu:yakkety + before_script: + - apt-get update -y + - apt-get -y install build-essential libirrlicht-dev cmake libbz2-dev libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev + +package:ubuntu-16.10: + image: ubuntu:yakkety + dependencies: + - build:ubuntu-16.10 + variables: + LEVELDB_PKG: libleveldb1v5 + <<: *debpkg_template + +deploy:ubuntu-16.10: + image: ubuntu:yakkety + dependencies: + - package:ubuntu-16.10 + variables: + LEVELDB_PKG: libleveldb1v5 + <<: *debpkg_install + +# Zesty + +build:ubuntu-17.04: + <<: *build_definition + image: ubuntu:zesty + before_script: + - apt-get update -y + - apt-get -y install build-essential libirrlicht-dev cmake libbz2-dev libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev + +package:ubuntu-17.04: + image: ubuntu:zesty + dependencies: + - build:ubuntu-17.04 + variables: + LEVELDB_PKG: libleveldb1v5 + <<: *debpkg_template + +deploy:ubuntu-17.04: + image: ubuntu:zesty + dependencies: + - package:ubuntu-17.04 + variables: + LEVELDB_PKG: libleveldb1v5 + <<: *debpkg_install + +## +## Fedora +## + +build:fedora-24: + <<: *build_definition + image: fedora:24 + before_script: + - dnf -y install make automake gcc gcc-c++ kernel-devel cmake libcurl* openal* libvorbis* libXxf86vm-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel irrlicht-devel bzip2-libs gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel doxygen spatialindex-devel bzip2-devel diff --git a/.travis.yml b/.travis.yml index 534479efb..57d934c90 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,6 +22,14 @@ matrix: - env: PLATFORM=Unix COMPILER=clang compiler: clang os: linux + - env: PLATFORM=Unix COMPILER=clang VALGRIND=1 + compiler: clang + os: linux + dist: trusty + - env: COMPILER=none LINT=1 + compiler: clang + os: linux + dist: trusty - env: PLATFORM=Unix COMPILER=g++-6 compiler: gcc os: linux diff --git a/CMakeLists.txt b/CMakeLists.txt index 11ebe94a1..1a0dcb688 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ set(PROJECT_NAME_CAPITALIZED "Minetest") # Also remember to set PROTOCOL_VERSION in network/networkprotocol.h when releasing set(VERSION_MAJOR 0) set(VERSION_MINOR 4) -set(VERSION_PATCH 15) +set(VERSION_PATCH 16) set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string") # Change to false for releases @@ -26,6 +26,11 @@ elseif(DEVELOPMENT_BUILD) set(VERSION_STRING "${VERSION_STRING}-dev") endif() +if (CMAKE_BUILD_TYPE STREQUAL Debug) + # Append "-debug" to version string + set(VERSION_STRING "${VERSION_STRING}-debug") +endif() + message(STATUS "*** Will build version ${VERSION_STRING} ***") @@ -49,7 +54,6 @@ if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type: Debug or Release" FORCE) endif() - # Included stuff set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") @@ -82,7 +86,7 @@ elseif(UNIX) # Linux, BSD etc set(EXAMPLE_CONF_DIR ".") set(MANDIR "unix/man") set(XDG_APPS_DIR "unix/applications") - set(APPDATADIR "unix/appdata") + set(APPDATADIR "unix/metainfo") set(ICONDIR "unix/icons") set(LOCALEDIR "locale") else() @@ -92,7 +96,7 @@ elseif(UNIX) # Linux, BSD etc set(MANDIR "${CMAKE_INSTALL_PREFIX}/share/man") set(EXAMPLE_CONF_DIR ${DOCDIR}) set(XDG_APPS_DIR "${CMAKE_INSTALL_PREFIX}/share/applications") - set(APPDATADIR "${CMAKE_INSTALL_PREFIX}/share/appdata") + set(APPDATADIR "${CMAKE_INSTALL_PREFIX}/share/metainfo") set(ICONDIR "${CMAKE_INSTALL_PREFIX}/share/icons") set(LOCALEDIR "${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}/locale") endif() @@ -152,6 +156,7 @@ endif() install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/builtin" DESTINATION "${SHAREDIR}") install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/client" DESTINATION "${SHAREDIR}") +install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/clientmods" DESTINATION "${SHAREDIR}") install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/games" DESTINATION "${SHAREDIR}" PATTERN ".git*" EXCLUDE) if(BUILD_CLIENT) @@ -173,8 +178,8 @@ install(FILES "minetest.conf.example" DESTINATION "${EXAMPLE_CONF_DIR}") if(UNIX AND NOT APPLE) install(FILES "doc/minetest.6" "doc/minetestserver.6" DESTINATION "${MANDIR}/man6") - install(FILES "misc/minetest.desktop" DESTINATION "${XDG_APPS_DIR}") - install(FILES "misc/minetest.appdata.xml" DESTINATION "${APPDATADIR}") + install(FILES "misc/net.minetest.minetest.desktop" DESTINATION "${XDG_APPS_DIR}") + install(FILES "misc/net.minetest.minetest.appdata.xml" DESTINATION "${APPDATADIR}") install(FILES "misc/minetest.svg" DESTINATION "${ICONDIR}/hicolor/scalable/apps") install(FILES "misc/minetest-xorg-icon-128.png" DESTINATION "${ICONDIR}/hicolor/128x128/apps" @@ -186,6 +191,10 @@ if(APPLE) install(FILES "misc/Info.plist" DESTINATION "${BUNDLE_PATH}/Contents") endif() +# Library pack +find_package(GMP REQUIRED) +find_package(Json REQUIRED) +find_package(Lua REQUIRED) # Subdirectories # Be sure to add all relevant definitions above this diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 986f60027..468ba0514 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,7 +25,6 @@ If you are planning to start some significant coding, you would benefit from ask - Have a title which begins with a capital letter - Be descriptive. (e.g. no `Update init.lua` or `Fix a problem`) - Have a first line with less than *80 characters* and have a second line that is *empty* - - Do **not** [sign your commits](https://git-scm.com/book/uz/v2/Git-Tools-Signing-Your-Work), as Minetest offers automatically built ppas over launchpad and it [would break](https://bugs.launchpad.net/bzr-git/+bug/1084403) if there were signed commits in master 4. Once you are happy with your changes, submit a pull request. - Open the [pull-request form](https://github.com/minetest/minetest/pull/new/master) diff --git a/README.txt b/README.txt index 5d4d15263..a627bde8d 100644 --- a/README.txt +++ b/README.txt @@ -3,7 +3,7 @@ Minetest An InfiniMiner/Minecraft inspired game. -Copyright (c) 2010-2013 Perttu Ahola <celeron55@gmail.com> +Copyright (c) 2010-2017 Perttu Ahola <celeron55@gmail.com> and contributors (see source file comments and the version control log) In case you downloaded the source code: @@ -43,7 +43,7 @@ Default controls - 0-9: Select item - Z: Zoom (needs zoom privilege) - T: Chat -- /: Commad +- /: Command - Esc: Pause menu/abort/exit (pauses only singleplayer game) - R: Enable/disable full range view @@ -85,7 +85,7 @@ $bin = /usr/bin $share = /usr/share/minetest $user = ~/.minetest -OS X: +macOS: $bin = Contents/MacOS $share = Contents/Resources $user = Contents/User OR ~/Library/Application Support/minetest @@ -101,7 +101,9 @@ Configuration file: $user/minetest.conf - It is created by Minetest when it is ran the first time. - A specific file can be specified on the command line: - --config <path-to-file> + --config <path-to-file> +- A run-in-place build will look for the configuration file in + $location_of_exe/../minetest.conf and also $location_of_exe/../../minetest.conf Command-line options: --------------------- @@ -117,7 +119,7 @@ For Fedora users: $ sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl* openal* libvorbis* libXxf86vm-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel irrlicht-devel bzip2-libs gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel doxygen spatialindex-devel bzip2-devel You can install git for easily keeping your copy up to date. -If you dont want git, read below on how to get the source without git. +If you don’t want git, read below on how to get the source without git. This is an example for installing git on Debian/Ubuntu: $ sudo apt-get install git @@ -178,7 +180,7 @@ ENABLE_FREETYPE - Build with FreeType2; Allows using TTF fonts ENABLE_GETTEXT - Build with Gettext; Allows using translations ENABLE_GLES - Search for Open GLES headers & libraries and use them ENABLE_LEVELDB - Build with LevelDB; Enables use of LevelDB map backend -ENABLE_POSTGRESQL - Build with libpq; Enables use of PostgreSQL map backend (PostgreSQL 9.5 or greater required) +ENABLE_POSTGRESQL - Build with libpq; Enables use of PostgreSQL map backend (PostgreSQL 9.5 or greater recommended) ENABLE_REDIS - Build with libhiredis; Enables use of Redis map backend ENABLE_SPATIAL - Build with LibSpatial; Speeds up AreaStores ENABLE_SOUND - Build with OpenAL, libogg & libvorbis; in-game Sounds @@ -212,7 +214,7 @@ IRRLICHT_LIBRARY - Path to libIrrlicht.a/libIrrlicht.so/libIrrlic LEVELDB_INCLUDE_DIR - Only when building with LevelDB; directory that contains db.h LEVELDB_LIBRARY - Only when building with LevelDB; path to libleveldb.a/libleveldb.so/libleveldb.dll.a LEVELDB_DLL - Only when building with LevelDB on Windows; path to libleveldb.dll -POSTGRESQL_INCLUDE_DIR - Only when building with PostgreSQL; directory that contains libpq-fe.h +PostgreSQL_INCLUDE_DIR - Only when building with PostgreSQL; directory that contains libpq-fe.h POSTGRESQL_LIBRARY - Only when building with PostgreSQL; path to libpq.a/libpq.so REDIS_INCLUDE_DIR - Only when building with Redis; directory that contains hiredis.h REDIS_LIBRARY - Only when building with Redis; path to libhiredis.a/libhiredis.so @@ -427,7 +429,7 @@ License of Minetest source code ------------------------------- Minetest -Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2010-2017 celeron55, Perttu Ahola <celeron55@gmail.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -502,7 +504,7 @@ Lua is licensed under the terms of the MIT license reproduced below. This means that Lua is free software and can be used for both academic and commercial purposes at absolutely no cost. -For details and rationale, see http://www.lua.org/license.html . +For details and rationale, see https://www.lua.org/license.html . Copyright (C) 1994-2008 Lua.org, PUC-Rio. @@ -527,25 +529,18 @@ THE SOFTWARE. Fonts --------------- -DejaVu Sans Mono: - - Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. - Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) - Bitstream Vera Fonts Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. -Arev Fonts Copyright: - - Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. - -Liberation Fonts Copyright: +Arimo - Apache License, version 2.0 + Digitized data copyright (c) 2010-2012 Google Corporation. - Copyright (c) 2007 Red Hat, Inc. All rights reserved. LIBERATION is a trademark of Red Hat, Inc. +Cousine - Apache License, version 2.0 + Digitized data copyright (c) 2010-2012 Google Corporation. -DroidSansFallback: +DroidSansFallBackFull: Copyright (C) 2008 The Android Open Source Project diff --git a/build/android/Makefile b/build/android/Makefile index 6e7a389c9..d9a82da4d 100644 --- a/build/android/Makefile +++ b/build/android/Makefile @@ -35,7 +35,7 @@ TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON) TARGET_ARCH = armv7 CROSS_PREFIX = arm-linux-androideabi- COMPILER_VERSION = 4.9 -HAVE_LEVELDB = 1 +HAVE_LEVELDB = 0 ################################################################################ # toolchain config for little endian mips @@ -59,7 +59,7 @@ HAVE_LEVELDB = 1 #CROSS_PREFIX = i686-linux-android- #TARGET_ARCH = x86 #COMPILER_VERSION = 4.9 -#HAVE_LEVELDB = 1 +#HAVE_LEVELDB = 0 ################################################################################ ASSETS_TIMESTAMP = deps/assets_timestamp @@ -84,14 +84,14 @@ OGG_TIMESTAMP = $(OGG_DIR)timestamp OGG_TIMESTAMP_INT = $(ANDR_ROOT)/deps/ogg_timestamp OGG_URL_GIT = https://github.com/vincentjames501/libvorbis-libogg-android -IRRLICHT_REVISION = 5122 +IRRLICHT_REVISION = 5145 IRRLICHT_DIR = $(ANDR_ROOT)/deps/irrlicht/ IRRLICHT_LIB = $(IRRLICHT_DIR)lib/Android/libIrrlicht.a IRRLICHT_TIMESTAMP = $(IRRLICHT_DIR)timestamp IRRLICHT_TIMESTAMP_INT = $(ANDR_ROOT)/deps/irrlicht_timestamp IRRLICHT_URL_SVN = https://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@$(IRRLICHT_REVISION) -OPENSSL_VERSION = 1.0.2j +OPENSSL_VERSION = 1.0.2k OPENSSL_BASEDIR = openssl-$(OPENSSL_VERSION) OPENSSL_DIR = $(ANDR_ROOT)/deps/$(OPENSSL_BASEDIR)/ OPENSSL_LIB = $(OPENSSL_DIR)/libssl.so.1.0.0 @@ -99,7 +99,7 @@ OPENSSL_TIMESTAMP = $(OPENSSL_DIR)timestamp OPENSSL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/openssl_timestamp OPENSSL_URL = https://www.openssl.org/source/openssl-$(OPENSSL_VERSION).tar.gz -CURL_VERSION = 7.52.0 +CURL_VERSION = 7.54.0 CURL_DIR = $(ANDR_ROOT)/deps/curl-$(CURL_VERSION) CURL_LIB = $(CURL_DIR)/lib/.libs/libcurl.a CURL_TIMESTAMP = $(CURL_DIR)/timestamp @@ -126,8 +126,8 @@ ICONV_TIMESTAMP = $(ICONV_DIR)timestamp ICONV_TIMESTAMP_INT = $(ANDR_ROOT)/deps/iconv_timestamp ICONV_URL_HTTP = https://ftp.gnu.org/pub/gnu/libiconv/libiconv-$(ICONV_VERSION).tar.gz -SQLITE3_FOLDER = sqlite-amalgamation-3150200 -SQLITE3_URL = https://www.sqlite.org/2016/$(SQLITE3_FOLDER).zip +SQLITE3_FOLDER = sqlite-amalgamation-3180000 +SQLITE3_URL = https://www.sqlite.org/2017/$(SQLITE3_FOLDER).zip ANDROID_SDK = $(shell grep '^sdk\.dir' local.properties | sed 's/^.*=[[:space:]]*//') ANDROID_NDK = $(shell grep '^ndk\.dir' local.properties | sed 's/^.*=[[:space:]]*//') @@ -352,7 +352,7 @@ leveldb_download : fi leveldb : $(LEVELDB_LIB) - +ifeq ($(HAVE_LEVELDB),1) $(LEVELDB_LIB): $(LEVELDB_TIMESTAMP) @REFRESH=0; \ if [ ! -e ${LEVELDB_TIMESTAMP_INT} ] ; then \ @@ -384,6 +384,7 @@ $(LEVELDB_LIB): $(LEVELDB_TIMESTAMP) else \ echo "nothing to be done for leveldb"; \ fi +endif clean_leveldb : $(RM) -rf deps/leveldb @@ -679,8 +680,7 @@ deps/${SQLITE3_FOLDER}/sqlite3.c : wget ${SQLITE3_URL}; \ unzip ${SQLITE3_FOLDER}.zip; \ ln -s ${SQLITE3_FOLDER} sqlite; \ - cd ${SQLITE3_FOLDER}; \ - patch sqlite3.c < ${ANDR_ROOT}/patches/sqlite3-readonly-fix.patch + cd ${SQLITE3_FOLDER}; clean_sqlite3: cd deps && $(RM) -rf ${SQLITE3_FOLDER} && $(RM) -f ${SQLITE3_FOLDER}.zip && \ @@ -781,7 +781,7 @@ apk: local.properties assets $(ICONV_LIB) $(IRRLICHT_LIB) $(CURL_LIB) $(GMP_LIB) fi; \ export VERSION_STR="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" && \ export BUILD_TYPE_C=$$(echo "$${BUILD_TYPE}" | sed 's/./\U&/') && \ - gradle assemble$$BUILD_TYPE_C && \ + ./gradlew assemble$$BUILD_TYPE_C && \ echo "APK stored at: build/outputs/apk/Minetest-$$BUILD_TYPE.apk" && \ echo "You can install it with \`make install_$$BUILD_TYPE\`" @@ -795,11 +795,14 @@ install_release: prep_srcdir : @if [ ! -e ${ANDR_ROOT}/jni/src ]; then \ - ln -s ${PROJ_ROOT}/src ${ANDR_ROOT}/jni/src; \ + ln -s ${PROJ_ROOT}/src ${ANDR_ROOT}/jni/src; \ + fi; \ + if [ ! -e ${ANDR_ROOT}/jni/lib ]; then \ + ln -s ${PROJ_ROOT}/lib ${ANDR_ROOT}/jni/lib; \ fi clean_apk : - gradle clean + ./gradlew clean clean_all : @$(MAKE) clean_apk; \ diff --git a/build/android/build.gradle b/build/android/build.gradle index 20c13e385..1263b2232 100644 --- a/build/android/build.gradle +++ b/build/android/build.gradle @@ -10,11 +10,11 @@ buildscript { apply plugin: "com.android.application" android { - compileSdkVersion 23 - buildToolsVersion "23.0.3" + compileSdkVersion 25 + buildToolsVersion "25.0.3" defaultConfig { - versionCode 16 + versionCode 17 versionName "${System.env.VERSION_STR}.${versionCode}" minSdkVersion 9 targetSdkVersion 9 @@ -46,4 +46,3 @@ android { } } } - diff --git a/build/android/gradle/wrapper/gradle-wrapper.jar b/build/android/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 000000000..8c0fb64a8 --- /dev/null +++ b/build/android/gradle/wrapper/gradle-wrapper.jar diff --git a/build/android/gradle/wrapper/gradle-wrapper.properties b/build/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..980438b75 --- /dev/null +++ b/build/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Aug 27 20:10:09 CEST 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/build/android/gradlew b/build/android/gradlew new file mode 100755 index 000000000..91a7e269e --- /dev/null +++ b/build/android/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/build/android/gradlew.bat b/build/android/gradlew.bat new file mode 100644 index 000000000..8a0b282aa --- /dev/null +++ b/build/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk index c2186efaf..7b741e04b 100644 --- a/build/android/jni/Android.mk +++ b/build/android/jni/Android.mk @@ -98,8 +98,8 @@ endif LOCAL_C_INCLUDES := \ jni/src \ jni/src/script \ - jni/src/lua/src \ - jni/src/jsoncpp \ + jni/lib/lua/src \ + jni/lib/jsoncpp \ jni/src/cguittfont \ deps/irrlicht/include \ deps/libiconv/include \ @@ -117,6 +117,7 @@ LOCAL_SRC_FILES := \ jni/src/cavegen.cpp \ jni/src/chat.cpp \ jni/src/client.cpp \ + jni/src/clientenvironment.cpp \ jni/src/clientiface.cpp \ jni/src/clientmap.cpp \ jni/src/clientmedia.cpp \ @@ -133,6 +134,7 @@ LOCAL_SRC_FILES := \ jni/src/convert_json.cpp \ jni/src/craftdef.cpp \ jni/src/database-dummy.cpp \ + jni/src/database-files.cpp \ jni/src/database-sqlite3.cpp \ jni/src/database.cpp \ jni/src/debug.cpp \ @@ -141,6 +143,7 @@ LOCAL_SRC_FILES := \ jni/src/dungeongen.cpp \ jni/src/emerge.cpp \ jni/src/environment.cpp \ + jni/src/face_position_cache.cpp \ jni/src/filecache.cpp \ jni/src/filesys.cpp \ jni/src/fontengine.cpp \ @@ -163,6 +166,7 @@ LOCAL_SRC_FILES := \ jni/src/inventory.cpp \ jni/src/inventorymanager.cpp \ jni/src/itemdef.cpp \ + jni/src/itemstackmetadata.cpp \ jni/src/keycode.cpp \ jni/src/light.cpp \ jni/src/localplayer.cpp \ @@ -183,6 +187,8 @@ LOCAL_SRC_FILES := \ jni/src/mapnode.cpp \ jni/src/mapsector.cpp \ jni/src/mesh.cpp \ + jni/src/mesh_generator_thread.cpp \ + jni/src/metadata.cpp \ jni/src/mg_biome.cpp \ jni/src/mg_decoration.cpp \ jni/src/mg_ore.cpp \ @@ -203,12 +209,14 @@ LOCAL_SRC_FILES := \ jni/src/porting.cpp \ jni/src/profiler.cpp \ jni/src/quicktune.cpp \ + jni/src/raycast.cpp \ jni/src/reflowscan.cpp \ jni/src/remoteplayer.cpp \ jni/src/rollback.cpp \ jni/src/rollback_interface.cpp \ jni/src/serialization.cpp \ jni/src/server.cpp \ + jni/src/serverenvironment.cpp \ jni/src/serverlist.cpp \ jni/src/serverobject.cpp \ jni/src/shader.cpp \ @@ -218,6 +226,7 @@ LOCAL_SRC_FILES := \ jni/src/sound_openal.cpp \ jni/src/staticobject.cpp \ jni/src/subgame.cpp \ + jni/src/tileanimation.cpp \ jni/src/tool.cpp \ jni/src/treegen.cpp \ jni/src/version.cpp \ @@ -261,6 +270,7 @@ LOCAL_SRC_FILES := \ jni/src/settings.cpp \ jni/src/wieldmesh.cpp \ jni/src/client/clientlauncher.cpp \ + jni/src/client/inputhandler.cpp \ jni/src/client/tile.cpp \ jni/src/client/joystick_controller.cpp \ jni/src/irrlicht_changes/static_text.cpp @@ -284,6 +294,7 @@ LOCAL_SRC_FILES += \ jni/src/script/common/c_types.cpp \ jni/src/script/cpp_api/s_async.cpp \ jni/src/script/cpp_api/s_base.cpp \ + jni/src/script/cpp_api/s_client.cpp \ jni/src/script/cpp_api/s_entity.cpp \ jni/src/script/cpp_api/s_env.cpp \ jni/src/script/cpp_api/s_inventory.cpp \ @@ -296,12 +307,18 @@ LOCAL_SRC_FILES += \ jni/src/script/cpp_api/s_server.cpp \ jni/src/script/lua_api/l_areastore.cpp \ jni/src/script/lua_api/l_base.cpp \ + jni/src/script/lua_api/l_camera.cpp \ + jni/src/script/lua_api/l_client.cpp \ jni/src/script/lua_api/l_craft.cpp \ jni/src/script/lua_api/l_env.cpp \ jni/src/script/lua_api/l_inventory.cpp \ jni/src/script/lua_api/l_item.cpp \ + jni/src/script/lua_api/l_itemstackmeta.cpp\ + jni/src/script/lua_api/l_localplayer.cpp \ jni/src/script/lua_api/l_mainmenu.cpp \ jni/src/script/lua_api/l_mapgen.cpp \ + jni/src/script/lua_api/l_metadata.cpp \ + jni/src/script/lua_api/l_minimap.cpp \ jni/src/script/lua_api/l_nodemeta.cpp \ jni/src/script/lua_api/l_nodetimer.cpp \ jni/src/script/lua_api/l_noise.cpp \ @@ -310,10 +327,13 @@ LOCAL_SRC_FILES += \ jni/src/script/lua_api/l_rollback.cpp \ jni/src/script/lua_api/l_server.cpp \ jni/src/script/lua_api/l_settings.cpp \ + jni/src/script/lua_api/l_sound.cpp \ jni/src/script/lua_api/l_http.cpp \ + jni/src/script/lua_api/l_storage.cpp \ jni/src/script/lua_api/l_util.cpp \ jni/src/script/lua_api/l_vmanip.cpp \ - jni/src/script/scripting_game.cpp \ + jni/src/script/scripting_client.cpp \ + jni/src/script/scripting_server.cpp \ jni/src/script/scripting_mainmenu.cpp #freetype2 support @@ -321,36 +341,36 @@ LOCAL_SRC_FILES += jni/src/cguittfont/xCGUITTFont.cpp # Lua LOCAL_SRC_FILES += \ - jni/src/lua/src/lapi.c \ - jni/src/lua/src/lauxlib.c \ - jni/src/lua/src/lbaselib.c \ - jni/src/lua/src/lcode.c \ - jni/src/lua/src/ldblib.c \ - jni/src/lua/src/ldebug.c \ - jni/src/lua/src/ldo.c \ - jni/src/lua/src/ldump.c \ - jni/src/lua/src/lfunc.c \ - jni/src/lua/src/lgc.c \ - jni/src/lua/src/linit.c \ - jni/src/lua/src/liolib.c \ - jni/src/lua/src/llex.c \ - jni/src/lua/src/lmathlib.c \ - jni/src/lua/src/lmem.c \ - jni/src/lua/src/loadlib.c \ - jni/src/lua/src/lobject.c \ - jni/src/lua/src/lopcodes.c \ - jni/src/lua/src/loslib.c \ - jni/src/lua/src/lparser.c \ - jni/src/lua/src/lstate.c \ - jni/src/lua/src/lstring.c \ - jni/src/lua/src/lstrlib.c \ - jni/src/lua/src/ltable.c \ - jni/src/lua/src/ltablib.c \ - jni/src/lua/src/ltm.c \ - jni/src/lua/src/lundump.c \ - jni/src/lua/src/lvm.c \ - jni/src/lua/src/lzio.c \ - jni/src/lua/src/print.c + jni/lib/lua/src/lapi.c \ + jni/lib/lua/src/lauxlib.c \ + jni/lib/lua/src/lbaselib.c \ + jni/lib/lua/src/lcode.c \ + jni/lib/lua/src/ldblib.c \ + jni/lib/lua/src/ldebug.c \ + jni/lib/lua/src/ldo.c \ + jni/lib/lua/src/ldump.c \ + jni/lib/lua/src/lfunc.c \ + jni/lib/lua/src/lgc.c \ + jni/lib/lua/src/linit.c \ + jni/lib/lua/src/liolib.c \ + jni/lib/lua/src/llex.c \ + jni/lib/lua/src/lmathlib.c \ + jni/lib/lua/src/lmem.c \ + jni/lib/lua/src/loadlib.c \ + jni/lib/lua/src/lobject.c \ + jni/lib/lua/src/lopcodes.c \ + jni/lib/lua/src/loslib.c \ + jni/lib/lua/src/lparser.c \ + jni/lib/lua/src/lstate.c \ + jni/lib/lua/src/lstring.c \ + jni/lib/lua/src/lstrlib.c \ + jni/lib/lua/src/ltable.c \ + jni/lib/lua/src/ltablib.c \ + jni/lib/lua/src/ltm.c \ + jni/lib/lua/src/lundump.c \ + jni/lib/lua/src/lvm.c \ + jni/lib/lua/src/lzio.c \ + jni/lib/lua/src/print.c # SQLite3 LOCAL_SRC_FILES += deps/sqlite/sqlite3.c @@ -363,7 +383,7 @@ LOCAL_SRC_FILES += \ jni/src/threading/thread.cpp # JSONCPP -LOCAL_SRC_FILES += jni/src/jsoncpp/json/jsoncpp.cpp +LOCAL_SRC_FILES += jni/lib/jsoncpp/jsoncpp.cpp LOCAL_SHARED_LIBRARIES := iconv openal ogg vorbis gmp LOCAL_STATIC_LIBRARIES := Irrlicht freetype curl ssl crypto android_native_app_glue $(PROFILER_LIBS) @@ -380,4 +400,3 @@ ifdef GPROF $(call import-module,android-ndk-profiler) endif $(call import-module,android/native_app_glue) - diff --git a/build/android/patches/sqlite3-readonly-fix.patch b/build/android/patches/sqlite3-readonly-fix.patch deleted file mode 100644 index be19055ee..000000000 --- a/build/android/patches/sqlite3-readonly-fix.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- sqlite3.c 2016-11-29 02:29:24.000000000 +0000 -+++ sqlite3.c 2016-12-08 22:54:54.206465377 +0000 -@@ -30445,7 +30445,14 @@ - #if OS_VXWORKS - struct vxworksFileId *pId; /* Unique file ID for vxworks. */ - #else -- ino_t ino; /* Inode number */ -+ #ifdef ANDROID -+ // Bionic's struct stat has a 64 bit st_ino on both 32 and -+ // 64 bit architectures. ino_t remains 32 bits wide on 32 bit -+ // architectures and can lead to inode truncation. -+ unsigned long long ino; /* Inode number */ -+ #else -+ ino_t ino; /* Inode number */ -+ #endif - #endif - }; diff --git a/builtin/client/chatcommands.lua b/builtin/client/chatcommands.lua new file mode 100644 index 000000000..2b8cc4acd --- /dev/null +++ b/builtin/client/chatcommands.lua @@ -0,0 +1,65 @@ +-- Minetest: builtin/client/chatcommands.lua + + +core.register_on_sending_chat_messages(function(message) + if message:sub(1,2) == ".." then + return false + end + + local first_char = message:sub(1,1) + if first_char == "/" or first_char == "." then + core.display_chat_message(core.gettext("issued command: ") .. message) + end + + if first_char ~= "." then + return false + end + + local cmd, param = string.match(message, "^%.([^ ]+) *(.*)") + param = param or "" + + if not cmd then + core.display_chat_message(core.gettext("-!- Empty command")) + return true + end + + local cmd_def = core.registered_chatcommands[cmd] + if cmd_def then + core.set_last_run_mod(cmd_def.mod_origin) + local _, message = cmd_def.func(param) + if message then + core.display_chat_message(message) + end + else + core.display_chat_message(core.gettext("-!- Invalid command: ") .. cmd) + end + + return true +end) + +core.register_chatcommand("list_players", { + description = core.gettext("List online players"), + func = function(param) + local players = table.concat(core.get_player_names(), ", ") + core.display_chat_message(core.gettext("Online players: ") .. players) + end +}) + +core.register_chatcommand("disconnect", { + description = core.gettext("Exit to main menu"), + func = function(param) + core.disconnect() + end, +}) + +core.register_chatcommand("clear_chat_queue", { + description = core.gettext("Clear the out chat queue"), + func = function(param) + core.clear_out_chat_queue() + return true, core.gettext("The out chat queue is now empty") + end, +}) + +function core.run_server_chatcommand(cmd, param) + core.send_chat_message("/" .. cmd .. " " .. param) +end diff --git a/builtin/client/init.lua b/builtin/client/init.lua new file mode 100644 index 000000000..3ac34d845 --- /dev/null +++ b/builtin/client/init.lua @@ -0,0 +1,23 @@ +-- Minetest: builtin/client/init.lua +local scriptpath = core.get_builtin_path()..DIR_DELIM +local clientpath = scriptpath.."client"..DIR_DELIM +local commonpath = scriptpath.."common"..DIR_DELIM + +dofile(clientpath .. "register.lua") +dofile(commonpath .. "after.lua") +dofile(commonpath .. "chatcommands.lua") +dofile(clientpath .. "chatcommands.lua") +dofile(commonpath .. "vector.lua") + +core.register_on_death(function() + core.display_chat_message("You died.") + local formspec = "size[11,5.5]bgcolor[#320000b4;true]" .. + "label[4.85,1.35;" .. fgettext("You died.") .. "]button_exit[4,3;3,0.5;btn_respawn;".. fgettext("Respawn") .."]" + core.show_formspec("bultin:death", formspec) +end) + +core.register_on_formspec_input(function(formname, fields) + if formname == "bultin:death" then + core.send_respawn() + end +end) diff --git a/builtin/client/register.lua b/builtin/client/register.lua new file mode 100644 index 000000000..6b12ddec8 --- /dev/null +++ b/builtin/client/register.lua @@ -0,0 +1,73 @@ + +core.callback_origins = {} + +local getinfo = debug.getinfo +debug.getinfo = nil + +function core.run_callbacks(callbacks, mode, ...) + assert(type(callbacks) == "table") + local cb_len = #callbacks + if cb_len == 0 then + if mode == 2 or mode == 3 then + return true + elseif mode == 4 or mode == 5 then + return false + end + end + local ret + for i = 1, cb_len do + local cb_ret = callbacks[i](...) + + if mode == 0 and i == 1 or mode == 1 and i == cb_len then + ret = cb_ret + elseif mode == 2 then + if not cb_ret or i == 1 then + ret = cb_ret + end + elseif mode == 3 then + if cb_ret then + return cb_ret + end + ret = cb_ret + elseif mode == 4 then + if (cb_ret and not ret) or i == 1 then + ret = cb_ret + end + elseif mode == 5 and cb_ret then + return cb_ret + end + end + return ret +end + +-- +-- Callback registration +-- + +local function make_registration() + local t = {} + local registerfunc = function(func) + t[#t + 1] = func + core.callback_origins[func] = { + mod = core.get_current_modname() or "??", + name = getinfo(1, "n").name or "??" + } + --local origin = core.callback_origins[func] + --print(origin.name .. ": " .. origin.mod .. " registering cbk " .. tostring(func)) + end + return t, registerfunc +end + +core.registered_globalsteps, core.register_globalstep = make_registration() +core.registered_on_shutdown, core.register_on_shutdown = make_registration() +core.registered_on_connect, core.register_on_connect = make_registration() +core.registered_on_receiving_chat_messages, core.register_on_receiving_chat_messages = make_registration() +core.registered_on_sending_chat_messages, core.register_on_sending_chat_messages = make_registration() +core.registered_on_death, core.register_on_death = make_registration() +core.registered_on_hp_modification, core.register_on_hp_modification = make_registration() +core.registered_on_damage_taken, core.register_on_damage_taken = make_registration() +core.registered_on_formspec_input, core.register_on_formspec_input = make_registration() +core.registered_on_dignode, core.register_on_dignode = make_registration() +core.registered_on_punchnode, core.register_on_punchnode = make_registration() +core.registered_on_placenode, core.register_on_placenode = make_registration() +core.registered_on_item_use, core.register_on_item_use = make_registration() diff --git a/builtin/common/after.lua b/builtin/common/after.lua new file mode 100644 index 000000000..cdfaaab86 --- /dev/null +++ b/builtin/common/after.lua @@ -0,0 +1,33 @@ +local jobs = {} +local time = 0.0 + +core.register_globalstep(function(dtime) + time = time + dtime + + if #jobs < 1 then + return + end + + -- Iterate backwards so that we miss any new timers added by + -- a timer callback, and so that we don't skip the next timer + -- in the list if we remove one. + for i = #jobs, 1, -1 do + local job = jobs[i] + if time >= job.expire then + core.set_last_run_mod(job.mod_origin) + job.func(unpack(job.arg)) + table.remove(jobs, i) + end + end +end) + +function core.after(after, func, ...) + assert(tonumber(after) and type(func) == "function", + "Invalid core.after invocation") + jobs[#jobs + 1] = { + func = func, + expire = time + after, + arg = {...}, + mod_origin = core.get_last_run_mod() + } +end diff --git a/builtin/common/chatcommands.lua b/builtin/common/chatcommands.lua new file mode 100644 index 000000000..e8955c6b4 --- /dev/null +++ b/builtin/common/chatcommands.lua @@ -0,0 +1,112 @@ +-- Minetest: builtin/common/chatcommands.lua + +core.registered_chatcommands = {} + +function core.register_chatcommand(cmd, def) + def = def or {} + def.params = def.params or "" + def.description = def.description or "" + def.privs = def.privs or {} + def.mod_origin = core.get_current_modname() or "??" + core.registered_chatcommands[cmd] = def +end + +function core.unregister_chatcommand(name) + if core.registered_chatcommands[name] then + core.registered_chatcommands[name] = nil + else + core.log("warning", "Not unregistering chatcommand " ..name.. + " because it doesn't exist.") + end +end + +function core.override_chatcommand(name, redefinition) + local chatcommand = core.registered_chatcommands[name] + assert(chatcommand, "Attempt to override non-existent chatcommand "..name) + for k, v in pairs(redefinition) do + rawset(chatcommand, k, v) + end + core.registered_chatcommands[name] = chatcommand +end + +local cmd_marker = "/" + +local function gettext(...) + return ... +end + +local function gettext_replace(text, replace) + return text:gsub("$1", replace) +end + + +if INIT == "client" then + cmd_marker = "." + gettext = core.gettext + gettext_replace = fgettext_ne +end + +local function do_help_cmd(name, param) + local function format_help_line(cmd, def) + local msg = core.colorize("#00ffff", cmd_marker .. cmd) + if def.params and def.params ~= "" then + msg = msg .. " " .. def.params + end + if def.description and def.description ~= "" then + msg = msg .. ": " .. def.description + end + return msg + end + if param == "" then + local cmds = {} + for cmd, def in pairs(core.registered_chatcommands) do + if INIT == "client" or core.check_player_privs(name, def.privs) then + cmds[#cmds + 1] = cmd + end + end + table.sort(cmds) + return true, gettext("Available commands: ") .. table.concat(cmds, " ") .. "\n" + .. gettext_replace("Use '$1help <cmd>' to get more information," + .. " or '$1help all' to list everything.", cmd_marker) + elseif param == "all" then + local cmds = {} + for cmd, def in pairs(core.registered_chatcommands) do + if INIT == "client" or core.check_player_privs(name, def.privs) then + cmds[#cmds + 1] = format_help_line(cmd, def) + end + end + table.sort(cmds) + return true, gettext("Available commands:").."\n"..table.concat(cmds, "\n") + elseif INIT == "game" and param == "privs" then + local privs = {} + for priv, def in pairs(core.registered_privileges) do + privs[#privs + 1] = priv .. ": " .. def.description + end + table.sort(privs) + return true, "Available privileges:\n"..table.concat(privs, "\n") + else + local cmd = param + local def = core.registered_chatcommands[cmd] + if not def then + return false, gettext("Command not available: ")..cmd + else + return true, format_help_line(cmd, def) + end + end +end + +if INIT == "client" then + core.register_chatcommand("help", { + params = gettext("[all/<cmd>]"), + description = gettext("Get help for commands"), + func = function(param) + return do_help_cmd(nil, param) + end, + }) +else + core.register_chatcommand("help", { + params = "[all/privs/<cmd>]", + description = "Get help for commands or list privileges", + func = do_help_cmd, + }) +end diff --git a/builtin/common/filterlist.lua b/builtin/common/filterlist.lua index 2a62362e3..562231192 100644 --- a/builtin/common/filterlist.lua +++ b/builtin/common/filterlist.lua @@ -289,6 +289,9 @@ function sort_mod_list(self) table.sort(self.m_processed_list, function(a, b) -- Show game mods at bottom if a.typ ~= b.typ then + if b.typ == "game" then + return a.typ ~= "game_mod" + end return b.typ == "game_mod" end -- If in same or no modpack, sort by name diff --git a/builtin/common/misc_helpers.lua b/builtin/common/misc_helpers.lua index c2dc7514d..68481f7c8 100644 --- a/builtin/common/misc_helpers.lua +++ b/builtin/common/misc_helpers.lua @@ -197,16 +197,17 @@ assert(table.indexof({"foo", "bar"}, "foo") == 1) assert(table.indexof({"foo", "bar"}, "baz") == -1) -------------------------------------------------------------------------------- -function file_exists(filename) - local f = io.open(filename, "r") - if f == nil then - return false - else - f:close() - return true +if INIT ~= "client" then + function file_exists(filename) + local f = io.open(filename, "r") + if f == nil then + return false + else + f:close() + return true + end end end - -------------------------------------------------------------------------------- function string:trim() return (self:gsub("^%s*(.-)%s*$", "%1")) @@ -307,7 +308,7 @@ function core.formspec_escape(text) end -function core.splittext(text,charlimit) +function core.wrap_text(text, charlimit) local retval = {} local current_idx = 1 @@ -462,7 +463,7 @@ if INIT == "game" then core.rotate_node = function(itemstack, placer, pointed_thing) core.rotate_and_place(itemstack, placer, pointed_thing, - core.setting_getbool("creative_mode"), + core.settings:get_bool("creative_mode"), {invert_wall = placer:get_player_control().sneak}) return itemstack end @@ -606,7 +607,9 @@ if INIT == "mainmenu" then return nil end +end +if INIT == "client" or INIT == "mainmenu" then function fgettext_ne(text, ...) text = core.gettext(text) local arg = {n=select('#', ...), ...} @@ -637,3 +640,86 @@ if INIT == "mainmenu" then end end +local ESCAPE_CHAR = string.char(0x1b) + +-- Client-side mods don't have access to settings +if core.settings and core.settings:get_bool("disable_escape_sequences") then + + function core.get_color_escape_sequence(color) + return "" + end + + function core.get_background_escape_sequence(color) + return "" + end + + function core.colorize(color, message) + return message + end + +else + + function core.get_color_escape_sequence(color) + return ESCAPE_CHAR .. "(c@" .. color .. ")" + end + + function core.get_background_escape_sequence(color) + return ESCAPE_CHAR .. "(b@" .. color .. ")" + end + + function core.colorize(color, message) + local lines = tostring(message):split("\n", true) + local color_code = core.get_color_escape_sequence(color) + + for i, line in ipairs(lines) do + lines[i] = color_code .. line + end + + return table.concat(lines, "\n") .. core.get_color_escape_sequence("#ffffff") + end + +end + +function core.strip_foreground_colors(str) + return (str:gsub(ESCAPE_CHAR .. "%(c@[^)]+%)", "")) +end + +function core.strip_background_colors(str) + return (str:gsub(ESCAPE_CHAR .. "%(b@[^)]+%)", "")) +end + +function core.strip_colors(str) + return (str:gsub(ESCAPE_CHAR .. "%([bc]@[^)]+%)", "")) +end + +-------------------------------------------------------------------------------- +-- Returns the exact coordinate of a pointed surface +-------------------------------------------------------------------------------- +function core.pointed_thing_to_face_pos(placer, pointed_thing) + local eye_offset_first = placer:get_eye_offset() + local node_pos = pointed_thing.under + local camera_pos = placer:get_pos() + local pos_off = vector.multiply( + vector.subtract(pointed_thing.above, node_pos), 0.5) + local look_dir = placer:get_look_dir() + local offset, nc + local oc = {} + + for c, v in pairs(pos_off) do + if nc or v == 0 then + oc[#oc + 1] = c + else + offset = v + nc = c + end + end + + local fine_pos = {[nc] = node_pos[nc] + offset} + camera_pos.y = camera_pos.y + 1.625 + eye_offset_first.y / 10 + local f = (node_pos[nc] + offset - camera_pos[nc]) / look_dir[nc] + + for i = 1, #oc do + fine_pos[oc[i]] = camera_pos[oc[i]] + look_dir[oc[i]] * f + end + return fine_pos +end diff --git a/builtin/common/serialize.lua b/builtin/common/serialize.lua index b2165648e..692ddd5f0 100644 --- a/builtin/common/serialize.lua +++ b/builtin/common/serialize.lua @@ -186,6 +186,10 @@ local safe_env = { } function core.deserialize(str, safe) + if type(str) ~= "string" then + return nil, "Cannot deserialize type '"..type(str) + .."'. Argument must be a string." + end if str:byte(1) == 0x1B then return nil, "Bytecode prohibited" end diff --git a/builtin/common/strict.lua b/builtin/common/strict.lua index 23ba3d727..ccde9676b 100644 --- a/builtin/common/strict.lua +++ b/builtin/common/strict.lua @@ -3,6 +3,7 @@ -- This ignores mod namespaces (variables with the same name as the current mod). local WARN_INIT = false +local getinfo = debug.getinfo function core.global_exists(name) if type(name) ~= "string" then @@ -18,7 +19,7 @@ local declared = {} local warned = {} function meta:__newindex(name, value) - local info = debug.getinfo(2, "Sl") + local info = getinfo(2, "Sl") local desc = ("%s:%d"):format(info.short_src, info.currentline) if not declared[name] then local warn_key = ("%s\0%d\0%s"):format(info.source, @@ -42,7 +43,7 @@ end function meta:__index(name) - local info = debug.getinfo(2, "Sl") + local info = getinfo(2, "Sl") local warn_key = ("%s\0%d\0%s"):format(info.source, info.currentline, name) if not declared[name] and not warned[warn_key] and info.what ~= "C" then core.log("warning", ("Undeclared global variable %q accessed at %s:%s") diff --git a/builtin/common/vector.lua b/builtin/common/vector.lua index 90ba3cc8b..0549f9a56 100644 --- a/builtin/common/vector.lua +++ b/builtin/common/vector.lua @@ -138,3 +138,8 @@ function vector.divide(a, b) z = a.z / b} end end + +function vector.sort(a, b) + return {x = math.min(a.x, b.x), y = math.min(a.y, b.y), z = math.min(a.z, b.z)}, + {x = math.max(a.x, b.x), y = math.max(a.y, b.y), z = math.max(a.z, b.z)} +end diff --git a/builtin/fstk/tabview.lua b/builtin/fstk/tabview.lua index 72551afd7..3715e231b 100644 --- a/builtin/fstk/tabview.lua +++ b/builtin/fstk/tabview.lua @@ -167,7 +167,7 @@ local function switch_to_tab(self, index) self.current_tab = self.tablist[index].name if (self.autosave_tab) then - core.setting_set(self.name .. "_LAST",self.current_tab) + core.settings:set(self.name .. "_LAST",self.current_tab) end -- call for tab to enter diff --git a/builtin/game/auth.lua b/builtin/game/auth.lua index 46fe3d342..8cb4ebf57 100644 --- a/builtin/game/auth.lua +++ b/builtin/game/auth.lua @@ -106,7 +106,7 @@ core.builtin_auth_handler = { end end -- For the admin, give everything - elseif name == core.setting_get("name") then + elseif name == core.settings:get("name") then for priv, def in pairs(core.registered_privileges) do privileges[priv] = true end @@ -125,7 +125,7 @@ core.builtin_auth_handler = { core.log('info', "Built-in authentication handler adding player '"..name.."'") core.auth_table[name] = { password = password, - privileges = core.string_to_privs(core.setting_get("default_privs")), + privileges = core.string_to_privs(core.settings:get("default_privs")), last_login = os.time(), } save_auth_file() @@ -148,7 +148,7 @@ core.builtin_auth_handler = { if not core.auth_table[name] then core.builtin_auth_handler.create_auth(name, core.get_password_hash(name, - core.setting_get("default_password"))) + core.settings:get("default_password"))) end core.auth_table[name].privileges = privileges core.notify_authentication_modified(name) diff --git a/builtin/game/chatcommands.lua b/builtin/game/chatcommands.lua index 2bd93855b..3dfc29ffa 100644 --- a/builtin/game/chatcommands.lua +++ b/builtin/game/chatcommands.lua @@ -1,27 +1,28 @@ --- Minetest: builtin/chatcommands.lua +-- Minetest: builtin/game/chatcommands.lua -- -- Chat command handler -- -core.chatcommands = {} -function core.register_chatcommand(cmd, def) - def = def or {} - def.params = def.params or "" - def.description = def.description or "" - def.privs = def.privs or {} - def.mod_origin = core.get_current_modname() or "??" - core.chatcommands[cmd] = def -end +core.chatcommands = core.registered_chatcommands -- BACKWARDS COMPATIBILITY core.register_on_chat_message(function(name, message) + if message:sub(1,1) ~= "/" then + return + end + local cmd, param = string.match(message, "^/([^ ]+) *(.*)") - if not param then - param = "" + if not cmd then + core.chat_send_player(name, "-!- Empty command") + return true end - local cmd_def = core.chatcommands[cmd] + + param = param or "" + + local cmd_def = core.registered_chatcommands[cmd] if not cmd_def then - return false + core.chat_send_player(name, "-!- Invalid command: " .. cmd) + return true end local has_privs, missing_privs = core.check_player_privs(name, cmd_def.privs) if has_privs then @@ -38,7 +39,7 @@ core.register_on_chat_message(function(name, message) return true -- Handled chat message end) -if core.setting_getbool("profiler.load") then +if core.settings:get_bool("profiler.load") then -- Run after register_chatcommand and its register_on_chat_message -- Before any chattcommands that should be profiled profiler.init_chatcommand() @@ -70,7 +71,8 @@ end -- core.register_chatcommand("me", { params = "<action>", - description = "chat action (eg. /me orders a pizza)", + description = "Display chat action (e.g., '/me orders a pizza' displays" + .. " '<player name> orders a pizza')", privs = {shout=true}, func = function(name, param) core.chat_send_all("* " .. name .. " " .. param) @@ -80,7 +82,7 @@ core.register_chatcommand("me", { core.register_chatcommand("admin", { description = "Show the name of the server owner", func = function(name) - local admin = minetest.setting_get("name") + local admin = minetest.settings:get("name") if admin then return true, "The administrator of this server is "..admin.."." else @@ -89,64 +91,9 @@ core.register_chatcommand("admin", { end, }) -core.register_chatcommand("help", { - privs = {}, - params = "[all/privs/<cmd>]", - description = "Get help for commands or list privileges", - func = function(name, param) - local function format_help_line(cmd, def) - local msg = core.colorize("#00ffff", "/"..cmd) - if def.params and def.params ~= "" then - msg = msg .. " " .. def.params - end - if def.description and def.description ~= "" then - msg = msg .. ": " .. def.description - end - return msg - end - if param == "" then - local msg = "" - local cmds = {} - for cmd, def in pairs(core.chatcommands) do - if core.check_player_privs(name, def.privs) then - cmds[#cmds + 1] = cmd - end - end - table.sort(cmds) - return true, "Available commands: " .. table.concat(cmds, " ") .. "\n" - .. "Use '/help <cmd>' to get more information," - .. " or '/help all' to list everything." - elseif param == "all" then - local cmds = {} - for cmd, def in pairs(core.chatcommands) do - if core.check_player_privs(name, def.privs) then - cmds[#cmds + 1] = format_help_line(cmd, def) - end - end - table.sort(cmds) - return true, "Available commands:\n"..table.concat(cmds, "\n") - elseif param == "privs" then - local privs = {} - for priv, def in pairs(core.registered_privileges) do - privs[#privs + 1] = priv .. ": " .. def.description - end - table.sort(privs) - return true, "Available privileges:\n"..table.concat(privs, "\n") - else - local cmd = param - local def = core.chatcommands[cmd] - if not def then - return false, "Command not available: "..cmd - else - return true, format_help_line(cmd, def) - end - end - end, -}) - core.register_chatcommand("privs", { params = "<name>", - description = "print out privileges of player", + description = "Print privileges of player", func = function(caller, param) param = param:trim() local name = (param ~= "" and param or caller) @@ -161,8 +108,8 @@ local function handle_grant_command(caller, grantname, grantprivstr) if not (caller_privs.privs or caller_privs.basic_privs) then return false, "Your privileges are insufficient." end - - if not core.auth_table[grantname] then + + if not core.get_auth_handler().get_auth(grantname) then return false, "Player " .. grantname .. " does not exist." end local grantprivs = core.string_to_privs(grantprivstr) @@ -172,7 +119,7 @@ local function handle_grant_command(caller, grantname, grantprivstr) local privs = core.get_player_privs(grantname) local privs_unknown = "" local basic_privs = - core.string_to_privs(core.setting_get("basic_privs") or "interact,shout") + core.string_to_privs(core.settings:get("basic_privs") or "interact,shout") for priv, _ in pairs(grantprivs) do if not basic_privs[priv] and not caller_privs.privs then return false, "Your privileges are insufficient." @@ -204,7 +151,7 @@ core.register_chatcommand("grant", { local grantname, grantprivstr = string.match(param, "([^ ]+) (.+)") if not grantname or not grantprivstr then return false, "Invalid parameters (see /help grant)" - end + end return handle_grant_command(name, grantname, grantprivstr) end, }) @@ -215,7 +162,7 @@ core.register_chatcommand("grantme", { func = function(name, param) if param == "" then return false, "Invalid parameters (see /help grantme)" - end + end return handle_grant_command(name, name, param) end, }) @@ -232,13 +179,13 @@ core.register_chatcommand("revoke", { local revoke_name, revoke_priv_str = string.match(param, "([^ ]+) (.+)") if not revoke_name or not revoke_priv_str then return false, "Invalid parameters (see /help revoke)" - elseif not core.auth_table[revoke_name] then + elseif not core.get_auth_handler().get_auth(revoke_name) then return false, "Player " .. revoke_name .. " does not exist." end local revoke_privs = core.string_to_privs(revoke_priv_str) local privs = core.get_player_privs(revoke_name) local basic_privs = - core.string_to_privs(core.setting_get("basic_privs") or "interact,shout") + core.string_to_privs(core.settings:get("basic_privs") or "interact,shout") for priv, _ in pairs(revoke_privs) do if not basic_privs[priv] and not core.check_player_privs(name, {privs=true}) then @@ -269,7 +216,7 @@ core.register_chatcommand("revoke", { core.register_chatcommand("setpassword", { params = "<name> <password>", - description = "set given password", + description = "Set player's password", privs = {password=true}, func = function(name, param) local toname, raw_password = string.match(param, "^([^ ]+) +(.+)$") @@ -307,7 +254,7 @@ core.register_chatcommand("setpassword", { core.register_chatcommand("clearpassword", { params = "<name>", - description = "set empty password", + description = "Set empty password", privs = {password=true}, func = function(name, param) local toname = param @@ -324,7 +271,7 @@ core.register_chatcommand("clearpassword", { core.register_chatcommand("auth_reload", { params = "", - description = "reload authentication data", + description = "Reload authentication data", privs = {server=true}, func = function(name, param) local done = core.auth_reload() @@ -332,9 +279,34 @@ core.register_chatcommand("auth_reload", { end, }) +core.register_chatcommand("remove_player", { + params = "<name>", + description = "Remove player data", + privs = {server=true}, + func = function(name, param) + local toname = param + if toname == "" then + return false, "Name field required" + end + + local rc = core.remove_player(toname) + + if rc == 0 then + core.log("action", name .. " removed player data of " .. toname .. ".") + return true, "Player \"" .. toname .. "\" removed." + elseif rc == 1 then + return true, "No such player \"" .. toname .. "\" to remove." + elseif rc == 2 then + return true, "Player \"" .. toname .. "\" is connected, cannot remove." + end + + return false, "Unhandled remove_player return code " .. rc .. "" + end, +}) + core.register_chatcommand("teleport", { params = "<X>,<Y>,<Z> | <to_name> | <name> <X>,<Y>,<Z> | <name> <to_name>", - description = "teleport to given position", + description = "Teleport to player or position", privs = {teleport=true}, func = function(name, param) -- Returns (pos, true) if found, otherwise (pos, false) @@ -365,7 +337,7 @@ core.register_chatcommand("teleport", { p.y = tonumber(p.y) p.z = tonumber(p.z) if p.x and p.y and p.z then - local lm = tonumber(minetest.setting_get("map_generation_limit") or 31000) + local lm = 31000 if p.x < -lm or p.x > lm or p.y < -lm or p.y > lm or p.z < -lm or p.z > lm then return false, "Cannot teleport out of map bounds!" end @@ -442,25 +414,25 @@ core.register_chatcommand("teleport", { core.register_chatcommand("set", { params = "[-n] <name> <value> | <name>", - description = "set or read server configuration setting", + description = "Set or read server configuration setting", privs = {server=true}, func = function(name, param) local arg, setname, setvalue = string.match(param, "(-[n]) ([^ ]+) (.+)") if arg and arg == "-n" and setname and setvalue then - core.setting_set(setname, setvalue) + core.settings:set(setname, setvalue) return true, setname .. " = " .. setvalue end local setname, setvalue = string.match(param, "([^ ]+) (.+)") if setname and setvalue then - if not core.setting_get(setname) then + if not core.settings:get(setname) then return false, "Failed. Use '/set -n <name> <value>' to create a new setting." end - core.setting_set(setname, setvalue) + core.settings:set(setname, setvalue) return true, setname .. " = " .. setvalue end local setname = string.match(param, "([^ ]+)") if setname then - local setvalue = core.setting_get(setname) + local setvalue = core.settings:get(setname) if not setvalue then setvalue = "<not set>" end @@ -497,7 +469,7 @@ end core.register_chatcommand("emergeblocks", { params = "(here [radius]) | (<pos1> <pos2>)", - description = "starts loading (or generating, if inexistent) map blocks " + description = "Load (or, if nonexistent, generate) map blocks " .. "contained in area pos1 to pos2", privs = {server=true}, func = function(name, param) @@ -523,7 +495,7 @@ core.register_chatcommand("emergeblocks", { core.register_chatcommand("deleteblocks", { params = "(here [radius]) | (<pos1> <pos2>)", - description = "delete map blocks contained in area pos1 to pos2", + description = "Delete map blocks contained in area pos1 to pos2", privs = {server=true}, func = function(name, param) local p1, p2 = parse_range_str(name, param) @@ -540,6 +512,25 @@ core.register_chatcommand("deleteblocks", { end, }) +core.register_chatcommand("fixlight", { + params = "(here [radius]) | (<pos1> <pos2>)", + description = "Resets lighting in the area between pos1 and pos2", + privs = {server = true}, + func = function(name, param) + local p1, p2 = parse_range_str(name, param) + if p1 == false then + return false, p2 + end + + if core.fix_light(p1, p2) then + return true, "Successfully reset light in the area ranging from " .. + core.pos_to_string(p1, 1) .. " to " .. core.pos_to_string(p2, 1) + else + return false, "Failed to load one or more blocks in area" + end + end, +}) + core.register_chatcommand("mods", { params = "", description = "List mods installed on the server", @@ -587,7 +578,7 @@ end core.register_chatcommand("give", { params = "<name> <ItemString>", - description = "give item to player", + description = "Give item to player", privs = {give=true}, func = function(name, param) local toname, itemstring = string.match(param, "^([^ ]+) +(.+)$") @@ -600,7 +591,7 @@ core.register_chatcommand("give", { core.register_chatcommand("giveme", { params = "<ItemString>", - description = "give item to yourself", + description = "Give item to yourself", privs = {give=true}, func = function(name, param) local itemstring = string.match(param, "(.+)$") @@ -671,12 +662,12 @@ end) core.register_chatcommand("rollback_check", { params = "[<range>] [<seconds>] [limit]", - description = "Check who has last touched a node or near it," - .. " max. <seconds> ago (default range=0," - .. " seconds=86400=24h, limit=5)", + description = "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", privs = {rollback=true}, func = function(name, param) - if not core.setting_getbool("enable_rollback_recording") then + if not core.settings:get_bool("enable_rollback_recording") then return false, "Rollback functions are disabled." end local range, seconds, limit = @@ -724,10 +715,10 @@ core.register_chatcommand("rollback_check", { core.register_chatcommand("rollback", { params = "<player name> [<seconds>] | :<actor> [<seconds>]", - description = "revert actions of a player; default for <seconds> is 60", + description = "Revert actions of a player. Default for <seconds> is 60", privs = {rollback=true}, func = function(name, param) - if not core.setting_getbool("enable_rollback_recording") then + if not core.settings:get_bool("enable_rollback_recording") then return false, "Rollback functions are disabled." end local target_name, seconds = string.match(param, ":([^ ]+) *(%d*)") @@ -769,7 +760,7 @@ core.register_chatcommand("status", { core.register_chatcommand("time", { params = "<0..23>:<0..59> | <0..24000>", - description = "set time of day", + description = "Set time of day", privs = {}, func = function(name, param) if param == "" then @@ -815,12 +806,21 @@ core.register_chatcommand("days", { }) core.register_chatcommand("shutdown", { - description = "shutdown server", + description = "Shutdown server", + params = "[delay_in_seconds (non-negative number, or -1 to cancel)] [reconnect] [message]", privs = {server=true}, func = function(name, param) - core.log("action", name .. " shuts down server") - core.request_shutdown() - core.chat_send_all("*** Server shutting down (operator request).") + local delay, reconnect, message = param:match("([^ ][-]?[0-9]+)([^ ]+)(.*)") + message = message or "" + + if delay ~= "" then + delay = tonumber(param) or 0 + else + delay = 0 + core.log("action", name .. " shuts down server") + core.chat_send_all("*** Server shutting down (operator request).") + end + core.request_shutdown(message:trim(), core.is_yes(reconnect), delay) end, }) @@ -846,7 +846,7 @@ core.register_chatcommand("ban", { core.register_chatcommand("unban", { params = "<name/ip>", - description = "remove IP ban", + description = "Remove IP ban", privs = {ban=true}, func = function(name, param) if not core.unban_player_or_ip(param) then @@ -859,7 +859,7 @@ core.register_chatcommand("unban", { core.register_chatcommand("kick", { params = "<name> [reason]", - description = "kick a player", + description = "Kick a player", privs = {kick=true}, func = function(name, param) local tokick, reason = param:match("([^ ]+) (.+)") @@ -878,7 +878,7 @@ core.register_chatcommand("kick", { core.register_chatcommand("clearobjects", { params = "[full|quick]", - description = "clear all objects in world", + description = "Clear all objects in world", privs = {server=true}, func = function(name, param) local options = {} @@ -938,3 +938,31 @@ core.register_chatcommand("last-login", { return false, "Last login time is unknown" end, }) + +core.register_chatcommand("clearinv", { + params = "[name]", + description = "Clear the inventory of yourself or another player", + func = function(name, param) + local player + if param and param ~= "" and param ~= name then + if not core.check_player_privs(name, {server=true}) then + return false, "You don't have permission" + .. " to run this command (missing privilege: server)" + end + player = core.get_player_by_name(param) + core.chat_send_player(param, name.." cleared your inventory.") + else + player = core.get_player_by_name(name) + end + + if player then + player:get_inventory():set_list("main", {}) + player:get_inventory():set_list("craft", {}) + player:get_inventory():set_list("craftpreview", {}) + core.log("action", name.." clears "..player:get_player_name().."'s inventory") + return true, "Cleared "..player:get_player_name().."'s inventory." + else + return false, "Player must be online to clear inventory!" + end + end, +}) diff --git a/builtin/game/deprecated.lua b/builtin/game/deprecated.lua index cd1cf5e2d..1a9a96f2a 100644 --- a/builtin/game/deprecated.lua +++ b/builtin/game/deprecated.lua @@ -49,3 +49,24 @@ setmetatable(core.env, { function core.rollback_get_last_node_actor(pos, range, seconds) return core.rollback_get_node_actions(pos, range, seconds, 1)[1] end + +-- +-- core.setting_* +-- + +local settings = core.settings + +local function setting_proxy(name) + return function(...) + core.log("deprecated", "WARNING: minetest.setting_* ".. + "functions are deprecated. ".. + "Use methods on the minetest.settings object.") + return settings[name](settings, ...) + end +end + +core.setting_set = setting_proxy("set") +core.setting_get = setting_proxy("get") +core.setting_setbool = setting_proxy("set_bool") +core.setting_getbool = setting_proxy("get_bool") +core.setting_save = setting_proxy("write") diff --git a/builtin/game/falling.lua b/builtin/game/falling.lua index 4696ce481..b1beb1ab0 100644 --- a/builtin/game/falling.lua +++ b/builtin/game/falling.lua @@ -18,9 +18,11 @@ core.register_entity(":__builtin:falling_node", { }, node = {}, + meta = {}, - set_node = function(self, node) + set_node = function(self, node, meta) self.node = node + self.meta = meta or {} self.object:set_properties({ is_visible = true, textures = {node.name}, @@ -28,15 +30,21 @@ core.register_entity(":__builtin:falling_node", { end, get_staticdata = function(self) - return core.serialize(self.node) + local ds = { + node = self.node, + meta = self.meta, + } + return core.serialize(ds) end, on_activate = function(self, staticdata) self.object:set_armor_groups({immortal = 1}) - local node = core.deserialize(staticdata) - if node then - self:set_node(node) + local ds = core.deserialize(staticdata) + if ds and ds.node then + self:set_node(ds.node, ds.meta) + elseif ds then + self:set_node(ds) elseif staticdata ~= "" then self:set_node({name = staticdata}) end @@ -83,7 +91,7 @@ core.register_entity(":__builtin:falling_node", { -- it's drops if n2.name ~= "air" and (not nd or nd.liquidtype == "none") then core.remove_node(np) - if nd.buildable_to == false then + if nd and nd.buildable_to == false then -- Add dropped items local drops = core.get_node_drops(n2.name, "") for _, dropped_item in pairs(drops) do @@ -98,6 +106,10 @@ core.register_entity(":__builtin:falling_node", { -- Create node and remove entity if core.registered_nodes[self.node.name] then core.add_node(np, self.node) + if self.meta then + local meta = core.get_meta(np) + meta:from_table(self.meta) + end end self.object:remove() core.check_for_falling(np) @@ -111,11 +123,25 @@ core.register_entity(":__builtin:falling_node", { end }) -local function spawn_falling_node(p, node) +local function spawn_falling_node(p, node, meta) local obj = core.add_entity(p, "__builtin:falling_node") if obj then + obj:get_luaentity():set_node(node, meta) + end +end + +function core.spawn_falling_node(pos) + local node = core.get_node(pos) + if node.name == "air" or node.name == "ignore" then + return false + end + local obj = core.add_entity(pos, "__builtin:falling_node") + if obj then obj:get_luaentity():set_node(node) + core.remove_node(pos) + return true end + return false end local function drop_attached_node(p) @@ -134,7 +160,8 @@ end function builtin_shared.check_attached_node(p, n) local def = core.registered_nodes[n.name] local d = {x = 0, y = 0, z = 0} - if def.paramtype2 == "wallmounted" then + if def.paramtype2 == "wallmounted" or + def.paramtype2 == "colorwallmounted" then -- The fallback vector here is in case 'wallmounted to dir' is nil due -- to voxelmanip placing a wallmounted node without resetting a -- pre-existing param2 value that is out-of-range for wallmounted. @@ -174,8 +201,13 @@ function core.check_single_for_falling(p) (not d_bottom.walkable or d_bottom.buildable_to) then n.level = core.get_node_level(p) + local meta = core.get_meta(p) + local metatable = {} + if meta ~= nil then + metatable = meta:to_table() + end core.remove_node(p) - spawn_falling_node(p, n) + spawn_falling_node(p, n, metatable) return true end end diff --git a/builtin/game/features.lua b/builtin/game/features.lua index 2aad458da..ef85fbbc3 100644 --- a/builtin/game/features.lua +++ b/builtin/game/features.lua @@ -9,6 +9,8 @@ core.features = { no_legacy_abms = true, texture_names_parens = true, area_store_custom_ids = true, + add_entity_with_staticdata = true, + no_chat_message_prediction = true, } function core.has_feature(arg) diff --git a/builtin/game/forceloading.lua b/builtin/game/forceloading.lua index 8a05de36c..7c5537e85 100644 --- a/builtin/game/forceloading.lua +++ b/builtin/game/forceloading.lua @@ -40,7 +40,7 @@ function core.forceload_block(pos, transient) elseif other_table[hash] ~= nil then relevant_table[hash] = 1 else - if total_forceloaded >= (tonumber(core.setting_get("max_forceloaded_blocks")) or 16) then + if total_forceloaded >= (tonumber(core.settings:get("max_forceloaded_blocks")) or 16) then return false end total_forceloaded = total_forceloaded+1 diff --git a/builtin/game/init.lua b/builtin/game/init.lua index b5e2f7cca..e2635f07a 100644 --- a/builtin/game/init.lua +++ b/builtin/game/init.lua @@ -13,15 +13,17 @@ dofile(gamepath.."constants.lua") assert(loadfile(gamepath.."item.lua"))(builtin_shared) dofile(gamepath.."register.lua") -if core.setting_getbool("profiler.load") then +if core.settings:get_bool("profiler.load") then profiler = dofile(scriptpath.."profiler"..DIR_DELIM.."init.lua") end +dofile(commonpath .. "after.lua") dofile(gamepath.."item_entity.lua") dofile(gamepath.."deprecated.lua") dofile(gamepath.."misc.lua") dofile(gamepath.."privileges.lua") dofile(gamepath.."auth.lua") +dofile(commonpath .. "chatcommands.lua") dofile(gamepath.."chatcommands.lua") dofile(gamepath.."static_spawn.lua") dofile(gamepath.."detached_inventory.lua") diff --git a/builtin/game/item.lua b/builtin/game/item.lua index bf456a4e0..e36745f93 100644 --- a/builtin/game/item.lua +++ b/builtin/game/item.lua @@ -109,7 +109,7 @@ local facedir_to_dir_map = { 1, 4, 3, 2, } function core.facedir_to_dir(facedir) - return facedir_to_dir[facedir_to_dir_map[facedir]] + return facedir_to_dir[facedir_to_dir_map[facedir % 32]] end function core.dir_to_wallmounted(dir) @@ -144,11 +144,20 @@ local wallmounted_to_dir = { {x = 0, y = 0, z = -1}, } function core.wallmounted_to_dir(wallmounted) - return wallmounted_to_dir[wallmounted] + return wallmounted_to_dir[wallmounted % 8] +end + +function core.dir_to_yaw(dir) + return -math.atan2(dir.x, dir.z) +end + +function core.yaw_to_dir(yaw) + return {x = -math.sin(yaw), y = 0, z = math.cos(yaw)} end function core.get_node_drops(nodename, toolname) - local drop = ItemStack({name=nodename}):get_definition().drop + local def = core.registered_nodes[nodename] + local drop = def and def.drop if drop == nil then -- default drop return {nodename} @@ -197,7 +206,6 @@ function core.get_node_drops(nodename, toolname) end function core.item_place_node(itemstack, placer, pointed_thing, param2) - local item = itemstack:peek_item() local def = itemstack:get_definition() if def.type ~= "node" or pointed_thing.type ~= "node" then return itemstack, false @@ -207,20 +215,21 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2) local oldnode_under = core.get_node_or_nil(under) local above = pointed_thing.above local oldnode_above = core.get_node_or_nil(above) + local playername = placer:get_player_name() if not oldnode_under or not oldnode_above then - core.log("info", placer:get_player_name() .. " tried to place" + core.log("info", playername .. " tried to place" .. " node in unloaded position " .. core.pos_to_string(above)) return itemstack, false end - local olddef_under = ItemStack({name=oldnode_under.name}):get_definition() + local olddef_under = core.registered_nodes[oldnode_under.name] olddef_under = olddef_under or core.nodedef_default - local olddef_above = ItemStack({name=oldnode_above.name}):get_definition() + local olddef_above = core.registered_nodes[oldnode_above.name] olddef_above = olddef_above or core.nodedef_default if not olddef_above.buildable_to and not olddef_under.buildable_to then - core.log("info", placer:get_player_name() .. " tried to place" + core.log("info", playername .. " tried to place" .. " node in invalid position " .. core.pos_to_string(above) .. ", replacing " .. oldnode_above.name) return itemstack, false @@ -235,17 +244,17 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2) place_to = {x = under.x, y = under.y, z = under.z} end - if core.is_protected(place_to, placer:get_player_name()) and + if core.is_protected(place_to, playername) and not minetest.check_player_privs(placer, "protection_bypass") then - core.log("action", placer:get_player_name() + core.log("action", playername .. " tried to place " .. def.name .. " at protected position " .. core.pos_to_string(place_to)) - core.record_protection_violation(place_to, placer:get_player_name()) + core.record_protection_violation(place_to, playername) return itemstack end - core.log("action", placer:get_player_name() .. " places node " + core.log("action", playername .. " places node " .. def.name .. " at " .. core.pos_to_string(place_to)) local oldnode = core.get_node(place_to) @@ -254,7 +263,8 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2) -- Calculate direction for wall mounted stuff like torches and signs if def.place_param2 ~= nil then newnode.param2 = def.place_param2 - elseif def.paramtype2 == 'wallmounted' and not param2 then + elseif (def.paramtype2 == "wallmounted" or + def.paramtype2 == "colorwallmounted") and not param2 then local dir = { x = under.x - above.x, y = under.y - above.y, @@ -262,7 +272,8 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2) } newnode.param2 = core.dir_to_wallmounted(dir) -- Calculate the direction for furnaces and chests and stuff - elseif def.paramtype2 == 'facedir' and not param2 then + elseif (def.paramtype2 == "facedir" or + def.paramtype2 == "colorfacedir") and not param2 then local placer_pos = placer:getpos() if placer_pos then local dir = { @@ -300,7 +311,6 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2) end -- Run script hook - local _, callback for _, callback in ipairs(core.registered_on_placenodes) do -- Deepcopy pos, node and pointed_thing because callback can modify them local place_to_copy = {x=place_to.x, y=place_to.y, z=place_to.z} @@ -441,8 +451,9 @@ function core.handle_node_drops(pos, drops, digger) end function core.node_dig(pos, node, digger) - local def = ItemStack({name=node.name}):get_definition() - if not def.diggable or (def.can_dig and not def.can_dig(pos,digger)) then + local def = core.registered_nodes[node.name] + if def and (not def.diggable or + (def.can_dig and not def.can_dig(pos, digger))) then core.log("info", digger:get_player_name() .. " tried to dig " .. node.name .. " which is not diggable " .. core.pos_to_string(pos)) @@ -467,12 +478,12 @@ function core.node_dig(pos, node, digger) local wdef = wielded:get_definition() local tp = wielded:get_tool_capabilities() - local dp = core.get_dig_params(def.groups, tp) + local dp = core.get_dig_params(def and def.groups, tp) if wdef and wdef.after_use then wielded = wdef.after_use(wielded, digger, node, dp) or wielded else -- Wear out tool - if not core.setting_getbool("creative_mode") then + if not core.settings:get_bool("creative_mode") then wielded:add_wear(dp.wear) if wielded:get_count() == 0 and wdef.sound and wdef.sound.breaks then core.sound_play(wdef.sound.breaks, {pos = pos, gain = 0.5}) @@ -485,7 +496,7 @@ function core.node_dig(pos, node, digger) core.handle_node_drops(pos, drops, digger) local oldmetadata = nil - if def.after_dig_node then + if def and def.after_dig_node then oldmetadata = core.get_meta(pos):to_table() end @@ -493,7 +504,7 @@ function core.node_dig(pos, node, digger) core.remove_node(pos) -- Run callback - if def.after_dig_node then + if def and def.after_dig_node then -- Copy pos and node because callback can modify them local pos_copy = {x=pos.x, y=pos.y, z=pos.z} local node_copy = {name=node.name, param1=node.param1, param2=node.param2} diff --git a/builtin/game/item_entity.lua b/builtin/game/item_entity.lua index be158c119..c0e36be2d 100644 --- a/builtin/game/item_entity.lua +++ b/builtin/game/item_entity.lua @@ -14,7 +14,7 @@ end -- If item_entity_ttl is not set, enity will have default life time -- Setting it to -1 disables the feature -local time_to_live = tonumber(core.setting_get("item_entity_ttl")) +local time_to_live = tonumber(core.settings:get("item_entity_ttl")) if not time_to_live then time_to_live = 900 end @@ -53,6 +53,8 @@ core.register_entity(":__builtin:item", { if itemtable then itemname = stack:to_table().name end + -- Backwards compatibility: old clients use the texture + -- to get the type of the item local item_texture = nil local item_type = "" if core.registered_items[itemname] then @@ -66,6 +68,7 @@ core.register_entity(":__builtin:item", { visual_size = {x = s, y = s}, collisionbox = {-c, -c, -c, c, c, c}, automatic_rotate = math.pi * 0.5, + wield_item = itemstring, } self.object:set_properties(prop) end, @@ -101,31 +104,39 @@ core.register_entity(":__builtin:item", { self:set_item(self.itemstring) end, + -- moves items from this stack to an other stack try_merge_with = function(self, own_stack, object, obj) + -- other item's stack local stack = ItemStack(obj.itemstring) - if own_stack:get_name() == stack:get_name() and stack:get_free_space() > 0 then + -- only merge if items are the same + if own_stack:get_name() == stack:get_name() and + own_stack:get_meta() == stack:get_meta() and + own_stack:get_wear() == stack:get_wear() and + stack:get_free_space() > 0 then local overflow = false local count = stack:get_count() + own_stack:get_count() local max_count = stack:get_stack_max() if count > max_count then overflow = true + stack:set_count(max_count) count = count - max_count + own_stack:set_count(count) else self.itemstring = '' + stack:set_count(count) end local pos = object:getpos() pos.y = pos.y + (count - stack:get_count()) / max_count * 0.15 object:moveto(pos, false) local s, c - local max_count = stack:get_stack_max() - local name = stack:get_name() if not overflow then - obj.itemstring = name .. " " .. count + obj.itemstring = stack:to_string() s = 0.2 + 0.1 * (count / max_count) c = s object:set_properties({ visual_size = {x = s, y = s}, - collisionbox = {-c, -c, -c, c, c, c} + collisionbox = {-c, -c, -c, c, c, c}, + wield_item = obj.itemstring }) self.object:remove() -- merging succeeded @@ -133,18 +144,20 @@ core.register_entity(":__builtin:item", { else s = 0.4 c = 0.3 + obj.itemstring = stack:to_string() object:set_properties({ visual_size = {x = s, y = s}, - collisionbox = {-c, -c, -c, c, c, c} + collisionbox = {-c, -c, -c, c, c, c}, + wield_item = obj.itemstring }) - obj.itemstring = name .. " " .. max_count s = 0.2 + 0.1 * (count / max_count) c = s + self.itemstring = own_stack:to_string() self.object:set_properties({ visual_size = {x = s, y = s}, - collisionbox = {-c, -c, -c, c, c, c} + collisionbox = {-c, -c, -c, c, c, c}, + wield_item = self.itemstring }) - self.itemstring = name .. " " .. count end end -- merging didn't succeed diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua index 7caa9e7ba..bfe407b9d 100644 --- a/builtin/game/misc.lua +++ b/builtin/game/misc.lua @@ -4,50 +4,6 @@ -- Misc. API functions -- -local jobs = {} -local time = 0.0 -local last = core.get_us_time() / 1000000 - -core.register_globalstep(function(dtime) - local new = core.get_us_time() / 1000000 - if new > last then - time = time + (new - last) - else - -- Overflow, we may lose a little bit of time here but - -- only 1 tick max, potentially running timers slightly - -- too early. - time = time + new - end - last = new - - if #jobs < 1 then - return - end - - -- Iterate backwards so that we miss any new timers added by - -- a timer callback, and so that we don't skip the next timer - -- in the list if we remove one. - for i = #jobs, 1, -1 do - local job = jobs[i] - if time >= job.expire then - core.set_last_run_mod(job.mod_origin) - job.func(unpack(job.arg)) - table.remove(jobs, i) - end - end -end) - -function core.after(after, func, ...) - assert(tonumber(after) and type(func) == "function", - "Invalid core.after invocation") - jobs[#jobs + 1] = { - func = func, - expire = time + after, - arg = {...}, - mod_origin = core.get_last_run_mod() - } -end - function core.check_player_privs(name, ...) local arg_type = type(name) if (arg_type == "userdata" or arg_type == "table") and @@ -56,11 +12,11 @@ function core.check_player_privs(name, ...) elseif arg_type ~= "string" then error("Invalid core.check_player_privs argument type: " .. arg_type, 2) end - + local requested_privs = {...} local player_privs = core.get_player_privs(name) local missing_privileges = {} - + if type(requested_privs[1]) == "table" then -- We were provided with a table like { privA = true, privB = true }. for priv, value in pairs(requested_privs[1]) do @@ -76,11 +32,11 @@ function core.check_player_privs(name, ...) end end end - + if #missing_privileges > 0 then return false, missing_privileges end - + return true, "" end @@ -114,6 +70,10 @@ function core.get_connected_players() return temp_table end +function minetest.player_exists(name) + return minetest.get_auth_handler().get_auth(name) ~= nil +end + -- Returns two position vectors representing a box of `radius` in each -- direction centered around the player corresponding to `player_name` function core.get_player_radius_area(player_name, radius) @@ -161,7 +121,7 @@ function core.get_node_group(name, group) end function core.setting_get_pos(name) - local value = core.setting_get(name) + local value = core.settings:get(name) if not value then return nil end @@ -210,38 +170,11 @@ function core.http_add_fetch(httpenv) return httpenv end -if minetest.setting_getbool("disable_escape_sequences") then - - function core.get_color_escape_sequence(color) - return "" - end - - function core.get_background_escape_sequence(color) - return "" - end - - function core.colorize(color, message) - return message - end - -else - - local ESCAPE_CHAR = string.char(0x1b) - function core.get_color_escape_sequence(color) - return ESCAPE_CHAR .. "(c@" .. color .. ")" - end - - function core.get_background_escape_sequence(color) - return ESCAPE_CHAR .. "(b@" .. color .. ")" - end - - function core.colorize(color, message) - return core.get_color_escape_sequence(color) .. message .. core.get_color_escape_sequence("#ffffff") - end - -end - function core.close_formspec(player_name, formname) return minetest.show_formspec(player_name, formname, "") end +function core.cancel_shutdown_requests() + core.request_shutdown("", false, -1) +end + diff --git a/builtin/game/register.lua b/builtin/game/register.lua index 90f095e9f..ec6f28097 100644 --- a/builtin/game/register.lua +++ b/builtin/game/register.lua @@ -331,8 +331,8 @@ core.register_item(":unknown", { core.register_node(":air", { description = "Air (you hacker you!)", - inventory_image = "unknown_node.png", - wield_image = "unknown_node.png", + inventory_image = "air.png", + wield_image = "air.png", drawtype = "airlike", paramtype = "light", sunlight_propagates = true, @@ -348,8 +348,8 @@ core.register_node(":air", { core.register_node(":ignore", { description = "Ignore (you hacker you!)", - inventory_image = "unknown_node.png", - wield_image = "unknown_node.png", + inventory_image = "ignore.png", + wield_image = "ignore.png", drawtype = "airlike", paramtype = "none", sunlight_propagates = false, diff --git a/builtin/game/statbars.lua b/builtin/game/statbars.lua index 61a8b9077..6aa106140 100644 --- a/builtin/game/statbars.lua +++ b/builtin/game/statbars.lua @@ -1,3 +1,5 @@ +-- cache setting +local enable_damage = core.settings:get_bool("enable_damage") local health_bar_definition = { @@ -42,9 +44,8 @@ local function initialize_builtin_statbars(player) player:hud_set_flags(player:hud_get_flags()) end - if player:hud_get_flags().healthbar and - core.is_yes(core.setting_get("enable_damage")) then - if hud_ids[name].id_healthbar == nil then + if player:hud_get_flags().healthbar and enable_damage then + if hud_ids[name].id_healthbar == nil then health_bar_definition.number = player:get_hp() hud_ids[name].id_healthbar = player:hud_add(health_bar_definition) end @@ -56,8 +57,7 @@ local function initialize_builtin_statbars(player) end if (player:get_breath() < 11) then - if player:hud_get_flags().breathbar and - core.is_yes(core.setting_get("enable_damage")) then + if player:hud_get_flags().breathbar and enable_damage then if hud_ids[name].id_breathbar == nil then hud_ids[name].id_breathbar = player:hud_add(breath_bar_definition) end diff --git a/builtin/game/static_spawn.lua b/builtin/game/static_spawn.lua index 100334226..b1157b42e 100644 --- a/builtin/game/static_spawn.lua +++ b/builtin/game/static_spawn.lua @@ -1,10 +1,10 @@ -- Minetest: builtin/static_spawn.lua local function warn_invalid_static_spawnpoint() - if core.setting_get("static_spawnpoint") and + if core.settings:get("static_spawnpoint") and not core.setting_get_pos("static_spawnpoint") then core.log("error", "The static_spawnpoint setting is invalid: \"".. - core.setting_get("static_spawnpoint").."\"") + core.settings:get("static_spawnpoint").."\"") end end diff --git a/builtin/init.lua b/builtin/init.lua index 4400a19d6..356e119fb 100644 --- a/builtin/init.lua +++ b/builtin/init.lua @@ -27,6 +27,7 @@ minetest = core -- Load other files local scriptdir = core.get_builtin_path() .. DIR_DELIM local gamepath = scriptdir .. "game" .. DIR_DELIM +local clientpath = scriptdir .. "client" .. DIR_DELIM local commonpath = scriptdir .. "common" .. DIR_DELIM local asyncpath = scriptdir .. "async" .. DIR_DELIM @@ -37,15 +38,17 @@ dofile(commonpath .. "misc_helpers.lua") if INIT == "game" then dofile(gamepath .. "init.lua") elseif INIT == "mainmenu" then - local mainmenuscript = core.setting_get("main_menu_script") - if mainmenuscript ~= nil and mainmenuscript ~= "" then - dofile(mainmenuscript) + local mm_script = core.settings:get("main_menu_script") + if mm_script and mm_script ~= "" then + dofile(mm_script) else dofile(core.get_mainmenu_path() .. DIR_DELIM .. "init.lua") end elseif INIT == "async" then dofile(asyncpath .. "init.lua") +elseif INIT == "client" then + os.setlocale = nil + dofile(clientpath .. "init.lua") else error(("Unrecognized builtin initialization type %s!"):format(tostring(INIT))) end - diff --git a/builtin/mainmenu/common.lua b/builtin/mainmenu/common.lua index da3667828..fa7ae583b 100644 --- a/builtin/mainmenu/common.lua +++ b/builtin/mainmenu/common.lua @@ -43,10 +43,10 @@ end local function configure_selected_world_params(idx) local worldconfig = modmgr.get_worldconfig(menudata.worldlist:get_list()[idx].path) if worldconfig.creative_mode then - core.setting_set("creative_mode", worldconfig.creative_mode) + core.settings:set("creative_mode", worldconfig.creative_mode) end if worldconfig.enable_damage then - core.setting_set("enable_damage", worldconfig.enable_damage) + core.settings:set("enable_damage", worldconfig.enable_damage) end end @@ -54,7 +54,12 @@ end function image_column(tooltip, flagname) return "image,tooltip=" .. core.formspec_escape(tooltip) .. "," .. "0=" .. core.formspec_escape(defaulttexturedir .. "blank.png") .. "," .. - "1=" .. core.formspec_escape(defaulttexturedir .. "server_flags_" .. flagname .. ".png") + "1=" .. core.formspec_escape(defaulttexturedir .. + (flagname and "server_flags_" .. flagname .. ".png" or "blank.png")) .. "," .. + "2=" .. core.formspec_escape(defaulttexturedir .. "server_ping_4.png") .. "," .. + "3=" .. core.formspec_escape(defaulttexturedir .. "server_ping_3.png") .. "," .. + "4=" .. core.formspec_escape(defaulttexturedir .. "server_ping_2.png") .. "," .. + "5=" .. core.formspec_escape(defaulttexturedir .. "server_ping_1.png") end -------------------------------------------------------------------------------- @@ -77,7 +82,7 @@ function order_favorite_list(list) end -------------------------------------------------------------------------------- -function render_favorite(spec, is_favorite) +function render_serverlist_row(spec, is_favorite) local text = "" if spec.name then text = text .. core.formspec_escape(spec.name:trim()) @@ -97,6 +102,21 @@ function render_favorite(spec, is_favorite) details = "0," end + if spec.ping then + local ping = spec.ping * 1000 + if ping <= 50 then + details = details .. "2," + elseif ping <= 100 then + details = details .. "3," + elseif ping <= 250 then + details = details .. "4," + else + details = details .. "5," + end + else + details = details .. "0," + end + if spec.clients and spec.clients_max then local clients_color = '' local clients_percent = 100 * spec.clients / spec.clients_max @@ -144,8 +164,8 @@ end -------------------------------------------------------------------------------- os.tempfolder = function() - if core.setting_get("TMPFolder") then - return core.setting_get("TMPFolder") .. DIR_DELIM .. "MT_" .. math.random(0,10000) + if core.settings:get("TMPFolder") then + return core.settings:get("TMPFolder") .. DIR_DELIM .. "MT_" .. math.random(0,10000) end local filetocheck = os.tmpname() @@ -186,7 +206,7 @@ function menu_handle_key_up_down(fields, textlist, settingname) oldidx < menudata.worldlist:size() then newidx = oldidx + 1 end - core.setting_set(settingname, menudata.worldlist:get_raw_index(newidx)) + core.settings:set(settingname, menudata.worldlist:get_raw_index(newidx)) configure_selected_world_params(newidx) return true end @@ -230,7 +250,7 @@ end -------------------------------------------------------------------------------- function text2textlist(xpos, ypos, width, height, tl_name, textlen, text, transparency) - local textlines = core.splittext(text, textlen) + local textlines = core.wrap_text(text, textlen) local retval = "textlist[" .. xpos .. "," .. ypos .. ";" .. width .. "," .. height .. ";" .. tl_name .. ";" @@ -308,9 +328,9 @@ function menu_worldmt_legacy(selected) for _, mode_name in pairs(modes_names) do local mode_val = menu_worldmt(selected, mode_name) if mode_val then - core.setting_set(mode_name, mode_val) + core.settings:set(mode_name, mode_val) else - menu_worldmt(selected, mode_name, core.setting_get(mode_name)) + menu_worldmt(selected, mode_name, core.settings:get(mode_name)) end end end diff --git a/builtin/mainmenu/dlg_config_world.lua b/builtin/mainmenu/dlg_config_world.lua index 7b3ab9852..fcedadea8 100644 --- a/builtin/mainmenu/dlg_config_world.lua +++ b/builtin/mainmenu/dlg_config_world.lua @@ -17,14 +17,13 @@ -------------------------------------------------------------------------------- -local enabled_all = false +local enabled_all = false local function modname_valid(name) return not name:find("[^a-z0-9_]") end local function get_formspec(data) - local mod = data.list:get_list()[data.selected_mod] local retval = @@ -32,24 +31,12 @@ local function get_formspec(data) "label[0.5,0;" .. fgettext("World:") .. "]" .. "label[1.75,0;" .. data.worldspec.name .. "]" - if data.hide_gamemods then - retval = retval .. "checkbox[1,6;cb_hide_gamemods;" .. fgettext("Hide Game") .. ";true]" - else - retval = retval .. "checkbox[1,6;cb_hide_gamemods;" .. fgettext("Hide Game") .. ";false]" - end - - if data.hide_modpackcontents then - retval = retval .. "checkbox[6,6;cb_hide_mpcontent;" .. fgettext("Hide mp content") .. ";true]" - else - retval = retval .. "checkbox[6,6;cb_hide_mpcontent;" .. fgettext("Hide mp content") .. ";false]" - end - if mod == nil then mod = {name=""} end local hard_deps, soft_deps = modmgr.get_dependencies(mod.path) - + retval = retval .. "label[0,0.7;" .. fgettext("Mod:") .. "]" .. "label[0.75,0.7;" .. mod.name .. "]" .. @@ -62,41 +49,45 @@ local function get_formspec(data) "button[3.25,7;2.5,0.5;btn_config_world_save;" .. fgettext("Save") .. "]" .. "button[5.75,7;2.5,0.5;btn_config_world_cancel;" .. fgettext("Cancel") .. "]" - if mod ~= nil and mod.name ~= "" and mod.typ ~= "game_mod" then + if mod and mod.name ~= "" and not mod.is_game_content then if mod.is_modpack then local rawlist = data.list:get_raw_list() local all_enabled = true - for j=1,#rawlist,1 do - if rawlist[j].modpack == mod.name and - rawlist[j].enabled ~= true then - all_enabled = false - break + for j = 1, #rawlist, 1 do + if rawlist[j].modpack == mod.name and not rawlist[j].enabled then + all_enabled = false + break end end - if all_enabled == false then - retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_enable;" .. fgettext("Enable MP") .. "]" + if all_enabled then + retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_disable;" .. + fgettext("Disable MP") .. "]" else - retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_disable;" .. fgettext("Disable MP") .. "]" + retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_enable;" .. + fgettext("Enable MP") .. "]" end else if mod.enabled then - retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. fgettext("enabled") .. ";true]" + retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. + fgettext("enabled") .. ";true]" else - retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. fgettext("enabled") .. ";false]" + retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. + fgettext("enabled") .. ";false]" end end end - if enabled_all then + if enabled_all then retval = retval .. - "button[8.75,0.125;2.5,0.5;btn_disable_all_mods;" .. fgettext("Disable all") .. "]" .. - "textlist[5.5,0.75;5.75,5.4;world_config_modlist;" + "button[8.75,0.125;2.5,0.5;btn_disable_all_mods;" .. fgettext("Disable all") .. "]" else retval = retval .. - "button[8.75,0.125;2.5,0.5;btn_enable_all_mods;" .. fgettext("Enable all") .. "]" .. - "textlist[5.5,0.75;5.75,5.4;world_config_modlist;" + "button[8.75,0.125;2.5,0.5;btn_enable_all_mods;" .. fgettext("Enable all") .. "]" end + retval = retval .. + "tablecolumns[color;tree;text]" .. + "table[5.5,0.75;5.75,6;world_config_modlist;" retval = retval .. modmgr.render_modlist(data.list) retval = retval .. ";" .. data.selected_mod .."]" @@ -106,7 +97,7 @@ end local function enable_mod(this, toset) local mod = this.data.list:get_list()[this.data.selected_mod] - if mod.typ == "game_mod" then + if mod.is_game_content then -- game mods can't be enabled or disabled elseif not mod.is_modpack then if toset == nil then @@ -129,16 +120,15 @@ end local function handle_buttons(this, fields) - if fields["world_config_modlist"] ~= nil then - local event = core.explode_textlist_event(fields["world_config_modlist"]) - this.data.selected_mod = event.index - core.setting_set("world_config_selected_mod", event.index) + local event = core.explode_table_event(fields["world_config_modlist"]) + this.data.selected_mod = event.row + core.settings:set("world_config_selected_mod", event.row) if event.type == "DCL" then enable_mod(this) end - + return true end @@ -160,44 +150,7 @@ local function handle_buttons(this, fields) return true end - if fields["cb_hide_gamemods"] ~= nil or - fields["cb_hide_mpcontent"] ~= nil then - local current = this.data.list:get_filtercriteria() - - if current == nil then - current = {} - end - - if fields["cb_hide_gamemods"] ~= nil then - if core.is_yes(fields["cb_hide_gamemods"]) then - current.hide_game = true - this.data.hide_gamemods = true - core.setting_set("world_config_hide_gamemods", "true") - else - current.hide_game = false - this.data.hide_gamemods = false - core.setting_set("world_config_hide_gamemods", "false") - end - end - - if fields["cb_hide_mpcontent"] ~= nil then - if core.is_yes(fields["cb_hide_mpcontent"]) then - current.hide_modpackcontents = true - this.data.hide_modpackcontents = true - core.setting_set("world_config_hide_modpackcontents", "true") - else - current.hide_modpackcontents = false - this.data.hide_modpackcontents = false - core.setting_set("world_config_hide_modpackcontents", "false") - end - end - - this.data.list:set_filtercriteria(current) - return true - end - if fields["btn_config_world_save"] then - local filename = this.data.worldspec.path .. DIR_DELIM .. "world.mt" @@ -209,7 +162,7 @@ local function handle_buttons(this, fields) local i,mod for i,mod in ipairs(rawlist) do if not mod.is_modpack and - mod.typ ~= "game_mod" then + not mod.is_game_content then if modname_valid(mod.name) then worldfile:set("load_mod_"..mod.name, tostring(mod.enabled)) else @@ -231,7 +184,7 @@ local function handle_buttons(this, fields) if not worldfile:write() then core.log("error", "Failed to write world config file") end - + this:delete() return true end @@ -245,19 +198,21 @@ local function handle_buttons(this, fields) local list = this.data.list:get_raw_list() for i = 1, #list do - if list[i].typ ~= "game_mod" and not list[i].is_modpack then + if not list[i].is_game_content + and not list[i].is_modpack then list[i].enabled = true end end enabled_all = true return true end - + if fields.btn_disable_all_mods then local list = this.data.list:get_raw_list() for i = 1, #list do - if list[i].typ ~= "game_mod" and not list[i].is_modpack then + if not list[i].is_game_content + and not list[i].is_modpack then list[i].enabled = false end end @@ -269,15 +224,12 @@ local function handle_buttons(this, fields) end function create_configure_world_dlg(worldidx) - local dlg = dialog_create("sp_config_world", get_formspec, handle_buttons, nil) - dlg.data.hide_gamemods = core.setting_getbool("world_config_hide_gamemods") - dlg.data.hide_modpackcontents = core.setting_getbool("world_config_hide_modpackcontents") - dlg.data.selected_mod = tonumber(core.setting_get("world_config_selected_mod")) + dlg.data.selected_mod = tonumber(core.settings:get("world_config_selected_mod")) if dlg.data.selected_mod == nil then dlg.data.selected_mod = 0 end @@ -286,14 +238,14 @@ function create_configure_world_dlg(worldidx) if dlg.data.worldspec == nil then dlg:delete() return nil end dlg.data.worldconfig = modmgr.get_worldconfig(dlg.data.worldspec.path) - + if dlg.data.worldconfig == nil or dlg.data.worldconfig.id == nil or dlg.data.worldconfig.id == "" then dlg:delete() return nil end - + dlg.data.list = filterlist.create( modmgr.preparemodlist, --refresh modmgr.comparemod, --compare @@ -302,16 +254,16 @@ function create_configure_world_dlg(worldidx) return true end end, - function(element,criteria) + function(element, criteria) if criteria.hide_game and - element.typ == "game_mod" then - return false + element.is_game_content then + return false end if criteria.hide_modpackcontents and - element.modpack ~= nil then - return false - end + element.modpack ~= nil then + return false + end return true end, --filter { worldpath= dlg.data.worldspec.path, diff --git a/builtin/mainmenu/dlg_create_world.lua b/builtin/mainmenu/dlg_create_world.lua index 477b8bcb9..e9ca7799f 100644 --- a/builtin/mainmenu/dlg_create_world.lua +++ b/builtin/mainmenu/dlg_create_world.lua @@ -18,8 +18,8 @@ local function create_world_formspec(dialogdata) local mapgens = core.get_mapgen_names() - local current_seed = core.setting_get("fixed_map_seed") or "" - local current_mg = core.setting_get("mg_name") + local current_seed = core.settings:get("fixed_map_seed") or "" + local current_mg = core.settings:get("mg_name") local mglist = "" local selindex = 1 @@ -33,7 +33,7 @@ local function create_world_formspec(dialogdata) end mglist = mglist:sub(1, -2) - local gameid = core.setting_get("menu_last_game") + local gameid = core.settings:get("menu_last_game") local game, gameidx = nil , 0 if gameid ~= nil then @@ -90,10 +90,10 @@ local function create_world_buttonhandler(this, fields) local message = nil - core.setting_set("fixed_map_seed", fields["te_seed"]) + core.settings:set("fixed_map_seed", fields["te_seed"]) if not menudata.worldlist:uid_exists_raw(worldname) then - core.setting_set("mg_name",fields["dd_mapgen"]) + core.settings:set("mg_name",fields["dd_mapgen"]) message = core.create_world(worldname,gameindex) else message = fgettext("A world named \"$1\" already exists", worldname) @@ -102,13 +102,13 @@ local function create_world_buttonhandler(this, fields) if message ~= nil then gamedata.errormessage = message else - core.setting_set("menu_last_game",gamemgr.games[gameindex].id) + core.settings:set("menu_last_game",gamemgr.games[gameindex].id) if this.data.update_worldlist_filter then menudata.worldlist:set_filtercriteria(gamemgr.games[gameindex].id) mm_texture.update("singleplayer", gamemgr.games[gameindex].id) end menudata.worldlist:refresh() - core.setting_set("mainmenu_last_selected_world", + core.settings:set("mainmenu_last_selected_world", menudata.worldlist:raw_index_by_uid(worldname)) end else diff --git a/builtin/mainmenu/dlg_settings_advanced.lua b/builtin/mainmenu/dlg_settings_advanced.lua index b0d923768..206ce1620 100644 --- a/builtin/mainmenu/dlg_settings_advanced.lua +++ b/builtin/mainmenu/dlg_settings_advanced.lua @@ -344,11 +344,86 @@ local function parse_config_file(read_all, parse_mods) return settings end -local settings = parse_config_file(false, true) +local function filter_settings(settings, searchstring) + if not searchstring or searchstring == "" then + return settings, -1 + end + + -- Setup the keyword list + local keywords = {} + for word in searchstring:lower():gmatch("%S+") do + table.insert(keywords, word) + end + + local result = {} + local category_stack = {} + local current_level = 0 + local best_setting = nil + for _, entry in pairs(settings) do + if entry.type == "category" then + -- Remove all settingless categories + while #category_stack > 0 and entry.level <= current_level do + table.remove(category_stack, #category_stack) + if #category_stack > 0 then + current_level = category_stack[#category_stack].level + else + current_level = 0 + end + end + + -- Push category onto stack + category_stack[#category_stack + 1] = entry + current_level = entry.level + else + -- See if setting matches keywords + local setting_score = 0 + for k = 1, #keywords do + local keyword = keywords[k] + + if string.find(entry.name:lower(), keyword, 1, true) then + setting_score = setting_score + 1 + end + + if entry.readable_name and + string.find(fgettext(entry.readable_name):lower(), keyword, 1, true) then + setting_score = setting_score + 1 + end + + if entry.comment and + string.find(fgettext_ne(entry.comment):lower(), keyword, 1, true) then + setting_score = setting_score + 1 + end + end + + -- Add setting to results if match + if setting_score > 0 then + -- Add parent categories + for _, category in pairs(category_stack) do + result[#result + 1] = category + end + category_stack = {} + + -- Add setting + result[#result + 1] = entry + entry.score = setting_score + + if not best_setting or + setting_score > result[best_setting].score then + best_setting = #result + end + end + end + end + return result, best_setting or -1 +end + +local full_settings = parse_config_file(false, true) +local search_string = "" +local settings = full_settings local selected_setting = 1 local function get_current_value(setting) - local value = core.setting_get(setting.name) + local value = core.settings:get(setting.name) if value == nil then value = setting.default end @@ -464,11 +539,11 @@ local function handle_change_setting_buttons(this, fields) if setting.type == "bool" then local new_value = fields["dd_setting_value"] -- Note: new_value is the actual (translated) value shown in the dropdown - core.setting_setbool(setting.name, new_value == fgettext("Enabled")) + core.settings:set_bool(setting.name, new_value == fgettext("Enabled")) elseif setting.type == "enum" then local new_value = fields["dd_setting_value"] - core.setting_set(setting.name, new_value) + core.settings:set(setting.name, new_value) elseif setting.type == "int" then local new_value = tonumber(fields["te_setting_value"]) @@ -490,7 +565,7 @@ local function handle_change_setting_buttons(this, fields) core.update_formspec(this:get_formspec()) return true end - core.setting_set(setting.name, new_value) + core.settings:set(setting.name, new_value) elseif setting.type == "float" then local new_value = tonumber(fields["te_setting_value"]) @@ -500,7 +575,7 @@ local function handle_change_setting_buttons(this, fields) core.update_formspec(this:get_formspec()) return true end - core.setting_set(setting.name, new_value) + core.settings:set(setting.name, new_value) elseif setting.type == "flags" then local new_value = fields["te_setting_value"] @@ -514,13 +589,13 @@ local function handle_change_setting_buttons(this, fields) return true end end - core.setting_set(setting.name, new_value) + core.settings:set(setting.name, new_value) else local new_value = fields["te_setting_value"] - core.setting_set(setting.name, new_value) + core.settings:set(setting.name, new_value) end - core.setting_save() + core.settings:write() this:delete() return true end @@ -544,14 +619,17 @@ end local function create_settings_formspec(tabview, name, tabdata) local formspec = "size[12,6.5;true]" .. - "tablecolumns[color;tree;text;text]" .. + "tablecolumns[color;tree;text,width=32;text]" .. "tableoptions[background=#00000000;border=false]" .. - "table[0,0;12,5.5;list_settings;" + "field[0.3,0.1;10.2,1;search_string;;" .. core.formspec_escape(search_string) .. "]" .. + "field_close_on_enter[search_string;false]" .. + "button[10.2,-0.2;2,1;search;" .. fgettext("Search") .. "]" .. + "table[0,0.8;12,4.5;list_settings;" local current_level = 0 for _, entry in ipairs(settings) do local name - if not core.setting_getbool("main_menu_technical_settings") and entry.readable_name then + if not core.settings:get_bool("main_menu_technical_settings") and entry.readable_name then name = fgettext_ne(entry.readable_name) else name = entry.name @@ -588,7 +666,7 @@ local function create_settings_formspec(tabview, name, tabdata) "button[10,6;2,1;btn_edit;" .. fgettext("Edit") .. "]" .. "button[7,6;3,1;btn_restore;" .. fgettext("Restore Default") .. "]" .. "checkbox[0,5.3;cb_tech_settings;" .. fgettext("Show technical names") .. ";" - .. dump(core.setting_getbool("main_menu_technical_settings")) .. "]" + .. dump(core.settings:get_bool("main_menu_technical_settings")) .. "]" return formspec end @@ -597,13 +675,13 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) local list_enter = false if fields["list_settings"] then selected_setting = core.get_table_index("list_settings") - if core.explode_table_event(fields["list_settings"]).type == "DCL" then + if core.explode_table_event(fields["list_settings"]).type == "DCL" then -- Directly toggle booleans local setting = settings[selected_setting] - if setting.type == "bool" then + if setting and setting.type == "bool" then local current_value = get_current_value(setting) - core.setting_setbool(setting.name, not core.is_yes(current_value)) - core.setting_save() + core.settings:set_bool(setting.name, not core.is_yes(current_value)) + core.settings:write() return true else list_enter = true @@ -613,9 +691,39 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) end end + if fields.search or fields.key_enter_field == "search_string" then + if search_string == fields.search_string then + if selected_setting > 0 then + -- Go to next result on enter press + local i = selected_setting + 1 + local looped = false + while i > #settings or settings[i].type == "category" do + i = i + 1 + if i > #settings then + -- Stop infinte looping + if looped then + return false + end + i = 1 + looped = true + end + end + selected_setting = i + core.update_formspec(this:get_formspec()) + return true + end + else + -- Search for setting + search_string = fields.search_string + settings, selected_setting = filter_settings(full_settings, search_string) + core.update_formspec(this:get_formspec()) + end + return true + end + if fields["btn_edit"] or list_enter then local setting = settings[selected_setting] - if setting.type ~= "category" then + if setting and setting.type ~= "category" then local edit_dialog = dialog_create("change_setting", create_change_setting_formspec, handle_change_setting_buttons) edit_dialog:set_parent(this) @@ -627,9 +735,9 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) if fields["btn_restore"] then local setting = settings[selected_setting] - if setting.type ~= "category" then - core.setting_set(setting.name, setting.default) - core.setting_save() + if setting and setting.type ~= "category" then + core.settings:set(setting.name, setting.default) + core.settings:write() core.update_formspec(this:get_formspec()) end return true @@ -641,8 +749,8 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) end if fields["cb_tech_settings"] then - core.setting_set("main_menu_technical_settings", fields["cb_tech_settings"]) - core.setting_save() + core.settings:set("main_menu_technical_settings", fields["cb_tech_settings"]) + core.settings:write() core.update_formspec(this:get_formspec()) return true end @@ -661,10 +769,4 @@ end -- Generate minetest.conf.example and settings_translation_file.cpp --- *** Please note *** --- There is text in minetest.conf.example that will not be generated from --- settingtypes.txt but must be preserved: --- The documentation of mapgen noise parameter formats (title plus 16 lines) --- Noise parameter 'mgv5_np_ground' in group format (13 lines) - ---assert(loadfile(core.get_mainmenu_path()..DIR_DELIM.."generate_from_settingtypes.lua"))(parse_config_file(true, false)) +--assert(loadfile(core.get_builtin_path()..DIR_DELIM.."mainmenu"..DIR_DELIM.."generate_from_settingtypes.lua"))(parse_config_file(true, false)) diff --git a/builtin/mainmenu/gamemgr.lua b/builtin/mainmenu/gamemgr.lua index b6faa71d9..fd6025fcd 100644 --- a/builtin/mainmenu/gamemgr.lua +++ b/builtin/mainmenu/gamemgr.lua @@ -68,10 +68,10 @@ end function gamemgr.gamelist() local retval = "" if #gamemgr.games > 0 then - retval = retval .. gamemgr.games[1].name + retval = retval .. core.formspec_escape(gamemgr.games[1].name) for i=2,#gamemgr.games,1 do - retval = retval .. "," .. gamemgr.games[i].name + retval = retval .. "," .. core.formspec_escape(gamemgr.games[i].name) end end return retval diff --git a/builtin/mainmenu/init.lua b/builtin/mainmenu/init.lua index 7f0c1e386..7c6af7d27 100644 --- a/builtin/mainmenu/init.lua +++ b/builtin/mainmenu/init.lua @@ -16,9 +16,9 @@ --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. mt_color_grey = "#AAAAAA" -mt_color_blue = "#0000DD" -mt_color_green = "#00DD00" -mt_color_dark_green = "#003300" +mt_color_blue = "#6389FF" +mt_color_green = "#72FF63" +mt_color_dark_green = "#25C191" --for all other colors ask sfan5 to complete his work! @@ -56,9 +56,8 @@ tabs.credits = dofile(menupath .. DIR_DELIM .. "tab_credits.lua") if PLATFORM == "Android" then tabs.simple_main = dofile(menupath .. DIR_DELIM .. "tab_simple_main.lua") else - tabs.singleplayer = dofile(menupath .. DIR_DELIM .. "tab_singleplayer.lua") - tabs.multiplayer = dofile(menupath .. DIR_DELIM .. "tab_multiplayer.lua") - tabs.server = dofile(menupath .. DIR_DELIM .. "tab_server.lua") + tabs.local_game = dofile(menupath .. DIR_DELIM .. "tab_local.lua") + tabs.play_online = dofile(menupath .. DIR_DELIM .. "tab_online.lua") tabs.texturepacks = dofile(menupath .. DIR_DELIM .. "tab_texturepacks.lua") end @@ -119,25 +118,24 @@ local function init_globals() menudata.worldlist:add_sort_mechanism("alphabetic", sort_worlds_alphabetic) menudata.worldlist:set_sortmode("alphabetic") - if not core.setting_get("menu_last_game") then - local default_game = core.setting_get("default_game") or "minetest" - core.setting_set("menu_last_game", default_game) + if not core.settings:get("menu_last_game") then + local default_game = core.settings:get("default_game") or "minetest" + core.settings:set("menu_last_game", default_game) end mm_texture.init() end -- Create main tabview - local tv_main = tabview_create("maintab", {x = 12, y = 5.2}, {x = 0, y = 0}) + local tv_main = tabview_create("maintab", {x = 12, y = 5.4}, {x = 0, y = 0}) if PLATFORM == "Android" then tv_main:add(tabs.simple_main) tv_main:add(tabs.settings) else tv_main:set_autosave_tab(true) - tv_main:add(tabs.singleplayer) - tv_main:add(tabs.multiplayer) - tv_main:add(tabs.server) + tv_main:add(tabs.local_game) + tv_main:add(tabs.play_online) tv_main:add(tabs.settings) tv_main:add(tabs.texturepacks) end @@ -149,7 +147,7 @@ local function init_globals() tv_main:set_fixed_size(false) if PLATFORM ~= "Android" then - tv_main:set_tab(core.setting_get("maintab_LAST")) + tv_main:set_tab(core.settings:get("maintab_LAST")) end ui.set_default("maintab") tv_main:show() @@ -167,4 +165,3 @@ local function init_globals() end init_globals() - diff --git a/builtin/mainmenu/modmgr.lua b/builtin/mainmenu/modmgr.lua index 2b7b371bf..dee048982 100644 --- a/builtin/mainmenu/modmgr.lua +++ b/builtin/mainmenu/modmgr.lua @@ -18,7 +18,7 @@ -------------------------------------------------------------------------------- function get_mods(path,retval,modpack) local mods = core.get_dir_list(path, true) - + for _, name in ipairs(mods) do if name:sub(1, 1) ~= "." then local prefix = path .. DIR_DELIM .. name .. DIR_DELIM @@ -237,49 +237,37 @@ function modmgr.render_modlist(render_list) local list = render_list:get_list() local last_modpack = nil - - for i,v in ipairs(list) do - if retval ~= "" then - retval = retval .."," - end - + local retval = {} + for i, v in ipairs(list) do local color = "" - if v.is_modpack then local rawlist = render_list:get_raw_list() + color = mt_color_dark_green - local all_enabled = true - for j=1,#rawlist,1 do + for j = 1, #rawlist, 1 do if rawlist[j].modpack == list[i].name and - rawlist[j].enabled ~= true then - all_enabled = false - break + rawlist[j].enabled ~= true then + -- Modpack not entirely enabled so showing as grey + color = mt_color_grey + break end end - - if all_enabled == false then - color = mt_color_grey - else - color = mt_color_dark_green - end - end - - if v.typ == "game_mod" then + elseif v.is_game_content then color = mt_color_blue - else - if v.enabled then - color = mt_color_green - end + elseif v.enabled then + color = mt_color_green end - retval = retval .. color - if v.modpack ~= nil then - retval = retval .. " " + retval[#retval + 1] = color + if v.modpack ~= nil or v.typ == "game_mod" then + retval[#retval + 1] = "1" + else + retval[#retval + 1] = "0" end - retval = retval .. v.name + retval[#retval + 1] = core.formspec_escape(v.name) end - return retval + return table.concat(retval, ",") end -------------------------------------------------------------------------------- @@ -425,8 +413,18 @@ function modmgr.preparemodlist(data) local gamespec = gamemgr.find_by_gameid(data.gameid) gamemgr.get_game_mods(gamespec, game_mods) + if #game_mods > 0 then + -- Add title + retval[#retval + 1] = { + typ = "game", + is_game_content = true, + name = fgettext("Subgame Mods") + } + end + for i=1,#game_mods,1 do game_mods[i].typ = "game_mod" + game_mods[i].is_game_content = true retval[#retval + 1] = game_mods[i] end diff --git a/builtin/mainmenu/store.lua b/builtin/mainmenu/store.lua index ad861082d..59391f8bc 100644 --- a/builtin/mainmenu/store.lua +++ b/builtin/mainmenu/store.lua @@ -233,14 +233,14 @@ function modstore.handle_buttons(parent, fields, name, data) if not core.handle_async( function(param) - local fullurl = core.setting_get("modstore_download_url") .. + local fullurl = core.settings:get("modstore_download_url") .. param.moddetails.download_url if param.version ~= nil then local found = false for i=1,#param.moddetails.versions, 1 do if param.moddetails.versions[i].date:sub(1,10) == param.version then - fullurl = core.setting_get("modstore_download_url") .. + fullurl = core.settings:get("modstore_download_url") .. param.moddetails.versions[i].download_url found = true end @@ -400,7 +400,7 @@ function modstore.getscreenshot(ypos,listentry) listentry.texturename = "in progress" --prepare url and filename - local fullurl = core.setting_get("modstore_download_url") .. + local fullurl = core.settings:get("modstore_download_url") .. listentry.details.screenshot_url local filename = os.tempfolder() .. "_MID_" .. listentry.id diff --git a/builtin/mainmenu/tab_credits.lua b/builtin/mainmenu/tab_credits.lua index c2ad19183..0774433b6 100644 --- a/builtin/mainmenu/tab_credits.lua +++ b/builtin/mainmenu/tab_credits.lua @@ -19,61 +19,68 @@ local core_developers = { "Perttu Ahola (celeron55) <celeron55@gmail.com>", - "Ryan Kwolek (kwolekr) <kwolekr@minetest.net>", - "PilzAdam <pilzadam@minetest.net>", "sfan5 <sfan5@live.de>", - "kahrl <kahrl@gmx.net>", - "sapier", "ShadowNinja <shadowninja@minetest.net>", "Nathanaël Courant (Nore/Ekdohibs) <nore@mesecons.net>", "Loic Blot (nerzhul/nrz) <loic.blot@unix-experience.fr>", - "Matt Gregory (paramat)", - "est31 <MTest31@outlook.com>", + "paramat", "Craig Robbins (Zeno) <craig.d.robbins@gmail.com>", "Auke Kok (sofar) <sofar@foo-projects.org>", - "Andrew Ward (rubenwardy) <rubenwardy@gmail.com>", + "rubenwardy <rw@rubenwardy.com>", + "Krock/SmallJoker <mk939@ymail.com>", } local active_contributors = { - "Duane Robertson <duane@duanerobertson.com>", - "SmallJoker <mk939@ymail.com>", - "Lars Hofhansl <larsh@apache.org>", - "Jeija <jeija@mesecons.net>", - "Gregory Currie (gregorycu)", - "Sokomine <wegwerf@anarres.dyndns.org>", - "TeTpaAka", - "Jean-Patrick G (kilbith) <jeanpatrick.guerrero@gmail.com>", - "Diego MartÃnez (kaeza) <kaeza@users.sf.net>", - "Dániel Juhász (juhdanad) <juhdanad@gmail.com>", - "Rogier <rogier777@gmail.com>", + "red-001 <red-001@outlook.ie> [CSM & Menu fixes]", + "Dániel Juhász (juhdanad) <juhdanad@gmail.com> [Audiovisuals: lighting]", + "numberZero [Audiovisuals: meshgen]", + "Lars Hofhansl <larsh@apache.org> [Occulusion culling, fixes]", + "Jean-Patrick G (kilbith) <jeanpatrick.guerrero@gmail.com> [Audiovisuals]", + "Vincent Glize (Dumbeldor) <vincent.glize@live.fr> [CSM]", + "bigfoot547 [CSM]", + "Rogier <rogier777@gmail.com> [Fixes]", + "Wuzzy [Audiovisuals]", + "Shara/Ezhh [Settings]", } local previous_core_developers = { "BlockMen", - "Maciej Kasatkin (RealBadAngel) <maciej.kasatkin@o2.pl>", + "Maciej Kasatkin (RealBadAngel) [RIP]", "Lisa Milne (darkrose) <lisa@ltmnet.com>", "proller", "Ilya Zhuravlev (xyz) <xyz@minetest.net>", + "PilzAdam <pilzadam@minetest.net>", + "est31 <MTest31@outlook.com>", + "kahrl <kahrl@gmx.net>", + "Ryan Kwolek (kwolekr) <kwolekr@minetest.net>", + "sapier", } local previous_contributors = { - "Vanessa Ezekowitz (VanessaE) <vanessaezekowitz@gmail.com>", - "Jurgen Doser (doserj) <jurgen.doser@gmail.com>", - "MirceaKitsune <mirceakitsune@gmail.com>", - "dannydark <the_skeleton_of_a_child@yahoo.co.uk>", - "0gb.us <0gb.us@0gb.us>", - "Guiseppe Bilotta (Oblomov) <guiseppe.bilotta@gmail.com>", - "Jonathan Neuschafer <j.neuschaefer@gmx.net>", - "Nils Dagsson Moskopp (erlehmann) <nils@dieweltistgarnichtso.net>", - "BÅ™etislav Å tec (t0suj4/TBC_x)", - "Aaron Suen <warr1024@gmail.com>", - "Constantin Wenger (SpeedProg) <constantin.wenger@googlemail.com>", - "matttpt <matttpt@gmail.com>", - "JacobF <queatz@gmail.com>", - "TriBlade9 <triblade9@mail.com>", - "Zefram <zefram@fysh.org>", + "Gregory Currie (gregorycu) [optimisation]", + "Diego MartÃnez (kaeza) <kaeza@users.sf.net>", + "T4im [Profiler]", + "TeTpaAka [Hand overriding, nametag colors]", + "HybridDog [Fixes]", + "Duane Robertson <duane@duanerobertson.com> [MGValleys]", + "neoascetic [OS X Fixes]", + "TriBlade9 <triblade9@mail.com> [Audiovisuals]", + "Jurgen Doser (doserj) <jurgen.doser@gmail.com> [Fixes]", + "MirceaKitsune <mirceakitsune@gmail.com> [Audiovisuals]", + "Guiseppe Bilotta (Oblomov) <guiseppe.bilotta@gmail.com> [Fixes]", + "matttpt <matttpt@gmail.com> [Fixes]", + "Nils Dagsson Moskopp (erlehmann) <nils@dieweltistgarnichtso.net> [Minetest Logo]", + "Jeija <jeija@mesecons.net> [HTTP, particles]", } +local function buildCreditList(source) + ret = {} + for i = 1, #source do + ret[i] = core.formspec_escape(source[i]) + end + return table.concat(ret, ",,") +end + return { name = "credits", caption = fgettext("Credits"), @@ -85,15 +92,15 @@ return { "label[0.5,3.5;http://minetest.net]" .. "tablecolumns[color;text]" .. "tableoptions[background=#00000000;highlight=#00000000;border=false]" .. - "table[3.5,-0.25;8.5,5.8;list_credits;" .. + "table[3.5,-0.25;8.5,6.05;list_credits;" .. "#FFFF00," .. fgettext("Core Developers") .. ",," .. - table.concat(core_developers, ",,") .. ",,," .. + buildCreditList(core_developers) .. ",,," .. "#FFFF00," .. fgettext("Active Contributors") .. ",," .. - table.concat(active_contributors, ",,") .. ",,," .. + buildCreditList(active_contributors) .. ",,," .. "#FFFF00," .. fgettext("Previous Core Developers") ..",," .. - table.concat(previous_core_developers, ",,") .. ",,," .. + buildCreditList(previous_core_developers) .. ",,," .. "#FFFF00," .. fgettext("Previous Contributors") .. ",," .. - table.concat(previous_contributors, ",,") .. "," .. + buildCreditList(previous_contributors) .. "," .. ";1]" end } diff --git a/builtin/mainmenu/tab_singleplayer.lua b/builtin/mainmenu/tab_local.lua index 05060cbc6..3e62078ce 100644 --- a/builtin/mainmenu/tab_singleplayer.lua +++ b/builtin/mainmenu/tab_local.lua @@ -16,9 +16,9 @@ --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. local function current_game() - local last_game_id = core.setting_get("menu_last_game") + local last_game_id = core.settings:get("menu_last_game") local game, index = gamemgr.find_by_gameid(last_game_id) - + return game end @@ -36,10 +36,10 @@ local function singleplayer_refresh_gamebar() if ("game_btnbar_" .. gamemgr.games[j].id == key) then mm_texture.update("singleplayer", gamemgr.games[j]) core.set_topleft_text(gamemgr.games[j].name) - core.setting_set("menu_last_game",gamemgr.games[j].id) + core.settings:set("menu_last_game",gamemgr.games[j].id) menudata.worldlist:set_filtercriteria(gamemgr.games[j].id) local index = filterlist.get_current_index(menudata.worldlist, - tonumber(core.setting_get("mainmenu_last_selected_world"))) + tonumber(core.settings:get("mainmenu_last_selected_world"))) if not index or index < 1 then local selected = core.get_textlist_index("sp_worlds") if selected ~= nil and selected < #menudata.worldlist:get_list() then @@ -57,24 +57,24 @@ local function singleplayer_refresh_gamebar() local btnbar = buttonbar_create("game_button_bar", game_buttonbar_button_handler, - {x=-0.3,y=5.65}, "horizontal", {x=12.4,y=1.15}) + {x=-0.3,y=5.9}, "horizontal", {x=12.4,y=1.15}) for i=1,#gamemgr.games,1 do local btn_name = "game_btnbar_" .. gamemgr.games[i].id - + local image = nil local text = nil local tooltip = core.formspec_escape(gamemgr.games[i].name) - + if gamemgr.games[i].menuicon_path ~= nil and gamemgr.games[i].menuicon_path ~= "" then image = core.formspec_escape(gamemgr.games[i].menuicon_path) else - + local part1 = gamemgr.games[i].id:sub(1,5) local part2 = gamemgr.games[i].id:sub(6,10) local part3 = gamemgr.games[i].id:sub(11) - + text = part1 .. "\n" .. part2 if part3 ~= nil and part3 ~= "" then @@ -89,28 +89,57 @@ local function get_formspec(tabview, name, tabdata) local retval = "" local index = filterlist.get_current_index(menudata.worldlist, - tonumber(core.setting_get("mainmenu_last_selected_world")) + tonumber(core.settings:get("mainmenu_last_selected_world")) ) retval = retval .. "button[4,4.15;2.6,0.5;world_delete;".. fgettext("Delete") .. "]" .. "button[6.5,4.15;2.8,0.5;world_create;".. fgettext("New") .. "]" .. "button[9.2,4.15;2.55,0.5;world_configure;".. fgettext("Configure") .. "]" .. - "button[8.5,4.95;3.25,0.5;play;".. fgettext("Play") .. "]" .. "label[4,-0.25;".. fgettext("Select World:") .. "]".. "checkbox[0.25,0.25;cb_creative_mode;".. fgettext("Creative Mode") .. ";" .. - dump(core.setting_getbool("creative_mode")) .. "]".. + dump(core.settings:get_bool("creative_mode")) .. "]".. "checkbox[0.25,0.7;cb_enable_damage;".. fgettext("Enable Damage") .. ";" .. - dump(core.setting_getbool("enable_damage")) .. "]".. + dump(core.settings:get_bool("enable_damage")) .. "]".. + "checkbox[0.25,1.15;cb_server;".. fgettext("Host Server") ..";" .. + dump(core.settings:get_bool("enable_server")) .. "]" .. "textlist[4,0.25;7.5,3.7;sp_worlds;" .. menu_render_worldlist() .. ";" .. index .. "]" + + if core.settings:get_bool("enable_server") then + retval = retval .. + "button[8.5,5;3.25,0.5;play;".. fgettext("Host Game") .. "]" .. + "checkbox[0.25,1.6;cb_server_announce;" .. fgettext("Announce Server") .. ";" .. + dump(core.settings:get_bool("server_announce")) .. "]" .. + "label[0.25,2.2;" .. fgettext("Name/Password") .. "]" .. + "field[0.55,3.2;3.5,0.5;te_playername;;" .. + core.formspec_escape(core.settings:get("name")) .. "]" .. + "pwdfield[0.55,4;3.5,0.5;te_passwd;]" + + local bind_addr = core.settings:get("bind_address") + if bind_addr ~= nil and bind_addr ~= "" then + retval = retval .. + "field[0.55,5.2;2.25,0.5;te_serveraddr;" .. fgettext("Bind Address") .. ";" .. + core.formspec_escape(core.settings:get("bind_address")) .. "]" .. + "field[2.8,5.2;1.25,0.5;te_serverport;" .. fgettext("Port") .. ";" .. + core.formspec_escape(core.settings:get("port")) .. "]" + else + retval = retval .. + "field[0.55,5.2;3.5,0.5;te_serverport;" .. fgettext("Server Port") .. ";" .. + core.formspec_escape(core.settings:get("port")) .. "]" + end + else + retval = retval .. + "button[8.5,5;3.25,0.5;play;".. fgettext("Play Game") .. "]" + end + return retval end local function main_button_handler(this, fields, name, tabdata) - assert(name == "singleplayer") + assert(name == "local") local world_doubleclick = false @@ -125,7 +154,7 @@ local function main_button_handler(this, fields, name, tabdata) end if event.type == "CHG" and selected ~= nil then - core.setting_set("mainmenu_last_selected_world", + core.settings:set("mainmenu_last_selected_world", menudata.worldlist:get_raw_index(selected)) return true end @@ -136,7 +165,7 @@ local function main_button_handler(this, fields, name, tabdata) end if fields["cb_creative_mode"] then - core.setting_set("creative_mode", fields["cb_creative_mode"]) + core.settings:set("creative_mode", fields["cb_creative_mode"]) local selected = core.get_textlist_index("sp_worlds") menu_worldmt(selected, "creative_mode", fields["cb_creative_mode"]) @@ -144,27 +173,65 @@ local function main_button_handler(this, fields, name, tabdata) end if fields["cb_enable_damage"] then - core.setting_set("enable_damage", fields["cb_enable_damage"]) + core.settings:set("enable_damage", fields["cb_enable_damage"]) local selected = core.get_textlist_index("sp_worlds") menu_worldmt(selected, "enable_damage", fields["cb_enable_damage"]) return true end - if fields["play"] ~= nil or - world_doubleclick or - fields["key_enter"] then + if fields["cb_server"] then + core.settings:set("enable_server", fields["cb_server"]) + + return true + end + + if fields["cb_server_announce"] then + core.settings:set("server_announce", fields["cb_server_announce"]) + local selected = core.get_textlist_index("srv_worlds") + menu_worldmt(selected, "server_announce", fields["cb_server_announce"]) + + return true + end + + if fields["play"] ~= nil or world_doubleclick or fields["key_enter"] then local selected = core.get_textlist_index("sp_worlds") gamedata.selected_world = menudata.worldlist:get_raw_index(selected) - - if selected ~= nil and gamedata.selected_world ~= 0 then - gamedata.singleplayer = true - core.start() + + if core.settings:get_bool("enable_server") then + if selected ~= nil and gamedata.selected_world ~= 0 then + gamedata.playername = fields["te_playername"] + gamedata.password = fields["te_passwd"] + gamedata.port = fields["te_serverport"] + gamedata.address = "" + + core.settings:set("port",gamedata.port) + if fields["te_serveraddr"] ~= nil then + core.settings:set("bind_address",fields["te_serveraddr"]) + end + + --update last game + local world = menudata.worldlist:get_raw_element(gamedata.selected_world) + if world then + local game, index = gamemgr.find_by_gameid(world.gameid) + core.settings:set("menu_last_game", game.id) + end + + core.start() + else + gamedata.errormessage = + fgettext("No world created or selected!") + end else - gamedata.errormessage = - fgettext("No world created or selected!") + if selected ~= nil and gamedata.selected_world ~= 0 then + gamedata.singleplayer = true + core.start() + else + gamedata.errormessage = + fgettext("No world created or selected!") + end + return true end - return true end if fields["world_create"] ~= nil then @@ -192,7 +259,7 @@ local function main_button_handler(this, fields, name, tabdata) mm_texture.update("singleplayer",current_game()) end end - + return true end @@ -202,7 +269,7 @@ local function main_button_handler(this, fields, name, tabdata) local configdialog = create_configure_world_dlg( menudata.worldlist:get_raw_index(selected)) - + if (configdialog ~= nil) then configdialog:set_parent(this) this:hide() @@ -210,22 +277,22 @@ local function main_button_handler(this, fields, name, tabdata) mm_texture.update("singleplayer",current_game()) end end - + return true end end local function on_change(type, old_tab, new_tab) local buttonbar = ui.find_by_name("game_button_bar") - + if ( buttonbar == nil ) then singleplayer_refresh_gamebar() buttonbar = ui.find_by_name("game_button_bar") end - + if (type == "ENTER") then local game = current_game() - + if game then menudata.worldlist:set_filtercriteria(game.id) core.set_topleft_text(game.name) @@ -242,8 +309,8 @@ end -------------------------------------------------------------------------------- return { - name = "singleplayer", - caption = fgettext("Singleplayer"), + name = "local", + caption = fgettext("Local Game"), cbf_formspec = get_formspec, cbf_button_handler = main_button_handler, on_change = on_change diff --git a/builtin/mainmenu/tab_mods.lua b/builtin/mainmenu/tab_mods.lua index 4a5b6c041..9510a9e18 100644 --- a/builtin/mainmenu/tab_mods.lua +++ b/builtin/mainmenu/tab_mods.lua @@ -28,7 +28,8 @@ local function get_formspec(tabview, name, tabdata) local retval = "label[0.05,-0.25;".. fgettext("Installed Mods:") .. "]" .. - "textlist[0,0.25;5.1,5;modlist;" .. + "tablecolumns[color;tree;text]" .. + "table[0,0.25;5.1,5;modlist;" .. modmgr.render_modlist(modmgr.global_mods) .. ";" .. tabdata.selected_mod .. "]" @@ -74,7 +75,7 @@ local function get_formspec(tabview, name, tabdata) if error == nil then local descriptiontext = descriptionfile:read("*all") - descriptionlines = core.splittext(descriptiontext,42) + descriptionlines = core.wrap_text(descriptiontext, 42) descriptionfile:close() else descriptionlines = {} @@ -127,8 +128,8 @@ end -------------------------------------------------------------------------------- local function handle_buttons(tabview, fields, tabname, tabdata) if fields["modlist"] ~= nil then - local event = core.explode_textlist_event(fields["modlist"]) - tabdata.selected_mod = event.index + local event = core.explode_table_event(fields["modlist"]) + tabdata.selected_mod = event.row return true end diff --git a/builtin/mainmenu/tab_multiplayer.lua b/builtin/mainmenu/tab_online.lua index 00150f26d..ab23a4b7c 100644 --- a/builtin/mainmenu/tab_multiplayer.lua +++ b/builtin/mainmenu/tab_online.lua @@ -20,28 +20,48 @@ local function get_formspec(tabview, name, tabdata) -- Update the cached supported proto info, -- it may have changed after a change by the settings menu. common_update_cached_supp_proto() - local fav_selected = menudata.favorites[tabdata.fav_selected] + local fav_selected = nil + if menudata.search_result then + fav_selected = menudata.search_result[tabdata.fav_selected] + else + fav_selected = menudata.favorites[tabdata.fav_selected] + end + + if not tabdata.search_for then + tabdata.search_for = "" + end local retval = - "label[7.75,-0.15;" .. fgettext("Address / Port") .. "]" .. - "label[7.75,1.05;" .. fgettext("Name / Password") .. "]" .. - "field[8,0.75;3.3,0.5;te_address;;" .. - core.formspec_escape(core.setting_get("address")) .. "]" .. - "field[11.15,0.75;1.4,0.5;te_port;;" .. - core.formspec_escape(core.setting_get("remote_port")) .. "]" .. - "button[10.1,4.9;2,0.5;btn_mp_connect;" .. fgettext("Connect") .. "]" .. - "field[8,1.95;2.95,0.5;te_name;;" .. - core.formspec_escape(core.setting_get("name")) .. "]" .. - "pwdfield[10.78,1.95;1.77,0.5;te_pwd;]" .. - "box[7.73,2.35;4.3,2.28;#999999]" + -- Search + "field[0.15,0.35;6.05,0.27;te_search;;"..core.formspec_escape(tabdata.search_for).."]".. + "button[5.8,0.1;2,0.1;btn_mp_search;" .. fgettext("Search") .. "]" .. + + -- Address / Port + "label[7.75,-0.25;" .. fgettext("Address / Port") .. "]" .. + "field[8,0.65;3.25,0.5;te_address;;" .. + core.formspec_escape(core.settings:get("address")) .. "]" .. + "field[11.1,0.65;1.4,0.5;te_port;;" .. + core.formspec_escape(core.settings:get("remote_port")) .. "]" .. + + -- Name / Password + "label[7.75,0.95;" .. fgettext("Name / Password") .. "]" .. + "field[8,1.85;2.9,0.5;te_name;;" .. + core.formspec_escape(core.settings:get("name")) .. "]" .. + "pwdfield[10.73,1.85;1.77,0.5;te_pwd;]" .. + + -- Description Background + "box[7.73,2.25;4.25,2.6;#999999]".. + + -- Connect + "button[10.1,5.15;2,0.5;btn_mp_connect;" .. fgettext("Connect") .. "]" if tabdata.fav_selected and fav_selected then if gamedata.fav then - retval = retval .. "button[7.85,4.9;2.3,0.5;btn_delete_favorite;" .. + retval = retval .. "button[7.75,5.15;2.3,0.5;btn_delete_favorite;" .. fgettext("Del. Favorite") .. "]" end if fav_selected.description then - retval = retval .. "textarea[8.1,2.4;4.26,2.6;;" .. + retval = retval .. "textarea[8.1,2.3;4.23,2.9;;" .. core.formspec_escape((gamedata.serverdescription or ""), true) .. ";]" end end @@ -49,6 +69,7 @@ local function get_formspec(tabview, name, tabdata) --favourites retval = retval .. "tablecolumns[" .. image_column(fgettext("Favorite"), "favorite") .. ";" .. + image_column(fgettext("Ping")) .. ",padding=0.25;" .. "color,span=3;" .. "text,align=right;" .. -- clients "text,align=center,padding=0.25;" .. -- "/" @@ -58,9 +79,27 @@ local function get_formspec(tabview, name, tabdata) image_column(fgettext("PvP enabled"), "pvp") .. ",padding=0.25;" .. "color,span=1;" .. "text,padding=1]" .. - "table[-0.15,-0.1;7.75,5.5;favourites;" + "table[-0.15,0.6;7.75,5.15;favourites;" - if #menudata.favorites > 0 then + if menudata.search_result then + for i = 1, #menudata.search_result do + local favs = core.get_favorites("local") + local server = menudata.search_result[i] + + for fav_id = 1, #favs do + if server.address == favs[fav_id].address and + server.port == favs[fav_id].port then + server.is_favorite = true + end + end + + if i ~= 1 then + retval = retval .. "," + end + + retval = retval .. render_serverlist_row(server, server.is_favorite) + end + elseif #menudata.favorites > 0 then local favs = core.get_favorites("local") if #favs > 0 then for i = 1, #favs do @@ -75,9 +114,9 @@ local function get_formspec(tabview, name, tabdata) end end end - retval = retval .. render_favorite(menudata.favorites[1], (#favs > 0)) + retval = retval .. render_serverlist_row(menudata.favorites[1], (#favs > 0)) for i = 2, #menudata.favorites do - retval = retval .. "," .. render_favorite(menudata.favorites[i], (i <= #favs)) + retval = retval .. "," .. render_serverlist_row(menudata.favorites[i], (i <= #favs)) end end @@ -92,17 +131,19 @@ end -------------------------------------------------------------------------------- local function main_button_handler(tabview, fields, name, tabdata) + local serverlist = menudata.search_result or menudata.favorites + if fields.te_name then gamedata.playername = fields.te_name - core.setting_set("name", fields.te_name) + core.settings:set("name", fields.te_name) end if fields.favourites then local event = core.explode_table_event(fields.favourites) - local fav = menudata.favorites[event.row] + local fav = serverlist[event.row] if event.type == "DCL" then - if event.row <= #menudata.favorites then + if event.row <= #serverlist then if menudata.favorites_is_public and not is_server_protocol_compat_or_error( fav.proto_min, fav.proto_max) then @@ -122,8 +163,8 @@ local function main_button_handler(tabview, fields, name, tabdata) gamedata.serverdescription = fav.description if gamedata.address and gamedata.port then - core.setting_set("address", gamedata.address) - core.setting_set("remote_port", gamedata.port) + core.settings:set("address", gamedata.address) + core.settings:set("remote_port", gamedata.port) core.start() end end @@ -131,7 +172,7 @@ local function main_button_handler(tabview, fields, name, tabdata) end if event.type == "CHG" then - if event.row <= #menudata.favorites then + if event.row <= #serverlist then gamedata.fav = false local favs = core.get_favorites("local") local address = fav.address @@ -146,8 +187,8 @@ local function main_button_handler(tabview, fields, name, tabdata) end if address and port then - core.setting_set("address", address) - core.setting_set("remote_port", port) + core.settings:set("address", address) + core.settings:set("remote_port", port) end tabdata.fav_selected = event.row end @@ -157,7 +198,7 @@ local function main_button_handler(tabview, fields, name, tabdata) if fields.key_up or fields.key_down then local fav_idx = core.get_table_index("favourites") - local fav = menudata.favorites[fav_idx] + local fav = serverlist[fav_idx] if fav_idx then if fields.key_up and fav_idx > 1 then @@ -176,10 +217,10 @@ local function main_button_handler(tabview, fields, name, tabdata) local address = fav.address local port = fav.port - + gamedata.serverdescription = fav.description if address and port then - core.setting_set("address", address) - core.setting_set("remote_port", port) + core.settings:set("address", address) + core.settings:set("remote_port", port) end tabdata.fav_selected = fav_idx @@ -194,21 +235,81 @@ local function main_button_handler(tabview, fields, name, tabdata) asyncOnlineFavourites() tabdata.fav_selected = nil - core.setting_set("address", "") - core.setting_set("remote_port", "30000") + core.settings:set("address", "") + core.settings:set("remote_port", "30000") + return true + end + + if fields.btn_mp_search or fields.key_enter_field == "te_search" then + tabdata.fav_selected = 1 + local input = fields.te_search:lower() + tabdata.search_for = fields.te_search + + if #menudata.favorites < 2 then + return true + end + + menudata.search_result = {} + + -- setup the keyword list + local keywords = {} + for word in input:gmatch("%S+") do + table.insert(keywords, word) + end + + if #keywords == 0 then + menudata.search_result = nil + return true + end + + -- Search the serverlist + local search_result = {} + for i = 1, #menudata.favorites do + local server = menudata.favorites[i] + local found = 0 + for k = 1, #keywords do + local keyword = keywords[k] + if server.name then + local name = server.name:lower() + local _, count = name:gsub(keyword, keyword) + found = found + count * 4 + end + + if server.description then + local desc = server.description:lower() + local _, count = desc:gsub(keyword, keyword) + found = found + count * 2 + end + end + if found > 0 then + local points = (#menudata.favorites - i) / 5 + found + server.points = points + table.insert(search_result, server) + end + end + if #search_result > 0 then + table.sort(search_result, function(a, b) + return a.points > b.points + end) + menudata.search_result = search_result + local first_server = search_result[1] + core.settings:set("address", first_server.address) + core.settings:set("remote_port", first_server.port) + end return true end - if (fields.btn_mp_connect or fields.key_enter) and fields.te_address and fields.te_port then + if (fields.btn_mp_connect or fields.key_enter) + and fields.te_address ~= "" and fields.te_port then gamedata.playername = fields.te_name gamedata.password = fields.te_pwd gamedata.address = fields.te_address gamedata.port = fields.te_port gamedata.selected_world = 0 local fav_idx = core.get_table_index("favourites") - local fav = menudata.favorites[fav_idx] + local fav = serverlist[fav_idx] - if fav_idx and fav_idx <= #menudata.favorites and + if fav_idx and fav_idx <= #serverlist and fav.address == fields.te_address and fav.port == fields.te_port then @@ -225,8 +326,8 @@ local function main_button_handler(tabview, fields, name, tabdata) gamedata.serverdescription = "" end - core.setting_set("address", fields.te_address) - core.setting_set("remote_port", fields.te_port) + core.settings:set("address", fields.te_address) + core.settings:set("remote_port", fields.te_port) core.start() return true @@ -241,8 +342,8 @@ end -------------------------------------------------------------------------------- return { - name = "multiplayer", - caption = fgettext("Client"), + name = "online", + caption = fgettext("Play Online"), cbf_formspec = get_formspec, cbf_button_handler = main_button_handler, on_change = on_change diff --git a/builtin/mainmenu/tab_server.lua b/builtin/mainmenu/tab_server.lua deleted file mode 100644 index 6b96825a0..000000000 --- a/builtin/mainmenu/tab_server.lua +++ /dev/null @@ -1,195 +0,0 @@ ---Minetest ---Copyright (C) 2014 sapier --- ---This program is free software; you can redistribute it and/or modify ---it under the terms of the GNU Lesser General Public License as published by ---the Free Software Foundation; either version 2.1 of the License, or ---(at your option) any later version. --- ---This program is distributed in the hope that it will be useful, ---but WITHOUT ANY WARRANTY; without even the implied warranty of ---MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ---GNU Lesser General Public License for more details. --- ---You should have received a copy of the GNU Lesser General Public License along ---with this program; if not, write to the Free Software Foundation, Inc., ---51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - --------------------------------------------------------------------------------- -local function get_formspec(tabview, name, tabdata) - - local index = menudata.worldlist:get_current_index( - tonumber(core.setting_get("mainmenu_last_selected_world")) - ) - - local retval = - "button[4,4.15;2.6,0.5;world_delete;" .. fgettext("Delete") .. "]" .. - "button[6.5,4.15;2.8,0.5;world_create;" .. fgettext("New") .. "]" .. - "button[9.2,4.15;2.55,0.5;world_configure;" .. fgettext("Configure") .. "]" .. - "button[8.5,4.95;3.25,0.5;start_server;" .. fgettext("Start Game") .. "]" .. - "label[4,-0.25;" .. fgettext("Select World:") .. "]" .. - "checkbox[0.25,0.25;cb_creative_mode;" .. fgettext("Creative Mode") .. ";" .. - dump(core.setting_getbool("creative_mode")) .. "]" .. - "checkbox[0.25,0.7;cb_enable_damage;" .. fgettext("Enable Damage") .. ";" .. - dump(core.setting_getbool("enable_damage")) .. "]" .. - "checkbox[0.25,1.15;cb_server_announce;" .. fgettext("Public") .. ";" .. - dump(core.setting_getbool("server_announce")) .. "]" .. - "label[0.25,2.2;" .. fgettext("Name/Password") .. "]" .. - "field[0.55,3.2;3.5,0.5;te_playername;;" .. - core.formspec_escape(core.setting_get("name")) .. "]" .. - "pwdfield[0.55,4;3.5,0.5;te_passwd;]" - - local bind_addr = core.setting_get("bind_address") - if bind_addr ~= nil and bind_addr ~= "" then - retval = retval .. - "field[0.55,5.2;2.25,0.5;te_serveraddr;" .. fgettext("Bind Address") .. ";" .. - core.formspec_escape(core.setting_get("bind_address")) .. "]" .. - "field[2.8,5.2;1.25,0.5;te_serverport;" .. fgettext("Port") .. ";" .. - core.formspec_escape(core.setting_get("port")) .. "]" - else - retval = retval .. - "field[0.55,5.2;3.5,0.5;te_serverport;" .. fgettext("Server Port") .. ";" .. - core.formspec_escape(core.setting_get("port")) .. "]" - end - - retval = retval .. - "textlist[4,0.25;7.5,3.7;srv_worlds;" .. - menu_render_worldlist() .. - ";" .. index .. "]" - - return retval -end - --------------------------------------------------------------------------------- -local function main_button_handler(this, fields, name, tabdata) - - local world_doubleclick = false - - if fields["srv_worlds"] ~= nil then - local event = core.explode_textlist_event(fields["srv_worlds"]) - local selected = core.get_textlist_index("srv_worlds") - - menu_worldmt_legacy(selected) - - if event.type == "DCL" then - world_doubleclick = true - end - if event.type == "CHG" then - core.setting_set("mainmenu_last_selected_world", - menudata.worldlist:get_raw_index(core.get_textlist_index("srv_worlds"))) - return true - end - end - - if menu_handle_key_up_down(fields,"srv_worlds","mainmenu_last_selected_world") then - return true - end - - if fields["cb_creative_mode"] then - core.setting_set("creative_mode", fields["cb_creative_mode"]) - local selected = core.get_textlist_index("srv_worlds") - menu_worldmt(selected, "creative_mode", fields["cb_creative_mode"]) - - return true - end - - if fields["cb_enable_damage"] then - core.setting_set("enable_damage", fields["cb_enable_damage"]) - local selected = core.get_textlist_index("srv_worlds") - menu_worldmt(selected, "enable_damage", fields["cb_enable_damage"]) - - return true - end - - if fields["cb_server_announce"] then - core.setting_set("server_announce", fields["cb_server_announce"]) - local selected = core.get_textlist_index("srv_worlds") - menu_worldmt(selected, "server_announce", fields["cb_server_announce"]) - - return true - end - - if fields["start_server"] ~= nil or - world_doubleclick or - fields["key_enter"] then - local selected = core.get_textlist_index("srv_worlds") - gamedata.selected_world = menudata.worldlist:get_raw_index(selected) - if selected ~= nil and gamedata.selected_world ~= 0 then - gamedata.playername = fields["te_playername"] - gamedata.password = fields["te_passwd"] - gamedata.port = fields["te_serverport"] - gamedata.address = "" - - core.setting_set("port",gamedata.port) - if fields["te_serveraddr"] ~= nil then - core.setting_set("bind_address",fields["te_serveraddr"]) - end - - --update last game - local world = menudata.worldlist:get_raw_element(gamedata.selected_world) - if world then - local game, index = gamemgr.find_by_gameid(world.gameid) - core.setting_set("menu_last_game", game.id) - end - - core.start() - else - gamedata.errormessage = - fgettext("No world created or selected!") - end - return true - end - - if fields["world_create"] ~= nil then - local create_world_dlg = create_create_world_dlg(true) - create_world_dlg:set_parent(this) - create_world_dlg:show() - this:hide() - return true - end - - if fields["world_delete"] ~= nil then - local selected = core.get_textlist_index("srv_worlds") - if selected ~= nil and - selected <= menudata.worldlist:size() then - local world = menudata.worldlist:get_list()[selected] - if world ~= nil and - world.name ~= nil and - world.name ~= "" then - local index = menudata.worldlist:get_raw_index(selected) - local delete_world_dlg = create_delete_world_dlg(world.name,index) - delete_world_dlg:set_parent(this) - delete_world_dlg:show() - this:hide() - end - end - - return true - end - - if fields["world_configure"] ~= nil then - local selected = core.get_textlist_index("srv_worlds") - if selected ~= nil then - local configdialog = - create_configure_world_dlg( - menudata.worldlist:get_raw_index(selected)) - - if (configdialog ~= nil) then - configdialog:set_parent(this) - configdialog:show() - this:hide() - end - end - return true - end - return false -end - --------------------------------------------------------------------------------- -return { - name = "server", - caption = fgettext("Server"), - cbf_formspec = get_formspec, - cbf_button_handler = main_button_handler, - on_change = nil -} diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua index af8df0ccb..5a8cc19b8 100644 --- a/builtin/mainmenu/tab_settings.lua +++ b/builtin/mainmenu/tab_settings.lua @@ -25,7 +25,8 @@ local labels = { }, node_highlighting = { fgettext("Node Outlining"), - fgettext("Node Highlighting") + fgettext("Node Highlighting"), + fgettext("None") }, filters = { fgettext("No Filter"), @@ -52,7 +53,7 @@ local dd_options = { }, node_highlighting = { table.concat(labels.node_highlighting, ","), - {"box", "halo"} + {"box", "halo", "none"} }, filters = { table.concat(labels.filters, ","), @@ -70,39 +71,39 @@ local dd_options = { local getSettingIndex = { Leaves = function() - local style = core.setting_get("leaves_style") + local style = core.settings:get("leaves_style") for idx, name in pairs(dd_options.leaves[2]) do if style == name then return idx end end return 1 end, NodeHighlighting = function() - local style = core.setting_get("node_highlighting") + local style = core.settings:get("node_highlighting") for idx, name in pairs(dd_options.node_highlighting[2]) do if style == name then return idx end end return 1 end, Filter = function() - if core.setting_get(dd_options.filters[2][3]) == "true" then + if core.settings:get(dd_options.filters[2][3]) == "true" then return 3 - elseif core.setting_get(dd_options.filters[2][3]) == "false" and - core.setting_get(dd_options.filters[2][2]) == "true" then + elseif core.settings:get(dd_options.filters[2][3]) == "false" and + core.settings:get(dd_options.filters[2][2]) == "true" then return 2 end return 1 end, Mipmap = function() - if core.setting_get(dd_options.mipmap[2][3]) == "true" then + if core.settings:get(dd_options.mipmap[2][3]) == "true" then return 3 - elseif core.setting_get(dd_options.mipmap[2][3]) == "false" and - core.setting_get(dd_options.mipmap[2][2]) == "true" then + elseif core.settings:get(dd_options.mipmap[2][3]) == "false" and + core.settings:get(dd_options.mipmap[2][2]) == "true" then return 2 end return 1 end, Antialiasing = function() - local antialiasing_setting = core.setting_get("fsaa") + local antialiasing_setting = core.settings:get("fsaa") for i = 1, #dd_options.antialiasing[2] do if antialiasing_setting == dd_options.antialiasing[2][i] then return i @@ -177,20 +178,20 @@ local function formspec(tabview, name, tabdata) local tab_string = "box[0,0;3.5,4.5;#999999]" .. "checkbox[0.25,0;cb_smooth_lighting;" .. fgettext("Smooth Lighting") .. ";" - .. dump(core.setting_getbool("smooth_lighting")) .. "]" .. + .. dump(core.settings:get_bool("smooth_lighting")) .. "]" .. "checkbox[0.25,0.5;cb_particles;" .. fgettext("Particles") .. ";" - .. dump(core.setting_getbool("enable_particles")) .. "]" .. + .. dump(core.settings:get_bool("enable_particles")) .. "]" .. "checkbox[0.25,1;cb_3d_clouds;" .. fgettext("3D Clouds") .. ";" - .. dump(core.setting_getbool("enable_3d_clouds")) .. "]" .. + .. dump(core.settings:get_bool("enable_3d_clouds")) .. "]" .. "checkbox[0.25,1.5;cb_opaque_water;" .. fgettext("Opaque Water") .. ";" - .. dump(core.setting_getbool("opaque_water")) .. "]" .. + .. dump(core.settings:get_bool("opaque_water")) .. "]" .. "checkbox[0.25,2.0;cb_connected_glass;" .. fgettext("Connected Glass") .. ";" - .. dump(core.setting_getbool("connected_glass")) .. "]" .. + .. dump(core.settings:get_bool("connected_glass")) .. "]" .. "dropdown[0.25,2.8;3.3;dd_node_highlighting;" .. dd_options.node_highlighting[1] .. ";" .. getSettingIndex.NodeHighlighting() .. "]" .. "dropdown[0.25,3.6;3.3;dd_leaves_style;" .. dd_options.leaves[1] .. ";" .. getSettingIndex.Leaves() .. "]" .. - "box[3.75,0;3.75,3.45;#999999]" .. + "box[3.75,0;3.75,4.45;#999999]" .. "label[3.85,0.1;" .. fgettext("Texturing:") .. "]" .. "dropdown[3.85,0.55;3.85;dd_filters;" .. dd_options.filters[1] .. ";" .. getSettingIndex.Filter() .. "]" .. @@ -199,9 +200,12 @@ local function formspec(tabview, name, tabdata) "label[3.85,2.15;" .. fgettext("Antialiasing:") .. "]" .. "dropdown[3.85,2.6;3.85;dd_antialiasing;" .. dd_options.antialiasing[1] .. ";" .. getSettingIndex.Antialiasing() .. "]" .. + "label[3.85,3.45;" .. fgettext("Screen:") .. "]" .. + "checkbox[3.85,3.6;cb_autosave_screensize;" .. fgettext("Autosave screen size") .. ";" + .. dump(core.settings:get_bool("autosave_screensize")) .. "]" .. "box[7.75,0;4,4.4;#999999]" .. "checkbox[8,0;cb_shaders;" .. fgettext("Shaders") .. ";" - .. dump(core.setting_getbool("enable_shaders")) .. "]" + .. dump(core.settings:get_bool("enable_shaders")) .. "]" if PLATFORM == "Android" then tab_string = tab_string .. @@ -209,38 +213,38 @@ local function formspec(tabview, name, tabdata) .. fgettext("Reset singleplayer world") .. "]" else tab_string = tab_string .. - "button[8,4.75;3.75,0.5;btn_change_keys;" + "button[8,4.85;3.75,0.5;btn_change_keys;" .. fgettext("Change keys") .. "]" end tab_string = tab_string .. - "button[0,4.75;3.75,0.5;btn_advanced_settings;" + "button[0,4.85;3.75,0.5;btn_advanced_settings;" .. fgettext("Advanced Settings") .. "]" - if core.setting_get("touchscreen_threshold") ~= nil then + if core.settings:get("touchscreen_threshold") ~= nil then tab_string = tab_string .. "label[4.3,4.1;" .. fgettext("Touchthreshold (px)") .. "]" .. "dropdown[3.85,4.55;3.85;dd_touchthreshold;0,10,20,30,40,50;" .. - ((tonumber(core.setting_get("touchscreen_threshold")) / 10) + 1) .. "]" + ((tonumber(core.settings:get("touchscreen_threshold")) / 10) + 1) .. "]" end - if core.setting_getbool("enable_shaders") then + if core.settings:get_bool("enable_shaders") then tab_string = tab_string .. "checkbox[8,0.5;cb_bumpmapping;" .. fgettext("Bump Mapping") .. ";" - .. dump(core.setting_getbool("enable_bumpmapping")) .. "]" .. + .. dump(core.settings:get_bool("enable_bumpmapping")) .. "]" .. "checkbox[8,1;cb_tonemapping;" .. fgettext("Tone Mapping") .. ";" - .. dump(core.setting_getbool("tone_mapping")) .. "]" .. + .. dump(core.settings:get_bool("tone_mapping")) .. "]" .. "checkbox[8,1.5;cb_generate_normalmaps;" .. fgettext("Normal Mapping") .. ";" - .. dump(core.setting_getbool("generate_normalmaps")) .. "]" .. + .. dump(core.settings:get_bool("generate_normalmaps")) .. "]" .. "checkbox[8,2;cb_parallax;" .. fgettext("Parallax Occlusion") .. ";" - .. dump(core.setting_getbool("enable_parallax_occlusion")) .. "]" .. + .. dump(core.settings:get_bool("enable_parallax_occlusion")) .. "]" .. "checkbox[8,2.5;cb_waving_water;" .. fgettext("Waving Water") .. ";" - .. dump(core.setting_getbool("enable_waving_water")) .. "]" .. + .. dump(core.settings:get_bool("enable_waving_water")) .. "]" .. "checkbox[8,3;cb_waving_leaves;" .. fgettext("Waving Leaves") .. ";" - .. dump(core.setting_getbool("enable_waving_leaves")) .. "]" .. + .. dump(core.settings:get_bool("enable_waving_leaves")) .. "]" .. "checkbox[8,3.5;cb_waving_plants;" .. fgettext("Waving Plants") .. ";" - .. dump(core.setting_getbool("enable_waving_plants")) .. "]" + .. dump(core.settings:get_bool("enable_waving_plants")) .. "]" else tab_string = tab_string .. "tablecolumns[color;text]" .. @@ -271,60 +275,64 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) return true end if fields["cb_smooth_lighting"] then - core.setting_set("smooth_lighting", fields["cb_smooth_lighting"]) + core.settings:set("smooth_lighting", fields["cb_smooth_lighting"]) return true end if fields["cb_particles"] then - core.setting_set("enable_particles", fields["cb_particles"]) + core.settings:set("enable_particles", fields["cb_particles"]) return true end if fields["cb_3d_clouds"] then - core.setting_set("enable_3d_clouds", fields["cb_3d_clouds"]) + core.settings:set("enable_3d_clouds", fields["cb_3d_clouds"]) return true end if fields["cb_opaque_water"] then - core.setting_set("opaque_water", fields["cb_opaque_water"]) + core.settings:set("opaque_water", fields["cb_opaque_water"]) return true end if fields["cb_connected_glass"] then - core.setting_set("connected_glass", fields["cb_connected_glass"]) + core.settings:set("connected_glass", fields["cb_connected_glass"]) + return true + end + if fields["cb_autosave_screensize"] then + core.settings:set("autosave_screensize", fields["cb_autosave_screensize"]) return true end if fields["cb_shaders"] then - if (core.setting_get("video_driver") == "direct3d8" or - core.setting_get("video_driver") == "direct3d9") then - core.setting_set("enable_shaders", "false") + if (core.settings:get("video_driver") == "direct3d8" or + core.settings:get("video_driver") == "direct3d9") then + core.settings:set("enable_shaders", "false") gamedata.errormessage = fgettext("To enable shaders the OpenGL driver needs to be used.") else - core.setting_set("enable_shaders", fields["cb_shaders"]) + core.settings:set("enable_shaders", fields["cb_shaders"]) end return true end if fields["cb_bumpmapping"] then - core.setting_set("enable_bumpmapping", fields["cb_bumpmapping"]) + core.settings:set("enable_bumpmapping", fields["cb_bumpmapping"]) return true end if fields["cb_tonemapping"] then - core.setting_set("tone_mapping", fields["cb_tonemapping"]) + core.settings:set("tone_mapping", fields["cb_tonemapping"]) return true end if fields["cb_generate_normalmaps"] then - core.setting_set("generate_normalmaps", fields["cb_generate_normalmaps"]) + core.settings:set("generate_normalmaps", fields["cb_generate_normalmaps"]) return true end if fields["cb_parallax"] then - core.setting_set("enable_parallax_occlusion", fields["cb_parallax"]) + core.settings:set("enable_parallax_occlusion", fields["cb_parallax"]) return true end if fields["cb_waving_water"] then - core.setting_set("enable_waving_water", fields["cb_waving_water"]) + core.settings:set("enable_waving_water", fields["cb_waving_water"]) return true end if fields["cb_waving_leaves"] then - core.setting_set("enable_waving_leaves", fields["cb_waving_leaves"]) + core.settings:set("enable_waving_leaves", fields["cb_waving_leaves"]) end if fields["cb_waving_plants"] then - core.setting_set("enable_waving_plants", fields["cb_waving_plants"]) + core.settings:set("enable_waving_plants", fields["cb_waving_plants"]) return true end if fields["btn_change_keys"] then @@ -332,7 +340,7 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) return true end if fields["cb_touchscreen_target"] then - core.setting_set("touchtarget", fields["cb_touchscreen_target"]) + core.settings:set("touchtarget", fields["cb_touchscreen_target"]) return true end if fields["btn_reset_singleplayer"] then @@ -345,49 +353,49 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) for i = 1, #labels.leaves do if fields["dd_leaves_style"] == labels.leaves[i] then - core.setting_set("leaves_style", dd_options.leaves[2][i]) + core.settings:set("leaves_style", dd_options.leaves[2][i]) ddhandled = true end end for i = 1, #labels.node_highlighting do if fields["dd_node_highlighting"] == labels.node_highlighting[i] then - core.setting_set("node_highlighting", dd_options.node_highlighting[2][i]) + core.settings:set("node_highlighting", dd_options.node_highlighting[2][i]) ddhandled = true end end if fields["dd_filters"] == labels.filters[1] then - core.setting_set("bilinear_filter", "false") - core.setting_set("trilinear_filter", "false") + core.settings:set("bilinear_filter", "false") + core.settings:set("trilinear_filter", "false") ddhandled = true elseif fields["dd_filters"] == labels.filters[2] then - core.setting_set("bilinear_filter", "true") - core.setting_set("trilinear_filter", "false") + core.settings:set("bilinear_filter", "true") + core.settings:set("trilinear_filter", "false") ddhandled = true elseif fields["dd_filters"] == labels.filters[3] then - core.setting_set("bilinear_filter", "false") - core.setting_set("trilinear_filter", "true") + core.settings:set("bilinear_filter", "false") + core.settings:set("trilinear_filter", "true") ddhandled = true end if fields["dd_mipmap"] == labels.mipmap[1] then - core.setting_set("mip_map", "false") - core.setting_set("anisotropic_filter", "false") + core.settings:set("mip_map", "false") + core.settings:set("anisotropic_filter", "false") ddhandled = true elseif fields["dd_mipmap"] == labels.mipmap[2] then - core.setting_set("mip_map", "true") - core.setting_set("anisotropic_filter", "false") + core.settings:set("mip_map", "true") + core.settings:set("anisotropic_filter", "false") ddhandled = true elseif fields["dd_mipmap"] == labels.mipmap[3] then - core.setting_set("mip_map", "true") - core.setting_set("anisotropic_filter", "true") + core.settings:set("mip_map", "true") + core.settings:set("anisotropic_filter", "true") ddhandled = true end if fields["dd_antialiasing"] then - core.setting_set("fsaa", + core.settings:set("fsaa", antialiasing_fname_to_name(fields["dd_antialiasing"])) ddhandled = true end if fields["dd_touchthreshold"] then - core.setting_set("touchscreen_threshold", fields["dd_touchthreshold"]) + core.settings:set("touchscreen_threshold", fields["dd_touchthreshold"]) ddhandled = true end diff --git a/builtin/mainmenu/tab_simple_main.lua b/builtin/mainmenu/tab_simple_main.lua index 3818f321f..de4ae1751 100644 --- a/builtin/mainmenu/tab_simple_main.lua +++ b/builtin/mainmenu/tab_simple_main.lua @@ -25,12 +25,12 @@ local function get_formspec(tabview, name, tabdata) local retval = "label[9.5,0;".. fgettext("Name / Password") .. "]" .. "field[0.25,3.35;5.5,0.5;te_address;;" .. - core.formspec_escape(core.setting_get("address")) .."]" .. + core.formspec_escape(core.settings:get("address")) .."]" .. "field[5.75,3.35;2.25,0.5;te_port;;" .. - core.formspec_escape(core.setting_get("remote_port")) .."]" .. + core.formspec_escape(core.settings:get("remote_port")) .."]" .. "button[10,2.6;2,1.5;btn_mp_connect;".. fgettext("Connect") .. "]" .. "field[9.8,1;2.6,0.5;te_name;;" .. - core.formspec_escape(core.setting_get("name")) .."]" .. + core.formspec_escape(core.settings:get("name")) .."]" .. "pwdfield[9.8,2;2.6,0.5;te_pwd;]" @@ -43,6 +43,7 @@ local function get_formspec(tabview, name, tabdata) retval = retval .. "tablecolumns[" .. image_column(fgettext("Favorite"), "favorite") .. ";" .. + image_column(fgettext("Ping"), "") .. ",padding=0.25;" .. "color,span=3;" .. "text,align=right;" .. -- clients "text,align=center,padding=0.25;" .. -- "/" @@ -70,9 +71,9 @@ local function get_formspec(tabview, name, tabdata) end end end - retval = retval .. render_favorite(menudata.favorites[1], (#favs > 0)) + retval = retval .. render_serverlist_row(menudata.favorites[1], (#favs > 0)) for i = 2, #menudata.favorites do - retval = retval .. "," .. render_favorite(menudata.favorites[i], (i <= #favs)) + retval = retval .. "," .. render_serverlist_row(menudata.favorites[i], (i <= #favs)) end end @@ -88,9 +89,9 @@ local function get_formspec(tabview, name, tabdata) -- checkboxes retval = retval .. "checkbox[8.0,3.9;cb_creative;".. fgettext("Creative Mode") .. ";" .. - dump(core.setting_getbool("creative_mode")) .. "]".. + dump(core.settings:get_bool("creative_mode")) .. "]".. "checkbox[8.0,4.4;cb_damage;".. fgettext("Enable Damage") .. ";" .. - dump(core.setting_getbool("enable_damage")) .. "]" + dump(core.settings:get_bool("enable_damage")) .. "]" -- buttons retval = retval .. "button[0,3.7;8,1.5;btn_start_singleplayer;" .. fgettext("Start Singleplayer") .. "]" .. @@ -127,8 +128,8 @@ local function main_button_handler(tabview, fields, name, tabdata) end if address and port then - core.setting_set("address", address) - core.setting_set("remote_port", port) + core.settings:set("address", address) + core.settings:set("remote_port", port) end tabdata.fav_selected = event.row end @@ -144,18 +145,18 @@ local function main_button_handler(tabview, fields, name, tabdata) asyncOnlineFavourites() tabdata.fav_selected = nil - core.setting_set("address", "") - core.setting_set("remote_port", "30000") + core.settings:set("address", "") + core.settings:set("remote_port", "30000") return true end if fields.cb_creative then - core.setting_set("creative_mode", fields.cb_creative) + core.settings:set("creative_mode", fields.cb_creative) return true end if fields.cb_damage then - core.setting_set("enable_damage", fields.cb_damage) + core.settings:set("enable_damage", fields.cb_damage) return true end @@ -185,12 +186,12 @@ local function main_button_handler(tabview, fields, name, tabdata) gamedata.selected_world = 0 - core.setting_set("address", fields.te_address) - core.setting_set("remote_port", fields.te_port) - - core.start() - return true - end + core.settings:set("address", fields.te_address) + core.settings:set("remote_port", fields.te_port) + + core.start() + return true + end if fields.btn_config_sp_world then local configdialog = create_configure_world_dlg(1) diff --git a/builtin/mainmenu/tab_texturepacks.lua b/builtin/mainmenu/tab_texturepacks.lua index 4638beaa1..2957481cf 100644 --- a/builtin/mainmenu/tab_texturepacks.lua +++ b/builtin/mainmenu/tab_texturepacks.lua @@ -54,9 +54,9 @@ local function get_formspec(tabview, name, tabdata) local retval = "label[4,-0.25;" .. fgettext("Select texture pack:") .. "]" .. "textlist[4,0.25;7.5,5.0;TPs;" - local current_texture_path = core.setting_get("texture_path") + local current_texture_path = core.settings:get("texture_path") local list = filter_texture_pack_list(core.get_dir_list(core.get_texturepath(), true)) - local index = tonumber(core.setting_get("mainmenu_last_selected_TP")) + local index = tonumber(core.settings:get("mainmenu_last_selected_TP")) if not index then index = 1 end @@ -106,7 +106,7 @@ local function main_button_handler(tabview, fields, name, tabdata) local event = core.explode_textlist_event(fields["TPs"]) if event.type == "CHG" or event.type == "DCL" then local index = core.get_textlist_index("TPs") - core.setting_set("mainmenu_last_selected_TP", index) + core.settings:set("mainmenu_last_selected_TP", index) local list = filter_texture_pack_list(core.get_dir_list(core.get_texturepath(), true)) local current_index = core.get_textlist_index("TPs") if current_index and #list >= current_index then @@ -114,7 +114,7 @@ local function main_button_handler(tabview, fields, name, tabdata) if list[current_index] == fgettext("None") then new_path = "" end - core.setting_set("texture_path", new_path) + core.settings:set("texture_path", new_path) end end return true diff --git a/builtin/mainmenu/textures.lua b/builtin/mainmenu/textures.lua index dadbb093e..9ba4ade7e 100644 --- a/builtin/mainmenu/textures.lua +++ b/builtin/mainmenu/textures.lua @@ -24,7 +24,7 @@ function mm_texture.init() DIR_DELIM .. "pack" .. DIR_DELIM mm_texture.basetexturedir = mm_texture.defaulttexturedir - mm_texture.texturepack = core.setting_get("texture_path") + mm_texture.texturepack = core.settings:get("texture_path") mm_texture.gameid = nil end @@ -61,7 +61,7 @@ function mm_texture.reset() mm_texture.set_generic("header") if not have_bg then - if core.setting_getbool("menu_clouds") then + if core.settings:get_bool("menu_clouds") then core.set_clouds(true) else mm_texture.set_dirt_bg() @@ -88,7 +88,7 @@ function mm_texture.update_game(gamedetails) if not have_bg then - if core.setting_getbool("menu_clouds") then + if core.settings:get_bool("menu_clouds") then core.set_clouds(true) else mm_texture.set_dirt_bg() diff --git a/builtin/profiler/init.lua b/builtin/profiler/init.lua index c1597d280..874950364 100644 --- a/builtin/profiler/init.lua +++ b/builtin/profiler/init.lua @@ -15,10 +15,18 @@ --with this program; if not, write to the Free Software Foundation, Inc., --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +local function get_bool_default(name, default) + local val = core.settings:get_bool(name) + if val == nil then + return default + end + return val +end + local profiler_path = core.get_builtin_path()..DIR_DELIM.."profiler"..DIR_DELIM local profiler = {} local sampler = assert(loadfile(profiler_path .. "sampling.lua"))(profiler) -local instrumentation = assert(loadfile(profiler_path .. "instrumentation.lua"))(profiler, sampler) +local instrumentation = assert(loadfile(profiler_path .. "instrumentation.lua"))(profiler, sampler, get_bool_default) local reporter = dofile(profiler_path .. "reporter.lua") profiler.instrument = instrumentation.instrument @@ -27,7 +35,7 @@ profiler.instrument = instrumentation.instrument -- Is called later, after `core.register_chatcommand` was set up. -- function profiler.init_chatcommand() - local instrument_profiler = core.setting_getbool("instrument.profiler") or false + local instrument_profiler = get_bool_default("instrument.profiler", false) if instrument_profiler then instrumentation.init_chatcommand() end diff --git a/builtin/profiler/instrumentation.lua b/builtin/profiler/instrumentation.lua index 4311215b2..be3a460e5 100644 --- a/builtin/profiler/instrumentation.lua +++ b/builtin/profiler/instrumentation.lua @@ -17,8 +17,9 @@ local format, pairs, type = string.format, pairs, type local core, get_current_modname = core, core.get_current_modname -local profiler, sampler = ... -local instrument_builtin = core.setting_getbool("instrument.builtin") or false +local profiler, sampler, get_bool_default = ... + +local instrument_builtin = get_bool_default("instrument.builtin", false) local register_functions = { register_globalstep = 0, @@ -137,7 +138,7 @@ local function instrument_register(func, func_name) end local function init_chatcommand() - if core.setting_getbool("instrument.chatcommand") or true then + if get_bool_default("instrument.chatcommand", true) then local orig_register_chatcommand = core.register_chatcommand core.register_chatcommand = function(cmd, def) def.func = instrument { @@ -153,8 +154,7 @@ end -- Start instrumenting selected functions -- local function init() - local is_set = core.setting_getbool - if is_set("instrument.entity") or true then + if get_bool_default("instrument.entity", true) then -- Explicitly declare entity api-methods. -- Simple iteration would ignore lookup via __index. local entity_instrumentation = { @@ -180,7 +180,7 @@ local function init() end end - if is_set("instrument.abm") or true then + if get_bool_default("instrument.abm", true) then -- Wrap register_abm() to automatically instrument abms. local orig_register_abm = core.register_abm core.register_abm = function(spec) @@ -193,7 +193,7 @@ local function init() end end - if is_set("instrument.lbm") or true then + if get_bool_default("instrument.lbm", true) then -- Wrap register_lbm() to automatically instrument lbms. local orig_register_lbm = core.register_lbm core.register_lbm = function(spec) @@ -206,13 +206,13 @@ local function init() end end - if is_set("instrument.global_callback") or true then + if get_bool_default("instrument.global_callback", true) then for func_name, _ in pairs(register_functions) do core[func_name] = instrument_register(core[func_name], func_name) end end - if is_set("instrument.profiler") or false then + if get_bool_default("instrument.profiler", false) then -- Measure overhead of instrumentation, but keep it down for functions -- So keep the `return` for better optimization. profiler.empty_instrument = instrument { diff --git a/builtin/profiler/reporter.lua b/builtin/profiler/reporter.lua index 5b38ed4df..fed47a36b 100644 --- a/builtin/profiler/reporter.lua +++ b/builtin/profiler/reporter.lua @@ -18,7 +18,7 @@ local DIR_DELIM, LINE_DELIM = DIR_DELIM, "\n" local table, unpack, string, pairs, io, os = table, unpack, string, pairs, io, os local rep, sprintf, tonumber = string.rep, string.format, tonumber -local core, setting_get = core, core.setting_get +local core, settings = core, core.settings local reporter = {} --- @@ -229,7 +229,7 @@ end local worldpath = core.get_worldpath() local function get_save_path(format, filter) - local report_path = setting_get("profiler.report_path") or "" + local report_path = settings:get("profiler.report_path") or "" if report_path ~= "" then core.mkdir(sprintf("%s%s%s", worldpath, DIR_DELIM, report_path)) end @@ -249,7 +249,7 @@ end -- function reporter.save(profile, format, filter) if not format or format == "" then - format = setting_get("profiler.default_report_format") or "txt" + format = settings:get("profiler.default_report_format") or "txt" end if filter == "" then filter = nil diff --git a/builtin/profiler/sampling.lua b/builtin/profiler/sampling.lua index 1d1ef256d..4b53399a5 100644 --- a/builtin/profiler/sampling.lua +++ b/builtin/profiler/sampling.lua @@ -185,7 +185,7 @@ end function sampler.init() sampler.reset() - if core.setting_getbool("instrument.profiler") then + if core.settings:get_bool("instrument.profiler") then core.register_globalstep(function() if logged_time == 0 then return diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 1818b5a18..ba3339d32 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -107,6 +107,12 @@ continuous_forward (Continuous forward) bool false # Enable Joysticks enable_joysticks (Enable Joysticks) bool false +# The identifier of the joystick to use +joystick_id (Joystick ID) int 0 + +# The type of joystick +joystick_type (Joystick Type) enum auto auto,generic,xbox + # The time in seconds it takes between repeated events # when holding down a joystick button combination. repeat_joystick_button_time (Joystick button repetition interval) float 0.17 @@ -156,6 +162,10 @@ keymap_chat (Chat key) key KEY_KEY_T # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 keymap_cmd (Command key) key / +# Key for opening the chat window to type local commands. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +keymap_cmd_local (Command key) key . + # Key for opening the chat console. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 keyman_console (Console key) key KEY_F10 @@ -176,6 +186,26 @@ keymap_fastmove (Fast key) key KEY_KEY_J # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 keymap_noclip (Noclip key) key KEY_KEY_H +# Key for selecting the next item in the hotbar. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +keymap_hotbar_next (Hotbar next key) key KEY_KEY_N + +# Key for selecting the previous item in the hotbar. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +keymap_hotbar_previous (Hotbar previous key) key KEY_KEY_B + +# Key for muting the game. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +keymap_mute (Mute key) key KEY_KEY_M + +# Key for increasing the volume. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +keymap_increase_volume (Inc. volume key) key + +# Key for decreasing the volume. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +keymap_decrease_volume (Dec. volume key) key + # Key for toggling autorun. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 keymap_autorun (Autorun key) key @@ -196,6 +226,10 @@ keymap_screenshot (Screenshot) key KEY_F12 # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 keymap_drop (Drop item key) key KEY_KEY_Q +# Key to use view zoom when possible. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +keymap_zoom (View zoom key) key KEY_KEY_Z + # Key for toggling the display of the HUD. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 keymap_toggle_hud (HUD toggle key) key KEY_F1 @@ -204,6 +238,10 @@ keymap_toggle_hud (HUD toggle key) key KEY_F1 # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 keymap_toggle_chat (Chat toggle key) key KEY_F2 +# Key for toggling the display of the large chat console. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +keymap_console (Large chat console key) key KEY_F10 + # Key for toggling the display of the fog. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 keymap_toggle_force_fog_off (Fog toggle key) key KEY_F3 @@ -264,12 +302,19 @@ show_entity_selectionbox (Show entity selection boxes) bool true # when connecting to the server. enable_remote_media_server (Connect to external media server) bool true +# Enable Lua modding support on client. +# This support is experimental and API can change. +enable_client_modding (Client modding) bool false + # URL to the server list displayed in the Multiplayer Tab. serverlist_url (Serverlist URL) string servers.minetest.net # File in client/serverlist/ that contains your favorite servers displayed in the Multiplayer Tab. serverlist_file (Serverlist file) string favoriteservers.txt +# Maximum size of the out chat queue. 0 to disable queueing and -1 to make the queue size unlimited +max_out_chat_queue_size (Maximum size of the out chat queue) int 20 + [*Graphics] [**In-Game] @@ -302,7 +347,10 @@ enable_clouds (Clouds) bool true enable_3d_clouds (3D clouds) bool true # Method used to highlight selected object. -node_highlighting (Node highlighting) enum box box,halo +node_highlighting (Node highlighting) enum box box,halo,none + +# Adds particles when digging a node. +enable_particles (Digging particles) bool true [***Filtering] @@ -337,12 +385,20 @@ texture_min_size (Minimum texture size for filters) int 64 # when set to higher number than 0. fsaa (FSAA) enum 0 0,1,2,4,8,16 +# Undersampling is similar to using lower screen resolution, but it applies +# to the game world only, keeping the GUI intact. +# It should give significant performance boost at the cost of less detailed image. +undersampling (Undersampling) enum 0 0,2,3,4 + [***Shaders] # Shaders allow advanced visual effects and may increase performance on some video cards. -# Thy only work with the OpenGL video backend. +# This only works with the OpenGL video backend. enable_shaders (Shaders) bool true +# Path to shader directory. If no path is defined, default location will be used. +shader_path (Shader path) path + [****Tone Mapping] # Enables filmic tone mapping @@ -377,7 +433,7 @@ enable_parallax_occlusion (Parallax occlusion) bool false parallax_occlusion_mode (Parallax occlusion mode) int 1 0 1 # Strength of parallax. -3d_parallax_strength (Parallax occlusion strength) float 0.025 +3d_paralax_strength (Parallax occlusion strength) float 0.025 # Number of parallax occlusion iterations. parallax_occlusion_iterations (Parallax occlusion iterations) int 4 @@ -426,6 +482,9 @@ screenW (Screen width) int 800 # Height component of the initial window size. screenH (Screen height) int 600 +# Save window size automatically when modified. +autosave_screensize (Autosave Screen Size) bool true + # Fullscreen mode. fullscreen (Full screen) bool false @@ -440,11 +499,11 @@ fov (Field of view) int 72 30 160 # Field of view while zooming in degrees. # This requires the "zoom" privilege on the server. -zoom_fov (Field of view for zoom) int 15 15 160 +zoom_fov (Field of view for zoom) int 15 7 160 -# Adjust the gamma encoding for the light tables. Lower numbers are brighter. +# Adjust the gamma encoding for the light tables. Higher numbers are brighter. # This setting is for the client only and is ignored by the server. -display_gamma (Gamma) float 1.8 1.0 3.0 +display_gamma (Gamma) float 2.2 1.0 3.0 # Path to texture directory. All textures are first searched from here. texture_path (Texture path) path @@ -459,13 +518,13 @@ cloud_height (Cloud height) int 120 # Values larger than 26 will start to produce sharp cutoffs at cloud area corners. cloud_radius (Cloud radius) int 12 -# Multiplier for view bobbing. +# Enable view bobbing and amount of view bobbing. # For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double. -view_bobbing_amount (View bobbing) float 1.0 +view_bobbing_amount (View bobbing factor) float 1.0 # Multiplier for fall bobbing. # For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double. -fall_bobbing_amount (Fall bobbing) float 0.0 +fall_bobbing_amount (Fall bobbing factor) float 0.0 # 3D support. # Currently supported: @@ -477,6 +536,9 @@ fall_bobbing_amount (Fall bobbing) float 0.0 # - pageflip: quadbuffer based 3d. 3d_mode (3D mode) enum none none,anaglyph,interlaced,topbottom,sidebyside,pageflip +# In-game chat console height, between 0.1 (10%) and 1.0 (100%). +console_height (Console height) float 1.0 0.1 1.0 + # In-game chat console background color (R,G,B). console_color (Console color) string (0,0,0) @@ -502,9 +564,21 @@ desynchronize_mapblock_texture_animation (Desynchronize block animation) bool tr # Useful if there's something to be displayed right or left of hotbar. hud_hotbar_max_width (Maximum hotbar width) float 1.0 +# Modifies the size of the hudbar elements. +hud_scaling (HUD scale factor) float 1.0 + # Enables caching of facedir rotated meshes. enable_mesh_cache (Mesh cache) bool false +# Delay between mesh updates on the client in ms. Increasing this will slow +# down the rate of mesh updates, thus reducing jitter on slower clients. +mesh_generation_interval (Mapblock mesh generation delay) int 0 0 50 + +# Size of the MapBlock cache of the mesh generator. Increasing this will +# increase the cache hit %, reducing the data being copied from the main +# thread, thus reducing jitter. +meshgen_block_cache_size (Mapblock mesh generator's MapBlock cache size MB) int 20 0 1000 + # Enables minimap. enable_minimap (Minimap) bool true @@ -528,9 +602,16 @@ ambient_occlusion_gamma (Ambient occlusion gamma) float 2.2 0.25 4.0 # Enables animation of inventory items. inventory_items_animations (Inventory items animations) bool false +# Android systems only: Tries to create inventory textures from meshes +# when no supported render was found. +inventory_image_hack (Inventory image hack) bool false + # Fraction of the visible distance at which fog starts to be rendered fog_start (Fog Start) float 0.4 0.0 0.99 +# Makes all liquids opaque +opaque_water (Opaque liquids) bool false + [**Menus] # Use a cloud animation for the main menu background. @@ -597,6 +678,10 @@ screenshot_quality (Screenshot quality) int 0 0 100 # Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens. screen_dpi (DPI) int 72 +# Windows systems only: Start Minetest with the command line window in the background. +# Contains the same information as the file debug.txt (default name). +enable_console (Enable console window) bool false + [*Sound] enable_sound (Sound) bool true @@ -703,9 +788,15 @@ map-dir (Map directory) path # Setting it to -1 disables the feature. item_entity_ttl (Item entity TTL) int 900 +# If enabled, show the server status message on player connection. +show_statusline_on_connect (Status message on connection) bool true + # Enable players getting damage and dying. enable_damage (Damage) bool false +# Enable creative mode for new created maps. +creative_mode (Creative) bool false + # A chosen map seed for a new map, leave empty for random. # Will be overridden when creating a new world in the main menu. fixed_map_seed (Fixed map seed) string @@ -758,7 +849,7 @@ active_object_send_range_blocks (Active object send range) int 3 # How large area of blocks are subject to the active block stuff, stated in mapblocks (16 nodes). # In active blocks objects are loaded and ABMs run. -active_block_range (Active block range) int 2 +active_block_range (Active block range) int 3 # From how far blocks are sent to clients, stated in mapblocks (16 nodes). max_block_send_distance (Max block send distance) int 10 @@ -793,9 +884,8 @@ movement_acceleration_fast (Fast mode acceleration) float 10 movement_speed_walk (Walking speed) float 4 movement_speed_crouch (Crouch speed) float 1.35 movement_speed_fast (Fast mode speed) float 20 -movement_speed_climb (Climbing speed) float 2 +movement_speed_climb (Climbing speed) float 3 movement_speed_jump (Jumping speed) float 6.5 -movement_speed_descend (Descending speed) float 6 movement_liquid_fluidity (Liquid fluidity) float 1 movement_liquid_fluidity_smooth (Liquid fluidity smoothing) float 0.5 movement_liquid_sink (Liquid sink) float 10 @@ -834,7 +924,7 @@ active_block_mgmt_interval (Active Block Management interval) float 2.0 abm_interval (Active Block Modifier interval) float 1.0 # Length of time between NodeTimer execution cycles -nodetimer_interval (NodeTimer interval) float 1.0 +nodetimer_interval (NodeTimer interval) float 0.2 # If enabled, invalid world data won't cause the server to shut down. # Only enable this if you know what you are doing. @@ -858,6 +948,12 @@ liquid_update (Liquid update tick) float 1.0 # Stated in mapblocks (16 nodes) block_send_optimize_distance (block send optimize distance) int 4 2 +# If enabled the server will perform map block occlusion culling based on +# on the eye position of the player. This can reduce the number of blocks +# sent to the client 50-80%. The client will not longer receive most invisible +# so that the utility of noclip mode is reduced. +server_side_occlusion_culling (Server side occlusion culling) bool true + [*Mapgen] # Name of map generator to be used when creating a new world. @@ -870,13 +966,10 @@ water_level (Water level) int 1 # From how far blocks are generated for clients, stated in mapblocks (16 nodes). max_block_generate_distance (Max block generate distance) int 6 -# Where the map generator stops. -# Please note: -# - Limited to 31000 (setting above has no effect) -# - The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks). -# - Those groups have an offset of -32, -32 nodes from the origin. -# - Only groups which are within the map_generation_limit are generated -map_generation_limit (Map generation limit) int 31000 0 31000 +# Limit of map generation, in nodes, in all 6 directions from (0, 0, 0). +# Only mapchunks completely within the mapgen limit are generated. +# Value is stored per-world. +mapgen_limit (Map generation limit) int 31000 0 31000 # Global map generation attributes. # In Mapgen v6 the 'decorations' flag controls all decorations except trees @@ -909,23 +1002,63 @@ emergequeue_limit_generate (Limit of emerge queues to generate) int 32 # at the cost of slightly buggy caves. num_emerge_threads (Number of emerge threads) int 1 -# Noise parameters for biome API temperature, humidity and biome blend. -mg_biome_np_heat (Mapgen biome heat noise parameters) noise_params 50, 50, (750, 750, 750), 5349, 3, 0.5, 2.0 -mg_biome_np_heat_blend (Mapgen heat blend noise parameters) noise_params 0, 1.5, (8, 8, 8), 13, 2, 1.0, 2.0 -mg_biome_np_humidity (Mapgen biome humidity noise parameters) noise_params 50, 50, (750, 750, 750), 842, 3, 0.5, 2.0 -mg_biome_np_humidity_blend (Mapgen biome humidity blend noise parameters) noise_params 0, 1.5, (8, 8, 8), 90003, 2, 1.0, 2.0 +[***Biome API temperature and humidity noise parameters] + +# Temperature variation for biomes. +mg_biome_np_heat (Heat noise) noise_params 50, 50, (1000, 1000, 1000), 5349, 3, 0.5, 2.0 + +# Small-scale temperature variation for blending biomes on borders. +mg_biome_np_heat_blend (Heat blend noise) noise_params 0, 1.5, (8, 8, 8), 13, 2, 1.0, 2.0 + +# Humidity variation for biomes. +mg_biome_np_humidity (Humidity noise) noise_params 50, 50, (1000, 1000, 1000), 842, 3, 0.5, 2.0 + +# Small-scale humidity variation for blending biomes on borders. +mg_biome_np_humidity_blend (Humidity blend noise) noise_params 0, 1.5, (8, 8, 8), 90003, 2, 1.0, 2.0 [***Mapgen v5] +# Map generation attributes specific to Mapgen v5. +# Flags that are not specified in the flag string are not modified from the default. +# Flags starting with 'no' are used to explicitly disable them. +mgv5_spflags (Mapgen v5 specific flags) flags caverns caverns,nocaverns + # Controls width of tunnels, a smaller value creates wider tunnels. -mgv5_cave_width (Mapgen v5 cave width) float 0.125 +mgv5_cave_width (Cave width) float 0.125 + +# Y-level of cavern upper limit. +mgv5_cavern_limit (Cavern limit) int -256 + +# Y-distance over which caverns expand to full size. +mgv5_cavern_taper (Cavern taper) int 256 + +# Defines full size of caverns, smaller values create larger caverns. +mgv5_cavern_threshold (Cavern threshold) float 0.7 + +# Variation of biome filler depth. +mgv5_np_filler_depth (Filler depth noise) noise_params 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0 + +# Variation of terrain vertical scale. +# When noise is < -0.55 terrain is near-flat. +mgv5_np_factor (Factor noise) noise_params 0, 1, (250, 250, 250), 920381, 3, 0.45, 2.0 + +# Y-level of average terrain surface. +mgv5_np_height (Height noise) noise_params 0, 10, (250, 250, 250), 84174, 4, 0.5, 2.0 + +# First of 2 3D noises that together define tunnels. +mgv5_np_cave1 (Cave1 noise) noise_params 0, 12, (50, 50, 50), 52534, 4, 0.5, 2.0 + +# Second of 2 3D noises that together define tunnels. +mgv5_np_cave2 (Cave2 noise) noise_params 0, 12, (50, 50, 50), 10325, 4, 0.5, 2.0 + +# 3D noise defining giant caverns. +mgv5_np_cavern (Cavern noise) noise_params 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 -mgv5_np_filler_depth (Mapgen v5 filler depth noise parameters) noise_params 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0 -mgv5_np_factor (Mapgen v5 factor noise parameters) noise_params 0, 1, (250, 250, 250), 920381, 3, 0.45, 2.0 -mgv5_np_height (Mapgen v5 height noise parameters) noise_params 0, 10, (250, 250, 250), 84174, 4, 0.5, 2.0 -mgv5_np_cave1 (Mapgen v5 cave1 noise parameters) noise_params 0, 12, (50, 50, 50), 52534, 4, 0.5, 2.0 -mgv5_np_cave2 (Mapgen v5 cave2 noise parameters) noise_params 0, 12, (50, 50, 50), 10325, 4, 0.5, 2.0 # TODO +# Noise parameters in group format, unsupported by advanced settings +# menu but settable in minetest.conf. +# See documentation of noise parameter formats in minetest.conf.example. +# 3D noise defining terrain. #mgv5_np_ground = { # offset = 0 # scale = 40 @@ -940,27 +1073,52 @@ mgv5_np_cave2 (Mapgen v5 cave2 noise parameters) noise_params 0, 12, (50, 50, 50 [***Mapgen v6] # Map generation attributes specific to Mapgen v6. -# When snowbiomes are enabled jungles are automatically enabled, the 'jungles' flag is ignored. +# The 'snowbiomes' flag enables the new 5 biome system. +# When the new biome system is enabled jungles are automatically enabled and +# the 'jungles' flag is ignored. # Flags that are not specified in the flag string are not modified from the default. # Flags starting with 'no' are used to explicitly disable them. -mgv6_spflags (Mapgen v6 flags) flags jungles,biomeblend,mudflow,snowbiomes,trees jungles,biomeblend,mudflow,snowbiomes,flat,trees,nojungles,nobiomeblend,nomudflow,nosnowbiomes,noflat,notrees - -# Controls size of deserts and beaches in Mapgen v6. -# When snowbiomes are enabled 'mgv6_freq_desert' is ignored. -mgv6_freq_desert (Mapgen v6 desert frequency) float 0.45 -mgv6_freq_beach (Mapgen v6 beach frequency) float 0.15 - -mgv6_np_terrain_base (Mapgen v6 terrain base noise parameters) noise_params -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0 -mgv6_np_terrain_higher (Mapgen v6 terrain altitude noise parameters) noise_params 20, 16, (500, 500, 500), 85039, 5, 0.6, 2.0 -mgv6_np_steepness (Mapgen v6 steepness noise parameters) noise_params 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2.0 -mgv6_np_height_select (Mapgen v6 height select noise parameters) noise_params 0.5, 1, (250, 250, 250), 4213, 5, 0.69, 2.0 -mgv6_np_mud (Mapgen v6 mud noise parameters) noise_params 4, 2, (200, 200, 200), 91013, 3, 0.55, 2.0 -mgv6_np_beach (Mapgen v6 beach noise parameters) noise_params 0, 1, (250, 250, 250), 59420, 3, 0.50, 2.0 -mgv6_np_biome (Mapgen v6 biome noise parameters) noise_params 0, 1, (500, 500, 500), 9130, 3, 0.50, 2.0 -mgv6_np_cave (Mapgen v6 cave noise parameters) noise_params 6, 6, (250, 250, 250), 34329, 3, 0.50, 2.0 -mgv6_np_humidity (Mapgen v6 humidity noise parameters) noise_params 0.5, 0.5, (500, 500, 500), 72384, 3, 0.50, 2.0 -mgv6_np_trees (Mapgen v6 trees noise parameters) noise_params 0, 1, (125, 125, 125), 2, 4, 0.66, 2.0 -mgv6_np_apple_trees (Mapgen v6 apple trees noise parameters) noise_params 0, 1, (100, 100, 100), 342902, 3, 0.45, 2.0 +mgv6_spflags (Mapgen v6 specific flags) flags jungles,biomeblend,mudflow,snowbiomes,trees jungles,biomeblend,mudflow,snowbiomes,flat,trees,nojungles,nobiomeblend,nomudflow,nosnowbiomes,noflat,notrees + +# Deserts occur when np_biome exceeds this value. +# When the new biome system is enabled, this is ignored. +mgv6_freq_desert (Desert noise threshold) float 0.45 + +# Sandy beaches occur when np_beach exceeds this value. +mgv6_freq_beach (Beach noise threshold) float 0.15 + +# Y-level of lower terrain and lakebeds. +mgv6_np_terrain_base (Terrain base noise) noise_params -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0 + +# Y-level of higher (cliff-top) terrain. +mgv6_np_terrain_higher (Terrain higher noise) noise_params 20, 16, (500, 500, 500), 85039, 5, 0.6, 2.0 + +# Varies steepness of cliffs. +mgv6_np_steepness (Steepness noise) noise_params 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2.0 + +# Defines areas of 'terrain_higher' (cliff-top terrain). +mgv6_np_height_select (Height select noise) noise_params 0.5, 1, (250, 250, 250), 4213, 5, 0.69, 2.0 + +# Varies depth of biome surface nodes. +mgv6_np_mud (Mud noise) noise_params 4, 2, (200, 200, 200), 91013, 3, 0.55, 2.0 + +# Defines areas with sandy beaches. +mgv6_np_beach (Beach noise) noise_params 0, 1, (250, 250, 250), 59420, 3, 0.50, 2.0 + +# Temperature variation for biomes. +mgv6_np_biome (Biome noise) noise_params 0, 1, (500, 500, 500), 9130, 3, 0.50, 2.0 + +# Variation of number of caves. +mgv6_np_cave (Cave noise) noise_params 6, 6, (250, 250, 250), 34329, 3, 0.50, 2.0 + +# Humidity variation for biomes. +mgv6_np_humidity (Humidity noise) noise_params 0.5, 0.5, (500, 500, 500), 72384, 3, 0.50, 2.0 + +# Defines tree areas and tree density. +mgv6_np_trees (Trees noise) noise_params 0, 1, (125, 125, 125), 2, 4, 0.66, 2.0 + +# Defines areas where trees have apples. +mgv6_np_apple_trees (Apple trees noise) noise_params 0, 1, (100, 100, 100), 342902, 3, 0.45, 2.0 [***Mapgen v7] @@ -969,37 +1127,77 @@ mgv6_np_apple_trees (Mapgen v6 apple trees noise parameters) noise_params 0, 1, # Floatlands are currently experimental and subject to change. # Flags that are not specified in the flag string are not modified from the default. # Flags starting with 'no' are used to explicitly disable them. -mgv7_spflags (Mapgen v7 flags) flags mountains,ridges mountains,ridges,floatlands,nomountains,noridges,nofloatlands +mgv7_spflags (Mapgen v7 specific flags) flags mountains,ridges,nofloatlands,caverns mountains,ridges,floatlands,caverns,nomountains,noridges,nofloatlands,nocaverns # Controls width of tunnels, a smaller value creates wider tunnels. -mgv7_cave_width (Mapgen v7 cave width) float 0.09 +mgv7_cave_width (Cave width) float 0.09 # Controls the density of floatland mountain terrain. # Is an offset added to the 'np_mountain' noise value. -mgv7_float_mount_density (Mapgen v7 floatland mountain density) float 0.6 +mgv7_float_mount_density (Floatland mountain density) float 0.6 # Typical maximum height, above and below midpoint, of floatland mountain terrain. -mgv7_float_mount_height (Mapgen v7 floatland mountain height) float 128.0 +mgv7_float_mount_height (Floatland mountain height) float 128.0 # Y-level of floatland midpoint and lake surface. -mgv7_floatland_level (Mapgen v7 floatland level) int 1280 +mgv7_floatland_level (Floatland level) int 1280 # Y-level to which floatland shadows extend. -mgv7_shadow_limit (Mapgen v7 shadow limit) int 1024 - -mgv7_np_terrain_base (Mapgen v7 terrain base noise parameters) noise_params 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0 -mgv7_np_terrain_alt (Mapgen v7 terrain altitude noise parameters) noise_params 4, 25, (600, 600, 600), 5934, 5, 0.6, 2.0 -mgv7_np_terrain_persist (Mapgen v7 terrain persistation noise parameters) noise_params 0.6, 0.1, (2000, 2000, 2000), 539, 3, 0.6, 2.0 -mgv7_np_height_select (Mapgen v7 height select noise parameters) noise_params -8, 16, (500, 500, 500), 4213, 6, 0.7, 2.0 -mgv7_np_filler_depth (Mapgen v7 filler depth noise parameters) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0 -mgv7_np_mount_height (Mapgen v7 mount height noise parameters) noise_params 256, 112, (1000, 1000, 1000), 72449, 3, 0.6, 2.0 -mgv7_np_ridge_uwater (Mapgen v7 river course noise parameters) noise_params 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0 -mgv7_np_floatland_base (Mapgen v7 floatland base terrain noise parameters) noise_params -0.6, 1.5, (600, 600, 600), 114, 5, 0.6, 2.0 -mgv7_np_float_base_height (Mapgen v7 floatland base terrain height noise parameters) noise_params 48, 24, (300, 300, 300), 907, 4, 0.7, 2.0 -mgv7_np_mountain (Mapgen v7 mountain noise parameters) noise_params -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0 -mgv7_np_ridge (Mapgen v7 river channel wall noise parameters) noise_params 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0 -mgv7_np_cave1 (Mapgen v7 cave1 noise parameters) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 -mgv7_np_cave2 (Mapgen v7 cave2 noise parameters) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 +mgv7_shadow_limit (Shadow limit) int 1024 + +# Y-level of cavern upper limit. +mgv7_cavern_limit (Cavern limit) int -256 + +# Y-distance over which caverns expand to full size. +mgv7_cavern_taper (Cavern taper) int 256 + +# Defines full size of caverns, smaller values create larger caverns. +mgv7_cavern_threshold (Cavern threshold) float 0.7 + +# Y-level of higher (cliff-top) terrain. +mgv7_np_terrain_base (Terrain base noise) noise_params 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0 + +# Y-level of lower terrain and lakebeds. +mgv7_np_terrain_alt (Terrain alt noise) noise_params 4, 25, (600, 600, 600), 5934, 5, 0.6, 2.0 + +# Varies roughness of terrain. +# Defines the 'persistence' value for terrain_base and terrain_alt noises. +mgv7_np_terrain_persist (Terrain persistence noise) noise_params 0.6, 0.1, (2000, 2000, 2000), 539, 3, 0.6, 2.0 + +# Defines areas of higher (cliff-top) terrain and affects steepness of cliffs. +mgv7_np_height_select (Height select noise) noise_params -8, 16, (500, 500, 500), 4213, 6, 0.7, 2.0 + +# Variation of biome filler depth. +mgv7_np_filler_depth (Filler depth noise) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0 + +# Variation of maximum mountain height (in nodes). +mgv7_np_mount_height (Mountain height noise) noise_params 256, 112, (1000, 1000, 1000), 72449, 3, 0.6, 2.0 + +# Defines large-scale river channel structure. +mgv7_np_ridge_uwater (Ridge underwater noise) noise_params 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0 + +# Defines areas of floatland smooth terrain. +# Smooth floatlands occur when noise > 0. +mgv7_np_floatland_base (Floatland base noise) noise_params -0.6, 1.5, (600, 600, 600), 114, 5, 0.6, 2.0 + +# Variation of hill height and lake depth on floatland smooth terrain. +mgv7_np_float_base_height (Floatland base height noise) noise_params 48, 24, (300, 300, 300), 907, 4, 0.7, 2.0 + +# 3D noise defining mountain structure and height. +# Also defines structure of floatland mountain terrain. +mgv7_np_mountain (Mountain noise) noise_params -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0 + +# 3D noise defining structure of river canyon walls. +mgv7_np_ridge (Ridge noise) noise_params 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0 + +# 3D noise defining giant caverns. +mgv7_np_cavern (Cavern noise) noise_params 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 + +# First of 2 3D noises that together define tunnels. +mgv7_np_cave1 (Cave1 noise) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 + +# Second of 2 3D noises that together define tunnels. +mgv7_np_cave2 (Cave2 noise) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 [***Mapgen flat] @@ -1007,46 +1205,49 @@ mgv7_np_cave2 (Mapgen v7 cave2 noise parameters) noise_params 0, 12, (67, 67, 67 # Occasional lakes and hills can be added to the flat world. # Flags that are not specified in the flag string are not modified from the default. # Flags starting with 'no' are used to explicitly disable them. -mgflat_spflags (Mapgen flat flags) flags lakes,hills,,nolakes,nohills +mgflat_spflags (Mapgen flat specific flags) flags nolakes,nohills lakes,hills,nolakes,nohills # Y of flat ground. -mgflat_ground_level (Mapgen flat ground level) int 8 +mgflat_ground_level (Ground level) int 8 # Y of upper limit of large pseudorandom caves. -mgflat_large_cave_depth (Mapgen flat large cave depth) int -33 +mgflat_large_cave_depth (Large cave depth) int -33 # Controls width of tunnels, a smaller value creates wider tunnels. -mgflat_cave_width (Mapgen flat cave width) float 0.09 +mgflat_cave_width (Cave width) float 0.09 # Terrain noise threshold for lakes. # Controls proportion of world area covered by lakes. # Adjust towards 0.0 for a larger proportion. -mgflat_lake_threshold (Mapgen flat lake threshold) float -0.45 +mgflat_lake_threshold (Lake threshold) float -0.45 # Controls steepness/depth of lake depressions. -mgflat_lake_steepness (Mapgen flat lake steepness) float 48.0 +mgflat_lake_steepness (Lake steepness) float 48.0 # Terrain noise threshold for hills. # Controls proportion of world area covered by hills. # Adjust towards 0.0 for a larger proportion. -mgflat_hill_threshold (Mapgen flat hill threshold) float 0.45 +mgflat_hill_threshold (Hill threshold) float 0.45 # Controls steepness/height of hills. -mgflat_hill_steepness (Mapgen flat hill steepness) float 64.0 +mgflat_hill_steepness (Hill steepness) float 64.0 + +# Defines location and terrain of optional hills and lakes. +mgflat_np_terrain (Terrain noise) noise_params 0, 1, (600, 600, 600), 7244, 5, 0.6, 2.0 -# Determines terrain shape. -# The 3 numbers in brackets control the scale of the -# terrain, the 3 numbers should be identical. -mgflat_np_terrain (Mapgen flat terrain noise parameters) noise_params 0, 1, (600, 600, 600), 7244, 5, 0.6, 2.0 +# Variation of biome filler depth. +mgflat_np_filler_depth (Filler depth noise) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0 -mgflat_np_filler_depth (Mapgen flat filler depth noise parameters) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0 -mgflat_np_cave1 (Mapgen flat cave1 noise parameters) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 -mgflat_np_cave2 (Mapgen flat cave2 noise parameters) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 +# First of 2 3D noises that together define tunnels. +mgflat_np_cave1 (Cave1 noise) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 + +# Second of 2 3D noises that together define tunnels. +mgflat_np_cave2 (Cave2 noise) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 [***Mapgen fractal] # Controls width of tunnels, a smaller value creates wider tunnels. -mgfractal_cave_width (Mapgen fractal cave width) float 0.09 +mgfractal_cave_width (Cave width) float 0.09 # Choice of 18 fractals from 9 formulas. # 1 = 4D "Roundy" mandelbrot set. @@ -1067,48 +1268,55 @@ mgfractal_cave_width (Mapgen fractal cave width) float 0.09 # 16 = 3D "Cosine Mandelbulb" julia set. # 17 = 4D "Mandelbulb" mandelbrot set. # 18 = 4D "Mandelbulb" julia set. -mgfractal_fractal (Mapgen fractal fractal) int 1 1 18 +mgfractal_fractal (Fractal type) int 1 1 18 # Iterations of the recursive function. # Controls the amount of fine detail. -mgfractal_iterations (Mapgen fractal iterations) int 11 +mgfractal_iterations (Iterations) int 11 # Approximate (X,Y,Z) scale of fractal in nodes. -mgfractal_scale (Mapgen fractal scale) v3f (4096.0, 1024.0, 4096.0) +mgfractal_scale (Scale) v3f (4096.0, 1024.0, 4096.0) # (X,Y,Z) offset of fractal from world centre in units of 'scale'. # Used to move a suitable spawn area of low land close to (0, 0). # The default is suitable for mandelbrot sets, it needs to be edited for julia sets. # Range roughly -2 to 2. Multiply by 'scale' for offset in nodes. -mgfractal_offset (Mapgen fractal offset) v3f (1.79, 0.0, 0.0) +mgfractal_offset (Offset) v3f (1.79, 0.0, 0.0) # W co-ordinate of the generated 3D slice of a 4D fractal. # Determines which 3D slice of the 4D shape is generated. # Has no effect on 3D fractals. # Range roughly -2 to 2. -mgfractal_slice_w (Mapgen fractal slice w) float 0.0 +mgfractal_slice_w (Slice w) float 0.0 # Julia set only: X component of hypercomplex constant determining julia shape. # Range roughly -2 to 2. -mgfractal_julia_x (Mapgen fractal julia x) float 0.33 +mgfractal_julia_x (Julia x) float 0.33 # Julia set only: Y component of hypercomplex constant determining julia shape. # Range roughly -2 to 2. -mgfractal_julia_y (Mapgen fractal julia y) float 0.33 +mgfractal_julia_y (Julia y) float 0.33 # Julia set only: Z component of hypercomplex constant determining julia shape. # Range roughly -2 to 2. -mgfractal_julia_z (Mapgen fractal julia z) float 0.33 +mgfractal_julia_z (Julia z) float 0.33 # Julia set only: W component of hypercomplex constant determining julia shape. # Has no effect on 3D fractals. # Range roughly -2 to 2. -mgfractal_julia_w (Mapgen fractal julia w) float 0.33 +mgfractal_julia_w (Julia w) float 0.33 + +# Y-level of seabed. +mgfractal_np_seabed (Seabed noise) noise_params -14, 9, (600, 600, 600), 41900, 5, 0.6, 2.0 + +# Variation of biome filler depth. +mgfractal_np_filler_depth (Filler depth noise) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0 -mgfractal_np_seabed (Mapgen fractal seabed noise parameters) noise_params -14, 9, (600, 600, 600), 41900, 5, 0.6, 2.0 -mgfractal_np_filler_depth (Mapgen fractal filler depth noise parameters) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0 -mgfractal_np_cave1 (Mapgen fractal cave1 noise parameters) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 -mgfractal_np_cave2 (Mapgen fractal cave2 noise parameters) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 +# First of 2 3D noises that together define tunnels. +mgfractal_np_cave1 (Cave1 noise) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 + +# Second of 2 3D noises that together define tunnels. +mgfractal_np_cave2 (Cave2 noise) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 # Mapgen Valleys parameters [***Mapgen Valleys] @@ -1186,7 +1394,7 @@ mgvalleys_np_inter_valley_slope (Valley Slope) noise_params 0.5, 0.5, (128, 128, [*Security] # Prevent mods from doing insecure things like running shell commands. -secure.enable_security (Enable mod security) bool false +secure.enable_security (Enable mod security) bool true # Comma-separated list of trusted mods that are allowed to access insecure # functions even when mod security is on (via request_insecure_environment()). @@ -1209,7 +1417,6 @@ profiler.load (Load the game profiler) bool false profiler.default_report_format (Default report format) enum txt txt,csv,lua,json,json_pretty # The file path relative to your worldpath in which profiles will be saved to. -# profiler.report_path (Report path) string "" [***Instrumentation] @@ -1260,7 +1467,7 @@ language (Language) enum ,be,ca,cs,da,de,en,eo,es,et,fr,he,hu,id,it,ja,jbo,ko, # - action # - info # - verbose -debug_log_level (Debug log level) enum action ,warning,action,info,verbose +debug_log_level (Debug log level) enum action ,none,error,warning,action,info,verbose # IPv6 support. enable_ipv6 (IPv6) bool true diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 71ded2b9d..7c5b9b613 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -37,7 +37,7 @@ const float fogShadingParameter = 1 / ( 1 - fogStart); vec3 uncharted2Tonemap(vec3 x) { - return ((x * (0.22 * x + 0.03) + 0.002) / (x * (0.22 * x + 0.3) + 0.06)) - 0.03334; + return ((x * (0.22 * x + 0.03) + 0.002) / (x * (0.22 * x + 0.3) + 0.06)) - 0.03333; } vec4 applyToneMapping(vec4 color) @@ -163,7 +163,8 @@ void main(void) } #endif - if (GENERATE_NORMALMAPS == 1 && normalTexturePresent == false) { +#if GENERATE_NORMALMAPS == 1 + if (normalTexturePresent == false) { float tl = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y + SAMPLE_STEP)); float t = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y - SAMPLE_STEP)); float tr = get_rgb_height(vec2(uv.x + SAMPLE_STEP, uv.y + SAMPLE_STEP)); @@ -177,7 +178,7 @@ void main(void) bump = vec4(normalize(vec3 (dX, dY, NORMALMAPS_STRENGTH)), 1.0); use_normalmap = true; } - +#endif vec4 base = texture2D(baseTexture, uv).rgba; #ifdef ENABLE_BUMPMAPPING @@ -200,20 +201,18 @@ void main(void) col = applyToneMapping(col); #endif - if (fogDistance != 0.0) { - // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), - // the fog will only be rendered correctly if the last operation before the - // clamp() is an addition. Else, the clamp() seems to be ignored. - // E.g. the following won't work: - // float clarity = clamp(fogShadingParameter - // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); - // As additions usually come for free following a multiplication, the new formula - // should be more efficient as well. - // Note: clarity = (1 - fogginess) - float clarity = clamp(fogShadingParameter - - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); - col = mix(skyBgColor, col, clarity); - } + // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), + // the fog will only be rendered correctly if the last operation before the + // clamp() is an addition. Else, the clamp() seems to be ignored. + // E.g. the following won't work: + // float clarity = clamp(fogShadingParameter + // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); + // As additions usually come for free following a multiplication, the new formula + // should be more efficient as well. + // Note: clarity = (1 - fogginess) + float clarity = clamp(fogShadingParameter + - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); + col = mix(skyBgColor, col, clarity); col = vec4(col.rgb, base.a); gl_FragColor = col; diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl index 44c48cc4c..3ac79c26d 100644 --- a/client/shaders/nodes_shader/opengl_vertex.glsl +++ b/client/shaders/nodes_shader/opengl_vertex.glsl @@ -1,7 +1,8 @@ uniform mat4 mWorldViewProj; uniform mat4 mWorld; -uniform float dayNightRatio; +// Color of the light emitted by the sun. +uniform vec3 dayLight; uniform vec3 eyePosition; uniform float animationTimer; @@ -14,6 +15,8 @@ varying vec3 tsEyeVec; varying vec3 tsLightVec; varying float area_enable_parallax; +// Color of the light emitted by the light sources. +const vec3 artificialLight = vec3(1.04, 1.04, 1.04); const float e = 2.718281828459; const float BS = 10.0; @@ -119,31 +122,23 @@ float disp_z; v.z = dot(eyeVec, normal); tsEyeVec = normalize (v); + // Calculate color. + // Red, green and blue components are pre-multiplied with + // the brightness, so now we have to multiply these + // colors with the color of the incoming light. + // The pre-baked colors are halved to prevent overflow. vec4 color; - float day = gl_Color.r; - float night = gl_Color.g; - float light_source = gl_Color.b; - - float rg = mix(night, day, dayNightRatio); - rg += light_source * 2.5; // Make light sources brighter - float b = rg; - - // Moonlight is blue - b += (day - night) / 13.0; - rg -= (day - night) / 23.0; - + // The alpha gives the ratio of sunlight in the incoming light. + float nightRatio = 1 - gl_Color.a; + color.rgb = gl_Color.rgb * (gl_Color.a * dayLight.rgb + + nightRatio * artificialLight.rgb) * 2; + color.a = 1; + // Emphase blue a bit in darker places // See C++ implementation in mapblock_mesh.cpp finalColorBlend() - b += max(0.0, (1.0 - abs(b - 0.13) / 0.17) * 0.025); - - // Artificial light is yellow-ish - // See C++ implementation in mapblock_mesh.cpp finalColorBlend() - rg += max(0.0, (1.0 - abs(rg - 0.85) / 0.15) * 0.065); - - color.r = rg; - color.g = rg; - color.b = b; - - color.a = gl_Color.a; + float brightness = (color.r + color.g + color.b) / 3; + color.b += max(0.0, 0.021 - abs(0.2 * brightness - 0.021) + + 0.07 * brightness); + gl_FrontColor = gl_BackColor = clamp(color, 0.0, 1.0); } diff --git a/client/shaders/water_surface_shader/opengl_fragment.glsl b/client/shaders/water_surface_shader/opengl_fragment.glsl deleted file mode 100644 index c4e78470d..000000000 --- a/client/shaders/water_surface_shader/opengl_fragment.glsl +++ /dev/null @@ -1,176 +0,0 @@ -uniform sampler2D baseTexture; -uniform sampler2D normalTexture; -uniform sampler2D textureFlags; - -uniform vec4 skyBgColor; -uniform float fogDistance; -uniform vec3 eyePosition; - -varying vec3 vPosition; -varying vec3 worldPosition; - -varying vec3 eyeVec; -varying vec3 tsEyeVec; -varying vec3 lightVec; -varying vec3 tsLightVec; - -bool normalTexturePresent = false; -bool texTileableHorizontal = false; -bool texTileableVertical = false; -bool texSeamless = false; - -const float e = 2.718281828459; -const float BS = 10.0; -const float fogStart = FOG_START; -const float fogShadingParameter = 1 / ( 1 - fogStart); - -#ifdef ENABLE_TONE_MAPPING - -/* Hable's UC2 Tone mapping parameters - A = 0.22; - B = 0.30; - C = 0.10; - D = 0.20; - E = 0.01; - F = 0.30; - W = 11.2; - equation used: ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F -*/ - -vec3 uncharted2Tonemap(vec3 x) -{ - return ((x * (0.22 * x + 0.03) + 0.002) / (x * (0.22 * x + 0.3) + 0.06)) - 0.03334; -} - -vec4 applyToneMapping(vec4 color) -{ - color = vec4(pow(color.rgb, vec3(2.2)), color.a); - const float gamma = 1.6; - const float exposureBias = 5.5; - color.rgb = uncharted2Tonemap(exposureBias * color.rgb); - // Precalculated white_scale from - //vec3 whiteScale = 1.0 / uncharted2Tonemap(vec3(W)); - vec3 whiteScale = vec3(1.036015346); - color.rgb *= whiteScale; - return vec4(pow(color.rgb, vec3(1.0 / gamma)), color.a); -} -#endif - -void get_texture_flags() -{ - vec4 flags = texture2D(textureFlags, vec2(0.0, 0.0)); - if (flags.r > 0.5) { - normalTexturePresent = true; - } - if (flags.g > 0.5) { - texTileableHorizontal = true; - } - if (flags.b > 0.5) { - texTileableVertical = true; - } - if (texTileableHorizontal && texTileableVertical) { - texSeamless = true; - } -} - -float intensity(vec3 color) -{ - return (color.r + color.g + color.b) / 3.0; -} - -float get_rgb_height(vec2 uv) -{ - return intensity(texture2D(baseTexture,uv).rgb); -} - -vec4 get_normal_map(vec2 uv) -{ - vec4 bump = texture2D(normalTexture, uv).rgba; - bump.xyz = normalize(bump.xyz * 2.0 -1.0); - bump.y = -bump.y; - return bump; -} - -void main(void) -{ - vec3 color; - vec4 bump; - vec2 uv = gl_TexCoord[0].st; - bool use_normalmap = false; - get_texture_flags(); - -#ifdef ENABLE_PARALLAX_OCCLUSION - if (normalTexturePresent) { - vec3 tsEye = normalize(tsEyeVec); - float height = PARALLAX_OCCLUSION_SCALE * texture2D(normalTexture, uv).a - PARALLAX_OCCLUSION_BIAS; - uv = uv + texture2D(normalTexture, uv).z * height * vec2(tsEye.x,-tsEye.y); - } -#endif - -#ifdef USE_NORMALMAPS - if (normalTexturePresent) { - bump = get_normal_map(uv); - use_normalmap = true; - } -#endif - - if (GENERATE_NORMALMAPS == 1 && use_normalmap == false) { - float tl = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y+SAMPLE_STEP)); - float t = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y-SAMPLE_STEP)); - float tr = get_rgb_height (vec2(uv.x+SAMPLE_STEP,uv.y+SAMPLE_STEP)); - float r = get_rgb_height (vec2(uv.x+SAMPLE_STEP,uv.y)); - float br = get_rgb_height (vec2(uv.x+SAMPLE_STEP,uv.y-SAMPLE_STEP)); - float b = get_rgb_height (vec2(uv.x,uv.y-SAMPLE_STEP)); - float bl = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y-SAMPLE_STEP)); - float l = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y)); - float dX = (tr + 2.0 * r + br) - (tl + 2.0 * l + bl); - float dY = (bl + 2.0 * b + br) - (tl + 2.0 * t + tr); - bump = vec4 (normalize(vec3 (dX, -dY, NORMALMAPS_STRENGTH)),1.0); - use_normalmap = true; - } - -vec4 base = texture2D(baseTexture, uv).rgba; - -#ifdef ENABLE_BUMPMAPPING - if (use_normalmap) { - vec3 L = normalize(lightVec); - vec3 E = normalize(eyeVec); - float specular = pow(clamp(dot(reflect(L, bump.xyz), E), 0.0, 1.0),0.5); - float diffuse = dot(E,bump.xyz); - /* Mathematic optimization - * Original: color = 0.05*base.rgb + diffuse*base.rgb + 0.2*specular*base.rgb; - * This optimization save 2 multiplications (orig: 4 multiplications + 3 additions - * end: 2 multiplications + 3 additions) - */ - color = (0.05 + diffuse + 0.2 * specular) * base.rgb; - } else { - color = base.rgb; - } -#else - color = base.rgb; -#endif - - vec4 col = vec4(color.rgb * gl_Color.rgb, 1.0); - -#ifdef ENABLE_TONE_MAPPING - col = applyToneMapping(col); -#endif - - if (fogDistance != 0.0) { - // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), - // the fog will only be rendered correctly if the last operation before the - // clamp() is an addition. Else, the clamp() seems to be ignored. - // E.g. the following won't work: - // float clarity = clamp(fogShadingParameter - // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); - // As additions usually come for free following a multiplication, the new formula - // should be more efficient as well. - // Note: clarity = (1 - fogginess) - float clarity = clamp(fogShadingParameter - - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); - col = mix(skyBgColor, col, clarity); - } - col = vec4(col.rgb, base.a); - - gl_FragColor = col; -} diff --git a/client/shaders/water_surface_shader/opengl_vertex.glsl b/client/shaders/water_surface_shader/opengl_vertex.glsl deleted file mode 100644 index a930e7b8f..000000000 --- a/client/shaders/water_surface_shader/opengl_vertex.glsl +++ /dev/null @@ -1,142 +0,0 @@ -uniform mat4 mWorldViewProj; -uniform mat4 mWorld; - -uniform float dayNightRatio; -uniform vec3 eyePosition; -uniform float animationTimer; - -varying vec3 vPosition; -varying vec3 worldPosition; - -varying vec3 eyeVec; -varying vec3 lightVec; -varying vec3 tsEyeVec; -varying vec3 tsLightVec; - -const float e = 2.718281828459; -const float BS = 10.0; - -float smoothCurve(float x) -{ - return x * x * (3.0 - 2.0 * x); -} -float triangleWave(float x) -{ - return abs(fract( x + 0.5 ) * 2.0 - 1.0); -} -float smoothTriangleWave(float x) -{ - return smoothCurve(triangleWave( x )) * 2.0 - 1.0; -} - -void main(void) -{ - gl_TexCoord[0] = gl_MultiTexCoord0; - -#if (MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE) && ENABLE_WAVING_WATER - vec4 pos = gl_Vertex; - pos.y -= 2.0; - - float posYbuf = (pos.z / WATER_WAVE_LENGTH + animationTimer * WATER_WAVE_SPEED * WATER_WAVE_LENGTH); - - pos.y -= sin(posYbuf) * WATER_WAVE_HEIGHT + sin(posYbuf / 7.0) * WATER_WAVE_HEIGHT; - gl_Position = mWorldViewProj * pos; -#elif MATERIAL_TYPE == TILE_MATERIAL_WAVING_LEAVES && ENABLE_WAVING_LEAVES - vec4 pos = gl_Vertex; - vec4 pos2 = mWorld * gl_Vertex; - /* - * Mathematic optimization: pos2.x * A + pos2.z * A (2 multiplications + 1 addition) - * replaced with: (pos2.x + pos2.z) * A (1 addition + 1 multiplication) - * And bufferize calcul to a float - */ - float pos2XpZ = pos2.x + pos2.z; - pos.x += (smoothTriangleWave(animationTimer*10.0 + pos2XpZ * 0.01) * 2.0 - 1.0) * 0.4; - pos.y += (smoothTriangleWave(animationTimer*15.0 + pos2XpZ * -0.01) * 2.0 - 1.0) * 0.2; - pos.z += (smoothTriangleWave(animationTimer*10.0 + pos2XpZ * -0.01) * 2.0 - 1.0) * 0.4; - gl_Position = mWorldViewProj * pos; -#elif MATERIAL_TYPE == TILE_MATERIAL_WAVING_PLANTS && ENABLE_WAVING_PLANTS - vec4 pos = gl_Vertex; - vec4 pos2 = mWorld * gl_Vertex; - if (gl_TexCoord[0].y < 0.05) { - /* - * Mathematic optimization: pos2.x * A + pos2.z * A (2 multiplications + 1 addition) - * replaced with: (pos2.x + pos2.z) * A (1 addition + 1 multiplication) - * And bufferize calcul to a float - */ - float pos2XpZ = pos2.x + pos2.z; - pos.x += (smoothTriangleWave(animationTimer * 20.0 + pos2XpZ * 0.1) * 2.0 - 1.0) * 0.8; - pos.y -= (smoothTriangleWave(animationTimer * 10.0 + pos2XpZ * -0.5) * 2.0 - 1.0) * 0.4; - } - gl_Position = mWorldViewProj * pos; -#else - gl_Position = mWorldViewProj * gl_Vertex; -#endif - - vPosition = gl_Position.xyz; - worldPosition = (mWorld * gl_Vertex).xyz; - vec3 sunPosition = vec3 (0.0, eyePosition.y * BS + 900.0, 0.0); - - vec3 normal, tangent, binormal; - normal = normalize(gl_NormalMatrix * gl_Normal); - if (gl_Normal.x > 0.5) { - // 1.0, 0.0, 0.0 - tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, -1.0)); - binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); - } else if (gl_Normal.x < -0.5) { - // -1.0, 0.0, 0.0 - tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0)); - binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); - } else if (gl_Normal.y > 0.5) { - // 0.0, 1.0, 0.0 - tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0)); - binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0)); - } else if (gl_Normal.y < -0.5) { - // 0.0, -1.0, 0.0 - tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0)); - binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0)); - } else if (gl_Normal.z > 0.5) { - // 0.0, 0.0, 1.0 - tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0)); - binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); - } else if (gl_Normal.z < -0.5) { - // 0.0, 0.0, -1.0 - tangent = normalize(gl_NormalMatrix * vec3(-1.0, 0.0, 0.0)); - binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); - } - mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, - tangent.y, binormal.y, normal.y, - tangent.z, binormal.z, normal.z); - - lightVec = sunPosition - worldPosition; - tsLightVec = lightVec * tbnMatrix; - eyeVec = (gl_ModelViewMatrix * gl_Vertex).xyz; - tsEyeVec = eyeVec * tbnMatrix; - - vec4 color; - float day = gl_Color.r; - float night = gl_Color.g; - float light_source = gl_Color.b; - - float rg = mix(night, day, dayNightRatio); - rg += light_source * 2.5; // Make light sources brighter - float b = rg; - - // Moonlight is blue - b += (day - night) / 13.0; - rg -= (day - night) / 23.0; - - // Emphase blue a bit in darker places - // See C++ implementation in mapblock_mesh.cpp finalColorBlend() - b += max(0.0, (1.0 - abs(b - 0.13)/0.17) * 0.025); - - // Artificial light is yellow-ish - // See C++ implementation in mapblock_mesh.cpp finalColorBlend() - rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065); - - color.r = rg; - color.g = rg; - color.b = b; - - color.a = gl_Color.a; - gl_FrontColor = gl_BackColor = clamp(color,0.0,1.0); -} diff --git a/client/shaders/wielded_shader/opengl_fragment.glsl b/client/shaders/wielded_shader/opengl_fragment.glsl index ba7a8f12d..546aef71d 100644 --- a/client/shaders/wielded_shader/opengl_fragment.glsl +++ b/client/shaders/wielded_shader/opengl_fragment.glsl @@ -75,7 +75,8 @@ void main(void) } #endif - if (GENERATE_NORMALMAPS == 1 && normalTexturePresent == false) { +#if GENERATE_NORMALMAPS == 1 + if (normalTexturePresent == false) { float tl = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y + SAMPLE_STEP)); float t = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y - SAMPLE_STEP)); float tr = get_rgb_height(vec2(uv.x + SAMPLE_STEP, uv.y + SAMPLE_STEP)); @@ -89,6 +90,7 @@ void main(void) bump = vec4(normalize(vec3 (dX, dY, NORMALMAPS_STRENGTH)), 1.0); use_normalmap = true; } +#endif vec4 base = texture2D(baseTexture, uv).rgba; @@ -108,19 +110,18 @@ void main(void) vec4 col = vec4(color.rgb, base.a); col *= gl_Color; - if (fogDistance != 0.0) { - // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), - // the fog will only be rendered correctly if the last operation before the - // clamp() is an addition. Else, the clamp() seems to be ignored. - // E.g. the following won't work: - // float clarity = clamp(fogShadingParameter - // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); - // As additions usually come for free following a multiplication, the new formula - // should be more efficient as well. - // Note: clarity = (1 - fogginess) - float clarity = clamp(fogShadingParameter - - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); - col = mix(skyBgColor, col, clarity); - } + // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), + // the fog will only be rendered correctly if the last operation before the + // clamp() is an addition. Else, the clamp() seems to be ignored. + // E.g. the following won't work: + // float clarity = clamp(fogShadingParameter + // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); + // As additions usually come for free following a multiplication, the new formula + // should be more efficient as well. + // Note: clarity = (1 - fogginess) + float clarity = clamp(fogShadingParameter + - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); + col = mix(skyBgColor, col, clarity); + gl_FragColor = vec4(col.rgb, base.a); } diff --git a/client/shaders/wielded_shader/opengl_vertex.glsl b/client/shaders/wielded_shader/opengl_vertex.glsl index 86c626896..9f05b833a 100644 --- a/client/shaders/wielded_shader/opengl_vertex.glsl +++ b/client/shaders/wielded_shader/opengl_vertex.glsl @@ -1,7 +1,6 @@ uniform mat4 mWorldViewProj; uniform mat4 mWorld; -uniform float dayNightRatio; uniform vec3 eyePosition; uniform float animationTimer; diff --git a/clientmods/preview/init.lua b/clientmods/preview/init.lua new file mode 100644 index 000000000..f3992612a --- /dev/null +++ b/clientmods/preview/init.lua @@ -0,0 +1,152 @@ +local modname = core.get_current_modname() or "??" +local modstorage = core.get_mod_storage() + +-- This is an example function to ensure it's working properly, should be removed before merge +core.register_on_shutdown(function() + print("[PREVIEW] shutdown client") +end) + +core.register_on_connect(function() + print("[PREVIEW] Player connection completed") + local server_info = core.get_server_info() + print("Server version: " .. server_info.protocol_version) + print("Server ip: " .. server_info.ip) + print("Server address: " .. server_info.address) + print("Server port: " .. server_info.port) +end) + +core.register_on_placenode(function(pointed_thing, node) + print("The local player place a node!") + print("pointed_thing :" .. dump(pointed_thing)) + print("node placed :" .. dump(node)) + return false +end) + +core.register_on_item_use(function(itemstack, pointed_thing) + print("The local player used an item!") + print("pointed_thing :" .. dump(pointed_thing)) + print("item = " .. itemstack:get_name()) + return false +end) + +-- This is an example function to ensure it's working properly, should be removed before merge +core.register_on_receiving_chat_messages(function(message) + print("[PREVIEW] Received message " .. message) + return false +end) + +-- This is an example function to ensure it's working properly, should be removed before merge +core.register_on_sending_chat_messages(function(message) + print("[PREVIEW] Sending message " .. message) + return false +end) + +-- This is an example function to ensure it's working properly, should be removed before merge +core.register_on_hp_modification(function(hp) + print("[PREVIEW] HP modified " .. hp) +end) + +-- This is an example function to ensure it's working properly, should be removed before merge +core.register_on_damage_taken(function(hp) + print("[PREVIEW] Damage taken " .. hp) +end) + +-- This is an example function to ensure it's working properly, should be removed before merge +core.register_globalstep(function(dtime) + -- print("[PREVIEW] globalstep " .. dtime) +end) + +-- This is an example function to ensure it's working properly, should be removed before merge +core.register_chatcommand("dump", { + func = function(param) + return true, dump(_G) + end, +}) + +core.register_chatcommand("colorize_test", { + func = function(param) + return true, core.colorize("red", param) + end, +}) + +core.register_chatcommand("test_node", { + func = function(param) + core.display_chat_message(dump(core.get_node({x=0, y=0, z=0}))) + core.display_chat_message(dump(core.get_node_or_nil({x=0, y=0, z=0}))) + end, +}) + +local function preview_minimap() + local minimap = core.ui.minimap + if not minimap then + print("[PREVIEW] Minimap is disabled. Skipping.") + return + end + minimap:set_mode(4) + minimap:show() + minimap:set_pos({x=5, y=50, z=5}) + minimap:set_shape(math.random(0, 1)) + + print("[PREVIEW] Minimap: mode => " .. dump(minimap:get_mode()) .. + " position => " .. dump(minimap:get_pos()) .. + " angle => " .. dump(minimap:get_angle())) +end + +core.after(2, function() + print("[PREVIEW] loaded " .. modname .. " mod") + modstorage:set_string("current_mod", modname) + print(modstorage:get_string("current_mod")) + preview_minimap() +end) + +core.after(5, function() + if core.ui.minimap then + core.ui.minimap:show() + end + + print("[PREVIEW] Day count: " .. core.get_day_count() .. + " time of day " .. core.get_timeofday()) + + print("[PREVIEW] Node level: " .. core.get_node_level({x=0, y=20, z=0}) .. + " max level " .. core.get_node_max_level({x=0, y=20, z=0})) + + print("[PREVIEW] Find node near: " .. dump(core.find_node_near({x=0, y=20, z=0}, 10, + {"group:tree", "default:dirt", "default:stone"}))) +end) + +core.register_on_dignode(function(pos, node) + print("The local player dug a node!") + print("pos:" .. dump(pos)) + print("node:" .. dump(node)) + return false +end) + +core.register_on_punchnode(function(pos, node) + print("The local player punched a node!") + local itemstack = core.get_wielded_item() + --[[ + -- getters + print(dump(itemstack:is_empty())) + print(dump(itemstack:get_name())) + print(dump(itemstack:get_count())) + print(dump(itemstack:get_wear())) + print(dump(itemstack:get_meta())) + print(dump(itemstack:get_metadata() + print(dump(itemstack:is_known())) + --print(dump(itemstack:get_definition())) + print(dump(itemstack:get_tool_capabilities())) + print(dump(itemstack:to_string())) + print(dump(itemstack:to_table())) + -- setters + print(dump(itemstack:set_name("default:dirt"))) + print(dump(itemstack:set_count("95"))) + print(dump(itemstack:set_wear(934))) + print(dump(itemstack:get_meta())) + print(dump(itemstack:get_metadata())) + --]] + print(dump(itemstack:to_table())) + print("pos:" .. dump(pos)) + print("node:" .. dump(node)) + return false +end) + diff --git a/cmake/Modules/FindGMP.cmake b/cmake/Modules/FindGMP.cmake index bb48289c5..64a57cfe0 100644 --- a/cmake/Modules/FindGMP.cmake +++ b/cmake/Modules/FindGMP.cmake @@ -1,4 +1,3 @@ - option(ENABLE_SYSTEM_GMP "Use GMP from system" TRUE) mark_as_advanced(GMP_LIBRARY GMP_INCLUDE_DIR) set(USE_SYSTEM_GMP FALSE) @@ -19,9 +18,9 @@ endif() if(NOT USE_SYSTEM_GMP) message(STATUS "Using bundled mini-gmp library.") - set(GMP_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/gmp) + set(GMP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/gmp) set(GMP_LIBRARY gmp) - add_subdirectory(gmp) + add_subdirectory(lib/gmp) endif() include(FindPackageHandleStandardArgs) diff --git a/cmake/Modules/FindJson.cmake b/cmake/Modules/FindJson.cmake index e69d6c4c0..26339a295 100644 --- a/cmake/Modules/FindJson.cmake +++ b/cmake/Modules/FindJson.cmake @@ -20,8 +20,7 @@ endif() if(NOT JSONCPP_FOUND) message(STATUS "Using bundled JSONCPP library.") - set(JSON_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/jsoncpp) + set(JSON_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/jsoncpp) set(JSON_LIBRARY jsoncpp) - add_subdirectory(jsoncpp/json) + add_subdirectory(lib/jsoncpp) endif() - diff --git a/cmake/Modules/FindLua.cmake b/cmake/Modules/FindLua.cmake new file mode 100644 index 000000000..be5d92d8c --- /dev/null +++ b/cmake/Modules/FindLua.cmake @@ -0,0 +1,28 @@ +# Look for Lua library to use +# This selects LuaJIT by default + +option(ENABLE_LUAJIT "Enable LuaJIT support" TRUE) +set(USE_LUAJIT FALSE) +option(REQUIRE_LUAJIT "Require LuaJIT support" FALSE) +if(REQUIRE_LUAJIT) + set(ENABLE_LUAJIT TRUE) +endif() +if(ENABLE_LUAJIT) + find_package(LuaJIT) + if(LUAJIT_FOUND) + set(USE_LUAJIT TRUE) + message (STATUS "Using LuaJIT provided by system.") + elseif(REQUIRE_LUAJIT) + message(FATAL_ERROR "LuaJIT not found whereas REQUIRE_LUAJIT=\"TRUE\" is used.\n" + "To continue, either install LuaJIT or do not use REQUIRE_LUAJIT=\"TRUE\".") + endif() +else() + message (STATUS "LuaJIT detection disabled! (ENABLE_LUAJIT=0)") +endif() + +if(NOT USE_LUAJIT) + message(STATUS "LuaJIT not found, using bundled Lua.") + set(LUA_LIBRARY lua) + set(LUA_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/lua/src) + add_subdirectory(lib/lua) +endif() diff --git a/doc/client_lua_api.md b/doc/client_lua_api.md new file mode 100644 index 000000000..b3e494cc1 --- /dev/null +++ b/doc/client_lua_api.md @@ -0,0 +1,1149 @@ +Minetest Lua Client Modding API Reference 0.4.15 +================================================ +* More information at <http://www.minetest.net/> +* Developer Wiki: <http://dev.minetest.net/> + +Introduction +------------ + +**WARNING: The client API is currently unstable, and may break/change without warning.** + +Content and functionality can be added to Minetest 0.4.15-dev+ by using Lua +scripting in run-time loaded mods. + +A mod is a self-contained bunch of scripts, textures and other related +things that is loaded by and interfaces with Minetest. + +Transfering client-sided mods form the server to the client is planned, but not implemented yet. + +If you see a deficiency in the API, feel free to attempt to add the +functionality in the engine and API. You can send such improvements as +source code patches on GitHub (https://github.com/minetest/minetest). + +Programming in Lua +------------------ +If you have any difficulty in understanding this, please read +[Programming in Lua](http://www.lua.org/pil/). + +Startup +------- +Mods are loaded during client startup from the mod load paths by running +the `init.lua` scripts in a shared environment. + +Paths +----- +* `RUN_IN_PLACE=1` (Windows release, local build) + * `$path_user`: + * Linux: `<build directory>` + * Windows: `<build directory>` + * `$path_share` + * Linux: `<build directory>` + * Windows: `<build directory>` +* `RUN_IN_PLACE=0`: (Linux release) + * `$path_share` + * Linux: `/usr/share/minetest` + * Windows: `<install directory>/minetest-0.4.x` + * `$path_user`: + * Linux: `$HOME/.minetest` + * Windows: `C:/users/<user>/AppData/minetest` (maybe) + +Mod load path +------------- +Generic: + +* `$path_share/clientmods/` +* `$path_user/clientmods/` (User-installed mods) + +In a run-in-place version (e.g. the distributed windows version): + +* `minetest-0.4.x/clientmods/` (User-installed mods) + +On an installed version on Linux: + +* `/usr/share/minetest/clientmods/` +* `$HOME/.minetest/clientmods/` (User-installed mods) + +Modpack support +---------------- +**NOTE: Not implemented yet.** + +Mods can be put in a subdirectory, if the parent directory, which otherwise +should be a mod, contains a file named `modpack.txt`. This file shall be +empty, except for lines starting with `#`, which are comments. + +Mod directory structure +------------------------ + + clientmods + ├── modname + | ├── depends.txt + | ├── init.lua + └── another + +### modname +The location of this directory. + +### depends.txt +List of mods that have to be loaded before loading this mod. + +A single line contains a single modname. + +Optional dependencies can be defined by appending a question mark +to a single modname. Their meaning is that if the specified mod +is missing, that does not prevent this mod from being loaded. + +### init.lua +The main Lua script. Running this script should register everything it +wants to register. Subsequent execution depends on minetest calling the +registered callbacks. + +`minetest.setting_get(name)` and `minetest.setting_getbool(name)` can be used +to read custom or existing settings at load time, if necessary. + +### `sounds` +Media files (sounds) that will be transferred to the +client and will be available for use by the mod. + +Naming convention for registered textual names +---------------------------------------------- +Registered names should generally be in this format: + + "modname:<whatever>" (<whatever> can have characters a-zA-Z0-9_) + +This is to prevent conflicting names from corrupting maps and is +enforced by the mod loader. + +### Example +In the mod `experimental`, there is the ideal item/node/entity name `tnt`. +So the name should be `experimental:tnt`. + +Enforcement can be overridden by prefixing the name with `:`. This can +be used for overriding the registrations of some other mod. + +Example: Any mod can redefine `experimental:tnt` by using the name + + :experimental:tnt + +when registering it. +(also that mod is required to have `experimental` as a dependency) + +The `:` prefix can also be used for maintaining backwards compatibility. + +Sounds +------ +**NOTE: max_hear_distance and connecting to objects is not implemented.** + +Only Ogg Vorbis files are supported. + +For positional playing of sounds, only single-channel (mono) files are +supported. Otherwise OpenAL will play them non-positionally. + +Mods should generally prefix their sounds with `modname_`, e.g. given +the mod name "`foomod`", a sound could be called: + + foomod_foosound.ogg + +Sounds are referred to by their name with a dot, a single digit and the +file extension stripped out. When a sound is played, the actual sound file +is chosen randomly from the matching sounds. + +When playing the sound `foomod_foosound`, the sound is chosen randomly +from the available ones of the following files: + +* `foomod_foosound.ogg` +* `foomod_foosound.0.ogg` +* `foomod_foosound.1.ogg` +* (...) +* `foomod_foosound.9.ogg` + +Examples of sound parameter tables: + + -- Play locationless + { + gain = 1.0, -- default + } + -- Play locationless, looped + { + gain = 1.0, -- default + loop = true, + } + -- Play in a location + { + pos = {x = 1, y = 2, z = 3}, + gain = 1.0, -- default + max_hear_distance = 32, -- default, uses an euclidean metric + } + -- Play connected to an object, looped + { + object = <an ObjectRef>, + gain = 1.0, -- default + max_hear_distance = 32, -- default, uses an euclidean metric + loop = true, + } + +Looped sounds must either be connected to an object or played locationless. + +### SimpleSoundSpec +* e.g. `""` +* e.g. `"default_place_node"` +* e.g. `{}` +* e.g. `{name = "default_place_node"}` +* e.g. `{name = "default_place_node", gain = 1.0}` + +Representations of simple things +-------------------------------- + +### Position/vector + + {x=num, y=num, z=num} + +For helper functions see "Vector helpers". + +### pointed_thing +* `{type="nothing"}` +* `{type="node", under=pos, above=pos}` +* `{type="object", id=ObjectID}` + +Flag Specifier Format +--------------------- +Flags using the standardized flag specifier format can be specified in either of +two ways, by string or table. + +The string format is a comma-delimited set of flag names; whitespace and +unrecognized flag fields are ignored. Specifying a flag in the string sets the +flag, and specifying a flag prefixed by the string `"no"` explicitly +clears the flag from whatever the default may be. + +In addition to the standard string flag format, the schematic flags field can +also be a table of flag names to boolean values representing whether or not the +flag is set. Additionally, if a field with the flag name prefixed with `"no"` +is present, mapped to a boolean of any value, the specified flag is unset. + +E.g. A flag field of value + + {place_center_x = true, place_center_y=false, place_center_z=true} + +is equivalent to + + {place_center_x = true, noplace_center_y=true, place_center_z=true} + +which is equivalent to + + "place_center_x, noplace_center_y, place_center_z" + +or even + + "place_center_x, place_center_z" + +since, by default, no schematic attributes are set. + +Formspec +-------- +Formspec defines a menu. It is a string, with a somewhat strange format. + +Spaces and newlines can be inserted between the blocks, as is used in the +examples. + +### Examples + +#### Chest + + size[8,9] + list[context;main;0,0;8,4;] + list[current_player;main;0,5;8,4;] + +#### Furnace + + size[8,9] + list[context;fuel;2,3;1,1;] + list[context;src;2,1;1,1;] + list[context;dst;5,1;2,2;] + list[current_player;main;0,5;8,4;] + +#### Minecraft-like player inventory + + size[8,7.5] + image[1,0.6;1,2;player.png] + list[current_player;main;0,3.5;8,4;] + list[current_player;craft;3,0;3,3;] + list[current_player;craftpreview;7,1;1,1;] + +### Elements + +#### `size[<W>,<H>,<fixed_size>]` +* Define the size of the menu in inventory slots +* `fixed_size`: `true`/`false` (optional) +* deprecated: `invsize[<W>,<H>;]` + +#### `container[<X>,<Y>]` +* Start of a container block, moves all physical elements in the container by (X, Y) +* Must have matching container_end +* Containers can be nested, in which case the offsets are added + (child containers are relative to parent containers) + +#### `container_end[]` +* End of a container, following elements are no longer relative to this container + +#### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]` +* Show an inventory list + +#### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]` +* Show an inventory list + +#### `listring[<inventory location>;<list name>]` +* Allows to create a ring of inventory lists +* Shift-clicking on items in one element of the ring + will send them to the next inventory list inside the ring +* The first occurrence of an element inside the ring will + determine the inventory where items will be sent to + +#### `listring[]` +* Shorthand for doing `listring[<inventory location>;<list name>]` + for the last two inventory lists added by list[...] + +#### `listcolors[<slot_bg_normal>;<slot_bg_hover>]` +* Sets background color of slots as `ColorString` +* Sets background color of slots on mouse hovering + +#### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>]` +* Sets background color of slots as `ColorString` +* Sets background color of slots on mouse hovering +* Sets color of slots border + +#### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>;<tooltip_bgcolor>;<tooltip_fontcolor>]` +* Sets background color of slots as `ColorString` +* Sets background color of slots on mouse hovering +* Sets color of slots border +* Sets default background color of tooltips +* Sets default font color of tooltips + +#### `tooltip[<gui_element_name>;<tooltip_text>;<bgcolor>,<fontcolor>]` +* Adds tooltip for an element +* `<bgcolor>` tooltip background color as `ColorString` (optional) +* `<fontcolor>` tooltip font color as `ColorString` (optional) + +#### `image[<X>,<Y>;<W>,<H>;<texture name>]` +* Show an image +* Position and size units are inventory slots + +#### `item_image[<X>,<Y>;<W>,<H>;<item name>]` +* Show an inventory image of registered item/node +* Position and size units are inventory slots + +#### `bgcolor[<color>;<fullscreen>]` +* Sets background color of formspec as `ColorString` +* If `true`, the background color is drawn fullscreen (does not effect the size of the formspec) + +#### `background[<X>,<Y>;<W>,<H>;<texture name>]` +* Use a background. Inventory rectangles are not drawn then. +* Position and size units are inventory slots +* Example for formspec 8x4 in 16x resolution: image shall be sized + 8 times 16px times 4 times 16px. + +#### `background[<X>,<Y>;<W>,<H>;<texture name>;<auto_clip>]` +* Use a background. Inventory rectangles are not drawn then. +* Position and size units are inventory slots +* Example for formspec 8x4 in 16x resolution: + image shall be sized 8 times 16px times 4 times 16px +* If `true` the background is clipped to formspec size + (`x` and `y` are used as offset values, `w` and `h` are ignored) + +#### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]` +* Textual password style field; will be sent to server when a button is clicked +* When enter is pressed in field, fields.key_enter_field will be sent with the name + of this field. +* `x` and `y` position the field relative to the top left of the menu +* `w` and `h` are the size of the field +* Fields are a set height, but will be vertically centred on `h` +* Position and size units are inventory slots +* `name` is the name of the field as returned in fields to `on_receive_fields` +* `label`, if not blank, will be text printed on the top left above the field +* See field_close_on_enter to stop enter closing the formspec + +#### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]` +* Textual field; will be sent to server when a button is clicked +* When enter is pressed in field, fields.key_enter_field will be sent with the name + of this field. +* `x` and `y` position the field relative to the top left of the menu +* `w` and `h` are the size of the field +* Fields are a set height, but will be vertically centred on `h` +* Position and size units are inventory slots +* `name` is the name of the field as returned in fields to `on_receive_fields` +* `label`, if not blank, will be text printed on the top left above the field +* `default` is the default value of the field + * `default` may contain variable references such as `${text}'` which + will fill the value from the metadata value `text` + * **Note**: no extra text or more than a single variable is supported ATM. +* See field_close_on_enter to stop enter closing the formspec + +#### `field[<name>;<label>;<default>]` +* As above, but without position/size units +* When enter is pressed in field, fields.key_enter_field will be sent with the name + of this field. +* Special field for creating simple forms, such as sign text input +* Must be used without a `size[]` element +* A "Proceed" button will be added automatically +* See field_close_on_enter to stop enter closing the formspec + +#### `field_close_on_enter[<name>;<close_on_enter>]` +* <name> is the name of the field +* if <close_on_enter> is false, pressing enter in the field will submit the form but not close it +* defaults to true when not specified (ie: no tag for a field) + +#### `textarea[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]` +* Same as fields above, but with multi-line input + +#### `label[<X>,<Y>;<label>]` +* `x` and `y` work as per field +* `label` is the text on the label +* Position and size units are inventory slots + +#### `vertlabel[<X>,<Y>;<label>]` +* Textual label drawn vertically +* `x` and `y` work as per field +* `label` is the text on the label +* Position and size units are inventory slots + +#### `button[<X>,<Y>;<W>,<H>;<name>;<label>]` +* Clickable button. When clicked, fields will be sent. +* `x`, `y` and `name` work as per field +* `w` and `h` are the size of the button +* `label` is the text on the button +* Position and size units are inventory slots + +#### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]` +* `x`, `y`, `w`, `h`, and `name` work as per button +* `texture name` is the filename of an image +* Position and size units are inventory slots + +#### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>;<pressed texture name>]` +* `x`, `y`, `w`, `h`, and `name` work as per button +* `texture name` is the filename of an image +* Position and size units are inventory slots +* `noclip=true` means the image button doesn't need to be within specified formsize +* `drawborder`: draw button border or not +* `pressed texture name` is the filename of an image on pressed state + +#### `item_image_button[<X>,<Y>;<W>,<H>;<item name>;<name>;<label>]` +* `x`, `y`, `w`, `h`, `name` and `label` work as per button +* `item name` is the registered name of an item/node, + tooltip will be made out of its description + to override it use tooltip element +* Position and size units are inventory slots + +#### `button_exit[<X>,<Y>;<W>,<H>;<name>;<label>]` +* When clicked, fields will be sent and the form will quit. + +#### `image_button_exit[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]` +* When clicked, fields will be sent and the form will quit. + +#### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>]` +* Scrollable item list showing arbitrary text elements +* `x` and `y` position the itemlist relative to the top left of the menu +* `w` and `h` are the size of the itemlist +* `name` fieldname sent to server on doubleclick value is current selected element +* `listelements` can be prepended by #color in hexadecimal format RRGGBB (only), + * if you want a listelement to start with "#" write "##". + +#### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>;<selected idx>;<transparent>]` +* Scrollable itemlist showing arbitrary text elements +* `x` and `y` position the item list relative to the top left of the menu +* `w` and `h` are the size of the item list +* `name` fieldname sent to server on doubleclick value is current selected element +* `listelements` can be prepended by #RRGGBB (only) in hexadecimal format + * if you want a listelement to start with "#" write "##" +* Index to be selected within textlist +* `true`/`false`: draw transparent background +* See also `minetest.explode_textlist_event` (main menu: `engine.explode_textlist_event`) + +#### `tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]` +* Show a tab**header** at specific position (ignores formsize) +* `x` and `y` position the itemlist relative to the top left of the menu +* `name` fieldname data is transferred to Lua +* `caption 1`...: name shown on top of tab +* `current_tab`: index of selected tab 1... +* `transparent` (optional): show transparent +* `draw_border` (optional): draw border + +#### `box[<X>,<Y>;<W>,<H>;<color>]` +* Simple colored semitransparent box +* `x` and `y` position the box relative to the top left of the menu +* `w` and `h` are the size of box +* `color` is color specified as a `ColorString` + +#### `dropdown[<X>,<Y>;<W>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]` +* Show a dropdown field +* **Important note**: There are two different operation modes: + 1. handle directly on change (only changed dropdown is submitted) + 2. read the value on pressing a button (all dropdown values are available) +* `x` and `y` position of dropdown +* Width of dropdown +* Fieldname data is transferred to Lua +* Items to be shown in dropdown +* Index of currently selected dropdown item + +#### `checkbox[<X>,<Y>;<name>;<label>;<selected>]` +* Show a checkbox +* `x` and `y`: position of checkbox +* `name` fieldname data is transferred to Lua +* `label` to be shown left of checkbox +* `selected` (optional): `true`/`false` + +#### `scrollbar[<X>,<Y>;<W>,<H>;<orientation>;<name>;<value>]` +* Show a scrollbar +* There are two ways to use it: + 1. handle the changed event (only changed scrollbar is available) + 2. read the value on pressing a button (all scrollbars are available) +* `x` and `y`: position of trackbar +* `w` and `h`: width and height +* `orientation`: `vertical`/`horizontal` +* Fieldname data is transferred to Lua +* Value this trackbar is set to (`0`-`1000`) +* See also `minetest.explode_scrollbar_event` (main menu: `engine.explode_scrollbar_event`) + +#### `table[<X>,<Y>;<W>,<H>;<name>;<cell 1>,<cell 2>,...,<cell n>;<selected idx>]` +* Show scrollable table using options defined by the previous `tableoptions[]` +* Displays cells as defined by the previous `tablecolumns[]` +* `x` and `y`: position the itemlist relative to the top left of the menu +* `w` and `h` are the size of the itemlist +* `name`: fieldname sent to server on row select or doubleclick +* `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` (main menu: `engine.explode_table_event`) + +#### `tableoptions[<opt 1>;<opt 2>;...]` +* Sets options for `table[]` +* `color=#RRGGBB` + * default text color (`ColorString`), defaults to `#FFFFFF` +* `background=#RRGGBB` + * table background color (`ColorString`), defaults to `#000000` +* `border=<true/false>` + * should the table be drawn with a border? (default: `true`) +* `highlight=#RRGGBB` + * highlight background color (`ColorString`), defaults to `#466432` +* `highlight_text=#RRGGBB` + * highlight text color (`ColorString`), defaults to `#FFFFFF` +* `opendepth=<value>` + * all subtrees up to `depth < value` are open (default value = `0`) + * only useful when there is a column of type "tree" + +#### `tablecolumns[<type 1>,<opt 1a>,<opt 1b>,...;<type 2>,<opt 2a>,<opt 2b>;...]` +* Sets columns for `table[]` +* Types: `text`, `image`, `color`, `indent`, `tree` + * `text`: show cell contents as text + * `image`: cell contents are an image index, use column options to define images + * `color`: cell contents are a ColorString and define color of following cell + * `indent`: cell contents are a number and define indentation of following cell + * `tree`: same as indent, but user can open and close subtrees (treeview-like) +* Column options: + * `align=<value>` + * for `text` and `image`: content alignment within cells. + Available values: `left` (default), `center`, `right`, `inline` + * `width=<value>` + * for `text` and `image`: minimum width in em (default: `0`) + * for `indent` and `tree`: indent width in em (default: `1.5`) + * `padding=<value>`: padding left of the column, in em (default `0.5`). + Exception: defaults to 0 for indent columns + * `tooltip=<value>`: tooltip text (default: empty) + * `image` column options: + * `0=<value>` sets image for image index 0 + * `1=<value>` sets image for image index 1 + * `2=<value>` sets image for image index 2 + * and so on; defined indices need not be contiguous empty or + non-numeric cells are treated as `0`. + * `color` column options: + * `span=<value>`: number of following columns to affect (default: infinite) + +**Note**: do _not_ use a element name starting with `key_`; those names are reserved to +pass key press events to formspec! + +Spatial Vectors +--------------- +* `vector.new(a[, b, c])`: returns a vector: + * A copy of `a` if `a` is a vector. + * `{x = a, y = b, z = c}`, if all `a, b, c` are defined +* `vector.direction(p1, p2)`: returns a vector +* `vector.distance(p1, p2)`: returns a number +* `vector.length(v)`: returns a number +* `vector.normalize(v)`: returns a vector +* `vector.floor(v)`: returns a vector, each dimension rounded down +* `vector.round(v)`: returns a vector, each dimension rounded to nearest int +* `vector.apply(v, func)`: returns a vector +* `vector.equals(v1, v2)`: returns a boolean + +For the following functions `x` can be either a vector or a number: + +* `vector.add(v, x)`: returns a vector +* `vector.subtract(v, x)`: returns a vector +* `vector.multiply(v, x)`: returns a scaled vector or Schur product +* `vector.divide(v, x)`: returns a scaled vector or Schur quotient + +Helper functions +---------------- +* `dump2(obj, name="_", dumped={})` + * Return object serialized as a string, handles reference loops +* `dump(obj, dumped={})` + * Return object serialized as a string +* `math.hypot(x, y)` + * Get the hypotenuse of a triangle with legs x and y. + Useful for distance calculation. +* `math.sign(x, tolerance)` + * Get the sign of a number. + Optional: Also returns `0` when the absolute value is within the tolerance (default: `0`) +* `string.split(str, separator=",", include_empty=false, max_splits=-1, sep_is_pattern=false)` + * If `max_splits` is negative, do not limit splits. + * `sep_is_pattern` specifies if separator is a plain string or a pattern (regex). + * e.g. `string:split("a,b", ",") == {"a","b"}` +* `string:trim()` + * e.g. `string.trim("\n \t\tfoo bar\t ") == "foo bar"` +* `minetest.wrap_text(str, limit)`: returns a string + * Adds new lines to the string to keep it within the specified character limit + * limit: Maximal amount of characters in one line +* `minetest.pos_to_string({x=X,y=Y,z=Z}, decimal_places))`: returns string `"(X,Y,Z)"` + * Convert position to a printable string + Optional: 'decimal_places' will round the x, y and z of the pos to the given decimal place. +* `minetest.string_to_pos(string)`: returns a position + * Same but in reverse. Returns `nil` if the string can't be parsed to a position. +* `minetest.string_to_area("(X1, Y1, Z1) (X2, Y2, Z2)")`: returns two positions + * Converts a string representing an area box into two positions +* `minetest.is_yes(arg)` + * returns whether `arg` can be interpreted as yes +* `table.copy(table)`: returns a table + * returns a deep copy of `table` + +Minetest namespace reference +------------------------------ + +### Utilities + +* `minetest.get_current_modname()`: returns the currently loading mod's name, when we are loading a mod +* `minetest.get_version()`: returns a table containing components of the + engine version. Components: + * `project`: Name of the project, eg, "Minetest" + * `string`: Simple version, eg, "1.2.3-dev" + * `hash`: Full git version (only set if available), eg, "1.2.3-dev-01234567-dirty" + Use this for informational purposes only. The information in the returned + table does not represent the capabilities of the engine, nor is it + reliable or verifyable. Compatible forks will have a different name and + version entirely. To check for the presence of engine features, test + whether the functions exported by the wanted features exist. For example: + `if minetest.nodeupdate then ... end`. + +### Logging +* `minetest.debug(...)` + * Equivalent to `minetest.log(table.concat({...}, "\t"))` +* `minetest.log([level,] text)` + * `level` is one of `"none"`, `"error"`, `"warning"`, `"action"`, + `"info"`, or `"verbose"`. Default is `"none"`. + +### Global callback registration functions +Call these functions only at load time! + +* `minetest.register_globalstep(func(dtime))` + * Called every client environment step, usually interval of 0.1s +* `minetest.register_on_shutdown(func())` + * Called before client shutdown + * **Warning**: If the client terminates abnormally (i.e. crashes), the registered + callbacks **will likely not be run**. Data should be saved at + semi-frequent intervals as well as on server shutdown. +* `minetest.register_on_connect(func())` + * Called at the end of client connection (when player is loaded onto map) +* `minetest.register_on_receiving_chat_message(func(name, message))` + * Called always when a client receive a message + * Return `true` to mark the message as handled, which means that it will not be shown to chat +* `minetest.register_on_sending_chat_message(func(name, message))` + * Called always when a client send a message from chat + * Return `true` to mark the message as handled, which means that it will not be sent to server +* `minetest.register_chatcommand(cmd, chatcommand definition)` + * Adds definition to minetest.registered_chatcommands +* `minetest.unregister_chatcommand(name)` + * Unregisters a chatcommands registered with register_chatcommand. +* `minetest.register_on_death(func())` + * Called when the local player dies +* `minetest.register_on_hp_modification(func(hp))` + * Called when server modified player's HP +* `minetest.register_on_damage_taken(func(hp))` + * Called when the local player take damages +* `minetest.register_on_formspec_input(func(formname, fields))` + * Called when a button is pressed in the local player's inventory form + * Newest functions are called first + * If function returns `true`, remaining functions are not called +* `minetest.register_on_dignode(func(pos, node))` + * Called when the local player digs a node + * Newest functions are called first + * If any function returns true, the node isn't dug +* `minetest.register_on_punchnode(func(pos, node))` + * Called when the local player punches a node + * Newest functions are called first + * If any function returns true, the punch is ignored +* `minetest.register_on_placenode(function(pointed_thing, node))` + * Called when a node has been placed +* `minetest.register_on_item_use(func(item, pointed_thing))` + * Called when the local player uses an item. + * Newest functions are called first. + * If any function returns true, the item use is not sent to server. +### Sounds +* `minetest.sound_play(spec, parameters)`: returns a handle + * `spec` is a `SimpleSoundSpec` + * `parameters` is a sound parameter table +* `minetest.sound_stop(handle)` + +### Timing +* `minetest.after(time, func, ...)` + * Call the function `func` after `time` seconds, may be fractional + * Optional: Variable number of arguments that are passed to `func` +* `minetest.get_us_time()` + * Returns time with microsecond precision. May not return wall time. +* `minetest.get_day_count()` + * Returns number days elapsed since world was created, accounting for time changes. +* `minetest.get_timeofday()` + * Returns the time of day: `0` for midnight, `0.5` for midday + +### Map +* `minetest.get_node(pos)` + * Returns the node at the given position as table in the format + `{name="node_name", param1=0, param2=0}`, returns `{name="ignore", param1=0, param2=0}` + for unloaded areas. +* `minetest.get_node_or_nil(pos)` + * Same as `get_node` but returns `nil` for unloaded areas. +* `minetest.find_node_near(pos, radius, nodenames, [search_center])`: returns pos or `nil` + * `radius`: using a maximum metric + * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"` + * `search_center` is an optional boolean (default: `false`) + If true `pos` is also checked for the nodes +* `minetest.get_meta(pos)` + * Get a `NodeMetaRef` at that position +* `minetest.get_node_level(pos)` + * get level of leveled node (water, snow) +* `minetest.get_node_max_level(pos)` + * get max available level for leveled node + +### Player +* `minetest.get_wielded_item()` + * Returns the itemstack the local player is holding +* `minetest.send_chat_message(message)` + * Act as if `message` was typed by the player into the terminal. +* `minetest.run_server_chatcommand(cmd, param)` + * Alias for `minetest.send_chat_message("/" .. cmd .. " " .. param)` +* `minetest.clear_out_chat_queue()` + * Clears the out chat queue +* `minetest.localplayer` + * Reference to the LocalPlayer object. See [`LocalPlayer`](#localplayer) class reference for methods. + +### Client Environment +* `minetest.get_player_names()` + * Returns list of player names on server +* `minetest.disconnect()` + * Disconnect from the server and exit to main menu. + * Returns `false` if the client is already disconnecting otherwise returns `true`. +* `minetest.take_screenshot()` + * Take a screenshot. +* `minetest.get_server_info()` + * Returns [server info](#server-info). +* `minetest.send_respawn()` + * Sends a respawn request to the server. + +### Storage API +* `minetest.get_mod_storage()`: + * returns reference to mod private `StorageRef` + * must be called during mod load time + +### Misc. +* `minetest.parse_json(string[, nullvalue])`: returns something + * Convert a string containing JSON data into the Lua equivalent + * `nullvalue`: returned in place of the JSON null; defaults to `nil` + * On success returns a table, a string, a number, a boolean or `nullvalue` + * On failure outputs an error message and returns `nil` + * Example: `parse_json("[10, {\"a\":false}]")`, returns `{10, {a = false}}` +* `minetest.write_json(data[, styled])`: returns a string or `nil` and an error message + * Convert a Lua table into a JSON string + * styled: Outputs in a human-readable format if this is set, defaults to false + * Unserializable things like functions and userdata are saved as null. + * **Warning**: JSON is more strict than the Lua table format. + 1. You can only use strings and positive integers of at least one as keys. + 2. You can not mix string and integer keys. + This is due to the fact that JSON has two distinct array and object values. + * Example: `write_json({10, {a = false}})`, returns `"[10, {\"a\": false}]"` +* `minetest.serialize(table)`: returns a string + * Convert a table containing tables, strings, numbers, booleans and `nil`s + into string form readable by `minetest.deserialize` + * Example: `serialize({foo='bar'})`, returns `'return { ["foo"] = "bar" }'` +* `minetest.deserialize(string)`: returns a table + * Convert a string returned by `minetest.deserialize` into a table + * `string` is loaded in an empty sandbox environment. + * Will load functions, but they cannot access the global environment. + * Example: `deserialize('return { ["foo"] = "bar" }')`, returns `{foo='bar'}` + * Example: `deserialize('print("foo")')`, returns `nil` (function call fails) + * `error:[string "print("foo")"]:1: attempt to call global 'print' (a nil value)` +* `minetest.compress(data, method, ...)`: returns `compressed_data` + * Compress a string of data. + * `method` is a string identifying the compression method to be used. + * Supported compression methods: + * Deflate (zlib): `"deflate"` + * `...` indicates method-specific arguments. Currently defined arguments are: + * Deflate: `level` - Compression level, `0`-`9` or `nil`. +* `minetest.decompress(compressed_data, method, ...)`: returns data + * Decompress a string of data (using ZLib). + * See documentation on `minetest.compress()` for supported compression methods. + * currently supported. + * `...` indicates method-specific arguments. Currently, no methods use this. +* `minetest.encode_base64(string)`: returns string encoded in base64 + * Encodes a string in base64. +* `minetest.decode_base64(string)`: returns string + * Decodes a string encoded in base64. +* `minetest.gettext(string)` : returns string + * look up the translation of a string in the gettext message catalog +* `fgettext_ne(string, ...)` + * call minetest.gettext(string), replace "$1"..."$9" with the given + extra arguments and return the result +* `fgettext(string, ...)` : returns string + * same as fgettext_ne(), but calls minetest.formspec_escape before returning result +* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a position + * returns the exact position on the surface of a pointed node +* `minetest.global_exists(name)` + * Checks if a global variable has been set, without triggering a warning. + +### UI +* `minetest.ui.minimap` + * Reference to the minimap object. See [`Minimap`](#minimap) class reference for methods. + * If client disabled minimap (using enable_minimap setting) this reference will be nil. +* `minetest.camera` + * Reference to the camera object. See [`Camera`](#camera) class reference for methods. +* `minetest.show_formspec(formname, formspec)` : returns true on success + * Shows a formspec to the player +* `minetest.display_chat_message(message)` returns true on success + * Shows a chat message to the current player. + +Class reference +--------------- + +### Minimap +An interface to manipulate minimap on client UI + +* `show()`: shows the minimap (if not disabled by server) +* `hide()`: hides the minimap +* `set_pos(pos)`: sets the minimap position on screen +* `get_pos()`: returns the minimap current position +* `set_angle(deg)`: sets the minimap angle in degrees +* `get_angle()`: returns the current minimap angle in degrees +* `set_mode(mode)`: sets the minimap mode (0 to 6) +* `get_mode()`: returns the current minimap mode +* `set_shape(shape)`: Sets the minimap shape. (0 = square, 1 = round) +* `get_shape()`: Gets the minimap shape. (0 = square, 1 = round) + +### Camera +An interface to get or set information about the camera and cameranode. +Please do not try to access the reference until the camera is initialized, otherwise the reference will be nil. + +#### Methods +* `set_camera_mode(mode)` + * Pass `0` for first-person, `1` for third person, and `2` for third person front +* `get_camera_mode()` + * Returns with same syntax as above +* `get_fov()` + * Returns: + +```lua + { + x = number, + y = number, + max = number, + actual = number + } +``` + +* `get_pos()` + * Returns position of camera with view bobbing +* `get_offset()` + * Returns eye offset vector +* `get_look_dir()` + * Returns eye direction unit vector +* `get_look_vertical()` + * Returns pitch in radians +* `get_look_horizontal()` + * Returns yaw in radians +* `get_aspect_ratio()` + * Returns aspect ratio of screen + +### LocalPlayer +An interface to retrieve information about the player. The player is +not accessible until the client is fully done loading and therefore +not at module init time. + +To get the localplayer handle correctly, use `on_connect()` as follows: + +```lua +local localplayer +minetest.register_on_connect(function() + localplayer = minetest.localplayer +end) +``` + +Methods: + +* `get_pos()` + * returns current player current position +* `get_velocity()` + * returns player speed vector +* `get_hp()` + * returns player HP +* `get_name()` + * returns player name +* `is_attached()` + * returns true if player is attached +* `is_touching_ground()` + * returns true if player touching ground +* `is_in_liquid()` + * returns true if player is in a liquid (This oscillates so that the player jumps a bit above the surface) +* `is_in_liquid_stable()` + * returns true if player is in a stable liquid (This is more stable and defines the maximum speed of the player) +* `get_liquid_viscosity()` + * returns liquid viscosity (Gets the viscosity of liquid to calculate friction) +* `is_climbing()` + * returns true if player is climbing +* `swimming_vertical()` + * returns true if player is swimming in vertical +* `get_physics_override()` + * returns: + +```lua + { + speed = float, + jump = float, + gravity = float, + sneak = boolean, + sneak_glitch = boolean + } +``` + +* `get_override_pos()` + * returns override position +* `get_last_pos()` + * returns last player position before the current client step +* `get_last_velocity()` + * returns last player speed +* `get_breath()` + * returns the player's breath +* `get_movement_acceleration()` + * returns acceleration of the player in different environments: + +```lua + { + fast = float, + air = float, + default = float, + } +``` + +* `get_movement_speed()` + * returns player's speed in different environments: + +```lua + { + walk = float, + jump = float, + crouch = float, + fast = float, + climb = float, + } +``` + +* `get_movement()` + * returns player's movement in different environments: + +```lua + { + liquid_fluidity = float, + liquid_sink = float, + liquid_fluidity_smooth = float, + gravity = float, + } +``` + +* `get_last_look_horizontal()`: + * returns last look horizontal angle +* `get_last_look_vertical()`: + * returns last look vertical angle +* `get_key_pressed()`: + * returns last key typed by the player + +### Settings +An interface to read config files in the format of `minetest.conf`. + +It can be created via `Settings(filename)`. + +#### Methods +* `get(key)`: returns a value +* `get_bool(key)`: returns a boolean +* `set(key, value)` +* `remove(key)`: returns a boolean (`true` for success) +* `get_names()`: returns `{key1,...}` +* `write()`: returns a boolean (`true` for success) + * write changes to file +* `to_table()`: returns `{[key1]=value1,...}` + +### NodeMetaRef +Node metadata: reference extra data and functionality stored in a node. +Can be obtained via `minetest.get_meta(pos)`. + +#### Methods +* `get_string(name)` +* `get_int(name)` +* `get_float(name)` +* `to_table()`: returns `nil` or a table with keys: + * `fields`: key-value storage + * `inventory`: `{list1 = {}, ...}}` + +----------------- +### Definitions +* `minetest.get_node_def(nodename)` + * Returns [node definition](#node-definition) table of `nodename` +* `minetest.get_item_def(itemstring)` + * Returns item definition table of `itemstring` + +#### Node Definition + +```lua + { + has_on_construct = bool, -- Whether the node has the on_construct callback defined + has_on_destruct = bool, -- Whether the node has the on_destruct callback defined + has_after_destruct = bool, -- Whether the node has the after_destruct callback defined + name = string, -- The name of the node e.g. "air", "default:dirt" + groups = table, -- The groups of the node + paramtype = string, -- Paramtype of the node + paramtype2 = string, -- ParamType2 of the node + drawtype = string, -- Drawtype of the node + mesh = <string>, -- Mesh name if existant + minimap_color = <Color>, -- Color of node on minimap *May not exist* + visual_scale = number, -- Visual scale of node + alpha = number, -- Alpha of the node. Only used for liquids + color = <Color>, -- Color of node *May not exist* + palette_name = <string>, -- Filename of palette *May not exist* + palette = <{ -- List of colors + Color, + Color + }>, + waving = number, -- 0 of not waving, 1 if waving + connect_sides = number, -- Used for connected nodes + connects_to = { -- List of nodes to connect to + "node1", + "node2" + }, + post_effect_color = Color, -- Color overlayed 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 + is_ground_content = bool, -- Whether caves should cut through the node + walkable = bool, -- Whether the player collides with the node + pointable = bool, -- Whether the player can select the node + diggable = bool, -- Whether the player can dig the node + climbable = bool, -- Whether the player can climb up the node + buildable_to = bool, -- Whether the player can replace the node by placing a node on it + rightclickable = bool, -- Whether the player can place nodes pointing at this node + damage_per_second = number, -- HP of damage per second when the player is in the node + liquid_type = <string>, -- A string containing "none", "flowing", or "source" *May not exist* + liquid_alternative_flowing = <string>, -- Alternative node for liquid *May not exist* + liquid_alternative_source = <string>, -- Alternative node for liquid *May not exist* + liquid_viscosity = <number>, -- How fast the liquid flows *May not exist* + liquid_renewable = <boolean>, -- Whether the liquid makes an infinite source *May not exist* + liquid_range = <number>, -- How far the liquid flows *May not exist* + drowning = bool, -- Whether the player will drown in the node + floodable = bool, -- Whether nodes will be replaced by liquids (flooded) + node_box = table, -- Nodebox to draw the node with + collision_box = table, -- Nodebox to set the collision area + selection_box = table, -- Nodebox to set the area selected by the player + sounds = { -- Table of sounds that the block makes + sound_footstep = SimpleSoundSpec, + sound_dig = SimpleSoundSpec, + sound_dug = SimpleSoundSpec + }, + legacy_facedir_simple = bool, -- Whether to use old facedir + legacy_wallmounted = bool -- Whether to use old wallmounted + } +``` + +#### Item Definition + +```lua + { + name = string, -- Name of the item e.g. "default:stone" + description = string, -- Description of the item e.g. "Stone" + type = string, -- Item type: "none", "node", "craftitem", "tool" + inventory_image = string, -- Image in the inventory + wield_image = string, -- Image in wieldmesh + palette_image = string, -- Image for palette + color = Color, -- Color for item + wield_scale = Vector, -- Wieldmesh scale + stack_max = number, -- Number of items stackable together + usable = bool, -- Has on_use callback defined + liquids_pointable = bool, -- Whether you can point at liquids with the item + tool_capabilities = <table>, -- If the item is a tool, tool capabiltites of the item + groups = table, -- Groups of the item + sound_place = SimpleSoundSpec, -- Sound played when placed + sound_place_failed = SimpleSoundSpec, -- Sound played when placement failed + node_placement_prediction = string -- Node placed in client until server catches up + } +``` +----------------- + +### Chat command definition (`register_chatcommand`) + + { + params = "<name> <privilege>", -- Short parameter description + description = "Remove privilege from player", -- Full description + func = function(param), -- Called when command is run. + -- Returns boolean success and text output. + } +### Server info +```lua +{ + address = "minetest.example.org", -- The domain name/IP address of a remote server or "" for a local server. + ip = "203.0.113.156", -- The IP address of the server. + port = 30000, -- The port the client is connected to. + protocol_version = 30 -- Will not be accurate at start up as the client might not be connected to the server yet, in that case it will be 0. +} +``` + +Escape sequences +---------------- +Most text can contain escape sequences, that can for example color the text. +There are a few exceptions: tab headers, dropdowns and vertical labels can't. +The following functions provide escape sequences: +* `minetest.get_color_escape_sequence(color)`: + * `color` is a [ColorString](#colorstring) + * The escape sequence sets the text color to `color` +* `minetest.colorize(color, message)`: + * Equivalent to: + `minetest.get_color_escape_sequence(color) .. + message .. + minetest.get_color_escape_sequence("#ffffff")` +* `color.get_background_escape_sequence(color)` + * `color` is a [ColorString](#colorstring) + * The escape sequence sets the background of the whole text element to + `color`. Only defined for item descriptions and tooltips. +* `color.strip_foreground_colors(str)` + * Removes foreground colors added by `get_color_escape_sequence`. +* `color.strip_background_colors(str)` + * Removes background colors added by `get_background_escape_sequence`. +* `color.strip_colors(str)` + * Removes all color escape sequences. + +`ColorString` +------------- +`#RGB` defines a color in hexadecimal format. + +`#RGBA` defines a color in hexadecimal format and alpha channel. + +`#RRGGBB` defines a color in hexadecimal format. + +`#RRGGBBAA` defines a color in hexadecimal format and alpha channel. + +Named colors are also supported and are equivalent to +[CSS Color Module Level 4](http://dev.w3.org/csswg/css-color/#named-colors). +To specify the value of the alpha channel, append `#AA` to the end of the color name +(e.g. `colorname#08`). For named colors the hexadecimal string representing the alpha +value must (always) be two hexadecimal digits. + +`Color` +------------- +`{a = alpha, r = red, g = green, b = blue}` defines an ARGB8 color. diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 34c64b8df..ae8263c6c 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1,4 +1,4 @@ -Minetest Lua Modding API Reference 0.4.15 +Minetest Lua Modding API Reference 0.4.16 ========================================= * More information at <http://www.minetest.net/> * Developer Wiki: <http://dev.minetest.net/> @@ -172,8 +172,8 @@ The main Lua script. Running this script should register everything it wants to register. Subsequent execution depends on minetest calling the registered callbacks. -`minetest.setting_get(name)` and `minetest.setting_getbool(name)` can be used -to read custom or existing settings at load time, if necessary. +`minetest.settings` can be used to read custom or existing settings at load +time, if necessary. (See `Settings`) ### `models` Models for entities or meshnodes. @@ -186,7 +186,11 @@ Naming convention for registered textual names ---------------------------------------------- Registered names should generally be in this format: - "modname:<whatever>" (<whatever> can have characters a-zA-Z0-9_) + `modname:<whatever>` + +`<whatever>` can have these characters: + + a-zA-Z0-9_ This is to prevent conflicting names from corrupting maps and is enforced by the mod loader. @@ -209,7 +213,7 @@ The `:` prefix can also be used for maintaining backwards compatibility. ### Aliases Aliases can be added by using `minetest.register_alias(name, convert_to)` or -`minetest.register_alias_force(name, convert_to). +`minetest.register_alias_force(name, convert_to)`. This will make Minetest to convert things called name to things called `convert_to`. @@ -309,10 +313,10 @@ Example: default_sandstone.png^[resize:16x16 #### `[opacity:<r>` - Makes the base image transparent according to the given ratio. - r must be between 0 and 255. - 0 means totally transparent. - 255 means totally opaque. +Makes the base image transparent according to the given ratio. + +`r` must be between 0 and 255. +0 means totally transparent. 255 means totally opaque. Example: @@ -403,6 +407,11 @@ Apply a mask to the base image. The mask is applied using binary AND. +#### `[sheet:<w>x<h>:<x>,<y>` +Retrieves a tile at position x,y from the base image +which it assumes to be a tilesheet with dimensions w,h. + + #### `[colorize:<color>:<ratio>` Colorize the textures with the given color. `<color>` is specified as a `ColorString`. @@ -414,6 +423,174 @@ the word "`alpha`", then each texture pixel will contain the RGB of `<color>` and the alpha of `<color>` multiplied by the alpha of the texture pixel. +#### `[multiply:<color>` +Multiplies texture colors with the given color. +`<color>` is specified as a `ColorString`. +Result is more like what you'd expect if you put a color on top of another +color. Meaning white surfaces get a lot of your new color while black parts don't +change very much. + +Hardware coloring +----------------- +The goal of hardware coloring is to simplify the creation of +colorful nodes. If your textures use the same pattern, and they only +differ in their color (like colored wool blocks), you can use hardware +coloring instead of creating and managing many texture files. +All of these methods use color multiplication (so a white-black texture +with red coloring will result in red-black color). + +### Static coloring +This method is useful if you wish to create nodes/items with +the same texture, in different colors, each in a new node/item definition. + +#### Global color +When you register an item or node, set its `color` field (which accepts a +`ColorSpec`) to the desired color. + +An `ItemStack`s static color can be overwritten by the `color` metadata +field. If you set that field to a `ColorString`, that color will be used. + +#### Tile color +Each tile may have an individual static color, which overwrites every +other coloring methods. To disable the coloring of a face, +set its color to white (because multiplying with white does nothing). +You can set the `color` property of the tiles in the node's definition +if the tile is in table format. + +### Palettes +For nodes and items which can have many colors, a palette is more +suitable. A palette is a texture, which can contain up to 256 pixels. +Each pixel is one possible color for the node/item. +You can register one node/item, which can have up to 256 colors. + +#### Palette indexing +When using palettes, you always provide a pixel index for the given +node or `ItemStack`. The palette is read from left to right and from +top to bottom. If the palette has less than 256 pixels, then it is +stretched to contain exactly 256 pixels (after arranging the pixels +to one line). The indexing starts from 0. + +Examples: +* 16x16 palette, index = 0: the top left corner +* 16x16 palette, index = 4: the fifth pixel in the first row +* 16x16 palette, index = 16: the pixel below the top left corner +* 16x16 palette, index = 255: the bottom right corner +* 2 (width)x4 (height) palette, index=31: the top left corner. + The palette has 8 pixels, so each pixel is stretched to 32 pixels, + to ensure the total 256 pixels. +* 2x4 palette, index=32: the top right corner +* 2x4 palette, index=63: the top right corner +* 2x4 palette, index=64: the pixel below the top left corner + +#### Using palettes with items +When registering an item, set the item definition's `palette` field to +a texture. You can also use texture modifiers. + +The `ItemStack`'s color depends on the `palette_index` field of the +stack's metadata. `palette_index` is an integer, which specifies the +index of the pixel to use. + +#### Linking palettes with nodes +When registering a node, set the item definition's `palette` field to +a texture. You can also use texture modifiers. +The node's color depends on its `param2`, so you also must set an +appropriate `drawtype`: +* `drawtype = "color"` for nodes which use their full `param2` for + palette indexing. These nodes can have 256 different colors. + The palette should contain 256 pixels. +* `drawtype = "colorwallmounted"` for nodes which use the first + five bits (most significant) of `param2` for palette indexing. + The remaining three bits are describing rotation, as in `wallmounted` + draw type. Division by 8 yields the palette index (without stretching the + palette). These nodes can have 32 different colors, and the palette + should contain 32 pixels. + Examples: + * `param2 = 17` is 2 * 8 + 1, so the rotation is 1 and the third (= 2 + 1) + pixel will be picked from the palette. + * `param2 = 35` is 4 * 8 + 3, so the rotation is 3 and the fifth (= 4 + 1) + pixel will be picked from the palette. +* `drawtype = "colorfacedir"` for nodes which use the first + three bits of `param2` for palette indexing. The remaining + five bits are describing rotation, as in `facedir` draw type. + Division by 32 yields the palette index (without stretching the + palette). These nodes can have 8 different colors, and the + palette should contain 8 pixels. + Examples: + * `param2 = 17` is 0 * 32 + 17, so the rotation is 17 and the + first (= 0 + 1) pixel will be picked from the palette. + * `param2 = 35` is 1 * 32 + 3, so the rotation is 3 and the + second (= 1 + 1) pixel will be picked from the palette. + +To colorize a node on the map, set its `param2` value (according +to the node's draw type). + +### Conversion between nodes in the inventory and the on the map +Static coloring is the same for both cases, there is no need +for conversion. + +If the `ItemStack`'s metadata contains the `color` field, it will be +lost on placement, because nodes on the map can only use palettes. + +If the `ItemStack`'s metadata contains the `palette_index` field, you +currently must manually convert between it and the node's `param2` with +custom `on_place` and `on_dig` callbacks. + +### Colored items in craft recipes +Craft recipes only support item strings, but fortunately item strings +can also contain metadata. Example craft recipe registration: + + local stack = ItemStack("wool:block") + dyed:get_meta():set_int("palette_index", 3) -- add index + minetest.register_craft({ + output = dyed:to_string(), -- convert to string + type = "shapeless", + recipe = { + "wool:block", + "dye:red", + }, + }) + +Metadata field filtering in the `recipe` field are not supported yet, +so the craft output is independent of the color of the ingredients. + +Soft texture overlay +-------------------- +Sometimes hardware coloring is not enough, because it affects the +whole tile. Soft texture overlays were added to Minetest to allow +the dynamic coloring of only specific parts of the node's texture. +For example a grass block may have colored grass, while keeping the +dirt brown. + +These overlays are 'soft', because unlike texture modifiers, the layers +are not merged in the memory, but they are simply drawn on top of each +other. This allows different hardware coloring, but also means that +tiles with overlays are drawn slower. Using too much overlays might +cause FPS loss. + +To define an overlay, simply set the `overlay_tiles` field of the node +definition. These tiles are defined in the same way as plain tiles: +they can have a texture name, color etc. +To skip one face, set that overlay tile to an empty string. + +Example (colored grass block): + + minetest.register_node("default:dirt_with_grass", { + description = "Dirt with Grass", + -- Regular tiles, as usual + -- The dirt tile disables palette coloring + tiles = {{name = "default_grass.png"}, + {name = "default_dirt.png", color = "white"}}, + -- Overlay tiles: define them in the same style + -- The top and bottom tile does not have overlay + overlay_tiles = {"", "", + {name = "default_grass_side.png", tileable_vertical = false}}, + -- Global color, used in inventory + color = "green", + -- Palette in the world + paramtype2 = "color", + palette = "default_foilage.png", + }) + Sounds ------ Only Ogg Vorbis files are supported. @@ -444,11 +621,13 @@ Examples of sound parameter tables: -- Play locationless on all clients { gain = 1.0, -- default + fade = 0.0, -- default, change to a value > 0 to fade the sound in } -- Play locationless to one player { to_player = name, gain = 1.0, -- default + fade = 0.0, -- default, change to a value > 0 to fade the sound in } -- Play locationless to one player, looped { @@ -501,7 +680,7 @@ the global `minetest.registered_*` tables. * `minetest.unregister_item(name)` * Unregisters the item name from engine, and deletes the entry with key * `name` from `minetest.registered_items` and from the associated item - * table according to its nature: minetest.registered_nodes[] etc + * table according to its nature: `minetest.registered_nodes[]` etc * `minetest.register_biome(biome definition)` * returns an integer uniquely identifying the registered biome @@ -579,9 +758,9 @@ They are represented by a table: {name="name", param1=num, param2=num} -`param1` and `param2` are 8-bit integers. The engine uses them for certain -automated functions. If you don't use these functions, you can use them to -store arbitrary values. +`param1` and `param2` are 8-bit integers ranging from 0 to 255. The engine uses +them for certain automated functions. If you don't use these functions, you can +use them to store arbitrary values. The functions of `param1` and `param2` are determined by certain fields in the node definition: @@ -633,15 +812,23 @@ node definition: bit 4 (0x10) - Makes the plant mesh 1.4x larger bit 5 (0x20) - Moves each face randomly a small bit down (1/8 max) bits 6-7 are reserved for future use. - collision_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, - }, - }, - ^ defines list of collision boxes for the node. If empty, collision boxes - will be the same as nodeboxes, in case of any other nodes will be full cube - as in the example above. + paramtype2 == "color" + ^ `param2` tells which color is picked from the palette. + The palette should have 256 pixels. + paramtype2 == "colorfacedir" + ^ Same as `facedir`, but with colors. + The first three bits of `param2` tells which color + is picked from the palette. + The palette should have 8 pixels. + paramtype2 == "colorwallmounted" + ^ Same as `wallmounted`, but with colors. + The first five bits of `param2` tells which color + is picked from the palette. + The palette should have 32 pixels. + paramtype2 == "glasslikeliquidlevel" + ^ Only valid for "glasslike_framed" or "glasslike_framed_optional" drawtypes. + param2 defines 64 levels of internal liquid. + Liquid texture is defined using `special_tiles = {"modname_tilename.png"},` Nodes can also contain extra data. See "Node Metadata". @@ -792,6 +979,7 @@ If no flags are specified (or defaults is), 2D noise is eased and 3D noise is no Accumulates the absolute value of each noise gradient result. Noise parameters format example for 2D or 3D perlin noise or perlin noise maps: + np_terrain = { offset = 0, scale = 1, @@ -802,8 +990,8 @@ Noise parameters format example for 2D or 3D perlin noise or perlin noise maps: lacunarity = 2.0, flags = "defaults, absvalue" } - ^ A single noise parameter table can be used to get 2D or 3D noise, - when getting 2D noise spread.z is ignored. + ^ A single noise parameter table can be used to get 2D or 3D noise, + when getting 2D noise spread.z is ignored. Ore types @@ -875,14 +1063,15 @@ to small changes. The following is a decent set of parameters to work from: }, noise_threshold = 1.6 -WARNING: Use this ore type *very* sparingly since it is ~200x more +**WARNING**: Use this ore type *very* sparingly since it is ~200x more computationally expensive than any other ore. Ore attributes -------------- See section "Flag Specifier Format". -Currently supported flags: `absheight` +Currently supported flags: +`absheight`, `puff_cliffs`, `puff_additive_composition`. ### `absheight` Also produce this same ore between the height range of `-y_max` and `-y_min`. @@ -938,6 +1127,7 @@ in the form of a table. This table specifies the following fields: previous contents (default: false) About probability values: + * A probability value of `0` or `1` means that node will never appear (0% chance). * A probability value of `254` or `255` means the node will always appear (100% chance). * If the probability value `p` is greater than `1`, then there is a @@ -1092,16 +1282,32 @@ There are three kinds of items: nodes, tools and craftitems. things according to `tool_capabilities`. * Craftitem (`register_craftitem`): A miscellaneous item. +### Amount and wear +All item stacks have an amount between 0 to 65535. It is 1 by +default. Tool item stacks can not have an amount greater than 1. + +Tools use a wear (=damage) value ranging from 0 to 65535. The +value 0 is the default and used is for unworn tools. The values +1 to 65535 are used for worn tools, where a higher value stands for +a higher wear. Non-tools always have a wear value of 0. + ### Item formats Items and item stacks can exist in three formats: Serializes, table format and `ItemStack`. #### Serialized -This is called "stackstring" or "itemstring": +This is called "stackstring" or "itemstring". It is a simple string with +1-3 components: the full item identifier, an optional amount and an optional +wear value. Syntax: -* e.g. `'default:dirt 5'` -* e.g. `'default:pick_wood 21323'` -* e.g. `'default:apple'` + <identifier> [<amount>[ <wear>]] + +Examples: + +* `'default:apple'`: 1 apple +* `'default:dirt 5'`: 5 dirt +* `'default:pick_stone'`: a new stone pickaxe +* `'default:pick_wood 1 21323'`: a wooden pickaxe, ca. 1/3 worn out #### Table format Examples: @@ -1195,16 +1401,18 @@ Another example: Make red wool from white wool and red dye: ### Special groups * `immortal`: Disables the group damage system for an entity +* `punch_operable`: For entities; disables the regular damage mechanism for + players punching it by hand or a non-tool item, so that it can do something + else than take damage. * `level`: Can be used to give an additional sense of progression in the game. * A larger level will cause e.g. a weapon of a lower level make much less damage, and get worn out much faster, or not be able to get drops from destroyed nodes. * `0` is something that is directly accessible at the start of gameplay * There is no upper limit -* `dig_immediate`: (player can always pick up node without tool wear) - * `2`: node is removed without tool wear after 0.5 seconds or so - (rail, sign) - * `3`: node is removed without tool wear immediately (torch) +* `dig_immediate`: (player can always pick up node without reducing tool wear) + * `2`: the node always gets the digging time 0.5 seconds (rail, sign) + * `3`: the node always gets the digging time 0 seconds (torch) * `disable_jump`: Player (and possibly other things) cannot jump from node * `fall_damage_add_percent`: damage speed = `speed * (1 + value/100)` * `bouncy`: value is bounce speed in percent @@ -1234,6 +1442,7 @@ Another example: Make red wool from white wool and red dye: ### Examples of custom groups Item groups are often used for defining, well, _groups of items_. + * `meat`: any meat-kind of a thing (rating might define the size or healing ability or be irrelevant -- it is not defined as of yet) * `eatable`: anything that can be eaten. Rating might define HP gain in half @@ -1305,6 +1514,10 @@ result in the tool to be able to dig nodes that have a rating of `2` or `3` for this group, and unable to dig the rating `1`, which is the toughest. Unless there is a matching group that enables digging otherwise. +If the result digging time is 0, a delay of 0.15 seconds is added between +digging nodes; If the player releases LMB after digging, this delay is set to 0, +i.e. players can more quickly click the nodes away instead of holding LMB. + #### Damage groups List of damage for groups of entities. See "Entity damage mechanism". @@ -1374,7 +1587,7 @@ a non-tool item, so that it can do something else than take damage. On the Lua side, every punch calls: - entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction, damage) This should never be called directly, because damage is usually not handled by the entity itself. @@ -1385,6 +1598,9 @@ the entity itself. * `tool_capabilities` can be `nil`. * `direction` is a unit vector, pointing from the source of the punch to the punched object. +* `damage` damage that will be done to entity +Return value of this function will determin if damage is done by this function +(retval true) or shall be done by engine (retval false) To punch an entity/object in Lua, call: @@ -1399,9 +1615,9 @@ Node Metadata ------------- The instance of a node in the world normally only contains the three values mentioned in "Nodes". However, it is possible to insert extra data into a -node. It is called "node metadata"; See "`NodeMetaRef`". +node. It is called "node metadata"; See `NodeMetaRef`. -Metadata contains two things: +Node metadata contains two things: * A key-value store * An inventory @@ -1439,6 +1655,25 @@ Example stuff: } }) +Item Metadata +------------- +Item stacks can store metadata too. See `ItemStackMetaRef`. + +Item metadata only contains a key-value store. + +Some of the values in the key-value store are handled specially: + +* `description`: Set the item stack's description. Defaults to `idef.description` +* `color`: A `ColorString`, which sets the stack's color. +* `palette_index`: If the item has a palette, this is used to get the + current color from the palette. + +Example stuff: + + local meta = stack:get_meta() + meta:set_string("key", "value") + print(dump(meta:to_table())) + Formspec -------- Formspec defines a menu. Currently not much else than inventories are @@ -1478,9 +1713,19 @@ examples. * `fixed_size`: `true`/`false` (optional) * deprecated: `invsize[<W>,<H>;]` +#### `position[<X>,<Y>]` +* Define the position of the formspec +* A value between 0.0 and 1.0 represents a position inside the screen +* The default value is the center of the screen (0.5, 0.5) + +#### `anchor[<X>,<Y>]` +* Define the anchor of the formspec +* A value between 0.0 and 1.0 represents an anchor inside the formspec +* The default value is the center of the formspec (0.5, 0.5) + #### `container[<X>,<Y>]` * Start of a container block, moves all physical elements in the container by (X, Y) -* Must have matching container_end +* Must have matching `container_end` * Containers can be nested, in which case the offsets are added (child containers are relative to parent containers) @@ -1520,7 +1765,7 @@ examples. * Sets default background color of tooltips * Sets default font color of tooltips -#### `tooltip[<gui_element_name>;<tooltip_text>;<bgcolor>,<fontcolor>]` +#### `tooltip[<gui_element_name>;<tooltip_text>;<bgcolor>;<fontcolor>]` * Adds tooltip for an element * `<bgcolor>` tooltip background color as `ColorString` (optional) * `<fontcolor>` tooltip font color as `ColorString` (optional) @@ -1565,7 +1810,7 @@ examples. #### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]` * Textual field; will be sent to server when a button is clicked -* When enter is pressed in field, fields.key_enter_field will be sent with the name +* When enter is pressed in field, `fields.key_enter_field` will be sent with the name of this field. * `x` and `y` position the field relative to the top left of the menu * `w` and `h` are the size of the field @@ -1577,16 +1822,16 @@ examples. * `default` may contain variable references such as `${text}'` which will fill the value from the metadata value `text` * **Note**: no extra text or more than a single variable is supported ATM. -* See field_close_on_enter to stop enter closing the formspec +* See `field_close_on_enter` to stop enter closing the formspec #### `field[<name>;<label>;<default>]` * As above, but without position/size units -* When enter is pressed in field, fields.key_enter_field will be sent with the name +* When enter is pressed in field, `fields.key_enter_field` will be sent with the name of this field. * Special field for creating simple forms, such as sign text input * Must be used without a `size[]` element * A "Proceed" button will be added automatically -* See field_close_on_enter to stop enter closing the formspec +* See `field_close_on_enter` to stop enter closing the formspec #### `field_close_on_enter[<name>;<close_on_enter>]` * <name> is the name of the field @@ -1806,18 +2051,25 @@ Escape sequences Most text can contain escape sequences, that can for example color the text. There are a few exceptions: tab headers, dropdowns and vertical labels can't. The following functions provide escape sequences: -* `core.get_color_escape_sequence(color)`: + +* `minetest.get_color_escape_sequence(color)`: * `color` is a ColorString * The escape sequence sets the text color to `color` -* `core.colorize(color, message)`: +* `minetest.colorize(color, message)`: * Equivalent to: - `core.get_color_escape_sequence(color) .. + `minetest.get_color_escape_sequence(color) .. message .. - core.get_color_escape_sequence("#ffffff")` + minetest.get_color_escape_sequence("#ffffff")` * `color.get_background_escape_sequence(color)` * `color` is a ColorString * The escape sequence sets the background of the whole text element to `color`. Only defined for item descriptions and tooltips. +* `color.strip_foreground_colors(str)` + * Removes foreground colors added by `get_color_escape_sequence`. +* `color.strip_background_colors(str)` + * Removes background colors added by `get_background_escape_sequence`. +* `color.strip_colors(str)` + * Removes all color escape sequences. Spatial Vectors --------------- @@ -1832,6 +2084,7 @@ Spatial Vectors * `vector.round(v)`: returns a vector, each dimension rounded to nearest int * `vector.apply(v, func)`: returns a vector * `vector.equals(v1, v2)`: returns a boolean +* `vector.sort(v1, v2)`: returns minp, maxp vectors of the cuboid defined by v1 and v2 For the following functions `x` can be either a vector or a number: @@ -1852,14 +2105,16 @@ Helper functions * `math.sign(x, tolerance)` * Get the sign of a number. Optional: Also returns `0` when the absolute value is within the tolerance (default: `0`) -* `string.split(str, separator=",", include_empty=false, max_splits=-1, -* sep_is_pattern=false)` +* `string.split(str, separator=",", include_empty=false, max_splits=-1, sep_is_pattern=false)` * If `max_splits` is negative, do not limit splits. * `sep_is_pattern` specifies if separator is a plain string or a pattern (regex). * e.g. `string:split("a,b", ",") == {"a","b"}` * `string:trim()` * e.g. `string.trim("\n \t\tfoo bar\t ") == "foo bar"` -* `minetest.pos_to_string({x=X,y=Y,z=Z}, decimal_places))`: returns `"(X,Y,Z)"` +* `minetest.wrap_text(str, limit)`: returns a string + * Adds new lines to the string to keep it within the specified character limit + * limit: Maximal amount of characters in one line +* `minetest.pos_to_string({x=X,y=Y,z=Z}, decimal_places))`: returns string `"(X,Y,Z)"` * Convert position to a printable string Optional: 'decimal_places' will round the x, y and z of the pos to the given decimal place. * `minetest.string_to_pos(string)`: returns a position @@ -1869,11 +2124,13 @@ Helper functions * `minetest.formspec_escape(string)`: returns a string * escapes the characters "[", "]", "\", "," and ";", which can not be used in formspecs * `minetest.is_yes(arg)` - * returns whether `arg` can be interpreted as yes + * returns true if passed 'y', 'yes', 'true' or a number that isn't zero. * `minetest.get_us_time()` * returns time with microsecond precision. May not return wall time. * `table.copy(table)`: returns a table * returns a deep copy of `table` +* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a position + * returns the exact position on the surface of a pointed node `minetest` namespace reference ------------------------------ @@ -1888,34 +2145,52 @@ Helper functions * `minetest.get_worldpath()`: returns e.g. `"/home/user/.minetest/world"` * Useful for storing custom data * `minetest.is_singleplayer()` -* `minetest.features` - * Table containing API feature flags: `{foo=true, bar=true}` +* `minetest.features`: Table containing API feature flags + + { + glasslike_framed = true, + nodebox_as_selectionbox = true, + chat_send_player_param3 = true, + get_all_craft_recipes_works = true, + use_texture_alpha = true, + -- ^ The transparency channel of textures can be used optionally + no_legacy_abms = true, + -- ^ Tree and grass ABMs are no longer done from C++ + texture_names_parens = true, + -- ^ Texture grouping is possible using parentheses + area_store_custom_ids = true, + -- ^ Unique Area ID for AreaStore:insert_area + add_entity_with_staticdata = true, + -- ^ add_entity supports passing initial staticdata to on_activate + no_chat_message_prediction = true, + -- ^ Chat messages are no longer predicted + } * `minetest.has_feature(arg)`: returns `boolean, missing_features` * `arg`: string or table in format `{foo=true, bar=true}` * `missing_features`: `{foo=true, bar=true}` -* `minetest.get_player_information(player_name)`: returns a table containing - information about player. Example return value: - { - address = "127.0.0.1", -- IP address of client - ip_version = 4, -- IPv4 / IPv6 - min_rtt = 0.01, -- minimum round trip time - max_rtt = 0.2, -- maximum round trip time - avg_rtt = 0.02, -- average round trip time - min_jitter = 0.01, -- minimum packet time jitter - max_jitter = 0.5, -- maximum packet time jitter - avg_jitter = 0.03, -- average packet time jitter - connection_uptime = 200, -- seconds since client connected - - -- following information is available on debug build only!!! - -- DO NOT USE IN MODS - --ser_vers = 26, -- serialization version used by client - --prot_vers = 23, -- protocol version used by client - --major = 0, -- major version number - --minor = 4, -- minor version number - --patch = 10, -- patch version number - --vers_string = "0.4.9-git", -- full version string - --state = "Active" -- current client state - } +* `minetest.get_player_information(player_name)`: + * Returns a table containing information about a player. Example return value: + + { + address = "127.0.0.1", -- IP address of client + ip_version = 4, -- IPv4 / IPv6 + min_rtt = 0.01, -- minimum round trip time + max_rtt = 0.2, -- maximum round trip time + avg_rtt = 0.02, -- average round trip time + min_jitter = 0.01, -- minimum packet time jitter + max_jitter = 0.5, -- maximum packet time jitter + avg_jitter = 0.03, -- average packet time jitter + connection_uptime = 200, -- seconds since client connected + prot_vers = 31, -- protocol version used by client + -- following information is available on debug build only!!! + -- DO NOT USE IN MODS + --ser_vers = 26, -- serialization version used by client + --major = 0, -- major version number + --minor = 4, -- minor version number + --patch = 10, -- patch version number + --vers_string = "0.4.9-git", -- full version string + --state = "Active" -- current client state + } * `minetest.mkdir(path)`: returns success. * Creates a directory specified by `path`, creating parent directories if they don't exist. @@ -1934,7 +2209,7 @@ Helper functions reliable or verifyable. Compatible forks will have a different name and version entirely. To check for the presence of engine features, test whether the functions exported by the wanted features exist. For example: - `if core.nodeupdate then ... end`. + `if minetest.nodeupdate then ... end`. ### Logging * `minetest.debug(...)` @@ -1962,7 +2237,7 @@ Call these functions only at load time! * Specify either output or input only. If you specify both, input will be ignored. For input use the same recipe table syntax as for `minetest.register_craft(recipe)`. For output specify only the item, without a quantity. * If no erase candidate could be found, Lua exception will be thrown. - * Warning! The type field ("shaped","cooking" or any other) will be ignored if the recipe + * **Warning**! The type field ("shaped","cooking" or any other) will be ignored if the recipe contains output. Erasing is then done independently from the crafting method. * `minetest.register_ore(ore definition)` * `minetest.register_biome(biome definition)` @@ -2017,7 +2292,7 @@ Call these functions only at load time! * Called when the player gets damaged or healed * `player`: ObjectRef of the player * `hp_change`: the amount of change. Negative when it is damage. - * `modifier`: when true, the function should return the actual hp_change. + * `modifier`: when true, the function should return the actual `hp_change`. Note: modifiers only get a temporary hp_change that can be modified by later modifiers. modifiers can return true as a second argument to stop the execution of further functions. Non-modifiers receive the final hp change calculated by the modifiers. @@ -2036,9 +2311,10 @@ Call these functions only at load time! * `minetest.register_on_cheat(func(ObjectRef, cheat))` * Called when a player cheats * `cheat`: `{type=<cheat_type>}`, where `<cheat_type>` is one of: - * `"moved_too_fast"` - * `"interacted_too_far"` - * `"finished_unknown_dig"` + * `moved_too_fast` + * `interacted_too_far` + * `interacted_while_dead` + * `finished_unknown_dig` * `dug_unbreakable` * `dug_too_fast` * `minetest.register_on_chat_message(func(name, message))` @@ -2070,25 +2346,24 @@ Call these functions only at load time! ### Other registration functions * `minetest.register_chatcommand(cmd, chatcommand definition)` + * Adds definition to `minetest.registered_chatcommands` +* `minetest.override_chatcommand(name, redefinition)` + * Overrides fields of a chatcommand registered with `register_chatcommand`. +* `minetest.unregister_chatcommand(name)` + * Unregisters a chatcommands registered with `register_chatcommand`. * `minetest.register_privilege(name, definition)` * `definition`: `"description text"` * `definition`: `{ description = "description text", give_to_singleplayer = boolean}` the default of `give_to_singleplayer` is true - * To allow players with basic_privs to grant, see basic_privs minetest.conf setting. + * To allow players with `basic_privs` to grant, see `basic_privs` minetest.conf setting. * `minetest.register_authentication_handler(handler)` * See `minetest.builtin_auth_handler` in `builtin.lua` for reference ### Setting-related -* `minetest.setting_set(name, value)` - * Setting names can't contain whitespace or any of `="{}#`. - * Setting values can't contain the sequence `\n"""`. - * Setting names starting with "secure." can't be set. -* `minetest.setting_get(name)`: returns string or `nil` -* `minetest.setting_setbool(name, value)` - * See documentation on `setting_set` for restrictions. -* `minetest.setting_getbool(name)`: returns boolean or `nil` -* `minetest.setting_get_pos(name)`: returns position or nil -* `minetest.setting_save()`, returns `nil`, save all settings to config file +* `minetest.settings`: Settings object containing all of the settings from the + main config file (`minetest.conf`). +* `minetest.setting_get_pos(name)`: Loads a setting from the main settings and + parses it as a position (in the format `(1,2,3)`). Returns a position or nil. ### Authentication * `minetest.notify_authentication_modified(name)` @@ -2108,7 +2383,7 @@ Call these functions only at load time! * on comparing the password hash in the database with the password hash * from the function, with an externally provided password, as the hash * in the db might use the new SRP verifier format. - * For this purpose, use minetest.check_password_entry instead. + * For this purpose, use `minetest.check_password_entry` instead. * `minetest.string_to_privs(str)`: returns `{priv1=true,...}` * `minetest.privs_to_string(privs)`: returns `"priv1,priv2,..."` * Convert between two privilege representations @@ -2158,6 +2433,9 @@ and `minetest.auth_reload` call the authetification handler. * Returns `true` if successful, `false` on failure (e.g. protected location) * `minetest.punch_node(pos)` * Punch node with the same effects that a player would cause +* `minetest.spawn_falling_node(pos)` + * Change node into falling node + * Returns `true` if successful, `false` on failure * `minetest.find_nodes_with_meta(pos1, pos2)` * Get a table of positions of nodes that have metadata within a region {pos1, pos2} @@ -2166,7 +2444,7 @@ and `minetest.auth_reload` call the authetification handler. * `minetest.get_node_timer(pos)` * Get `NodeTimerRef` -* `minetest.add_entity(pos, name)`: Spawn Lua-defined entity at position +* `minetest.add_entity(pos, name, [staticdata])`: Spawn Lua-defined entity at position * Returns `ObjectRef`, or `nil` if failed * `minetest.add_item(pos, item)`: Spawn item * Returns `ObjectRef`, or `nil` if failed @@ -2179,9 +2457,11 @@ and `minetest.auth_reload` call the authetification handler. * `minetest.get_gametime()`: returns the time, in seconds, since the world was created * `minetest.get_day_count()`: returns number days elapsed since world was created, * accounting for time changes. -* `minetest.find_node_near(pos, radius, nodenames)`: returns pos or `nil` +* `minetest.find_node_near(pos, radius, nodenames, [search_center])`: returns pos or `nil` * `radius`: using a maximum metric * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"` + * `search_center` is an optional boolean (default: `false`) + If true `pos` is also checked for the nodes * `minetest.find_nodes_in_area(minp, maxp, nodenames)`: returns a list of positions * returns as second value a table with the count of the individual nodes found * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"` @@ -2199,7 +2479,7 @@ and `minetest.auth_reload` call the authetification handler. * `flags` is a flag field with the available flags: `dungeon`, `temple`, `cave_begin`, `cave_end`, `large_cave_begin`, `large_cave_end`, `decoration` * The second parameter is a list of IDS of decorations which notification is requested for -* `get_gen_notify()`: returns a flagstring and a table with the deco_ids +* `get_gen_notify()`: returns a flagstring and a table with the `deco_id`s * `minetest.get_mapgen_object(objectname)` * Return requested mapgen object if available (see "Mapgen objects") * `minetest.get_biome_id(biome_name)` @@ -2207,9 +2487,9 @@ and `minetest.auth_reload` call the authetification handler. given biome_name string. * `minetest.get_mapgen_params()` Returns mapgen parameters, a table containing `mgname`, `seed`, `chunksize`, `water_level`, and `flags`. - * Deprecated: use minetest.get_mapgen_setting(name) instead + * Deprecated: use `minetest.get_mapgen_setting(name)` instead * `minetest.set_mapgen_params(MapgenParams)` - * Deprecated: use minetest.set_mapgen_setting(name, value, override) instead + * Deprecated: use `minetest.set_mapgen_setting(name, value, override)` instead * Set map generation parameters * Function cannot be called after the registration period; only initialization and `on_mapgen_init` @@ -2234,7 +2514,7 @@ and `minetest.auth_reload` call the authetification handler. is not already present in map_meta.txt. * `override_meta` is an optional boolean (default: `false`). If this is set to true, the setting will become the active setting regardless of the map metafile contents. - * Note: to set the seed, use "seed", not "fixed_map_seed" + * Note: to set the seed, use `"seed"`, not `"fixed_map_seed"` * `minetest.set_mapgen_setting_noiseparams(name, value, [override_meta])` * Same as above, except value is a NoiseParams table. * `minetest.set_noiseparams(name, noiseparams, set_default)` @@ -2262,8 +2542,8 @@ and `minetest.auth_reload` call the authetification handler. * `function EmergeAreaCallback(blockpos, action, calls_remaining, param)` * - `blockpos` is the *block* coordinates of the block that had been emerged * - `action` could be one of the following constant values: - * `core.EMERGE_CANCELLED`, `core.EMERGE_ERRORED`, `core.EMERGE_FROM_MEMORY`, - * `core.EMERGE_FROM_DISK`, `core.EMERGE_GENERATED` + * `minetest.EMERGE_CANCELLED`, `minetest.EMERGE_ERRORED`, `minetest.EMERGE_FROM_MEMORY`, + * `minetest.EMERGE_FROM_DISK`, `minetest.EMERGE_GENERATED` * - `calls_remaining` is the number of callbacks to be expected after this one * - `param` is the user-defined parameter passed to emerge_area (or nil if the * parameter was absent) @@ -2287,8 +2567,6 @@ and `minetest.auth_reload` call the authetification handler. * `algorithm`: One of `"A*_noprefetch"` (default), `"A*"`, `"Dijkstra"` * `minetest.spawn_tree (pos, {treedef})` * spawns L-system tree at given `pos` with definition in `treedef` table - * Warning: L-system generation currently creates lighting bugs in the form of mapblock-sized shadows. - Often these bugs appear as subtle shadows in water. * `minetest.transforming_liquid_add(pos)` * add node to liquid update queue * `minetest.get_node_max_level(pos)` @@ -2302,11 +2580,27 @@ and `minetest.auth_reload` call the authetification handler. * increase level of leveled node by level, default `level` equals `1` * if `totallevel > maxlevel`, returns rest (`total-max`) * can be negative for decreasing -* `core.check_single_for_falling(pos)` +* `minetest.fix_light(pos1, pos2)`: returns `true`/`false` + * resets the light in a cuboid-shaped part of + the map and removes lighting bugs. + * Loads the area if it is not loaded. + * `pos1` is the corner of the cuboid with the least coordinates + (in node coordinates), inclusive. + * `pos2` is the opposite corner of the cuboid, inclusive. + * The actual updated cuboid might be larger than the specified one, + because only whole map blocks can be updated. + The actual updated area consists of those map blocks that intersect + with the given cuboid. + * However, the neighborhood of the updated area might change + as well, as light can spread out of the cuboid, also light + might be removed. + * returns `false` if the area is not fully generated, + `true` otherwise +* `minetest.check_single_for_falling(pos)` * causes an unsupported `group:falling_node` node to fall and causes an unattached `group:attached_node` node to fall. * does not spread these updates to neighbours. -* `core.check_for_falling(pos)` +* `minetest.check_for_falling(pos)` * causes an unsupported `group:falling_node` node to fall and causes an unattached `group:attached_node` node to fall. * spread these updates to neighbours and can cause a cascade @@ -2321,7 +2615,7 @@ and `minetest.auth_reload` call the authetification handler. * `{type="detached", name="creative"}` * `minetest.create_detached_inventory(name, callbacks, [player_name])`: returns an `InvRef` * callbacks: See "Detached inventory callbacks" - * player_name: Make detached inventory available to one player exclusively, + * `player_name`: Make detached inventory available to one player exclusively, by default they will be sent to every player (even if not used). Note that this parameter is mostly just a workaround and will be removed in future releases. * Creates a detached inventory. If it already exists, it is cleared. @@ -2337,11 +2631,11 @@ and `minetest.auth_reload` call the authetification handler. * `formspec`: formspec to display * `minetest.close_formspec(playername, formname)` * `playername`: name of player to close formspec - * `formname`: has to exactly match the one given in show_formspec, or the formspec will + * `formname`: has to exactly match the one given in `show_formspec`, or the formspec will not close. - * calling show_formspec(playername, formname, "") is equal to this expression + * calling `show_formspec(playername, formname, "")` is equal to this expression * to close a formspec regardless of the formname, call - minetest.close_formspec(playername, ""). USE THIS ONLY WHEN ABSOLUTELY NECESSARY! + `minetest.close_formspec(playername, "")`. **USE THIS ONLY WHEN ABSOLUTELY NECESSARY!** * `minetest.formspec_escape(string)`: returns a string * escapes the characters "[", "]", "\", "," and ";", which can not be used in formspecs * `minetest.explode_table_event(string)`: returns a table @@ -2378,6 +2672,10 @@ and `minetest.auth_reload` call the authetification handler. * Convert a vector to a wallmounted value, used for `paramtype2="wallmounted"` * `minetest.wallmounted_to_dir(wallmounted)` * Convert a wallmounted value back into a vector aimed directly out the "back" of a node +* `minetest.dir_to_yaw(dir)` + * Convert a vector into a yaw (angle) +* `minetest.yaw_to_dir(yaw)` + * Convert yaw (angle) to a vector * `minetest.get_node_drops(nodename, toolname)` * Returns list of item names. * **Note**: This will be removed or modified in a future version. @@ -2403,6 +2701,7 @@ and `minetest.auth_reload` call the authetification handler. * returns indexed table with all registered recipes for query item (node) or `nil` if no recipe was found * recipe entry table: + { method = 'normal' or 'cooking' or 'fuel' width = 0-3, 0 means shapeless recipe @@ -2410,6 +2709,7 @@ and `minetest.auth_reload` call the authetification handler. output = string with item name and quantity } * Example query for `"default:gold_ingot"` will return table: + { [1]={type = "cooking", width = 3, output = "default:gold_ingot", items = {1 = "default:gold_lump"}}, @@ -2468,6 +2768,11 @@ These functions return the leftover itemstack. * `spec` is a `SimpleSoundSpec` * `parameters` is a sound parameter table * `minetest.sound_stop(handle)` +* `minetest.sound_fade(handle, step, gain)` + * `handle` is a handle returned by `minetest.sound_play` + * `step` determines how fast a sound will fade. + Negative step will lower the sound volume, positive step will increase the sound volume + * `gain` the target gain for the fade. ### Timing * `minetest.after(time, func, ...)` @@ -2475,10 +2780,17 @@ These functions return the leftover itemstack. * Optional: Variable number of arguments that are passed to `func` ### Server -* `minetest.request_shutdown([message],[reconnect])`: request for server shutdown. Will display `message` to clients, - and `reconnect` == true displays a reconnect button. +* `minetest.request_shutdown([message],[reconnect],[delay])`: request for server shutdown. Will display `message` to clients, + `reconnect` == true displays a reconnect button, + `delay` adds an optional delay (in seconds) before shutdown + negative delay cancels the current active shutdown + zero delay triggers an immediate shutdown. +* `minetest.cancel_shutdown_requests()`: cancel current delayed shutdown * `minetest.get_server_status()`: returns server status string * `minetest.get_server_uptime()`: returns the server uptime in seconds +* `minetest.remove_player(name)`: remove player from database (if he is not connected). + * Does not remove player authentication data, minetest.player_exists will continue to return true. + * Returns a code (0: successful, 1: no such player, 2: player is connected) ### Bans * `minetest.get_ban_list()`: returns the ban list (same as `minetest.get_ban_description("")`) @@ -2503,7 +2815,7 @@ These functions return the leftover itemstack. minsize, maxsize, collisiondetection, texture, playername)` -* `minetest.delete_particlespawner(id, player)`` +* `minetest.delete_particlespawner(id, player)` * Delete `ParticleSpawner` with `id` (return value from `minetest.add_particlespawner`) * If playername is specified, only deletes on the player's client, * otherwise on all clients @@ -2574,8 +2886,14 @@ These functions return the leftover itemstack. * `HTTPApiTable.fetch_async_get(handle)`: returns HTTPRequestResult * Return response data for given asynchronous HTTP request +### Storage API: +* `minetest.get_mod_storage()`: + * returns reference to mod private `StorageRef` + * must be called during mod load time + ### Misc. * `minetest.get_connected_players()`: returns list of `ObjectRefs` +* `minetest.player_exists(name)`: boolean, whether player exists (regardless of online status) * `minetest.hud_replace_builtin(name, hud_definition)` * Replaces definition of a builtin hud element * `name`: `"breath"` or `"health"` @@ -2605,7 +2923,7 @@ These functions return the leftover itemstack. * `minetest.write_json(data[, styled])`: returns a string or `nil` and an error message * Convert a Lua table into a JSON string * styled: Outputs in a human-readable format if this is set, defaults to false - * Unserializable things like functions and userdata are saved as null. + * Unserializable things like functions and userdata will cause an error. * **Warning**: JSON is more strict than the Lua table format. 1. You can only use strings and positive integers of at least one as keys. 2. You can not mix string and integer keys. @@ -2722,6 +3040,8 @@ These functions return the leftover itemstack. * Map of object references, indexed by active object id * `minetest.luaentities` * Map of Lua entities, indexed by active object id +* `minetest.registered_chatcommands` + * Map of registered chat command definitions, indexed by name * `minetest.registered_ores` * List of registered ore definitions. * `minetest.registered_biomes` @@ -2732,9 +3052,8 @@ These functions return the leftover itemstack. Class reference --------------- -### `NodeMetaRef` -Node metadata: reference extra data and functionality stored in a node. -Can be gotten via `minetest.get_meta(pos)`. +### `MetaDataRef` +See `StorageRef`, `NodeMetaRef` and `ItemStackMetaRef`. #### Methods * `set_string(name, value)` @@ -2743,11 +3062,41 @@ Can be gotten via `minetest.get_meta(pos)`. * `get_int(name)` * `set_float(name, value)` * `get_float(name)` -* `get_inventory()`: returns `InvRef` -* `to_table()`: returns `nil` or `{fields = {...}, inventory = {list1 = {}, ...}}` +* `to_table()`: returns `nil` or a table with keys: + * `fields`: key-value storage + * `inventory`: `{list1 = {}, ...}}` (NodeMetaRef only) * `from_table(nil or {})` - * to clear metadata, use from_table(nil) - * See "Node Metadata" + * Any non-table value will clear the metadata + * See "Node Metadata" for an example + * returns `true` on success +* `equals(other)` + * returns `true` if this metadata has the same key-value pairs as `other` + +### `NodeMetaRef` +Node metadata: reference extra data and functionality stored in a node. +Can be obtained via `minetest.get_meta(pos)`. + +#### Methods +* All methods in MetaDataRef +* `get_inventory()`: returns `InvRef` +* `mark_as_private(name or {name1, name2, ...})`: Mark specific vars as private + This will prevent them from being sent to the client. Note that the "private" + status will only be remembered if an associated key-value pair exists, meaning + it's best to call this when initializing all other meta (e.g. `on_construct`). + +### `ItemStackMetaRef` +ItemStack metadata: reference extra data and functionality stored in a stack. +Can be obtained via `item:get_meta()`. + +#### Methods +* All methods in MetaDataRef + +### `StorageRef` +Mod metadata: per mod metadata, saved automatically. +Can be obtained via `minetest.get_mod_storage()` during load time. + +#### Methods +* All methods in MetaDataRef ### `NodeTimerRef` Node Timers: a high resolution persistent per-node timer. @@ -2758,7 +3107,7 @@ Can be gotten via `minetest.get_node_timer(pos)`. * set a timer's state * `timeout` is in seconds, and supports fractional values (0.1 etc) * `elapsed` is in seconds, and supports fractional values (0.1 etc) - * will trigger the node's `on_timer` function after `timeout`-elapsed seconds + * will trigger the node's `on_timer` function after `(timeout - elapsed)` seconds * `start(timeout)` * start a timer * equivalent to `set(timeout,0)` @@ -2767,7 +3116,7 @@ Can be gotten via `minetest.get_node_timer(pos)`. * `get_timeout()`: returns current timeout in seconds * if `timeout` equals `0`, timer is inactive * `get_elapsed()`: returns current elapsed time in seconds - * the node's `on_timer` function will be called after `timeout`-elapsed seconds + * the node's `on_timer` function will be called after `(timeout - elapsed)` seconds * `is_started()`: returns boolean state of timer * returns `true` if timer is started, otherwise `false` @@ -2778,10 +3127,10 @@ This is basically a reference to a C++ `ServerActiveObject` #### Methods * `remove()`: remove object (after returning from Lua) - * Note: Doesn't work on players, use minetest.kick_player instead -* `getpos()`: returns `{x=num, y=num, z=num}` -* `setpos(pos)`; `pos`=`{x=num, y=num, z=num}` -* `moveto(pos, continuous=false)`: interpolated move + * Note: Doesn't work on players, use `minetest.kick_player` instead +* `get_pos()`: returns `{x=num, y=num, z=num}` +* `set_pos(pos)`; `pos`=`{x=num, y=num, z=num}` +* `move_to(pos, continuous=false)`: interpolated move * `punch(puncher, time_from_last_punch, tool_capabilities, direction)` * `puncher` = another `ObjectRef`, * `time_from_last_punch` = time since last punch action of the puncher @@ -2797,7 +3146,7 @@ This is basically a reference to a C++ `ServerActiveObject` * `set_armor_groups({group1=rating, group2=rating, ...})` * `get_armor_groups()`: returns a table with the armor group ratings * `set_animation({x=1,y=1}, frame_speed=15, frame_blend=0, frame_loop=true)` -* `get_animation()`: returns range, frame_speed, frame_blend and frame_loop +* `get_animation()`: returns `range`, `frame_speed`, `frame_blend` and `frame_loop` * `set_attach(parent, bone, position, rotation)` * `bone`: string * `position`: `{x=num, y=num, z=num}` (relative) @@ -2827,14 +3176,15 @@ This is basically a reference to a C++ `ServerActiveObject` } ##### LuaEntitySAO-only (no-op for other objects) -* `setvelocity({x=num, y=num, z=num})` -* `getvelocity()`: returns `{x=num, y=num, z=num}` -* `setacceleration({x=num, y=num, z=num})` -* `getacceleration()`: returns `{x=num, y=num, z=num}` -* `setyaw(radians)` -* `getyaw()`: returns number in radians -* `settexturemod(mod)` -* `setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2, +* `set_velocity({x=num, y=num, z=num})` +* `get_velocity()`: returns `{x=num, y=num, z=num}` +* `set_acceleration({x=num, y=num, z=num})` +* `get_acceleration()`: returns `{x=num, y=num, z=num}` +* `set_yaw(radians)` +* `get_yaw()`: returns number in radians +* `set_texture_mod(mod)` +* `get_texture_mod()` returns current texture modifier +* `set_sprite(p={x=0,y=0}, num_frames=1, framelength=0.2, select_horiz_by_yawpitch=false)` * Select sprite from spritesheet with optional animation and DM-style texture selection based on yaw relative to camera @@ -2854,21 +3204,28 @@ This is basically a reference to a C++ `ServerActiveObject` * radians - Angle from looking forward, where positive is downwards. * `set_look_horizontal(radians)`: sets look yaw * radians - Angle from the +z direction, where positive is counter-clockwise. -* `get_look_pitch()`: pitch in radians - Deprecated as broken. Use get_look_vertical. +* `get_look_pitch()`: pitch in radians - Deprecated as broken. Use `get_look_vertical`. * Angle ranges between -pi/2 and pi/2, which are straight down and up respectively. -* `get_look_yaw()`: yaw in radians - Deprecated as broken. Use get_look_horizontal. +* `get_look_yaw()`: yaw in radians - Deprecated as broken. Use `get_look_horizontal`. * Angle is counter-clockwise from the +x direction. -* `set_look_pitch(radians)`: sets look pitch - Deprecated. Use set_look_vertical. -* `set_look_yaw(radians)`: sets look yaw - Deprecated. Use set_look_horizontal. +* `set_look_pitch(radians)`: sets look pitch - Deprecated. Use `set_look_vertical`. +* `set_look_yaw(radians)`: sets look yaw - Deprecated. Use `set_look_horizontal`. * `get_breath()`: returns players breath * `set_breath(value)`: sets players breath * values: * `0`: player is drowning, * `1`-`10`: remaining number of bubbles * `11`: bubbles bar is not shown +* `set_attribute(attribute, value)`: + * Sets an extra attribute with value on player. + * `value` must be a string. + * If `value` is `nil`, remove attribute from player. +* `get_attribute(attribute)`: + * Returns value (a string) for extra attribute. + * Returns `nil` if no attribute found. * `set_inventory_formspec(formspec)` * Redefine player's inventory form - * Should usually be called in on_joinplayer + * Should usually be called in `on_joinplayer` * `get_inventory_formspec()`: returns a formspec string * `get_player_control()`: returns table with player pressed keys * `{jump=bool,right=bool,left=bool,LMB=bool,RMB=bool,sneak=bool,aux1=bool,down=bool,up=bool}` @@ -2880,8 +3237,12 @@ This is basically a reference to a C++ `ServerActiveObject` * `jump`: multiplier to default jump value (default: `1`) * `gravity`: multiplier to default gravity value (default: `1`) * `sneak`: whether player can sneak (default: `true`) - * `sneak_glitch`: whether player can use the sneak glitch (default: `true`) -* `get_physics_override()`: returns the table given to set_physics_override + * `sneak_glitch`: whether player can use the new move code replications + of the old sneak side-effects: sneak ladders and 2 node sneak jump + (default: `false`) + * `new_move`: use new move/sneak code. When `false` the exact old code + is used for the specific old sneak behaviour (default: `true`) +* `get_physics_override()`: returns the table given to `set_physics_override` * `hud_add(hud definition)`: add a HUD element described by HUD def, returns ID number on success * `hud_remove(id)`: remove the HUD element of the specified id @@ -2905,13 +3266,24 @@ This is basically a reference to a C++ `ServerActiveObject` * `hud_set_hotbar_selected_image(texturename)` * sets image for selected item of hotbar * `hud_get_hotbar_selected_image`: returns texturename -* `set_sky(bgcolor, type, {texture names})` +* `set_sky(bgcolor, type, {texture names}, clouds)` * `bgcolor`: ColorSpec, defaults to white - * Available types: + * `type`: Available types: * `"regular"`: Uses 0 textures, `bgcolor` ignored * `"skybox"`: Uses 6 textures, `bgcolor` used * `"plain"`: Uses 0 textures, `bgcolor` used -* `get_sky()`: returns bgcolor, type and a table with the textures + * `clouds`: Boolean for whether clouds appear in front of `"skybox"` or + `"plain"` custom skyboxes (default: `true`) +* `get_sky()`: returns bgcolor, type, table of textures, clouds +* `set_clouds(parameters)`: set cloud parameters + * `parameters` is a table with the following optional fields: + * `density`: from `0` (no clouds) to `1` (full clouds) (default `0.4`) + * `color`: basic cloud color, with alpha channel (default `#fff0f0e5`) + * `ambient`: cloud color lower bound, use for a "glow at night" effect (default `#000000`) + * `height`: cloud height, i.e. y of cloud base (default per conf, usually `120`) + * `thickness`: cloud thickness in nodes (default `16`) + * `speed`: 2D cloud speed + direction in nodes per second (default `{x=0, y=-2}`) +* `get_clouds()`: returns a table with the current cloud parameters as in `set_clouds` * `override_day_night_ratio(ratio or nil)` * `0`...`1`: Overrides day-night ratio, controlling sunlight to a specific amount * `nil`: Disables override, defaulting to sunlight based on day-night cycle @@ -2925,11 +3297,11 @@ This is basically a reference to a C++ `ServerActiveObject` {x=189, y=198}, -- < dig animation key frames {x=200, y=219}, -- < walk+dig animation key frames frame_speed=30): -- < animation frame speed -* `get_local_animation()`: returns stand, walk, dig, dig+walk tables and frame_speed +* `get_local_animation()`: returns stand, walk, dig, dig+walk tables and `frame_speed` * `set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})`: defines offset value for camera per player * in first person view * in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`) -* `get_eye_offset()`: returns offset_first and offset_third +* `get_eye_offset()`: returns `offset_first` and `offset_third` ### `InvRef` An `InvRef` is a reference to an inventory. @@ -3015,8 +3387,9 @@ an itemstring, a table or `nil`. * `set_count(count)`: Returns boolean whether item was cleared * `get_wear()`: Returns tool wear (`0`-`65535`), `0` for non-tools. * `set_wear(wear)`: Returns boolean whether item was cleared -* `get_metadata()`: Returns metadata (a string attached to an item stack). -* `set_metadata(metadata)`: Returns true. +* `get_meta()`: Returns ItemStackMetaRef. See section for more details +* `get_metadata()`: (DEPRECATED) Returns metadata (a string attached to an item stack). +* `set_metadata(metadata)`: (DEPRECATED) Returns true. * `clear()`: removes all items from the stack, making it empty. * `replace(item)`: replace the contents of this stack. * `item` can also be an itemstring or table. @@ -3061,9 +3434,9 @@ It can be created via `PcgRandom(seed)` or `PcgRandom(seed, sequence)`. * `next(min, max)`: return next integer random number [`min`...`max`] * `rand_normal_dist(min, max, num_trials=6)`: return normally distributed random number [`min`...`max`] * This is only a rough approximation of a normal distribution with: - * mean = (max - min) / 2, and - * variance = (((max - min + 1) ^ 2) - 1) / (12 * num_trials) - * Increasing num_trials improves accuracy of the approximation + * `mean = (max - min) / 2`, and + * `variance = (((max - min + 1) ^ 2) - 1) / (12 * num_trials)` + * Increasing `num_trials` improves accuracy of the approximation ### `SecureRandom` Interface for the operating system's crypto-secure PRNG. @@ -3131,11 +3504,11 @@ destruction callbacks run, and no rollback information is logged. It is important to note that VoxelManip is designed for speed, and *not* ease of use or flexibility. If your mod requires a map manipulation facility that will handle 100% of all edge cases, or the use -of high level node placement features, perhaps minetest.set_node() is better suited for the job. +of high level node placement features, perhaps `minetest.set_node()` is better suited for the job. In addition, VoxelManip might not be faster, or could even be slower, for your specific use case. VoxelManip is most effective when setting very large areas of map at once - for example, if only -setting a 5x5x5 node area, a minetest.set_node() loop may be more optimal. Always profile code +setting a 5x5x5 node area, a `minetest.set_node()` loop may be more optimal. Always profile code using both methods of map manipulation to determine which is most appropriate for your usage. #### Using VoxelManip @@ -3171,17 +3544,14 @@ otherwise explicitly stated. Once the bulk data has been edited to your liking, the internal VoxelManip state can be set using: `VoxelManip:set_data()` for node content (in Content ID form, see section 'Content IDs'), `VoxelManip:set_light_data()` for node light levels, and -`VoxelManip:set_param2_data()` for the node type-dependent "param2" values. +`VoxelManip:set_param2_data()` for the node type-dependent `param2` values. The parameter to each of the above three functions can use any table at all in the same flat array -format as produced by get_data() et al. and is *not required* to be a table retrieved from get_data(). +format as produced by `get_data()` et al. and is *not required* to be a table retrieved from `get_data()`. Once the internal VoxelManip state has been modified to your liking, the changes can be committed back to the map by calling `VoxelManip:write_to_map()`. -Finally, a call to `VoxelManip:update_map()` is required to re-calculate lighting and set the blocks -as being modified so that connected clients are sent the updated parts of map. - ##### Flat array format Let @@ -3193,6 +3563,7 @@ Then, for a loaded region of p1..p2, this array ranges from `1` up to and includ the expression `Nx * Ny * Nz`. Positions offset from p1 are present in the array with the format of: + ``` [ (0, 0, 0), (1, 0, 0), (2, 0, 0), ... (Nx, 0, 0), @@ -3224,11 +3595,10 @@ After registration of a node, its Content ID will remain the same throughout exe Note that the node being queried needs to have already been been registered. The following builtin node types have their Content IDs defined as constants: -``` -core.CONTENT_UNKNOWN (ID for "unknown" nodes) -core.CONTENT_AIR (ID for "air" nodes) -core.CONTENT_IGNORE (ID for "ignore" nodes) -``` + +* `minetest.CONTENT_UNKNOWN`: ID for "unknown" nodes +* `minetest.CONTENT_AIR`: ID for "air" nodes +* `minetest.CONTENT_IGNORE`: ID for "ignore" nodes ##### Mapgen VoxelManip objects Inside of `on_generated()` callbacks, it is possible to retrieve the same VoxelManip object used by the @@ -3246,8 +3616,6 @@ but with a few differences: will also update the Mapgen VoxelManip object's internal state active on the current thread. * After modifying the Mapgen VoxelManip object's internal buffer, it may be necessary to update lighting information using either: `VoxelManip:calc_lighting()` or `VoxelManip:set_lighting()`. -* `VoxelManip:update_map()` does not need to be called after `write_to_map()`. The map update is performed - automatically after all on_generated callbacks have been run for that generated block. ##### Other API functions operating on a VoxelManip If any VoxelManip contents were set to a liquid node, `VoxelManip:update_liquids()` must be called @@ -3281,8 +3649,14 @@ will place the schematic inside of the VoxelManip. * `read_from_map(p1, p2)`: Loads a chunk of map into the VoxelManip object containing the region formed by `p1` and `p2`. * returns actual emerged `pmin`, actual emerged `pmax` -* `write_to_map()`: Writes the data loaded from the `VoxelManip` back to the map. +* `write_to_map([light])`: Writes the data loaded from the `VoxelManip` back to the map. * **important**: data must be set using `VoxelManip:set_data()` before calling this + * if `light` is true, then lighting is automatically recalculated. + The default value is true. + If `light` is false, no light calculations happen, and you should correct + all modified blocks with `minetest.fix_light()` as soon as possible. + Keep in mind that modifying the map where light is incorrect can cause + more lighting bugs. * `get_node_at(pos)`: Returns a `MapNode` table of the node currently loaded in the `VoxelManip` at that position * `set_node_at(pos, node)`: Sets a specific `MapNode` in the `VoxelManip` at that position @@ -3290,9 +3664,7 @@ will place the schematic inside of the VoxelManip. * returns raw node data in the form of an array of node content IDs * if the param `buffer` is present, this table will be used to store the result instead * `set_data(data)`: Sets the data contents of the `VoxelManip` object -* `update_map()`: Update map after writing chunk back to map. - * To be used only by `VoxelManip` objects created by the mod itself; - not a `VoxelManip` that was retrieved from `minetest.get_mapgen_object` +* `update_map()`: Does nothing, kept for compatibility. * `set_lighting(light, [p1, p2])`: Set the lighting within the `VoxelManip` to a uniform value * `light` is a table, `{day=<0...15>, night=<0...15>}` * To be used only by a `VoxelManip` object from `minetest.get_mapgen_object` @@ -3351,10 +3723,15 @@ It can be created via `Settings(filename)`. * `get(key)`: returns a value * `get_bool(key)`: returns a boolean * `set(key, value)` + * Setting names can't contain whitespace or any of `="{}#`. + * Setting values can't contain the sequence `\n"""`. + * Setting names starting with "secure." can't be set on the main settings object (`minetest.settings`). +* `set_bool(key, value)` + * See documentation for set() above. * `remove(key)`: returns a boolean (`true` for success) * `get_names()`: returns `{key1,...}` * `write()`: returns a boolean (`true` for success) - * write changes to file + * Writes changes to file. * `to_table()`: returns `{[key1]=value1,...}` Mapgen objects @@ -3516,24 +3893,26 @@ Definition tables { hp_max = 1, physical = true, - collide_with_objects = true, -- collide with other objects if physical=true + collide_with_objects = true, -- collide with other objects if physical = true weight = 5, - collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, - visual = "cube"/"sprite"/"upright_sprite"/"mesh"/"wielditem", - visual_size = {x=1, y=1}, + collisionbox = {-0.5, 0.0, -0.5, 0.5, 1.0, 0.5}, + visual = "cube" / "sprite" / "upright_sprite" / "mesh" / "wielditem", + visual_size = {x = 1, y = 1}, mesh = "model", textures = {}, -- number of required textures depends on visual colors = {}, -- number of required colors depends on visual - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, + spritediv = {x = 1, y = 1}, + initial_sprite_basepos = {x = 0, y = 0}, is_visible = true, makes_footstep_sound = false, automatic_rotate = false, stepheight = 0, automatic_face_movement_dir = 0.0, - -- ^ automatically set yaw to movement direction; offset in degrees; false to disable + -- ^ Automatically set yaw to movement direction, offset in degrees, + -- 'false' to disable. automatic_face_movement_max_rotation_per_sec = -1, - -- ^ limit automatic rotation to this value in degrees per second. values < 0 no limit + -- ^ Limit automatic rotation to this value in degrees per second, + -- value < 0 no limit. backface_culling = true, -- false to disable backface_culling for model nametag = "", -- by default empty, for players their name is shown if empty nametag_color = <color>, -- sets color of nametag as ColorSpec @@ -3609,6 +3988,19 @@ Definition tables {hard = 1, metal = 1, spikes = 1} inventory_image = "default_tool_steelaxe.png", wield_image = "", + palette = "", + --[[ + ^ An image file containing the palette of a node. + ^ You can set the currently used color as the + ^ "palette_index" field of the item stack metadata. + ^ The palette is always stretched to fit indices + ^ between 0 and 255, to ensure compatibility with + ^ "colorfacedir" and "colorwallmounted" nodes. + ]] + color = "0xFFFFFFFF", + --[[ + ^ The color of the item. The palette overrides this. + ]] wield_scale = {x = 1, y = 1, z = 1}, stack_max = 99, range = 4.0, @@ -3692,11 +4084,33 @@ Definition tables when displacement mapping is used Directions are from the point of view of the tile texture, not the node it's on +* `{name="image.png", color=ColorSpec}` + * the texture's color will be multiplied with this color. + * the tile's color overrides the owning node's color in all cases. * deprecated, yet still supported field names: * `image` (name) ### Tile animation definition -* `{type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}` + + { + type = "vertical_frames", + aspect_w = 16, + -- ^ specify width of a frame in pixels + aspect_h = 16, + -- ^ specify height of a frame in pixels + length = 3.0, + -- ^ specify full loop length + } + + { + type = "sheet_2d", + frames_w = 5, + -- ^ specify width in number of frames + frames_h = 3, + -- ^ specify height in number of frames + frame_length = 0.5, + -- ^ specify length of a single frame + } ### Node definition (`register_node`) @@ -3705,18 +4119,34 @@ Definition tables drawtype = "normal", -- See "Node drawtypes" visual_scale = 1.0, --[[ - ^ Supported for drawtypes "plantlike", "signlike", "torchlike", "mesh". - ^ For plantlike, the image will start at the bottom of the node; for the - ^ other drawtypes, the image will be centered on the node. + ^ Supported for drawtypes "plantlike", "signlike", "torchlike", + ^ "firelike", "mesh". + ^ For plantlike and firelike, the image will start at the bottom of the + ^ node, for the other drawtypes the image will be centered on the node. ^ Note that positioning for "torchlike" may still change. ]] tiles = {tile definition 1, def2, def3, def4, def5, def6}, --[[ ^ Textures of node; +Y, -Y, +X, -X, +Z, -Z (old field name: tile_images) ^ List can be shortened to needed length ]] + overlay_tiles = {tile definition 1, def2, def3, def4, def5, def6}, --[[ + ^ Same as `tiles`, but these textures are drawn on top of the + ^ base tiles. You can use this to colorize only specific parts of + ^ your texture. If the texture name is an empty string, that + ^ overlay is not drawn. Since such tiles are drawn twice, it + ^ is not recommended to use overlays on very common nodes. special_tiles = {tile definition 1, Tile definition 2}, --[[ ^ Special textures of node; used rarely (old field name: special_materials) ^ List can be shortened to needed length ]] - alpha = 255, + color = ColorSpec, --[[ + ^ The node's original color will be multiplied with this color. + ^ If the node has a palette, then this setting only has an effect + ^ in the inventory and on the wield item. ]] use_texture_alpha = false, -- Use texture's alpha channel + palette = "palette.png", --[[ + ^ The node's `param2` is used to select a pixel from the image + ^ (pixels are arranged from left to right and from top to bottom). + ^ The node's color will be multiplied with the selected pixel's + ^ color. Tiles can override this behavior. + ^ Only when `paramtype2` supports palettes. ]] post_effect_color = "green#0F", -- If player is inside node, see "ColorSpec" paramtype = "none", -- See "Nodes" --[[ ^ paramtype = "light" allows light to propagate from or through the node with light value @@ -3730,7 +4160,9 @@ Definition tables diggable = true, -- If false, can never be dug climbable = false, -- If true, can be climbed on (ladder) buildable_to = false, -- If true, placed nodes can replace this node - floodable = false, -- If true, liquids flow into and replace this node + floodable = false, --[[ + ^ If true, liquids flow into and replace this node. + ^ Warning: making a liquid node 'floodable' does not work and may cause problems. ]] liquidtype = "none", -- "none"/"source"/"flowing" liquid_alternative_flowing = "", -- Flowing version of source liquid liquid_alternative_source = "", -- Source version of flowing liquid @@ -3759,6 +4191,12 @@ Definition tables ^ If drawtype "nodebox" is used and selection_box is nil, then node_box is used. ]] legacy_facedir_simple = false, -- Support maps made in and before January 2012 legacy_wallmounted = false, -- Support maps made in and before January 2012 + waving = 0, --[[ valid for mesh, nodebox, plantlike, allfaces_optional nodes + ^ 1 - wave node like plants (top of node moves, bottom is fixed) + ^ 2 - wave node like leaves (whole node moves side-to-side synchronously) + ^ caveats: not all models will properly wave + ^ plantlike drawtype nodes can only wave like plants + ^ allfaces_optional drawtype nodes can only wave like leaves --]] sounds = { footstep = <SimpleSoundSpec>, dig = <SimpleSoundSpec>, -- "__group" = group-based sound (default) @@ -3791,6 +4229,14 @@ Definition tables ^ Node destructor; called after removing node ^ Not called for bulk node placement (i.e. schematics and VoxelManip) ^ default: nil ]] + on_flood = func(pos, oldnode, newnode), --[[ + ^ Called when a liquid (newnode) is about to flood oldnode, if + ^ it has `floodable = true` in the nodedef. Not called for bulk + ^ node placement (i.e. schematics and VoxelManip) or air nodes. If + ^ return true the node is not flooded, but on_flood callback will + ^ most likely be called over and over again every liquid update + ^ interval. Default: nil. + ^ Warning: making a liquid node 'floodable' does not work and may cause problems. ]] after_place_node = func(pos, placer, itemstack, pointed_thing) --[[ ^ Called after constructing node when node was placed using @@ -4151,10 +4597,15 @@ The Biome API is still in an experimental phase and subject to change. -- ^ vertical: if true faces player using y axis only texture = "image.png", -- ^ Uses texture (string) - playername = "singleplayer" + playername = "singleplayer", -- ^ optional, if specified spawns particle only on the player's client + animation = {Tile Animation definition}, + -- ^ optional, specifies how to animate the particle texture + glow = 0 + -- ^ optional, specify particle self-luminescence in darkness } + ### `ParticleSpawner` definition (`add_particlespawner`) { diff --git a/doc/menu_lua_api.txt b/doc/menu_lua_api.txt index 423b8bb9c..074bc962d 100644 --- a/doc/menu_lua_api.txt +++ b/doc/menu_lua_api.txt @@ -1,4 +1,4 @@ -Minetest Lua Mainmenu API Reference 0.4.15 +Minetest Lua Mainmenu API Reference 0.4.16 ======================================== Introduction diff --git a/doc/texture_packs.txt b/doc/texture_packs.txt index 5c535a9f1..1813c29e4 100644 --- a/doc/texture_packs.txt +++ b/doc/texture_packs.txt @@ -76,6 +76,9 @@ by texture packs. All existing fallback textures can be found in the directory * `player.png`: front texture of the 2D upright sprite player * `player_back.png`: back texture of the 2D upright sprite player +* `progress_bar.png`: foreground texture of the loading screen's progress bar +* `progress_bar_bg.png`: background texture of the loading screen's progress bar + * `moon.png`: texture of the moon. Default texture is generated by Minetest * `moon_tonemap.png`: tonemap to be used when `moon.png` was found * `sun.png`: texture of the sun. Default texture is generated by Minetest diff --git a/doc/world_format.txt b/doc/world_format.txt index a4fb3d8f2..976d14fd5 100644 --- a/doc/world_format.txt +++ b/doc/world_format.txt @@ -1,12 +1,13 @@ ============================= -Minetest World Format 22...25 +Minetest World Format 22...27 ============================= This applies to a world format carrying the block serialization version -22...25, used at least in +22...27, used at least in - 0.4.dev-20120322 ... 0.4.dev-20120606 (22...23) - 0.4.0 (23) - 24 was never released as stable and existed for ~2 days +- 27 was added in 0.4.15-dev The block serialization version does not fully specify every aspect of this format; if compliance with this format is to be checked, it needs to be @@ -262,15 +263,36 @@ u8 flags - 0x02: day_night_differs: Whether the lighting of the block is different on day and night. Only blocks that have this bit set are updated when day transforms to night. - - 0x04: lighting_expired: If true, lighting is invalid and should be - updated. If you can't calculate lighting in your generator properly, - you could try setting this 1 to everything and setting the uppermost - block in every sector as is_underground=0. I am quite sure it doesn't - work properly, though. + - 0x04: lighting_expired: Not used in version 27 and above. If true, + lighting is invalid and should be updated. If you can't calculate + lighting in your generator properly, you could try setting this 1 to + everything and setting the uppermost block in every sector as + is_underground=0. I am quite sure it doesn't work properly, though. - 0x08: generated: True if the block has been generated. If false, block is mostly filled with CONTENT_IGNORE and is likely to contain eg. parts of trees of neighboring blocks. +u16 lighting_complete +- Added in version 27. +- This contains 12 flags, each of them corresponds to a direction. +- Indicates if the light is correct at the sides of a map block. + Lighting may not be correct if the light changed, but a neighbor + block was not loaded at that time. + If these flags are false, Minetest will automatically recompute light + when both this block and its required neighbor are loaded. +- The bit order is: + nothing, nothing, nothing, nothing, + night X-, night Y-, night Z-, night Z+, night Y+, night X+, + day X-, day Y-, day Z-, day Z+, day Y+, day X+. + Where 'day' is for the day light bank, 'night' is for the night + light bank. + The 'nothing' bits should be always set, as they will be used + to indicate if direct sunlight spreading is finished. +- Example: if the block at (0, 0, 0) has + lighting_complete = 0b1111111111111110, + then Minetest will correct lighting in the day light bank when + the block at (1, 0, 0) is also loaded. + u8 content_width - Number of bytes in the content (param0) fields of nodes if map format version <= 23: diff --git a/fonts/Arimo-LICENSE.txt b/fonts/Arimo-LICENSE.txt new file mode 100644 index 000000000..d68578f6a --- /dev/null +++ b/fonts/Arimo-LICENSE.txt @@ -0,0 +1,2 @@ +Arimo - Apache License, version 2.0 +Arimo-Regular.ttf: Digitized data copyright (c) 2010-2012 Google Corporation. diff --git a/fonts/Arimo-Regular.ttf b/fonts/Arimo-Regular.ttf Binary files differnew file mode 100644 index 000000000..9be443c7d --- /dev/null +++ b/fonts/Arimo-Regular.ttf diff --git a/fonts/Cousine-LICENSE.txt b/fonts/Cousine-LICENSE.txt new file mode 100644 index 000000000..c84465f01 --- /dev/null +++ b/fonts/Cousine-LICENSE.txt @@ -0,0 +1,2 @@ +Cousine - Apache License, version 2.0 +Cousine-Regular.ttf: Digitized data copyright (c) 2010-2012 Google Corporation. diff --git a/fonts/Cousine-Regular.ttf b/fonts/Cousine-Regular.ttf Binary files differnew file mode 100644 index 000000000..4d6990a25 --- /dev/null +++ b/fonts/Cousine-Regular.ttf diff --git a/fonts/DroidSansFallbackFull-LICENSE.txt b/fonts/DroidSansFallbackFull-LICENSE.txt new file mode 100644 index 000000000..d3a2eaa8c --- /dev/null +++ b/fonts/DroidSansFallbackFull-LICENSE.txt @@ -0,0 +1,13 @@ +Copyright (C) 2008 The Android Open Source Project + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/fonts/liberationmono.ttf b/fonts/liberationmono.ttf Binary files differdeleted file mode 100644 index 7260bd65e..000000000 --- a/fonts/liberationmono.ttf +++ /dev/null diff --git a/fonts/liberationsans.ttf b/fonts/liberationsans.ttf Binary files differdeleted file mode 100644 index 59d2e251b..000000000 --- a/fonts/liberationsans.ttf +++ /dev/null diff --git a/fonts/lucida_sans_10.xml b/fonts/lucida_sans_10.xml Binary files differdeleted file mode 100755 index d54e9f6a6..000000000 --- a/fonts/lucida_sans_10.xml +++ /dev/null diff --git a/fonts/lucida_sans_100.png b/fonts/lucida_sans_100.png Binary files differdeleted file mode 100755 index 9f3dc25c8..000000000 --- a/fonts/lucida_sans_100.png +++ /dev/null diff --git a/fonts/lucida_sans_11.xml b/fonts/lucida_sans_11.xml Binary files differdeleted file mode 100755 index 33d06c376..000000000 --- a/fonts/lucida_sans_11.xml +++ /dev/null diff --git a/fonts/lucida_sans_110.png b/fonts/lucida_sans_110.png Binary files differdeleted file mode 100755 index 1c98efcca..000000000 --- a/fonts/lucida_sans_110.png +++ /dev/null diff --git a/fonts/lucida_sans_12.xml b/fonts/lucida_sans_12.xml Binary files differdeleted file mode 100755 index 382981dcf..000000000 --- a/fonts/lucida_sans_12.xml +++ /dev/null diff --git a/fonts/lucida_sans_120.png b/fonts/lucida_sans_120.png Binary files differdeleted file mode 100755 index c106feb27..000000000 --- a/fonts/lucida_sans_120.png +++ /dev/null diff --git a/fonts/lucida_sans_14.xml b/fonts/lucida_sans_14.xml Binary files differdeleted file mode 100755 index 99398d792..000000000 --- a/fonts/lucida_sans_14.xml +++ /dev/null diff --git a/fonts/lucida_sans_140.png b/fonts/lucida_sans_140.png Binary files differdeleted file mode 100755 index d314dc5b3..000000000 --- a/fonts/lucida_sans_140.png +++ /dev/null diff --git a/fonts/lucida_sans_16.xml b/fonts/lucida_sans_16.xml Binary files differdeleted file mode 100755 index b07c1119f..000000000 --- a/fonts/lucida_sans_16.xml +++ /dev/null diff --git a/fonts/lucida_sans_160.png b/fonts/lucida_sans_160.png Binary files differdeleted file mode 100755 index 233ee9d42..000000000 --- a/fonts/lucida_sans_160.png +++ /dev/null diff --git a/fonts/lucida_sans_18.xml b/fonts/lucida_sans_18.xml Binary files differdeleted file mode 100755 index 881aff18d..000000000 --- a/fonts/lucida_sans_18.xml +++ /dev/null diff --git a/fonts/lucida_sans_180.png b/fonts/lucida_sans_180.png Binary files differdeleted file mode 100755 index 68cbe3bc8..000000000 --- a/fonts/lucida_sans_180.png +++ /dev/null diff --git a/fonts/lucida_sans_20.xml b/fonts/lucida_sans_20.xml Binary files differdeleted file mode 100755 index 329c226c0..000000000 --- a/fonts/lucida_sans_20.xml +++ /dev/null diff --git a/fonts/lucida_sans_200.png b/fonts/lucida_sans_200.png Binary files differdeleted file mode 100755 index 7b57632b8..000000000 --- a/fonts/lucida_sans_200.png +++ /dev/null diff --git a/fonts/lucida_sans_22.xml b/fonts/lucida_sans_22.xml Binary files differdeleted file mode 100755 index 14d0cc2b9..000000000 --- a/fonts/lucida_sans_22.xml +++ /dev/null diff --git a/fonts/lucida_sans_220.png b/fonts/lucida_sans_220.png Binary files differdeleted file mode 100755 index 4f385f4d4..000000000 --- a/fonts/lucida_sans_220.png +++ /dev/null diff --git a/fonts/lucida_sans_24.xml b/fonts/lucida_sans_24.xml Binary files differdeleted file mode 100755 index 5956f46e6..000000000 --- a/fonts/lucida_sans_24.xml +++ /dev/null diff --git a/fonts/lucida_sans_240.png b/fonts/lucida_sans_240.png Binary files differdeleted file mode 100755 index 8fc4e9d6b..000000000 --- a/fonts/lucida_sans_240.png +++ /dev/null diff --git a/fonts/lucida_sans_26.xml b/fonts/lucida_sans_26.xml Binary files differdeleted file mode 100755 index ae10ff8d7..000000000 --- a/fonts/lucida_sans_26.xml +++ /dev/null diff --git a/fonts/lucida_sans_260.png b/fonts/lucida_sans_260.png Binary files differdeleted file mode 100755 index 9bae8de5b..000000000 --- a/fonts/lucida_sans_260.png +++ /dev/null diff --git a/fonts/lucida_sans_28.xml b/fonts/lucida_sans_28.xml Binary files differdeleted file mode 100755 index c1b3361d3..000000000 --- a/fonts/lucida_sans_28.xml +++ /dev/null diff --git a/fonts/lucida_sans_280.png b/fonts/lucida_sans_280.png Binary files differdeleted file mode 100755 index 527fa3734..000000000 --- a/fonts/lucida_sans_280.png +++ /dev/null diff --git a/fonts/lucida_sans_36.xml b/fonts/lucida_sans_36.xml Binary files differdeleted file mode 100755 index ca300d6de..000000000 --- a/fonts/lucida_sans_36.xml +++ /dev/null diff --git a/fonts/lucida_sans_360.png b/fonts/lucida_sans_360.png Binary files differdeleted file mode 100755 index eecf35e33..000000000 --- a/fonts/lucida_sans_360.png +++ /dev/null diff --git a/fonts/lucida_sans_4.xml b/fonts/lucida_sans_4.xml Binary files differdeleted file mode 100755 index edc5af951..000000000 --- a/fonts/lucida_sans_4.xml +++ /dev/null diff --git a/fonts/lucida_sans_40.png b/fonts/lucida_sans_40.png Binary files differdeleted file mode 100755 index 5c10c1ed3..000000000 --- a/fonts/lucida_sans_40.png +++ /dev/null diff --git a/fonts/lucida_sans_48.xml b/fonts/lucida_sans_48.xml Binary files differdeleted file mode 100755 index c8c75974d..000000000 --- a/fonts/lucida_sans_48.xml +++ /dev/null diff --git a/fonts/lucida_sans_480.png b/fonts/lucida_sans_480.png Binary files differdeleted file mode 100755 index 928a0d723..000000000 --- a/fonts/lucida_sans_480.png +++ /dev/null diff --git a/fonts/lucida_sans_56.xml b/fonts/lucida_sans_56.xml Binary files differdeleted file mode 100755 index 9f2cc831e..000000000 --- a/fonts/lucida_sans_56.xml +++ /dev/null diff --git a/fonts/lucida_sans_560.png b/fonts/lucida_sans_560.png Binary files differdeleted file mode 100755 index 7afb09912..000000000 --- a/fonts/lucida_sans_560.png +++ /dev/null diff --git a/fonts/lucida_sans_6.xml b/fonts/lucida_sans_6.xml Binary files differdeleted file mode 100755 index 069c9aa80..000000000 --- a/fonts/lucida_sans_6.xml +++ /dev/null diff --git a/fonts/lucida_sans_60.png b/fonts/lucida_sans_60.png Binary files differdeleted file mode 100755 index 0efcd9e32..000000000 --- a/fonts/lucida_sans_60.png +++ /dev/null diff --git a/fonts/lucida_sans_8.xml b/fonts/lucida_sans_8.xml Binary files differdeleted file mode 100755 index 44f0e6a74..000000000 --- a/fonts/lucida_sans_8.xml +++ /dev/null diff --git a/fonts/lucida_sans_80.png b/fonts/lucida_sans_80.png Binary files differdeleted file mode 100755 index 287c65663..000000000 --- a/fonts/lucida_sans_80.png +++ /dev/null diff --git a/fonts/lucida_sans_9.xml b/fonts/lucida_sans_9.xml Binary files differdeleted file mode 100755 index 99aa6447c..000000000 --- a/fonts/lucida_sans_9.xml +++ /dev/null diff --git a/fonts/lucida_sans_90.png b/fonts/lucida_sans_90.png Binary files differdeleted file mode 100755 index 822a465f2..000000000 --- a/fonts/lucida_sans_90.png +++ /dev/null diff --git a/fonts/mono_dejavu_sans_10.xml b/fonts/mono_dejavu_sans_10.xml Binary files differindex 0276cedb6..0276cedb6 100755..100644 --- a/fonts/mono_dejavu_sans_10.xml +++ b/fonts/mono_dejavu_sans_10.xml diff --git a/fonts/mono_dejavu_sans_100.png b/fonts/mono_dejavu_sans_100.png Binary files differindex 45a312542..45a312542 100755..100644 --- a/fonts/mono_dejavu_sans_100.png +++ b/fonts/mono_dejavu_sans_100.png diff --git a/fonts/mono_dejavu_sans_11.xml b/fonts/mono_dejavu_sans_11.xml Binary files differindex f727ed2bb..f727ed2bb 100755..100644 --- a/fonts/mono_dejavu_sans_11.xml +++ b/fonts/mono_dejavu_sans_11.xml diff --git a/fonts/mono_dejavu_sans_110.png b/fonts/mono_dejavu_sans_110.png Binary files differindex c90c0e242..c90c0e242 100755..100644 --- a/fonts/mono_dejavu_sans_110.png +++ b/fonts/mono_dejavu_sans_110.png diff --git a/fonts/mono_dejavu_sans_12.xml b/fonts/mono_dejavu_sans_12.xml Binary files differindex 38f6427be..38f6427be 100755..100644 --- a/fonts/mono_dejavu_sans_12.xml +++ b/fonts/mono_dejavu_sans_12.xml diff --git a/fonts/mono_dejavu_sans_120.png b/fonts/mono_dejavu_sans_120.png Binary files differindex 0cebd70e8..0cebd70e8 100755..100644 --- a/fonts/mono_dejavu_sans_120.png +++ b/fonts/mono_dejavu_sans_120.png diff --git a/fonts/mono_dejavu_sans_14.xml b/fonts/mono_dejavu_sans_14.xml Binary files differindex b90a34960..b90a34960 100755..100644 --- a/fonts/mono_dejavu_sans_14.xml +++ b/fonts/mono_dejavu_sans_14.xml diff --git a/fonts/mono_dejavu_sans_140.png b/fonts/mono_dejavu_sans_140.png Binary files differindex a413759ea..a413759ea 100755..100644 --- a/fonts/mono_dejavu_sans_140.png +++ b/fonts/mono_dejavu_sans_140.png diff --git a/fonts/mono_dejavu_sans_16.xml b/fonts/mono_dejavu_sans_16.xml Binary files differindex 3f7d2c2a2..3f7d2c2a2 100755..100644 --- a/fonts/mono_dejavu_sans_16.xml +++ b/fonts/mono_dejavu_sans_16.xml diff --git a/fonts/mono_dejavu_sans_160.png b/fonts/mono_dejavu_sans_160.png Binary files differindex bd8a2f40a..bd8a2f40a 100755..100644 --- a/fonts/mono_dejavu_sans_160.png +++ b/fonts/mono_dejavu_sans_160.png diff --git a/fonts/mono_dejavu_sans_18.xml b/fonts/mono_dejavu_sans_18.xml Binary files differindex 92865cbfc..92865cbfc 100755..100644 --- a/fonts/mono_dejavu_sans_18.xml +++ b/fonts/mono_dejavu_sans_18.xml diff --git a/fonts/mono_dejavu_sans_180.png b/fonts/mono_dejavu_sans_180.png Binary files differindex a299afcbe..a299afcbe 100755..100644 --- a/fonts/mono_dejavu_sans_180.png +++ b/fonts/mono_dejavu_sans_180.png diff --git a/fonts/mono_dejavu_sans_20.xml b/fonts/mono_dejavu_sans_20.xml Binary files differindex acd8c77d0..acd8c77d0 100755..100644 --- a/fonts/mono_dejavu_sans_20.xml +++ b/fonts/mono_dejavu_sans_20.xml diff --git a/fonts/mono_dejavu_sans_200.png b/fonts/mono_dejavu_sans_200.png Binary files differindex 68ee62681..68ee62681 100755..100644 --- a/fonts/mono_dejavu_sans_200.png +++ b/fonts/mono_dejavu_sans_200.png diff --git a/fonts/mono_dejavu_sans_22.xml b/fonts/mono_dejavu_sans_22.xml Binary files differindex eafb4def6..eafb4def6 100755..100644 --- a/fonts/mono_dejavu_sans_22.xml +++ b/fonts/mono_dejavu_sans_22.xml diff --git a/fonts/mono_dejavu_sans_220.png b/fonts/mono_dejavu_sans_220.png Binary files differindex 042d7e094..042d7e094 100755..100644 --- a/fonts/mono_dejavu_sans_220.png +++ b/fonts/mono_dejavu_sans_220.png diff --git a/fonts/mono_dejavu_sans_24.xml b/fonts/mono_dejavu_sans_24.xml Binary files differindex fc8b6232e..fc8b6232e 100755..100644 --- a/fonts/mono_dejavu_sans_24.xml +++ b/fonts/mono_dejavu_sans_24.xml diff --git a/fonts/mono_dejavu_sans_240.png b/fonts/mono_dejavu_sans_240.png Binary files differindex d2d68c5bb..d2d68c5bb 100755..100644 --- a/fonts/mono_dejavu_sans_240.png +++ b/fonts/mono_dejavu_sans_240.png diff --git a/fonts/mono_dejavu_sans_26.xml b/fonts/mono_dejavu_sans_26.xml Binary files differindex 829f09948..829f09948 100755..100644 --- a/fonts/mono_dejavu_sans_26.xml +++ b/fonts/mono_dejavu_sans_26.xml diff --git a/fonts/mono_dejavu_sans_260.png b/fonts/mono_dejavu_sans_260.png Binary files differindex 3a8cb6c57..3a8cb6c57 100755..100644 --- a/fonts/mono_dejavu_sans_260.png +++ b/fonts/mono_dejavu_sans_260.png diff --git a/fonts/mono_dejavu_sans_28.xml b/fonts/mono_dejavu_sans_28.xml Binary files differindex b5b25bd07..b5b25bd07 100755..100644 --- a/fonts/mono_dejavu_sans_28.xml +++ b/fonts/mono_dejavu_sans_28.xml diff --git a/fonts/mono_dejavu_sans_280.png b/fonts/mono_dejavu_sans_280.png Binary files differindex ccf62ba48..ccf62ba48 100755..100644 --- a/fonts/mono_dejavu_sans_280.png +++ b/fonts/mono_dejavu_sans_280.png diff --git a/fonts/mono_dejavu_sans_4.xml b/fonts/mono_dejavu_sans_4.xml Binary files differindex cfebb39b3..cfebb39b3 100755..100644 --- a/fonts/mono_dejavu_sans_4.xml +++ b/fonts/mono_dejavu_sans_4.xml diff --git a/fonts/mono_dejavu_sans_40.png b/fonts/mono_dejavu_sans_40.png Binary files differindex 24ed693f7..24ed693f7 100755..100644 --- a/fonts/mono_dejavu_sans_40.png +++ b/fonts/mono_dejavu_sans_40.png diff --git a/fonts/mono_dejavu_sans_6.xml b/fonts/mono_dejavu_sans_6.xml Binary files differindex d0e1de21d..d0e1de21d 100755..100644 --- a/fonts/mono_dejavu_sans_6.xml +++ b/fonts/mono_dejavu_sans_6.xml diff --git a/fonts/mono_dejavu_sans_60.png b/fonts/mono_dejavu_sans_60.png Binary files differindex 326af996f..326af996f 100755..100644 --- a/fonts/mono_dejavu_sans_60.png +++ b/fonts/mono_dejavu_sans_60.png diff --git a/fonts/mono_dejavu_sans_8.xml b/fonts/mono_dejavu_sans_8.xml Binary files differindex c48bf7ccc..c48bf7ccc 100755..100644 --- a/fonts/mono_dejavu_sans_8.xml +++ b/fonts/mono_dejavu_sans_8.xml diff --git a/fonts/mono_dejavu_sans_80.png b/fonts/mono_dejavu_sans_80.png Binary files differindex 04326dbb2..04326dbb2 100755..100644 --- a/fonts/mono_dejavu_sans_80.png +++ b/fonts/mono_dejavu_sans_80.png diff --git a/fonts/mono_dejavu_sans_9.xml b/fonts/mono_dejavu_sans_9.xml Binary files differindex 74e841034..74e841034 100755..100644 --- a/fonts/mono_dejavu_sans_9.xml +++ b/fonts/mono_dejavu_sans_9.xml diff --git a/fonts/mono_dejavu_sans_90.png b/fonts/mono_dejavu_sans_90.png Binary files differindex 65ac51858..65ac51858 100755..100644 --- a/fonts/mono_dejavu_sans_90.png +++ b/fonts/mono_dejavu_sans_90.png diff --git a/games/minimal/mods/default/init.lua b/games/minimal/mods/default/init.lua index bff7860e3..fcdf93547 100644 --- a/games/minimal/mods/default/init.lua +++ b/games/minimal/mods/default/init.lua @@ -18,6 +18,8 @@ dofile(minetest.get_modpath("default").."/mapgen.lua") minetest.register_on_joinplayer(function(player) local cb = function(player) minetest.chat_send_player(player:get_player_name(), "This is the [minimal] \"Minimal Development Test\" game. Use [minetest_game] for the real thing.") + player:set_attribute("test_attribute", "test_me") + player:set_attribute("remove_this", nil) end minetest.after(2.0, cb, player) end) @@ -39,10 +41,15 @@ minetest.register_item(":", { crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1}, snappy = {times={[3]=0.40}, uses=0, maxlevel=1}, oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=1.40}, uses=0, maxlevel=3}, - } + }, + damage_groups = {fleshy=1}, } }) +-- +-- Picks +-- + minetest.register_tool("default:pick_wood", { description = "Wooden Pickaxe", inventory_image = "default_tool_woodpick.png", @@ -50,7 +57,8 @@ minetest.register_tool("default:pick_wood", { max_drop_level=0, groupcaps={ cracky={times={[2]=2.00, [3]=1.20}, uses=10, maxlevel=1} - } + }, + damage_groups = {fleshy=2}, }, }) minetest.register_tool("default:pick_stone", { @@ -60,7 +68,8 @@ minetest.register_tool("default:pick_stone", { max_drop_level=0, groupcaps={ cracky={times={[1]=2.00, [2]=1.20, [3]=0.80}, uses=20, maxlevel=1} - } + }, + damage_groups = {fleshy=3}, }, }) minetest.register_tool("default:pick_steel", { @@ -70,7 +79,8 @@ minetest.register_tool("default:pick_steel", { max_drop_level=1, groupcaps={ cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=10, maxlevel=2} - } + }, + damage_groups = {fleshy=4}, }, }) minetest.register_tool("default:pick_mese", { @@ -83,9 +93,15 @@ minetest.register_tool("default:pick_mese", { cracky={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}, crumbly={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}, snappy={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3} - } + }, + damage_groups = {fleshy=4}, }, }) + +-- +-- Shovels +-- + minetest.register_tool("default:shovel_wood", { description = "Wooden Shovel", inventory_image = "default_tool_woodshovel.png", @@ -93,7 +109,8 @@ minetest.register_tool("default:shovel_wood", { max_drop_level=0, groupcaps={ crumbly={times={[1]=2.00, [2]=0.80, [3]=0.50}, uses=10, maxlevel=1} - } + }, + damage_groups = {fleshy=2}, }, }) minetest.register_tool("default:shovel_stone", { @@ -103,7 +120,8 @@ minetest.register_tool("default:shovel_stone", { max_drop_level=0, groupcaps={ crumbly={times={[1]=1.20, [2]=0.50, [3]=0.30}, uses=20, maxlevel=1} - } + }, + damage_groups = {fleshy=3}, }, }) minetest.register_tool("default:shovel_steel", { @@ -113,9 +131,15 @@ minetest.register_tool("default:shovel_steel", { max_drop_level=1, groupcaps={ crumbly={times={[1]=1.00, [2]=0.70, [3]=0.60}, uses=10, maxlevel=2} - } + }, + damage_groups = {fleshy=4}, }, }) + +-- +-- Axes +-- + minetest.register_tool("default:axe_wood", { description = "Wooden Axe", inventory_image = "default_tool_woodaxe.png", @@ -124,7 +148,8 @@ minetest.register_tool("default:axe_wood", { groupcaps={ choppy={times={[2]=1.40, [3]=0.80}, uses=10, maxlevel=1}, fleshy={times={[2]=1.50, [3]=0.80}, uses=10, maxlevel=1} - } + }, + damage_groups = {fleshy=2}, }, }) minetest.register_tool("default:axe_stone", { @@ -135,7 +160,8 @@ minetest.register_tool("default:axe_stone", { groupcaps={ choppy={times={[1]=1.50, [2]=1.00, [3]=0.60}, uses=20, maxlevel=1}, fleshy={times={[2]=1.30, [3]=0.70}, uses=20, maxlevel=1} - } + }, + damage_groups = {fleshy=3}, }, }) minetest.register_tool("default:axe_steel", { @@ -146,9 +172,15 @@ minetest.register_tool("default:axe_steel", { groupcaps={ choppy={times={[1]=2.00, [2]=1.60, [3]=1.00}, uses=10, maxlevel=2}, fleshy={times={[2]=1.10, [3]=0.60}, uses=40, maxlevel=1} - } + }, + damage_groups = {fleshy=3}, }, }) + +-- +-- Swords +-- + minetest.register_tool("default:sword_wood", { description = "Wooden Sword", inventory_image = "default_tool_woodsword.png", @@ -159,7 +191,8 @@ minetest.register_tool("default:sword_wood", { fleshy={times={[2]=1.10, [3]=0.60}, uses=10, maxlevel=1}, snappy={times={[2]=1.00, [3]=0.50}, uses=10, maxlevel=1}, choppy={times={[3]=1.00}, uses=20, maxlevel=0} - } + }, + damage_groups = {fleshy=2}, } }) minetest.register_tool("default:sword_stone", { @@ -172,7 +205,8 @@ minetest.register_tool("default:sword_stone", { fleshy={times={[2]=0.80, [3]=0.40}, uses=20, maxlevel=1}, snappy={times={[2]=0.80, [3]=0.40}, uses=20, maxlevel=1}, choppy={times={[3]=0.90}, uses=20, maxlevel=0} - } + }, + damage_groups = {fleshy=4}, } }) minetest.register_tool("default:sword_steel", { @@ -185,7 +219,8 @@ minetest.register_tool("default:sword_steel", { fleshy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=10, maxlevel=2}, snappy={times={[2]=0.70, [3]=0.30}, uses=40, maxlevel=1}, choppy={times={[3]=0.70}, uses=40, maxlevel=0} - } + }, + damage_groups = {fleshy=6}, } }) @@ -957,37 +992,37 @@ minetest.register_node("default:cloud", { minetest.register_node("default:water_flowing", { description = "Water (flowing)", - inventory_image = minetest.inventorycube("default_water.png"), drawtype = "flowingliquid", - tiles ={"default_water.png"}, + tiles = {"default_water.png"}, special_tiles = { - {name="default_water.png", backface_culling=false}, - {name="default_water.png", backface_culling=true}, + {name = "default_water.png", backface_culling = false}, + {name = "default_water.png", backface_culling = true}, }, alpha = WATER_ALPHA, paramtype = "light", + paramtype2 = "flowingliquid", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, + drop = "", drowning = 1, liquidtype = "flowing", liquid_alternative_flowing = "default:water_flowing", liquid_alternative_source = "default:water_source", liquid_viscosity = WATER_VISC, - post_effect_color = {a=64, r=100, g=100, b=200}, - groups = {water=3, liquid=3}, + post_effect_color = {a = 64, r = 100, g = 100, b = 200}, + groups = {water = 3, liquid = 3}, }) minetest.register_node("default:water_source", { description = "Water", - inventory_image = minetest.inventorycube("default_water.png"), drawtype = "liquid", - tiles ={"default_water.png"}, + tiles = {"default_water.png"}, special_tiles = { -- New-style water source material (mostly unused) - {name="default_water.png", backface_culling=false}, + {name = "default_water.png", backface_culling = false}, }, alpha = WATER_ALPHA, paramtype = "light", @@ -996,13 +1031,70 @@ minetest.register_node("default:water_source", { diggable = false, buildable_to = true, is_ground_content = false, + drop = "", drowning = 1, liquidtype = "source", liquid_alternative_flowing = "default:water_flowing", liquid_alternative_source = "default:water_source", liquid_viscosity = WATER_VISC, - post_effect_color = {a=64, r=100, g=100, b=200}, - groups = {water=3, liquid=3}, + post_effect_color = {a = 64, r = 100, g = 100, b = 200}, + groups = {water = 3, liquid = 3}, +}) + +minetest.register_node("default:river_water_source", { + description = "River Water Source", + drawtype = "liquid", + tiles = {"default_river_water.png"}, + special_tiles = { + -- New-style water source material (mostly unused) + {name = "default_river_water.png", backface_culling = false}, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 103, r = 30, g = 76, b = 90}, + groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1}, +}) + +minetest.register_node("default:river_water_flowing", { + description = "Flowing River Water", + drawtype = "flowingliquid", + tiles = {"default_river_water.png"}, + special_tiles = { + {name = "default_river_water.png", backface_culling = false}, + {name = "default_river_water.png", backface_culling = true}, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 103, r = 30, g = 76, b = 90}, + groups = {water = 3, liquid = 3, puts_out_fire = 1, + not_in_creative_inventory = 1, cools_lava = 1}, }) minetest.register_node("default:lava_flowing", { @@ -1044,8 +1136,11 @@ minetest.register_node("default:lava_source", { inventory_image = minetest.inventorycube("default_lava.png"), drawtype = "liquid", --tiles ={"default_lava.png"}, - tiles ={ - {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} + tiles = { + { + name = "default_lava_source_animated.png", + animation = {type="sheet_2d", frames_w=3, frames_h=2, frame_length=0.5} + } }, special_tiles = { -- New-style lava source material (mostly unused) @@ -1130,8 +1225,9 @@ minetest.register_node("default:sign_wall", { minetest.register_node("default:chest", { description = "Chest", - tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, + tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0", + "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,0", + "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:0,1"}, paramtype2 = "facedir", groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, legacy_facedir_simple = true, @@ -1164,8 +1260,9 @@ end minetest.register_node("default:chest_locked", { description = "Locked Chest", - tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, + tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0", + "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,0", + "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,1"}, paramtype2 = "facedir", groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, legacy_facedir_simple = true, @@ -1188,6 +1285,8 @@ minetest.register_node("default:chest_locked", { meta:set_string("owner", "") local inv = meta:get_inventory() inv:set_size("main", 8*4) + -- this is not really the intended usage but works for testing purposes: + meta:mark_as_private("owner") end, can_dig = function(pos,player) local meta = minetest.get_meta(pos); @@ -1349,13 +1448,13 @@ minetest.register_abm({ local srclist = inv:get_list("src") local cooked = nil - + if srclist then cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) end - + local was_active = false - + if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then was_active = true meta:set_float("fuel_time", meta:get_float("fuel_time") + 1) @@ -1375,7 +1474,7 @@ minetest.register_abm({ meta:set_string("src_time", 0) end end - + if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then local percent = math.floor(meta:get_float("fuel_time") / meta:get_float("fuel_totaltime") * 100) @@ -1400,7 +1499,7 @@ minetest.register_abm({ local cooked = nil local fuellist = inv:get_list("fuel") local srclist = inv:get_list("src") - + if srclist then cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) end @@ -1426,7 +1525,7 @@ minetest.register_abm({ meta:set_string("fuel_totaltime", fuel.time) meta:set_string("fuel_time", 0) - + local stack = inv:get_stack("fuel", 1) stack:take_item() inv:set_stack("fuel", 1, stack) @@ -1533,7 +1632,7 @@ function default.grow_tree(data, a, pos, is_apple_tree, seed) y = y+th-1 -- (x, y, z) is now last piece of trunk local leaves_a = VoxelArea:new{MinEdge={x=-2, y=-1, z=-2}, MaxEdge={x=2, y=2, z=2}} local leaves_buffer = {} - + -- Force leaves near the trunk local d = 1 for xi = -d, d do @@ -1543,14 +1642,14 @@ function default.grow_tree(data, a, pos, is_apple_tree, seed) end end end - + -- Add leaves randomly for iii = 1, 8 do local d = 1 local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d) local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d) local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d) - + for xi = 0, d do for yi = 0, d do for zi = 0, d do @@ -1559,7 +1658,7 @@ function default.grow_tree(data, a, pos, is_apple_tree, seed) end end end - + -- Add the leaves for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do diff --git a/games/minimal/mods/default/mapgen.lua b/games/minimal/mods/default/mapgen.lua index 65b67dae5..30a865366 100644 --- a/games/minimal/mods/default/mapgen.lua +++ b/games/minimal/mods/default/mapgen.lua @@ -8,6 +8,7 @@ minetest.register_alias("mapgen_dirt", "default:dirt") minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass") minetest.register_alias("mapgen_sand", "default:sand") minetest.register_alias("mapgen_water_source", "default:water_source") +minetest.register_alias("mapgen_river_water_source", "default:river_water_source") minetest.register_alias("mapgen_lava_source", "default:lava_source") minetest.register_alias("mapgen_gravel", "default:gravel") diff --git a/games/minimal/mods/default/textures/default_chest.png b/games/minimal/mods/default/textures/default_chest.png Binary files differnew file mode 100644 index 000000000..9746a3fd9 --- /dev/null +++ b/games/minimal/mods/default/textures/default_chest.png diff --git a/games/minimal/mods/default/textures/default_chest_front.png b/games/minimal/mods/default/textures/default_chest_front.png Binary files differdeleted file mode 100644 index 55b076c35..000000000 --- a/games/minimal/mods/default/textures/default_chest_front.png +++ /dev/null diff --git a/games/minimal/mods/default/textures/default_chest_lock.png b/games/minimal/mods/default/textures/default_chest_lock.png Binary files differdeleted file mode 100644 index 4b2d1af6c..000000000 --- a/games/minimal/mods/default/textures/default_chest_lock.png +++ /dev/null diff --git a/games/minimal/mods/default/textures/default_chest_side.png b/games/minimal/mods/default/textures/default_chest_side.png Binary files differdeleted file mode 100644 index ae4847cb6..000000000 --- a/games/minimal/mods/default/textures/default_chest_side.png +++ /dev/null diff --git a/games/minimal/mods/default/textures/default_chest_top.png b/games/minimal/mods/default/textures/default_chest_top.png Binary files differdeleted file mode 100644 index ac41551b0..000000000 --- a/games/minimal/mods/default/textures/default_chest_top.png +++ /dev/null diff --git a/games/minimal/mods/default/textures/default_lava_source_animated.png b/games/minimal/mods/default/textures/default_lava_source_animated.png Binary files differindex aa9d57cf1..54f4c0ddd 100644 --- a/games/minimal/mods/default/textures/default_lava_source_animated.png +++ b/games/minimal/mods/default/textures/default_lava_source_animated.png diff --git a/games/minimal/mods/default/textures/default_river_water.png b/games/minimal/mods/default/textures/default_river_water.png Binary files differnew file mode 100644 index 000000000..3b55c5f66 --- /dev/null +++ b/games/minimal/mods/default/textures/default_river_water.png diff --git a/games/minimal/mods/errorhandler_test/init.lua b/games/minimal/mods/errorhandler_test/init.lua deleted file mode 100644 index 9d1535c1d..000000000 --- a/games/minimal/mods/errorhandler_test/init.lua +++ /dev/null @@ -1,106 +0,0 @@ --- --- exception handler test module --- --- --- To avoid this from crashing the module will startup in inactive mode. --- to make specific errors happen you need to cause them by following --- chat command: --- --- exceptiontest <location> <errortype> --- --- location has to be one of: --- * mapgen: cause in next on_generate call --- * entity_step: spawn a entity and make it do error in on_step --- * globalstep: do error in next globalstep --- * immediate: cause right in chat handler --- --- errortypes defined are: --- * segv: make sigsegv happen --- * zerodivision: cause a division by zero to happen --- * exception: throw an exception - -if core.cause_error == nil or - type(core.cause_error) ~= "function" then - return -end - - -core.log("action", "WARNING: loading exception handler test module!") - -local exceptiondata = { - tocause = "none", - mapgen = false, - entity_step = false, - globalstep = false, -} - -local exception_entity = -{ - on_step = function(self, dtime) - if exceptiondata.entity_step then - core.cause_error(exceptiondata.tocause) - end - end, -} -local exception_entity_name = "errorhandler_test:error_entity" - -local function exception_chat_handler(playername, param) - local parameters = param:split(" ") - - if #parameters ~= 2 then - core.chat_send_player(playername, "Invalid argument count for exceptiontest") - end - - core.log("error", "Causing error at:" .. parameters[1]) - - if parameters[1] == "mapgen" then - exceptiondata.tocause = parameters[2] - exceptiondata.mapgen = true - elseif parameters[1] == "entity_step" then - --spawn entity at player location - local player = core.get_player_by_name(playername) - - if player:is_player() then - local pos = player:getpos() - - core.add_entity(pos, exception_entity_name) - end - - exceptiondata.tocause = parameters[2] - exceptiondata.entity_step = true - - elseif parameters[1] == "globalstep" then - exceptiondata.tocause = parameters[2] - exceptiondata.globalstep = true - - elseif parameters[1] == "immediate" then - core.cause_error(parameters[2]) - - else - core.chat_send_player(playername, "Invalid error location: " .. dump(parameters[1])) - end -end - -core.register_chatcommand("exceptiontest", - { - params = "<location> <errortype>", - description = "cause a given error to happen.\n" .. - " location=(mapgen,entity_step,globalstep,immediate)\n" .. - " errortype=(segv,zerodivision,exception)", - func = exception_chat_handler, - privs = { server=true } - }) - -core.register_globalstep(function(dtime) - if exceptiondata.globalstep then - core.cause_error(exceptiondata.tocause) - end -end) - -core.register_on_generated(function(minp, maxp, blockseed) - if exceptiondata.mapgen then - core.cause_error(exceptiondata.tocause) - end -end) - -core.register_entity(exception_entity_name, exception_entity) diff --git a/games/minimal/mods/experimental/init.lua b/games/minimal/mods/experimental/init.lua index 729191bce..6e0fb1738 100644 --- a/games/minimal/mods/experimental/init.lua +++ b/games/minimal/mods/experimental/init.lua @@ -28,7 +28,7 @@ minetest.after(1.0, switch_player_visual) ]] minetest.register_node("experimental:soundblock", { - tile_images = {"unknown_node.png", "default_tnt_bottom.png", + tiles = {"unknown_node.png", "default_tnt_bottom.png", "default_tnt_side.png", "default_tnt_side.png", "default_tnt_side.png", "default_tnt_side.png"}, inventory_image = minetest.inventorycube("unknown_node.png", @@ -120,7 +120,7 @@ minetest.register_craft({ }) minetest.register_node("experimental:tnt", { - tile_images = {"default_tnt_top.png", "default_tnt_bottom.png", + tiles = {"default_tnt_top.png", "default_tnt_bottom.png", "default_tnt_side.png", "default_tnt_side.png", "default_tnt_side.png", "default_tnt_side.png"}, inventory_image = minetest.inventorycube("default_tnt_top.png", @@ -453,7 +453,7 @@ minetest.register_abm({ minetest.register_node("experimental:tester_node_1", { description = "Tester Node 1 (construct/destruct/timer)", - tile_images = {"wieldhand.png"}, + tiles = {"wieldhand.png"}, groups = {oddly_breakable_by_hand=2}, sounds = default.node_sound_wood_defaults(), -- This was known to cause a bug in minetest.item_place_node() when used @@ -502,10 +502,16 @@ minetest.register_craftitem("experimental:tester_tool_1", { on_use = function(itemstack, user, pointed_thing) --print(dump(pointed_thing)) if pointed_thing.type == "node" then - if minetest.get_node(pointed_thing.under).name == "experimental:tester_node_1" then + local node = minetest.get_node(pointed_thing.under) + if node.name == "experimental:tester_node_1" or node.name == "default:chest" then local p = pointed_thing.under minetest.log("action", "Tester tool used at "..minetest.pos_to_string(p)) - minetest.dig_node(p) + if node.name == "experimental:tester_node_1" then + minetest.dig_node(p) + else + minetest.get_meta(p):mark_as_private({"infotext", "formspec"}) + minetest.chat_send_player(user:get_player_name(), "Verify that chest is unusable now.") + end else local p = pointed_thing.above minetest.log("action", "Tester tool used at "..minetest.pos_to_string(p)) @@ -523,6 +529,43 @@ minetest.register_craft({ } }) +minetest.register_craftitem("experimental:tester_tool_2", { + description = "Tester Tool 2", + inventory_image = "experimental_tester_tool_1.png^[invert:g", + on_use = function(itemstack, user, pointed_thing) + local pos = minetest.get_pointed_thing_position(pointed_thing, true) + if pos == nil then return end + pos = vector.add(pos, {x=0, y=0.5, z=0}) + local tex, anim + if math.random(0, 1) == 0 then + tex = "default_lava_source_animated.png" + anim = {type="sheet_2d", frames_w=3, frames_h=2, frame_length=0.5} + else + tex = "default_lava_flowing_animated.png" + anim = {type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} + end + + minetest.add_particle({ + pos = pos, + velocity = {x=0, y=0, z=0}, + acceleration = {x=0, y=0.04, z=0}, + expirationtime = 6, + collisiondetection = true, + texture = tex, + animation = anim, + size = 4, + glow = math.random(0, 5), + }) + end, +}) + +minetest.register_craft({ + output = 'experimental:tester_tool_2', + recipe = { + {'group:crumbly','group:crumbly'}, + } +}) + --[[minetest.register_on_joinplayer(function(player) minetest.after(3, function() player:set_inventory_formspec("size[8,7.5]".. diff --git a/games/minimal/mods/stairs/init.lua b/games/minimal/mods/stairs/init.lua index 4929d1370..c3bbc561e 100644 --- a/games/minimal/mods/stairs/init.lua +++ b/games/minimal/mods/stairs/init.lua @@ -5,7 +5,7 @@ function stairs.register_stair(subname, recipeitem, groups, images, description) minetest.register_node("stairs:stair_" .. subname, { description = description, drawtype = "nodebox", - tile_images = images, + tiles = images, paramtype = "light", paramtype2 = "facedir", is_ground_content = true, @@ -34,7 +34,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description) minetest.register_node("stairs:slab_" .. subname, { description = description, drawtype = "nodebox", - tile_images = images, + tiles = images, paramtype = "light", is_ground_content = true, groups = groups, diff --git a/src/gmp/CMakeLists.txt b/lib/gmp/CMakeLists.txt index 96ae8191d..96ae8191d 100644 --- a/src/gmp/CMakeLists.txt +++ b/lib/gmp/CMakeLists.txt diff --git a/src/gmp/mini-gmp.c b/lib/gmp/mini-gmp.c index f3b43fbe8..f3b43fbe8 100644 --- a/src/gmp/mini-gmp.c +++ b/lib/gmp/mini-gmp.c diff --git a/src/gmp/mini-gmp.h b/lib/gmp/mini-gmp.h index 8c94ca2ed..8c94ca2ed 100644 --- a/src/gmp/mini-gmp.h +++ b/lib/gmp/mini-gmp.h diff --git a/src/jsoncpp/json/CMakeLists.txt b/lib/jsoncpp/CMakeLists.txt index 9056e4b6d..9056e4b6d 100644 --- a/src/jsoncpp/json/CMakeLists.txt +++ b/lib/jsoncpp/CMakeLists.txt diff --git a/src/jsoncpp/json/UPDATING b/lib/jsoncpp/json/UPDATING index d00076601..d00076601 100644 --- a/src/jsoncpp/json/UPDATING +++ b/lib/jsoncpp/json/UPDATING diff --git a/lib/jsoncpp/json/json.h b/lib/jsoncpp/json/json.h new file mode 100644 index 000000000..e9b696c01 --- /dev/null +++ b/lib/jsoncpp/json/json.h @@ -0,0 +1,1981 @@ +/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json.h" + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +The author (Baptiste Lepilleur) explicitly disclaims copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is +released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + +#ifndef JSON_AMALGATED_H_INCLUDED +# define JSON_AMALGATED_H_INCLUDED +/// If defined, indicates that the source file is amalgated +/// to prevent private header inclusion. +#define JSON_IS_AMALGAMATION +#define JSONCPP_STRING +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + +// DO NOT EDIT. This file (and "version") is generated by CMake. +// Run CMake configure step to update it. +#ifndef JSON_VERSION_H_INCLUDED +# define JSON_VERSION_H_INCLUDED + +# define JSONCPP_VERSION_STRING "0.10.6" +# define JSONCPP_VERSION_MAJOR 0 +# define JSONCPP_VERSION_MINOR 10 +# define JSONCPP_VERSION_PATCH 6 +# define JSONCPP_VERSION_QUALIFIER +# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8)) + +#endif // JSON_VERSION_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_CONFIG_H_INCLUDED +#define JSON_CONFIG_H_INCLUDED + +/// If defined, indicates that json library is embedded in CppTL library. +//# define JSON_IN_CPPTL 1 + +/// If defined, indicates that json may leverage CppTL library +//# define JSON_USE_CPPTL 1 +/// If defined, indicates that cpptl vector based map should be used instead of +/// std::map +/// as Value container. +//# define JSON_USE_CPPTL_SMALLMAP 1 + +// If non-zero, the library uses exceptions to report bad input instead of C +// assertion macros. The default is to use exceptions. +#ifndef JSON_USE_EXCEPTION +#define JSON_USE_EXCEPTION 1 +#endif + +/// If defined, indicates that the source file is amalgated +/// to prevent private header inclusion. +/// Remarks: it is automatically defined in the generated amalgated header. +// #define JSON_IS_AMALGAMATION + +#ifdef JSON_IN_CPPTL +#include <cpptl/config.h> +#ifndef JSON_USE_CPPTL +#define JSON_USE_CPPTL 1 +#endif +#endif + +#ifdef JSON_IN_CPPTL +#define JSON_API CPPTL_API +#elif defined(JSON_DLL_BUILD) +#if defined(_MSC_VER) +#define JSON_API __declspec(dllexport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#elif defined(JSON_DLL) +#if defined(_MSC_VER) +#define JSON_API __declspec(dllimport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#endif // ifdef JSON_IN_CPPTL +#if !defined(JSON_API) +#define JSON_API +#endif + +// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for +// integer +// Storages, and 64 bits integer support is disabled. +// #define JSON_NO_INT64 1 + +#if defined(_MSC_VER) && _MSC_VER <= 1200 // MSVC 6 +// Microsoft Visual Studio 6 only support conversion from __int64 to double +// (no conversion from unsigned __int64). +#define JSON_USE_INT64_DOUBLE_CONVERSION 1 +// Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255' +// characters in the debug information) +// All projects I've ever seen with VS6 were using this globally (not bothering +// with pragma push/pop). +#pragma warning(disable : 4786) +#endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6 + +#if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008 +/// Indicates that the following function is deprecated. +#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +#elif defined(__clang__) && defined(__has_feature) +#if __has_feature(attribute_deprecated_with_message) +#define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +#endif +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +#elif defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +#endif + +#if !defined(JSONCPP_DEPRECATED) +#define JSONCPP_DEPRECATED(message) +#endif // if !defined(JSONCPP_DEPRECATED) + +namespace Json { +typedef int Int; +typedef unsigned int UInt; +#if defined(JSON_NO_INT64) +typedef int LargestInt; +typedef unsigned int LargestUInt; +#undef JSON_HAS_INT64 +#else // if defined(JSON_NO_INT64) +// For Microsoft Visual use specific types as long long is not supported +#if defined(_MSC_VER) // Microsoft Visual Studio +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#else // if defined(_MSC_VER) // Other platforms, use long long +typedef long long int Int64; +typedef unsigned long long int UInt64; +#endif // if defined(_MSC_VER) +typedef Int64 LargestInt; +typedef UInt64 LargestUInt; +#define JSON_HAS_INT64 +#endif // if defined(JSON_NO_INT64) +} // end namespace Json + +#endif // JSON_CONFIG_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_FORWARDS_H_INCLUDED +#define JSON_FORWARDS_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +// writer.h +class FastWriter; +class StyledWriter; + +// reader.h +class Reader; + +// features.h +class Features; + +// value.h +typedef unsigned int ArrayIndex; +class StaticString; +class Path; +class PathArgument; +class Value; +class ValueIteratorBase; +class ValueIterator; +class ValueConstIterator; + +} // namespace Json + +#endif // JSON_FORWARDS_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/features.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_FEATURES_H_INCLUDED +#define CPPTL_JSON_FEATURES_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "forwards.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +/** \brief Configuration passed to reader and writer. + * This configuration object can be used to force the Reader or Writer + * to behave in a standard conforming way. + */ +class JSON_API Features { +public: + /** \brief A configuration that allows all features and assumes all strings + * are UTF-8. + * - C & C++ comments are allowed + * - Root object can be any JSON value + * - Assumes Value strings are encoded in UTF-8 + */ + static Features all(); + + /** \brief A configuration that is strictly compatible with the JSON + * specification. + * - Comments are forbidden. + * - Root object must be either an array or an object value. + * - Assumes Value strings are encoded in UTF-8 + */ + static Features strictMode(); + + /** \brief Initialize the configuration like JsonConfig::allFeatures; + */ + Features(); + + /// \c true if comments are allowed. Default: \c true. + bool allowComments_; + + /// \c true if root must be either an array or an object value. Default: \c + /// false. + bool strictRoot_; +}; + +} // namespace Json + +#endif // CPPTL_JSON_FEATURES_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/features.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/value.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_H_INCLUDED +#define CPPTL_JSON_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "forwards.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include <string> +#include <vector> +#include <exception> + +#ifndef JSON_USE_CPPTL_SMALLMAP +#include <map> +#else +#include <cpptl/smallmap.h> +#endif +#ifdef JSON_USE_CPPTL +#include <cpptl/forwards.h> +#endif + +// Disable warning C4251: <data member>: <type> needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +//Conditional NORETURN attribute on the throw functions would: +// a) suppress false positives from static code analysis +// b) possibly improve optimization opportunities. +#if !defined(JSONCPP_NORETURN) +# if defined(_MSC_VER) +# define JSONCPP_NORETURN __declspec(noreturn) +# elif defined(__GNUC__) +# define JSONCPP_NORETURN __attribute__ ((__noreturn__)) +# else +# define JSONCPP_NORETURN +# endif +#endif + +/** \brief JSON (JavaScript Object Notation). + */ +namespace Json { + +/** Base class for all exceptions we throw. + * + * We use nothing but these internally. Of course, STL can throw others. + */ +class JSON_API Exception : public std::exception { +public: + Exception(std::string const& msg); + virtual ~Exception() throw(); + virtual char const* what() const throw(); +protected: + std::string const msg_; +}; + +/** Exceptions which the user cannot easily avoid. + * + * E.g. out-of-memory (when we use malloc), stack-overflow, malicious input + * + * \remark derived from Json::Exception + */ +class JSON_API RuntimeError : public Exception { +public: + RuntimeError(std::string const& msg); +}; + +/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros. + * + * These are precondition-violations (user bugs) and internal errors (our bugs). + * + * \remark derived from Json::Exception + */ +class JSON_API LogicError : public Exception { +public: + LogicError(std::string const& msg); +}; + +/// used internally +JSONCPP_NORETURN void throwRuntimeError(std::string const& msg); +/// used internally +JSONCPP_NORETURN void throwLogicError(std::string const& msg); + +/** \brief Type of the value held by a Value object. + */ +enum ValueType { + nullValue = 0, ///< 'null' value + intValue, ///< signed integer value + uintValue, ///< unsigned integer value + realValue, ///< double value + stringValue, ///< UTF-8 string value + booleanValue, ///< bool value + arrayValue, ///< array value (ordered list) + objectValue ///< object value (collection of name/value pairs). +}; + +enum CommentPlacement { + commentBefore = 0, ///< a comment placed on the line before a value + commentAfterOnSameLine, ///< a comment just after a value on the same line + commentAfter, ///< a comment on the line after a value (only make sense for + /// root value) + numberOfCommentPlacement +}; + +//# ifdef JSON_USE_CPPTL +// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames; +// typedef CppTL::AnyEnumerator<const Value &> EnumValues; +//# endif + +/** \brief Lightweight wrapper to tag static string. + * + * Value constructor and objectValue member assignement takes advantage of the + * StaticString and avoid the cost of string duplication when storing the + * string or the member name. + * + * Example of usage: + * \code + * Json::Value aValue( StaticString("some text") ); + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ +class JSON_API StaticString { +public: + explicit StaticString(const char* czstring) : c_str_(czstring) {} + + operator const char*() const { return c_str_; } + + const char* c_str() const { return c_str_; } + +private: + const char* c_str_; +}; + +/** \brief Represents a <a HREF="http://www.json.org">JSON</a> value. + * + * This class is a discriminated union wrapper that can represents a: + * - signed integer [range: Value::minInt - Value::maxInt] + * - unsigned integer (range: 0 - Value::maxUInt) + * - double + * - UTF-8 string + * - boolean + * - 'null' + * - an ordered list of Value + * - collection of name/value pairs (javascript object) + * + * The type of the held value is represented by a #ValueType and + * can be obtained using type(). + * + * Values of an #objectValue or #arrayValue can be accessed using operator[]() + * methods. + * Non-const methods will automatically create the a #nullValue element + * if it does not exist. + * The sequence of an #arrayValue will be automatically resized and initialized + * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. + * + * The get() methods can be used to obtain default value in the case the + * required element does not exist. + * + * It is possible to iterate over the list of a #objectValue values using + * the getMemberNames() method. + * + * \note #Value string-length fit in size_t, but keys must be < 2^30. + * (The reason is an implementation detail.) A #CharReader will raise an + * exception if a bound is exceeded to avoid security holes in your app, + * but the Value API does *not* check bounds. That is the responsibility + * of the caller. + */ +class JSON_API Value { + friend class ValueIteratorBase; +public: + typedef std::vector<std::string> Members; + typedef ValueIterator iterator; + typedef ValueConstIterator const_iterator; + typedef Json::UInt UInt; + typedef Json::Int Int; +#if defined(JSON_HAS_INT64) + typedef Json::UInt64 UInt64; + typedef Json::Int64 Int64; +#endif // defined(JSON_HAS_INT64) + typedef Json::LargestInt LargestInt; + typedef Json::LargestUInt LargestUInt; + typedef Json::ArrayIndex ArrayIndex; + + static const Value& nullRef; +#if !defined(__ARMEL__) + /// \deprecated This exists for binary compatibility only. Use nullRef. + static const Value null; +#endif + /// Minimum signed integer value that can be stored in a Json::Value. + static const LargestInt minLargestInt; + /// Maximum signed integer value that can be stored in a Json::Value. + static const LargestInt maxLargestInt; + /// Maximum unsigned integer value that can be stored in a Json::Value. + static const LargestUInt maxLargestUInt; + + /// Minimum signed int value that can be stored in a Json::Value. + static const Int minInt; + /// Maximum signed int value that can be stored in a Json::Value. + static const Int maxInt; + /// Maximum unsigned int value that can be stored in a Json::Value. + static const UInt maxUInt; + +#if defined(JSON_HAS_INT64) + /// Minimum signed 64 bits int value that can be stored in a Json::Value. + static const Int64 minInt64; + /// Maximum signed 64 bits int value that can be stored in a Json::Value. + static const Int64 maxInt64; + /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. + static const UInt64 maxUInt64; +#endif // defined(JSON_HAS_INT64) + +private: +#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + class CZString { + public: + enum DuplicationPolicy { + noDuplication = 0, + duplicate, + duplicateOnCopy + }; + CZString(ArrayIndex index); + CZString(char const* str, unsigned length, DuplicationPolicy allocate); + CZString(CZString const& other); + ~CZString(); + CZString& operator=(CZString other); + bool operator<(CZString const& other) const; + bool operator==(CZString const& other) const; + ArrayIndex index() const; + //const char* c_str() const; ///< \deprecated + char const* data() const; + unsigned length() const; + bool isStaticString() const; + + private: + void swap(CZString& other); + + struct StringStorage { + unsigned policy_: 2; + unsigned length_: 30; // 1GB max + }; + + char const* cstr_; // actually, a prefixed string, unless policy is noDup + union { + ArrayIndex index_; + StringStorage storage_; + }; + }; + +public: +#ifndef JSON_USE_CPPTL_SMALLMAP + typedef std::map<CZString, Value> ObjectValues; +#else + typedef CppTL::SmallMap<CZString, Value> ObjectValues; +#endif // ifndef JSON_USE_CPPTL_SMALLMAP +#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + +public: + /** \brief Create a default Value of the given type. + + This is a very useful constructor. + To create an empty array, pass arrayValue. + To create an empty object, pass objectValue. + Another Value can then be set to this one by assignment. +This is useful since clear() and resize() will not alter types. + + Examples: +\code +Json::Value null_value; // null +Json::Value arr_value(Json::arrayValue); // [] +Json::Value obj_value(Json::objectValue); // {} +\endcode + */ + Value(ValueType type = nullValue); + Value(Int value); + Value(UInt value); +#if defined(JSON_HAS_INT64) + Value(Int64 value); + Value(UInt64 value); +#endif // if defined(JSON_HAS_INT64) + Value(double value); + Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.) + Value(const char* begin, const char* end); ///< Copy all, incl zeroes. + /** \brief Constructs a value from a static string. + + * Like other value string constructor but do not duplicate the string for + * internal storage. The given string must remain alive after the call to this + * constructor. + * \note This works only for null-terminated strings. (We cannot change the + * size of this class, so we have nowhere to store the length, + * which might be computed later for various operations.) + * + * Example of usage: + * \code + * static StaticString foo("some text"); + * Json::Value aValue(foo); + * \endcode + */ + Value(const StaticString& value); + Value(const std::string& value); ///< Copy data() til size(). Embedded zeroes too. +#ifdef JSON_USE_CPPTL + Value(const CppTL::ConstString& value); +#endif + Value(bool value); + /// Deep copy. + Value(const Value& other); + ~Value(); + + /// Deep copy, then swap(other). + /// \note Over-write existing comments. To preserve comments, use #swapPayload(). + Value &operator=(const Value &other); + /// Swap everything. + void swap(Value& other); + /// Swap values but leave comments and source offsets in place. + void swapPayload(Value& other); + + ValueType type() const; + + /// Compare payload only, not comments etc. + bool operator<(const Value& other) const; + bool operator<=(const Value& other) const; + bool operator>=(const Value& other) const; + bool operator>(const Value& other) const; + bool operator==(const Value& other) const; + bool operator!=(const Value& other) const; + int compare(const Value& other) const; + + const char* asCString() const; ///< Embedded zeroes could cause you trouble! + std::string asString() const; ///< Embedded zeroes are possible. + /** Get raw char* of string-value. + * \return false if !string. (Seg-fault if str or end are NULL.) + */ + bool getString( + char const** begin, char const** end) const; +#ifdef JSON_USE_CPPTL + CppTL::ConstString asConstString() const; +#endif + Int asInt() const; + UInt asUInt() const; +#if defined(JSON_HAS_INT64) + Int64 asInt64() const; + UInt64 asUInt64() const; +#endif // if defined(JSON_HAS_INT64) + LargestInt asLargestInt() const; + LargestUInt asLargestUInt() const; + float asFloat() const; + double asDouble() const; + bool asBool() const; + + bool isNull() const; + bool isBool() const; + bool isInt() const; + bool isInt64() const; + bool isUInt() const; + bool isUInt64() const; + bool isIntegral() const; + bool isDouble() const; + bool isNumeric() const; + bool isString() const; + bool isArray() const; + bool isObject() const; + + bool isConvertibleTo(ValueType other) const; + + /// Number of values in array or object + ArrayIndex size() const; + + /// \brief Return true if empty array, empty object, or null; + /// otherwise, false. + bool empty() const; + + /// Return isNull() + bool operator!() const; + + /// Remove all object members and array elements. + /// \pre type() is arrayValue, objectValue, or nullValue + /// \post type() is unchanged + void clear(); + + /// Resize the array to size elements. + /// New elements are initialized to null. + /// May only be called on nullValue or arrayValue. + /// \pre type() is arrayValue or nullValue + /// \post type() is arrayValue + void resize(ArrayIndex size); + + /// Access an array element (zero based index ). + /// If the array contains less than index element, then null value are + /// inserted + /// in the array so that its size is index+1. + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + Value& operator[](ArrayIndex index); + + /// Access an array element (zero based index ). + /// If the array contains less than index element, then null value are + /// inserted + /// in the array so that its size is index+1. + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + Value& operator[](int index); + + /// Access an array element (zero based index ) + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + const Value& operator[](ArrayIndex index) const; + + /// Access an array element (zero based index ) + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + const Value& operator[](int index) const; + + /// If the array contains at least index+1 elements, returns the element + /// value, + /// otherwise returns defaultValue. + Value get(ArrayIndex index, const Value& defaultValue) const; + /// Return true if index < size(). + bool isValidIndex(ArrayIndex index) const; + /// \brief Append value to array at the end. + /// + /// Equivalent to jsonvalue[jsonvalue.size()] = value; + Value& append(const Value& value); + + /// Access an object value by name, create a null member if it does not exist. + /// \note Because of our implementation, keys are limited to 2^30 -1 chars. + /// Exceeding that will cause an exception. + Value& operator[](const char* key); + /// Access an object value by name, returns null if there is no member with + /// that name. + const Value& operator[](const char* key) const; + /// Access an object value by name, create a null member if it does not exist. + /// \param key may contain embedded nulls. + Value& operator[](const std::string& key); + /// Access an object value by name, returns null if there is no member with + /// that name. + /// \param key may contain embedded nulls. + const Value& operator[](const std::string& key) const; + /** \brief Access an object value by name, create a null member if it does not + exist. + + * If the object has no entry for that name, then the member name used to store + * the new entry is not duplicated. + * Example of use: + * \code + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ + Value& operator[](const StaticString& key); +#ifdef JSON_USE_CPPTL + /// Access an object value by name, create a null member if it does not exist. + Value& operator[](const CppTL::ConstString& key); + /// Access an object value by name, returns null if there is no member with + /// that name. + const Value& operator[](const CppTL::ConstString& key) const; +#endif + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + Value get(const char* key, const Value& defaultValue) const; + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + /// \note key may contain embedded nulls. + Value get(const char* begin, const char* end, const Value& defaultValue) const; + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + /// \param key may contain embedded nulls. + Value get(const std::string& key, const Value& defaultValue) const; +#ifdef JSON_USE_CPPTL + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + Value get(const CppTL::ConstString& key, const Value& defaultValue) const; +#endif + /// Most general and efficient version of isMember()const, get()const, + /// and operator[]const + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 + Value const* find(char const* begin, char const* end) const; + /// Most general and efficient version of object-mutators. + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 + /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue. + Value const* demand(char const* begin, char const* end); + /// \brief Remove and return the named member. + /// + /// Do nothing if it did not exist. + /// \return the removed Value, or null. + /// \pre type() is objectValue or nullValue + /// \post type() is unchanged + /// \deprecated + Value removeMember(const char* key); + /// Same as removeMember(const char*) + /// \param key may contain embedded nulls. + /// \deprecated + Value removeMember(const std::string& key); + /// Same as removeMember(const char* begin, const char* end, Value* removed), + /// but 'key' is null-terminated. + bool removeMember(const char* key, Value* removed); + /** \brief Remove the named map member. + + Update 'removed' iff removed. + \param key may contain embedded nulls. + \return true iff removed (no exceptions) + */ + bool removeMember(std::string const& key, Value* removed); + /// Same as removeMember(std::string const& key, Value* removed) + bool removeMember(const char* begin, const char* end, Value* removed); + /** \brief Remove the indexed array element. + + O(n) expensive operations. + Update 'removed' iff removed. + \return true iff removed (no exceptions) + */ + bool removeIndex(ArrayIndex i, Value* removed); + + /// Return true if the object has a member named key. + /// \note 'key' must be null-terminated. + bool isMember(const char* key) const; + /// Return true if the object has a member named key. + /// \param key may contain embedded nulls. + bool isMember(const std::string& key) const; + /// Same as isMember(std::string const& key)const + bool isMember(const char* begin, const char* end) const; +#ifdef JSON_USE_CPPTL + /// Return true if the object has a member named key. + bool isMember(const CppTL::ConstString& key) const; +#endif + + /// \brief Return a list of the member names. + /// + /// If null, return an empty list. + /// \pre type() is objectValue or nullValue + /// \post if type() was nullValue, it remains nullValue + Members getMemberNames() const; + + //# ifdef JSON_USE_CPPTL + // EnumMemberNames enumMemberNames() const; + // EnumValues enumValues() const; + //# endif + + /// \deprecated Always pass len. + JSONCPP_DEPRECATED("Use setComment(std::string const&) instead.") + void setComment(const char* comment, CommentPlacement placement); + /// Comments must be //... or /* ... */ + void setComment(const char* comment, size_t len, CommentPlacement placement); + /// Comments must be //... or /* ... */ + void setComment(const std::string& comment, CommentPlacement placement); + bool hasComment(CommentPlacement placement) const; + /// Include delimiters and embedded newlines. + std::string getComment(CommentPlacement placement) const; + + std::string toStyledString() const; + + const_iterator begin() const; + const_iterator end() const; + + iterator begin(); + iterator end(); + +private: + void initBasic(ValueType type, bool allocated = false); + + Value& resolveReference(const char* key); + Value& resolveReference(const char* key, const char* end); + + struct CommentInfo { + CommentInfo(); + ~CommentInfo(); + + void setComment(const char* text, size_t len); + + char* comment_; + }; + + // struct MemberNamesTransform + //{ + // typedef const char *result_type; + // const char *operator()( const CZString &name ) const + // { + // return name.c_str(); + // } + //}; + + union ValueHolder { + LargestInt int_; + LargestUInt uint_; + double real_; + bool bool_; + char* string_; // actually ptr to unsigned, followed by str, unless !allocated_ + ObjectValues* map_; + } value_; + ValueType type_ : 8; + unsigned int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. + // If not allocated_, string_ must be null-terminated. + CommentInfo* comments_; +}; + +/** \brief Experimental and untested: represents an element of the "path" to + * access a node. + */ +class JSON_API PathArgument { +public: + friend class Path; + + PathArgument(); + PathArgument(ArrayIndex index); + PathArgument(const char* key); + PathArgument(const std::string& key); + +private: + enum Kind { + kindNone = 0, + kindIndex, + kindKey + }; + std::string key_; + ArrayIndex index_; + Kind kind_; +}; + +/** \brief Experimental and untested: represents a "path" to access a node. + * + * Syntax: + * - "." => root node + * - ".[n]" => elements at index 'n' of root node (an array value) + * - ".name" => member named 'name' of root node (an object value) + * - ".name1.name2.name3" + * - ".[0][1][2].name1[3]" + * - ".%" => member name is provided as parameter + * - ".[%]" => index is provied as parameter + */ +class JSON_API Path { +public: + Path(const std::string& path, + const PathArgument& a1 = PathArgument(), + const PathArgument& a2 = PathArgument(), + const PathArgument& a3 = PathArgument(), + const PathArgument& a4 = PathArgument(), + const PathArgument& a5 = PathArgument()); + + const Value& resolve(const Value& root) const; + Value resolve(const Value& root, const Value& defaultValue) const; + /// Creates the "path" to access the specified node and returns a reference on + /// the node. + Value& make(Value& root) const; + +private: + typedef std::vector<const PathArgument*> InArgs; + typedef std::vector<PathArgument> Args; + + void makePath(const std::string& path, const InArgs& in); + void addPathInArg(const std::string& path, + const InArgs& in, + InArgs::const_iterator& itInArg, + PathArgument::Kind kind); + void invalidPath(const std::string& path, int location); + + Args args_; +}; + +/** \brief base class for Value iterators. + * + */ +class JSON_API ValueIteratorBase { +public: + typedef std::bidirectional_iterator_tag iterator_category; + typedef unsigned int size_t; + typedef int difference_type; + typedef ValueIteratorBase SelfType; + + bool operator==(const SelfType& other) const { return isEqual(other); } + + bool operator!=(const SelfType& other) const { return !isEqual(other); } + + difference_type operator-(const SelfType& other) const { + return other.computeDistance(*this); + } + + /// Return either the index or the member name of the referenced value as a + /// Value. + Value key() const; + + /// Return the index of the referenced Value, or -1 if it is not an arrayValue. + UInt index() const; + + /// Return the member name of the referenced Value, or "" if it is not an + /// objectValue. + /// \note Avoid `c_str()` on result, as embedded zeroes are possible. + std::string name() const; + + /// Return the member name of the referenced Value. "" if it is not an + /// objectValue. + /// \deprecated This cannot be used for UTF-8 strings, since there can be embedded nulls. + JSONCPP_DEPRECATED("Use `key = name();` instead.") + char const* memberName() const; + /// Return the member name of the referenced Value, or NULL if it is not an + /// objectValue. + /// \note Better version than memberName(). Allows embedded nulls. + char const* memberName(char const** end) const; + +protected: + Value& deref() const; + + void increment(); + + void decrement(); + + difference_type computeDistance(const SelfType& other) const; + + bool isEqual(const SelfType& other) const; + + void copy(const SelfType& other); + +private: + Value::ObjectValues::iterator current_; + // Indicates that iterator is for a null value. + bool isNull_; + +public: + // For some reason, BORLAND needs these at the end, rather + // than earlier. No idea why. + ValueIteratorBase(); + explicit ValueIteratorBase(const Value::ObjectValues::iterator& current); +}; + +/** \brief const iterator for object and array value. + * + */ +class JSON_API ValueConstIterator : public ValueIteratorBase { + friend class Value; + +public: + typedef const Value value_type; + //typedef unsigned int size_t; + //typedef int difference_type; + typedef const Value& reference; + typedef const Value* pointer; + typedef ValueConstIterator SelfType; + + ValueConstIterator(); + +private: +/*! \internal Use by Value to create an iterator. + */ + explicit ValueConstIterator(const Value::ObjectValues::iterator& current); +public: + SelfType& operator=(const ValueIteratorBase& other); + + SelfType operator++(int) { + SelfType temp(*this); + ++*this; + return temp; + } + + SelfType operator--(int) { + SelfType temp(*this); + --*this; + return temp; + } + + SelfType& operator--() { + decrement(); + return *this; + } + + SelfType& operator++() { + increment(); + return *this; + } + + reference operator*() const { return deref(); } + + pointer operator->() const { return &deref(); } +}; + +/** \brief Iterator for object and array value. + */ +class JSON_API ValueIterator : public ValueIteratorBase { + friend class Value; + +public: + typedef Value value_type; + typedef unsigned int size_t; + typedef int difference_type; + typedef Value& reference; + typedef Value* pointer; + typedef ValueIterator SelfType; + + ValueIterator(); + ValueIterator(const ValueConstIterator& other); + ValueIterator(const ValueIterator& other); + +private: +/*! \internal Use by Value to create an iterator. + */ + explicit ValueIterator(const Value::ObjectValues::iterator& current); +public: + SelfType& operator=(const SelfType& other); + + SelfType operator++(int) { + SelfType temp(*this); + ++*this; + return temp; + } + + SelfType operator--(int) { + SelfType temp(*this); + --*this; + return temp; + } + + SelfType& operator--() { + decrement(); + return *this; + } + + SelfType& operator++() { + increment(); + return *this; + } + + reference operator*() const { return deref(); } + + pointer operator->() const { return &deref(); } +}; + +} // namespace Json + + +namespace std { +/// Specialize std::swap() for Json::Value. +template<> +inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); } +} + + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // CPPTL_JSON_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/value.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/reader.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_READER_H_INCLUDED +#define CPPTL_JSON_READER_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "features.h" +#include "value.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include <deque> +#include <iosfwd> +#include <stack> +#include <string> +#include <istream> + +// Disable warning C4251: <data member>: <type> needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +namespace Json { + +/** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a + *Value. + * + * \deprecated Use CharReader and CharReaderBuilder. + */ +class JSON_API Reader { +public: + typedef char Char; + typedef const Char* Location; + + /** \brief Constructs a Reader allowing all features + * for parsing. + */ + Reader(); + + /** \brief Constructs a Reader allowing the specified feature set + * for parsing. + */ + Reader(const Features& features); + + /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> + * document. + * \param document UTF-8 encoded string containing the document to read. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them + * back during + * serialization, \c false to discard comments. + * This parameter is ignored if + * Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an + * error occurred. + */ + bool + parse(const std::string& document, Value& root, bool collectComments = true); + + /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> + document. + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the + document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string of the + document to read. + * Must be >= beginDoc. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them + back during + * serialization, \c false to discard comments. + * This parameter is ignored if + Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an + error occurred. + */ + bool parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments = true); + + /// \brief Parse from input stream. + /// \see Json::operator>>(std::istream&, Json::Value&). + bool parse(std::istream& is, Value& root, bool collectComments = true); + + /** \brief Returns a user friendly string that list errors in the parsed + * document. + * \return Formatted error message with the list of errors with their location + * in + * the parsed document. An empty string is returned if no error + * occurred + * during parsing. + * \deprecated Use getFormattedErrorMessages() instead (typo fix). + */ + JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.") + std::string getFormatedErrorMessages() const; + + /** \brief Returns a user friendly string that list errors in the parsed + * document. + * \return Formatted error message with the list of errors with their location + * in + * the parsed document. An empty string is returned if no error + * occurred + * during parsing. + */ + std::string getFormattedErrorMessages() const; + +private: + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + std::string message_; + Location extra_; + }; + + typedef std::deque<ErrorInfo> Errors; + + bool readToken(Token& token); + void skipSpaces(); + bool match(Location pattern, int patternLength); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + void readNumber(); + bool readValue(); + bool readObject(Token& token); + bool readArray(Token& token); + bool decodeNumber(Token& token); + bool decodeNumber(Token& token, Value& decoded); + bool decodeString(Token& token); + bool decodeString(Token& token, std::string& decoded); + bool decodeDouble(Token& token); + bool decodeDouble(Token& token, Value& decoded); + bool decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool addError(const std::string& message, Token& token, Location extra = 0); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const std::string& message, + Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void + getLocationLineAndColumn(Location location, int& line, int& column) const; + std::string getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, CommentPlacement placement); + void skipCommentTokens(Token& token); + + typedef std::stack<Value*> Nodes; + Nodes nodes_; + Errors errors_; + std::string document_; + Location begin_; + Location end_; + Location current_; + Location lastValueEnd_; + Value* lastValue_; + std::string commentsBefore_; + Features features_; + bool collectComments_; +}; // Reader + +/** Interface for reading JSON from a char array. + */ +class JSON_API CharReader { +public: + virtual ~CharReader() {} + /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> + document. + * The document must be a UTF-8 encoded string containing the document to read. + * + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the + document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string of the + document to read. + * Must be >= beginDoc. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param errs [out] Formatted error messages (if not NULL) + * a user friendly string that lists errors in the parsed + * document. + * \return \c true if the document was successfully parsed, \c false if an + error occurred. + */ + virtual bool parse( + char const* beginDoc, char const* endDoc, + Value* root, std::string* errs) = 0; + + class Factory { + public: + virtual ~Factory() {} + /** \brief Allocate a CharReader via operator new(). + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual CharReader* newCharReader() const = 0; + }; // Factory +}; // CharReader + +/** \brief Build a CharReader implementation. + +Usage: +\code + using namespace Json; + CharReaderBuilder builder; + builder["collectComments"] = false; + Value value; + std::string errs; + bool ok = parseFromStream(builder, std::cin, &value, &errs); +\endcode +*/ +class JSON_API CharReaderBuilder : public CharReader::Factory { +public: + // Note: We use a Json::Value so that we can add data-members to this class + // without a major version bump. + /** Configuration of this builder. + These are case-sensitive. + Available settings (case-sensitive): + - `"collectComments": false or true` + - true to collect comment and allow writing them + back during serialization, false to discard comments. + This parameter is ignored if allowComments is false. + - `"allowComments": false or true` + - true if comments are allowed. + - `"strictRoot": false or true` + - true if root must be either an array or an object value + - `"allowDroppedNullPlaceholders": false or true` + - true if dropped null placeholders are allowed. (See StreamWriterBuilder.) + - `"allowNumericKeys": false or true` + - true if numeric object keys are allowed. + - `"allowSingleQuotes": false or true` + - true if '' are allowed for strings (both keys and values) + - `"stackLimit": integer` + - Exceeding stackLimit (recursive depth of `readValue()`) will + cause an exception. + - This is a security issue (seg-faults caused by deeply nested JSON), + so the default is low. + - `"failIfExtra": false or true` + - If true, `parse()` returns false when extra non-whitespace trails + the JSON value in the input string. + - `"rejectDupKeys": false or true` + - If true, `parse()` returns false when a key is duplicated within an object. + - `"allowSpecialFloats": false or true` + - If true, special float values (NaNs and infinities) are allowed + and their values are lossfree restorable. + + You can examine 'settings_` yourself + to see the defaults. You can also write and read them just like any + JSON Value. + \sa setDefaults() + */ + Json::Value settings_; + + CharReaderBuilder(); + virtual ~CharReaderBuilder(); + + virtual CharReader* newCharReader() const; + + /** \return true if 'settings' are legal and consistent; + * otherwise, indicate bad settings via 'invalid'. + */ + bool validate(Json::Value* invalid) const; + + /** A simple way to update a specific setting. + */ + Value& operator[](std::string key); + + /** Called by ctor, but you can use this to reset settings_. + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderDefaults + */ + static void setDefaults(Json::Value* settings); + /** Same as old Features::strictMode(). + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderStrictMode + */ + static void strictMode(Json::Value* settings); +}; + +/** Consume entire stream and use its begin/end. + * Someday we might have a real StreamReader, but for now this + * is convenient. + */ +bool JSON_API parseFromStream( + CharReader::Factory const&, + std::istream&, + Value* root, std::string* errs); + +/** \brief Read from 'sin' into 'root'. + + Always keep comments from the input JSON. + + This can be used to read a file into a particular sub-object. + For example: + \code + Json::Value root; + cin >> root["dir"]["file"]; + cout << root; + \endcode + Result: + \verbatim + { + "dir": { + "file": { + // The input stream JSON would be nested here. + } + } + } + \endverbatim + \throw std::exception on parse error. + \see Json::operator<<() +*/ +JSON_API std::istream& operator>>(std::istream&, Value&); + +} // namespace Json + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // CPPTL_JSON_READER_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/reader.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/writer.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_WRITER_H_INCLUDED +#define JSON_WRITER_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "value.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include <vector> +#include <string> +#include <ostream> + +// Disable warning C4251: <data member>: <type> needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +namespace Json { + +class Value; + +/** + +Usage: +\code + using namespace Json; + void writeToStdout(StreamWriter::Factory const& factory, Value const& value) { + std::unique_ptr<StreamWriter> const writer( + factory.newStreamWriter()); + writer->write(value, &std::cout); + std::cout << std::endl; // add lf and flush + } +\endcode +*/ +class JSON_API StreamWriter { +protected: + std::ostream* sout_; // not owned; will not delete +public: + StreamWriter(); + virtual ~StreamWriter(); + /** Write Value into document as configured in sub-class. + Do not take ownership of sout, but maintain a reference during function. + \pre sout != NULL + \return zero on success (For now, we always return zero, so check the stream instead.) + \throw std::exception possibly, depending on configuration + */ + virtual int write(Value const& root, std::ostream* sout) = 0; + + /** \brief A simple abstract factory. + */ + class JSON_API Factory { + public: + virtual ~Factory(); + /** \brief Allocate a CharReader via operator new(). + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual StreamWriter* newStreamWriter() const = 0; + }; // Factory +}; // StreamWriter + +/** \brief Write into stringstream, then return string, for convenience. + * A StreamWriter will be created from the factory, used, and then deleted. + */ +std::string JSON_API writeString(StreamWriter::Factory const& factory, Value const& root); + + +/** \brief Build a StreamWriter implementation. + +Usage: +\code + using namespace Json; + Value value = ...; + StreamWriterBuilder builder; + builder["commentStyle"] = "None"; + builder["indentation"] = " "; // or whatever you like + std::unique_ptr<Json::StreamWriter> writer( + builder.newStreamWriter()); + writer->write(value, &std::cout); + std::cout << std::endl; // add lf and flush +\endcode +*/ +class JSON_API StreamWriterBuilder : public StreamWriter::Factory { +public: + // Note: We use a Json::Value so that we can add data-members to this class + // without a major version bump. + /** Configuration of this builder. + Available settings (case-sensitive): + - "commentStyle": "None" or "All" + - "indentation": "<anything>" + - "enableYAMLCompatibility": false or true + - slightly change the whitespace around colons + - "dropNullPlaceholders": false or true + - Drop the "null" string from the writer's output for nullValues. + Strictly speaking, this is not valid JSON. But when the output is being + fed to a browser's Javascript, it makes for smaller output and the + browser can handle the output just fine. + - "useSpecialFloats": false or true + - If true, outputs non-finite floating point values in the following way: + NaN values as "NaN", positive infinity as "Infinity", and negative infinity + as "-Infinity". + + You can examine 'settings_` yourself + to see the defaults. You can also write and read them just like any + JSON Value. + \sa setDefaults() + */ + Json::Value settings_; + + StreamWriterBuilder(); + virtual ~StreamWriterBuilder(); + + /** + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual StreamWriter* newStreamWriter() const; + + /** \return true if 'settings' are legal and consistent; + * otherwise, indicate bad settings via 'invalid'. + */ + bool validate(Json::Value* invalid) const; + /** A simple way to update a specific setting. + */ + Value& operator[](std::string key); + + /** Called by ctor, but you can use this to reset settings_. + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_writer.cpp StreamWriterBuilderDefaults + */ + static void setDefaults(Json::Value* settings); +}; + +/** \brief Abstract class for writers. + * \deprecated Use StreamWriter. (And really, this is an implementation detail.) + */ +class JSON_API Writer { +public: + virtual ~Writer(); + + virtual std::string write(const Value& root) = 0; +}; + +/** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format + *without formatting (not human friendly). + * + * The JSON document is written in a single line. It is not intended for 'human' + *consumption, + * but may be usefull to support feature such as RPC where bandwith is limited. + * \sa Reader, Value + * \deprecated Use StreamWriterBuilder. + */ +class JSON_API FastWriter : public Writer { + +public: + FastWriter(); + virtual ~FastWriter() {} + + void enableYAMLCompatibility(); + +public: // overridden from Writer + virtual std::string write(const Value& root); + +private: + void writeValue(const Value& value); + + std::string document_; + bool yamlCompatiblityEnabled_; +}; + +/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a + *human friendly way. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per + *line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value + *types, + * and all the values fit on one lines, then print the array on a single + *line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their + *#CommentPlacement. + * + * \sa Reader, Value, Value::setComment() + * \deprecated Use StreamWriterBuilder. + */ +class JSON_API StyledWriter : public Writer { +public: + StyledWriter(); + virtual ~StyledWriter() {} + +public: // overridden from Writer + /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format. + * \param root Value to serialize. + * \return String containing the JSON document that represents the root value. + */ + virtual std::string write(const Value& root); + +private: + void writeValue(const Value& value); + void writeArrayValue(const Value& value); + bool isMultineArray(const Value& value); + void pushValue(const std::string& value); + void writeIndent(); + void writeWithIndent(const std::string& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(const Value& root); + void writeCommentAfterValueOnSameLine(const Value& root); + bool hasCommentForValue(const Value& value); + static std::string normalizeEOL(const std::string& text); + + typedef std::vector<std::string> ChildValues; + + ChildValues childValues_; + std::string document_; + std::string indentString_; + int rightMargin_; + int indentSize_; + bool addChildValues_; +}; + +/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a + human friendly way, + to a stream rather than to a string. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per + line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value + types, + * and all the values fit on one lines, then print the array on a single + line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their + #CommentPlacement. + * + * \param indentation Each level will be indented by this amount extra. + * \sa Reader, Value, Value::setComment() + * \deprecated Use StreamWriterBuilder. + */ +class JSON_API StyledStreamWriter { +public: + StyledStreamWriter(std::string indentation = "\t"); + ~StyledStreamWriter() {} + +public: + /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format. + * \param out Stream to write to. (Can be ostringstream, e.g.) + * \param root Value to serialize. + * \note There is no point in deriving from Writer, since write() should not + * return a value. + */ + void write(std::ostream& out, const Value& root); + +private: + void writeValue(const Value& value); + void writeArrayValue(const Value& value); + bool isMultineArray(const Value& value); + void pushValue(const std::string& value); + void writeIndent(); + void writeWithIndent(const std::string& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(const Value& root); + void writeCommentAfterValueOnSameLine(const Value& root); + bool hasCommentForValue(const Value& value); + static std::string normalizeEOL(const std::string& text); + + typedef std::vector<std::string> ChildValues; + + ChildValues childValues_; + std::ostream* document_; + std::string indentString_; + int rightMargin_; + std::string indentation_; + bool addChildValues_ : 1; + bool indented_ : 1; +}; + +#if defined(JSON_HAS_INT64) +std::string JSON_API valueToString(Int value); +std::string JSON_API valueToString(UInt value); +#endif // if defined(JSON_HAS_INT64) +std::string JSON_API valueToString(LargestInt value); +std::string JSON_API valueToString(LargestUInt value); +std::string JSON_API valueToString(double value); +std::string JSON_API valueToString(bool value); +std::string JSON_API valueToQuotedString(const char* value); + +/// \brief Output using the StyledStreamWriter. +/// \see Json::operator>>() +JSON_API std::ostream& operator<<(std::ostream&, const Value& root); + +} // namespace Json + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // JSON_WRITER_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/writer.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/assertions.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED +#define CPPTL_JSON_ASSERTIONS_H_INCLUDED + +#include <stdlib.h> +#include <sstream> + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +/** It should not be possible for a maliciously designed file to + * cause an abort() or seg-fault, so these macros are used only + * for pre-condition violations and internal logic errors. + */ +#if JSON_USE_EXCEPTION + +// @todo <= add detail about condition in exception +# define JSON_ASSERT(condition) \ + {if (!(condition)) {Json::throwLogicError( "assert json failed" );}} + +# define JSON_FAIL_MESSAGE(message) \ + { \ + std::ostringstream oss; oss << message; \ + Json::throwLogicError(oss.str()); \ + abort(); \ + } + +#else // JSON_USE_EXCEPTION + +# define JSON_ASSERT(condition) assert(condition) + +// The call to assert() will show the failure message in debug builds. In +// release builds we abort, for a core-dump or debugger. +# define JSON_FAIL_MESSAGE(message) \ + { \ + std::ostringstream oss; oss << message; \ + assert(false && oss.str().c_str()); \ + abort(); \ + } + + +#endif + +#define JSON_ASSERT_MESSAGE(condition, message) \ + if (!(condition)) { \ + JSON_FAIL_MESSAGE(message); \ + } + +#endif // CPPTL_JSON_ASSERTIONS_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/assertions.h +// ////////////////////////////////////////////////////////////////////// + + + + + +#endif //ifndef JSON_AMALGATED_H_INCLUDED diff --git a/lib/jsoncpp/jsoncpp.cpp b/lib/jsoncpp/jsoncpp.cpp new file mode 100644 index 000000000..618191612 --- /dev/null +++ b/lib/jsoncpp/jsoncpp.cpp @@ -0,0 +1,4937 @@ +/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json.h" + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +The author (Baptiste Lepilleur) explicitly disclaims copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is +released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + + +#include "json/json.h" + +#ifndef JSON_IS_AMALGAMATION +#error "Compile with -I PATH_TO_JSON_DIRECTORY" +#endif + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_tool.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED +#define LIB_JSONCPP_JSON_TOOL_H_INCLUDED + +/* This header provides common string manipulation support, such as UTF-8, + * portable conversion from/to string... + * + * It is an internal header that must not be exposed. + */ + +namespace Json { + +/// Converts a unicode code-point to UTF-8. +static inline std::string codePointToUTF8(unsigned int cp) { + std::string result; + + // based on description from http://en.wikipedia.org/wiki/UTF-8 + + if (cp <= 0x7f) { + result.resize(1); + result[0] = static_cast<char>(cp); + } else if (cp <= 0x7FF) { + result.resize(2); + result[1] = static_cast<char>(0x80 | (0x3f & cp)); + result[0] = static_cast<char>(0xC0 | (0x1f & (cp >> 6))); + } else if (cp <= 0xFFFF) { + result.resize(3); + result[2] = static_cast<char>(0x80 | (0x3f & cp)); + result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 6))); + result[0] = static_cast<char>(0xE0 | (0xf & (cp >> 12))); + } else if (cp <= 0x10FFFF) { + result.resize(4); + result[3] = static_cast<char>(0x80 | (0x3f & cp)); + result[2] = static_cast<char>(0x80 | (0x3f & (cp >> 6))); + result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 12))); + result[0] = static_cast<char>(0xF0 | (0x7 & (cp >> 18))); + } + + return result; +} + +/// Returns true if ch is a control character (in range [1,31]). +static inline bool isControlCharacter(char ch) { return ch > 0 && ch <= 0x1F; } + +enum { + /// Constant that specify the size of the buffer that must be passed to + /// uintToString. + uintToStringBufferSize = 3 * sizeof(LargestUInt) + 1 +}; + +// Defines a char buffer for use with uintToString(). +typedef char UIntToStringBuffer[uintToStringBufferSize]; + +/** Converts an unsigned integer to string. + * @param value Unsigned interger to convert to string + * @param current Input/Output string buffer. + * Must have at least uintToStringBufferSize chars free. + */ +static inline void uintToString(LargestUInt value, char*& current) { + *--current = 0; + do { + *--current = static_cast<signed char>(value % 10U + static_cast<unsigned>('0')); + value /= 10; + } while (value != 0); +} + +/** Change ',' to '.' everywhere in buffer. + * + * We had a sophisticated way, but it did not work in WinCE. + * @see https://github.com/open-source-parsers/jsoncpp/pull/9 + */ +static inline void fixNumericLocale(char* begin, char* end) { + while (begin < end) { + if (*begin == ',') { + *begin = '.'; + } + ++begin; + } +} + +} // namespace Json { + +#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_tool.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_reader.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2011 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include <json/assertions.h> +#include <json/reader.h> +#include <json/value.h> +#include "json_tool.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include <utility> +#include <cstdio> +#include <cassert> +#include <cstring> +#include <istream> +#include <sstream> +#include <memory> +#include <set> +#include <limits> + +#if defined(_MSC_VER) +#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above +#define snprintf sprintf_s +#elif _MSC_VER >= 1900 // VC++ 14.0 and above +#define snprintf std::snprintf +#else +#define snprintf _snprintf +#endif +#elif defined(__ANDROID__) +#define snprintf snprintf +#elif __cplusplus >= 201103L +#define snprintf std::snprintf +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +static int const stackLimit_g = 1000; +static int stackDepth_g = 0; // see readValue() + +namespace Json { + +typedef std::auto_ptr<CharReader> CharReaderPtr; + +// Implementation of class Features +// //////////////////////////////// + +Features::Features() + : allowComments_(true), strictRoot_(false) +{} +Features Features::all() { return Features(); } + +Features Features::strictMode() { + Features features; + features.allowComments_ = false; + features.strictRoot_ = true; + return features; +} + +// Implementation of class Reader +// //////////////////////////////// + +static bool containsNewLine(Reader::Location begin, Reader::Location end) { + for (; begin < end; ++begin) + if (*begin == '\n' || *begin == '\r') + return true; + return false; +} + +// Class Reader +// ////////////////////////////////////////////////////////////////// + +Reader::Reader() + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(Features::all()), + collectComments_() {} + +Reader::Reader(const Features& features) + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(features), collectComments_() { +} + +bool +Reader::parse(const std::string& document, Value& root, bool collectComments) { + document_ = document; + const char* begin = document_.c_str(); + const char* end = begin + document_.length(); + return parse(begin, end, root, collectComments); +} + +bool Reader::parse(std::istream& sin, Value& root, bool collectComments) { + // std::istream_iterator<char> begin(sin); + // std::istream_iterator<char> end; + // Those would allow streamed input from a file, if parse() were a + // template function. + + // Since std::string is reference-counted, this at least does not + // create an extra copy. + std::string doc; + std::getline(sin, doc, (char)EOF); + return parse(doc, root, collectComments); +} + +bool Reader::parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = 0; + lastValue_ = 0; + commentsBefore_ = ""; + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + stackDepth_g = 0; // Yes, this is bad coding, but options are limited. + bool successful = readValue(); + Token token; + skipCommentTokens(token); + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool Reader::readValue() { + // This is a non-reentrant way to support a stackLimit. Terrible! + // But this deprecated class has a security problem: Bad input can + // cause a seg-fault. This seems like a fair, binary-compatible way + // to prevent the problem. + if (stackDepth_g >= stackLimit_g) throwRuntimeError("Exceeded stackLimit in readValue()."); + ++stackDepth_g; + + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_ = ""; + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + break; + case tokenArrayBegin: + successful = readArray(token); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: + { + Value v(true); + currentValue().swapPayload(v); + } + break; + case tokenFalse: + { + Value v(false); + currentValue().swapPayload(v); + } + break; + case tokenNull: + { + Value v; + currentValue().swapPayload(v); + } + break; + // Else, fall through... + default: + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + --stackDepth_g; + return successful; +} + +void Reader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool Reader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + token.type_ = tokenNumber; + readNumber(); + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + +void Reader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +bool Reader::match(Location pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool Reader::readComment() { + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if (c == '*') + successful = readCStyleComment(); + else if (c == '/') + successful = readCppStyleComment(); + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (c != '*' || !containsNewLine(commentBegin, current_)) + placement = commentAfterOnSameLine; + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +static std::string normalizeEOL(Reader::Location begin, Reader::Location end) { + std::string normalized; + normalized.reserve(end - begin); + Reader::Location current = begin; + while (current != end) { + char c = *current++; + if (c == '\r') { + if (current != end && *current == '\n') + // convert dos EOL + ++current; + // convert Mac EOL + normalized += '\n'; + } else { + normalized += c; + } + } + return normalized; +} + +void +Reader::addComment(Location begin, Location end, CommentPlacement placement) { + assert(collectComments_); + const std::string& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != 0); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool Reader::readCStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + } + return getNextChar() == '/'; +} + +bool Reader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +void Reader::readNumber() { + const char *p = current_; + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : 0; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } +} + +bool Reader::readString() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + +bool Reader::readObject(Token& /*tokenStart*/) { + Token tokenName; + std::string name; + Value init(objectValue); + currentValue().swapPayload(init); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + return true; + name = ""; + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else { + break; + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover( + "Missing ':' after object member name", colon, tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover( + "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover( + "Missing '}' or object member name", tokenName, tokenObjectEnd); +} + +bool Reader::readArray(Token& /*tokenStart*/) { + Value init(arrayValue); + currentValue().swapPayload(init); + skipSpaces(); + if (*current_ == ']') // empty array + { + Token endArray; + readToken(endArray); + return true; + } + int index = 0; + for (;;) { + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token token; + // Accept Comment after last item in the array. + ok = readToken(token); + while (token.type_ == tokenComment && ok) { + ok = readToken(token); + } + bool badTokenType = + (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover( + "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + } + if (token.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool Reader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + return true; +} + +bool Reader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + bool isNegative = *current == '-'; + if (isNegative) + ++current; + // TODO: Help the compiler do the div and mod at compile time or get rid of them. + Value::LargestUInt maxIntegerValue = + isNegative ? Value::LargestUInt(Value::maxLargestInt) + 1 + : Value::maxLargestUInt; + Value::LargestUInt threshold = maxIntegerValue / 10; + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + Value::UInt digit(c - '0'); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, b) this is the last digit, and + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > maxIntegerValue % 10) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + if (isNegative && value == maxIntegerValue) + decoded = Value::minLargestInt; + else if (isNegative) + decoded = -Value::LargestInt(value); + else if (value <= Value::LargestUInt(Value::maxInt)) + decoded = Value::LargestInt(value); + else + decoded = value; + return true; +} + +bool Reader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + return true; +} + +bool Reader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + std::string buffer(token.start_, token.end_); + std::istringstream is(buffer); + if (!(is >> value)) + return addError("'" + std::string(token.start_, token.end_) + + "' is not a number.", + token); + decoded = value; + return true; +} + +bool Reader::decodeString(Token& token) { + std::string decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + return true; +} + +bool Reader::decodeString(Token& token, std::string& decoded) { + decoded.reserve(token.end_ - token.start_ - 2); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + else if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool Reader::decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, + current); + unsigned int surrogatePair; + if (*(current++) == '\\' && *(current++) == 'u') { + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, + current); + } + return true; +} + +bool Reader::decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", + token, + current); + unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, + current); + } + return true; +} + +bool +Reader::addError(const std::string& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool Reader::recoverFromError(TokenType skipUntilToken) { + int errorCount = int(errors_.size()); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool Reader::addErrorAndRecover(const std::string& message, + Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& Reader::currentValue() { return *(nodes_.top()); } + +Reader::Char Reader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void Reader::getLocationLineAndColumn(Location location, + int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +std::string Reader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; + snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + return buffer; +} + +// Deprecated. Preserved for backward compatibility +std::string Reader::getFormatedErrorMessages() const { + return getFormattedErrorMessages(); +} + +std::string Reader::getFormattedErrorMessages() const { + std::string formattedMessage; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + +// Reader +///////////////////////// + +// exact copy of Features +class OurFeatures { +public: + static OurFeatures all(); + OurFeatures(); + bool allowComments_; + bool strictRoot_; + bool allowDroppedNullPlaceholders_; + bool allowNumericKeys_; + bool allowSingleQuotes_; + bool failIfExtra_; + bool rejectDupKeys_; + bool allowSpecialFloats_; + int stackLimit_; +}; // OurFeatures + +// exact copy of Implementation of class Features +// //////////////////////////////// + +OurFeatures::OurFeatures() + : allowComments_(true), strictRoot_(false) + , allowDroppedNullPlaceholders_(false), allowNumericKeys_(false) + , allowSingleQuotes_(false) + , failIfExtra_(false) + , allowSpecialFloats_(false) +{ +} + +OurFeatures OurFeatures::all() { return OurFeatures(); } + +// Implementation of class Reader +// //////////////////////////////// + +// exact copy of Reader, renamed to OurReader +class OurReader { +public: + typedef char Char; + typedef const Char* Location; + struct StructuredError { + size_t offset_start; + size_t offset_limit; + std::string message; + }; + + OurReader(OurFeatures const& features); + bool parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments = true); + std::string getFormattedErrorMessages() const; + +private: + OurReader(OurReader const&); // no impl + void operator=(OurReader const&); // no impl + + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenNaN, + tokenPosInf, + tokenNegInf, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + std::string message_; + Location extra_; + }; + + typedef std::deque<ErrorInfo> Errors; + + bool readToken(Token& token); + void skipSpaces(); + bool match(Location pattern, int patternLength); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + bool readStringSingleQuote(); + bool readNumber(bool checkInf); + bool readValue(); + bool readObject(Token& token); + bool readArray(Token& token); + bool decodeNumber(Token& token); + bool decodeNumber(Token& token, Value& decoded); + bool decodeString(Token& token); + bool decodeString(Token& token, std::string& decoded); + bool decodeDouble(Token& token); + bool decodeDouble(Token& token, Value& decoded); + bool decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool addError(const std::string& message, Token& token, Location extra = 0); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const std::string& message, + Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void + getLocationLineAndColumn(Location location, int& line, int& column) const; + std::string getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, CommentPlacement placement); + void skipCommentTokens(Token& token); + + typedef std::stack<Value*> Nodes; + Nodes nodes_; + Errors errors_; + std::string document_; + Location begin_; + Location end_; + Location current_; + Location lastValueEnd_; + Value* lastValue_; + std::string commentsBefore_; + int stackDepth_; + + OurFeatures const features_; + bool collectComments_; +}; // OurReader + +// complete copy of Read impl, for OurReader + +OurReader::OurReader(OurFeatures const& features) + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(features), collectComments_() { +} + +bool OurReader::parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = 0; + lastValue_ = 0; + commentsBefore_ = ""; + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + stackDepth_ = 0; + bool successful = readValue(); + Token token; + skipCommentTokens(token); + if (features_.failIfExtra_) { + if (token.type_ != tokenError && token.type_ != tokenEndOfStream) { + addError("Extra non-whitespace after JSON value.", token); + return false; + } + } + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool OurReader::readValue() { + if (stackDepth_ >= features_.stackLimit_) throwRuntimeError("Exceeded stackLimit in readValue()."); + ++stackDepth_; + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_ = ""; + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + break; + case tokenArrayBegin: + successful = readArray(token); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: + { + Value v(true); + currentValue().swapPayload(v); + } + break; + case tokenFalse: + { + Value v(false); + currentValue().swapPayload(v); + } + break; + case tokenNull: + { + Value v; + currentValue().swapPayload(v); + } + break; + case tokenNaN: + { + Value v(std::numeric_limits<double>::quiet_NaN()); + currentValue().swapPayload(v); + } + break; + case tokenPosInf: + { + Value v(std::numeric_limits<double>::infinity()); + currentValue().swapPayload(v); + } + break; + case tokenNegInf: + { + Value v(-std::numeric_limits<double>::infinity()); + currentValue().swapPayload(v); + } + break; + case tokenArraySeparator: + case tokenObjectEnd: + case tokenArrayEnd: + if (features_.allowDroppedNullPlaceholders_) { + // "Un-read" the current token and mark the current value as a null + // token. + current_--; + Value v; + currentValue().swapPayload(v); + break; + } // else, fall through ... + default: + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + --stackDepth_; + return successful; +} + +void OurReader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool OurReader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '\'': + if (features_.allowSingleQuotes_) { + token.type_ = tokenString; + ok = readStringSingleQuote(); + break; + } // else continue + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + token.type_ = tokenNumber; + readNumber(false); + break; + case '-': + if (readNumber(true)) { + token.type_ = tokenNumber; + } else { + token.type_ = tokenNegInf; + ok = features_.allowSpecialFloats_ && match("nfinity", 7); + } + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case 'N': + if (features_.allowSpecialFloats_) { + token.type_ = tokenNaN; + ok = match("aN", 2); + } else { + ok = false; + } + break; + case 'I': + if (features_.allowSpecialFloats_) { + token.type_ = tokenPosInf; + ok = match("nfinity", 7); + } else { + ok = false; + } + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + +void OurReader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +bool OurReader::match(Location pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool OurReader::readComment() { + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if (c == '*') + successful = readCStyleComment(); + else if (c == '/') + successful = readCppStyleComment(); + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (c != '*' || !containsNewLine(commentBegin, current_)) + placement = commentAfterOnSameLine; + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +void +OurReader::addComment(Location begin, Location end, CommentPlacement placement) { + assert(collectComments_); + const std::string& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != 0); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool OurReader::readCStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + } + return getNextChar() == '/'; +} + +bool OurReader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +bool OurReader::readNumber(bool checkInf) { + const char *p = current_; + if (checkInf && p != end_ && *p == 'I') { + current_ = ++p; + return false; + } + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : 0; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } + return true; +} +bool OurReader::readString() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + + +bool OurReader::readStringSingleQuote() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '\'') + break; + } + return c == '\''; +} + +bool OurReader::readObject(Token& /*tokenStart*/) { + Token tokenName; + std::string name; + Value init(objectValue); + currentValue().swapPayload(init); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + return true; + name = ""; + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { + Value numberName; + if (!decodeNumber(tokenName, numberName)) + return recoverFromError(tokenObjectEnd); + name = numberName.asString(); + } else { + break; + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover( + "Missing ':' after object member name", colon, tokenObjectEnd); + } + if (name.length() >= (1U<<30)) throwRuntimeError("keylength >= 2^30"); + if (features_.rejectDupKeys_ && currentValue().isMember(name)) { + std::string msg = "Duplicate key: '" + name + "'"; + return addErrorAndRecover( + msg, tokenName, tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover( + "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover( + "Missing '}' or object member name", tokenName, tokenObjectEnd); +} + +bool OurReader::readArray(Token& /*tokenStart*/) { + Value init(arrayValue); + currentValue().swapPayload(init); + skipSpaces(); + if (*current_ == ']') // empty array + { + Token endArray; + readToken(endArray); + return true; + } + int index = 0; + for (;;) { + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token token; + // Accept Comment after last item in the array. + ok = readToken(token); + while (token.type_ == tokenComment && ok) { + ok = readToken(token); + } + bool badTokenType = + (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover( + "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + } + if (token.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool OurReader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + return true; +} + +bool OurReader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + bool isNegative = *current == '-'; + if (isNegative) + ++current; + // TODO: Help the compiler do the div and mod at compile time or get rid of them. + Value::LargestUInt maxIntegerValue = + isNegative ? Value::LargestUInt(-Value::minLargestInt) + : Value::maxLargestUInt; + Value::LargestUInt threshold = maxIntegerValue / 10; + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + Value::UInt digit(c - '0'); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, b) this is the last digit, and + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > maxIntegerValue % 10) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + if (isNegative) + decoded = -Value::LargestInt(value); + else if (value <= Value::LargestUInt(Value::maxInt)) + decoded = Value::LargestInt(value); + else + decoded = value; + return true; +} + +bool OurReader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + return true; +} + +bool OurReader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + std::string buffer( token.start_, token.end_ ); + std::istringstream is(buffer); + if (!(is >> value)) + return addError("'" + std::string(token.start_, token.end_) + + "' is not a number.", + token); + decoded = value; + return true; +} + +bool OurReader::decodeString(Token& token) { + std::string decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + return true; +} + +bool OurReader::decodeString(Token& token, std::string& decoded) { + decoded.reserve(token.end_ - token.start_ - 2); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + else if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool OurReader::decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, + current); + unsigned int surrogatePair; + if (*(current++) == '\\' && *(current++) == 'u') { + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, + current); + } + return true; +} + +bool OurReader::decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", + token, + current); + unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, + current); + } + return true; +} + +bool +OurReader::addError(const std::string& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool OurReader::recoverFromError(TokenType skipUntilToken) { + int errorCount = int(errors_.size()); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool OurReader::addErrorAndRecover(const std::string& message, + Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& OurReader::currentValue() { return *(nodes_.top()); } + +OurReader::Char OurReader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void OurReader::getLocationLineAndColumn(Location location, + int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +std::string OurReader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; + snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + return buffer; +} + +std::string OurReader::getFormattedErrorMessages() const { + std::string formattedMessage; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + + +class OurCharReader : public CharReader { + bool const collectComments_; + OurReader reader_; +public: + OurCharReader( + bool collectComments, + OurFeatures const& features) + : collectComments_(collectComments) + , reader_(features) + {} + virtual bool parse( + char const* beginDoc, char const* endDoc, + Value* root, std::string* errs) { + bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_); + if (errs) { + *errs = reader_.getFormattedErrorMessages(); + } + return ok; + } +}; + +CharReaderBuilder::CharReaderBuilder() +{ + setDefaults(&settings_); +} +CharReaderBuilder::~CharReaderBuilder() +{} +CharReader* CharReaderBuilder::newCharReader() const +{ + bool collectComments = settings_["collectComments"].asBool(); + OurFeatures features = OurFeatures::all(); + features.allowComments_ = settings_["allowComments"].asBool(); + features.strictRoot_ = settings_["strictRoot"].asBool(); + features.allowDroppedNullPlaceholders_ = settings_["allowDroppedNullPlaceholders"].asBool(); + features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool(); + features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool(); + features.stackLimit_ = settings_["stackLimit"].asInt(); + features.failIfExtra_ = settings_["failIfExtra"].asBool(); + features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool(); + features.allowSpecialFloats_ = settings_["allowSpecialFloats"].asBool(); + return new OurCharReader(collectComments, features); +} +static void getValidReaderKeys(std::set<std::string>* valid_keys) +{ + valid_keys->clear(); + valid_keys->insert("collectComments"); + valid_keys->insert("allowComments"); + valid_keys->insert("strictRoot"); + valid_keys->insert("allowDroppedNullPlaceholders"); + valid_keys->insert("allowNumericKeys"); + valid_keys->insert("allowSingleQuotes"); + valid_keys->insert("stackLimit"); + valid_keys->insert("failIfExtra"); + valid_keys->insert("rejectDupKeys"); + valid_keys->insert("allowSpecialFloats"); +} +bool CharReaderBuilder::validate(Json::Value* invalid) const +{ + Json::Value my_invalid; + if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL + Json::Value& inv = *invalid; + std::set<std::string> valid_keys; + getValidReaderKeys(&valid_keys); + Value::Members keys = settings_.getMemberNames(); + size_t n = keys.size(); + for (size_t i = 0; i < n; ++i) { + std::string const& key = keys[i]; + if (valid_keys.find(key) == valid_keys.end()) { + inv[key] = settings_[key]; + } + } + return 0u == inv.size(); +} +Value& CharReaderBuilder::operator[](std::string key) +{ + return settings_[key]; +} +// static +void CharReaderBuilder::strictMode(Json::Value* settings) +{ +//! [CharReaderBuilderStrictMode] + (*settings)["allowComments"] = false; + (*settings)["strictRoot"] = true; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["failIfExtra"] = true; + (*settings)["rejectDupKeys"] = true; + (*settings)["allowSpecialFloats"] = false; +//! [CharReaderBuilderStrictMode] +} +// static +void CharReaderBuilder::setDefaults(Json::Value* settings) +{ +//! [CharReaderBuilderDefaults] + (*settings)["collectComments"] = true; + (*settings)["allowComments"] = true; + (*settings)["strictRoot"] = false; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["stackLimit"] = 1000; + (*settings)["failIfExtra"] = false; + (*settings)["rejectDupKeys"] = false; + (*settings)["allowSpecialFloats"] = false; +//! [CharReaderBuilderDefaults] +} + +////////////////////////////////// +// global functions + +bool parseFromStream( + CharReader::Factory const& fact, std::istream& sin, + Value* root, std::string* errs) +{ + std::ostringstream ssin; + ssin << sin.rdbuf(); + std::string doc = ssin.str(); + char const* begin = doc.data(); + char const* end = begin + doc.size(); + // Note that we do not actually need a null-terminator. + CharReaderPtr const reader(fact.newCharReader()); + return reader->parse(begin, end, root, errs); +} + +std::istream& operator>>(std::istream& sin, Value& root) { + CharReaderBuilder b; + std::string errs; + bool ok = parseFromStream(b, sin, &root, &errs); + if (!ok) { + fprintf(stderr, + "Error from reader: %s", + errs.c_str()); + + throwRuntimeError("reader error"); + } + return sin; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_reader.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_valueiterator.inl +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +// included by json_value.cpp + +namespace Json { + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIteratorBase +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIteratorBase::ValueIteratorBase() + : current_(), isNull_(true) { +} + +ValueIteratorBase::ValueIteratorBase( + const Value::ObjectValues::iterator& current) + : current_(current), isNull_(false) {} + +Value& ValueIteratorBase::deref() const { + return current_->second; +} + +void ValueIteratorBase::increment() { + ++current_; +} + +void ValueIteratorBase::decrement() { + --current_; +} + +ValueIteratorBase::difference_type +ValueIteratorBase::computeDistance(const SelfType& other) const { +#ifdef JSON_USE_CPPTL_SMALLMAP + return other.current_ - current_; +#else + // Iterator for null value are initialized using the default + // constructor, which initialize current_ to the default + // std::map::iterator. As begin() and end() are two instance + // of the default std::map::iterator, they can not be compared. + // To allow this, we handle this comparison specifically. + if (isNull_ && other.isNull_) { + return 0; + } + + // Usage of std::distance is not portable (does not compile with Sun Studio 12 + // RogueWave STL, + // which is the one used by default). + // Using a portable hand-made version for non random iterator instead: + // return difference_type( std::distance( current_, other.current_ ) ); + difference_type myDistance = 0; + for (Value::ObjectValues::iterator it = current_; it != other.current_; + ++it) { + ++myDistance; + } + return myDistance; +#endif +} + +bool ValueIteratorBase::isEqual(const SelfType& other) const { + if (isNull_) { + return other.isNull_; + } + return current_ == other.current_; +} + +void ValueIteratorBase::copy(const SelfType& other) { + current_ = other.current_; + isNull_ = other.isNull_; +} + +Value ValueIteratorBase::key() const { + const Value::CZString czstring = (*current_).first; + if (czstring.data()) { + if (czstring.isStaticString()) + return Value(StaticString(czstring.data())); + return Value(czstring.data(), czstring.data() + czstring.length()); + } + return Value(czstring.index()); +} + +UInt ValueIteratorBase::index() const { + const Value::CZString czstring = (*current_).first; + if (!czstring.data()) + return czstring.index(); + return Value::UInt(-1); +} + +std::string ValueIteratorBase::name() const { + char const* keey; + char const* end; + keey = memberName(&end); + if (!keey) return std::string(); + return std::string(keey, end); +} + +char const* ValueIteratorBase::memberName() const { + const char* cname = (*current_).first.data(); + return cname ? cname : ""; +} + +char const* ValueIteratorBase::memberName(char const** end) const { + const char* cname = (*current_).first.data(); + if (!cname) { + *end = NULL; + return NULL; + } + *end = cname + (*current_).first.length(); + return cname; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueConstIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueConstIterator::ValueConstIterator() {} + +ValueConstIterator::ValueConstIterator( + const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueConstIterator& ValueConstIterator:: +operator=(const ValueIteratorBase& other) { + copy(other); + return *this; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIterator::ValueIterator() {} + +ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueIterator::ValueIterator(const ValueConstIterator& other) + : ValueIteratorBase(other) {} + +ValueIterator::ValueIterator(const ValueIterator& other) + : ValueIteratorBase(other) {} + +ValueIterator& ValueIterator::operator=(const SelfType& other) { + copy(other); + return *this; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_valueiterator.inl +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_value.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2011 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include <json/assertions.h> +#include <json/value.h> +#include <json/writer.h> +#endif // if !defined(JSON_IS_AMALGAMATION) +#include <math.h> +#include <sstream> +#include <utility> +#include <cstring> +#include <cassert> +#ifdef JSON_USE_CPPTL +#include <cpptl/conststring.h> +#endif +#include <cstddef> // size_t +#include <algorithm> // min() + +#define JSON_ASSERT_UNREACHABLE assert(false) + +namespace Json { + +// This is a walkaround to avoid the static initialization of Value::null. +// kNull must be word-aligned to avoid crashing on ARM. We use an alignment of +// 8 (instead of 4) as a bit of future-proofing. +#if defined(__ARMEL__) +#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#else +// This exists for binary compatibility only. Use nullRef. +const Value Value::null; +#define ALIGNAS(byte_alignment) +#endif +static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = { 0 }; +const unsigned char& kNullRef = kNull[0]; +const Value& Value::nullRef = reinterpret_cast<const Value&>(kNullRef); + +const Int Value::minInt = Int(~(UInt(-1) / 2)); +const Int Value::maxInt = Int(UInt(-1) / 2); +const UInt Value::maxUInt = UInt(-1); +#if defined(JSON_HAS_INT64) +const Int64 Value::minInt64 = Int64(~(UInt64(-1) / 2)); +const Int64 Value::maxInt64 = Int64(UInt64(-1) / 2); +const UInt64 Value::maxUInt64 = UInt64(-1); +// The constant is hard-coded because some compiler have trouble +// converting Value::maxUInt64 to a double correctly (AIX/xlC). +// Assumes that UInt64 is a 64 bits integer. +static const double maxUInt64AsDouble = 18446744073709551615.0; +#endif // defined(JSON_HAS_INT64) +const LargestInt Value::minLargestInt = LargestInt(~(LargestUInt(-1) / 2)); +const LargestInt Value::maxLargestInt = LargestInt(LargestUInt(-1) / 2); +const LargestUInt Value::maxLargestUInt = LargestUInt(-1); + +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +template <typename T, typename U> +static inline bool InRange(double d, T min, U max) { + return d >= min && d <= max; +} +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +static inline double integerToDouble(Json::UInt64 value) { + return static_cast<double>(Int64(value / 2)) * 2.0 + Int64(value & 1); +} + +template <typename T> static inline double integerToDouble(T value) { + return static_cast<double>(value); +} + +template <typename T, typename U> +static inline bool InRange(double d, T min, U max) { + return d >= integerToDouble(min) && d <= integerToDouble(max); +} +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + +/** Duplicates the specified string value. + * @param value Pointer to the string to duplicate. Must be zero-terminated if + * length is "unknown". + * @param length Length of the value. if equals to unknown, then it will be + * computed using strlen(value). + * @return Pointer on the duplicate instance of string. + */ +static inline char* duplicateStringValue(const char* value, + size_t length) { + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + if (length >= (size_t)Value::maxInt) + length = Value::maxInt - 1; + + char* newString = static_cast<char*>(malloc(length + 1)); + if (newString == NULL) { + throwRuntimeError( + "in Json::Value::duplicateStringValue(): " + "Failed to allocate string value buffer"); + } + memcpy(newString, value, length); + newString[length] = 0; + return newString; +} + +/* Record the length as a prefix. + */ +static inline char* duplicateAndPrefixStringValue( + const char* value, + unsigned int length) +{ + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + JSON_ASSERT_MESSAGE(length <= (unsigned)Value::maxInt - sizeof(unsigned) - 1U, + "in Json::Value::duplicateAndPrefixStringValue(): " + "length too big for prefixing"); + unsigned actualLength = length + static_cast<unsigned>(sizeof(unsigned)) + 1U; + char* newString = static_cast<char*>(malloc(actualLength)); + if (newString == 0) { + throwRuntimeError( + "in Json::Value::duplicateAndPrefixStringValue(): " + "Failed to allocate string value buffer"); + } + *reinterpret_cast<unsigned*>(newString) = length; + memcpy(newString + sizeof(unsigned), value, length); + newString[actualLength - 1U] = 0; // to avoid buffer over-run accidents by users later + return newString; +} +inline static void decodePrefixedString( + bool isPrefixed, char const* prefixed, + unsigned* length, char const** value) +{ + if (!isPrefixed) { + *length = static_cast<unsigned>(strlen(prefixed)); + *value = prefixed; + } else { + *length = *reinterpret_cast<unsigned const*>(prefixed); + *value = prefixed + sizeof(unsigned); + } +} +/** Free the string duplicated by duplicateStringValue()/duplicateAndPrefixStringValue(). + */ +static inline void releaseStringValue(char* value) { free(value); } + +} // namespace Json + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ValueInternals... +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +#if !defined(JSON_IS_AMALGAMATION) + +#include "json_valueiterator.inl" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +Exception::Exception(std::string const& msg) + : msg_(msg) +{} +Exception::~Exception() throw() +{} +char const* Exception::what() const throw() +{ + return msg_.c_str(); +} +RuntimeError::RuntimeError(std::string const& msg) + : Exception(msg) +{} +LogicError::LogicError(std::string const& msg) + : Exception(msg) +{} +JSONCPP_NORETURN void throwRuntimeError(std::string const& msg) +{ + throw RuntimeError(msg); +} +JSONCPP_NORETURN void throwLogicError(std::string const& msg) +{ + throw LogicError(msg); +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CommentInfo +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +Value::CommentInfo::CommentInfo() : comment_(0) {} + +Value::CommentInfo::~CommentInfo() { + if (comment_) + releaseStringValue(comment_); +} + +void Value::CommentInfo::setComment(const char* text, size_t len) { + if (comment_) { + releaseStringValue(comment_); + comment_ = 0; + } + JSON_ASSERT(text != 0); + JSON_ASSERT_MESSAGE( + text[0] == '\0' || text[0] == '/', + "in Json::Value::setComment(): Comments must start with /"); + // It seems that /**/ style comments are acceptable as well. + comment_ = duplicateStringValue(text, len); +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CZString +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +// Notes: policy_ indicates if the string was allocated when +// a string is stored. + +Value::CZString::CZString(ArrayIndex aindex) : cstr_(0), index_(aindex) {} + +Value::CZString::CZString(char const* str, unsigned ulength, DuplicationPolicy allocate) + : cstr_(str) +{ + // allocate != duplicate + storage_.policy_ = allocate & 0x3; + storage_.length_ = ulength & 0x3FFFFFFF; +} + +Value::CZString::CZString(const CZString& other) + : cstr_(other.storage_.policy_ != noDuplication && other.cstr_ != 0 + ? duplicateStringValue(other.cstr_, other.storage_.length_) + : other.cstr_) +{ + storage_.policy_ = (other.cstr_ + ? (static_cast<DuplicationPolicy>(other.storage_.policy_) == noDuplication + ? noDuplication : duplicate) + : static_cast<DuplicationPolicy>(other.storage_.policy_)); + storage_.length_ = other.storage_.length_; +} + +Value::CZString::~CZString() { + if (cstr_ && storage_.policy_ == duplicate) + releaseStringValue(const_cast<char*>(cstr_)); +} + +void Value::CZString::swap(CZString& other) { + std::swap(cstr_, other.cstr_); + std::swap(index_, other.index_); +} + +Value::CZString& Value::CZString::operator=(CZString other) { + swap(other); + return *this; +} + +bool Value::CZString::operator<(const CZString& other) const { + if (!cstr_) return index_ < other.index_; + //return strcmp(cstr_, other.cstr_) < 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + unsigned min_len = std::min(this_len, other_len); + int comp = memcmp(this->cstr_, other.cstr_, min_len); + if (comp < 0) return true; + if (comp > 0) return false; + return (this_len < other_len); +} + +bool Value::CZString::operator==(const CZString& other) const { + if (!cstr_) return index_ == other.index_; + //return strcmp(cstr_, other.cstr_) == 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + if (this_len != other_len) return false; + int comp = memcmp(this->cstr_, other.cstr_, this_len); + return comp == 0; +} + +ArrayIndex Value::CZString::index() const { return index_; } + +//const char* Value::CZString::c_str() const { return cstr_; } +const char* Value::CZString::data() const { return cstr_; } +unsigned Value::CZString::length() const { return storage_.length_; } +bool Value::CZString::isStaticString() const { return storage_.policy_ == noDuplication; } + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::Value +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +/*! \internal Default constructor initialization must be equivalent to: + * memset( this, 0, sizeof(Value) ) + * This optimization is used in ValueInternalMap fast allocator. + */ +Value::Value(ValueType vtype) { + initBasic(vtype); + switch (vtype) { + case nullValue: + break; + case intValue: + case uintValue: + value_.int_ = 0; + break; + case realValue: + value_.real_ = 0.0; + break; + case stringValue: + value_.string_ = 0; + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(); + break; + case booleanValue: + value_.bool_ = false; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +Value::Value(Int value) { + initBasic(intValue); + value_.int_ = value; +} + +Value::Value(UInt value) { + initBasic(uintValue); + value_.uint_ = value; +} +#if defined(JSON_HAS_INT64) +Value::Value(Int64 value) { + initBasic(intValue); + value_.int_ = value; +} +Value::Value(UInt64 value) { + initBasic(uintValue); + value_.uint_ = value; +} +#endif // defined(JSON_HAS_INT64) + +Value::Value(double value) { + initBasic(realValue); + value_.real_ = value; +} + +Value::Value(const char* value) { + initBasic(stringValue, true); + value_.string_ = duplicateAndPrefixStringValue(value, static_cast<unsigned>(strlen(value))); +} + +Value::Value(const char* beginValue, const char* endValue) { + initBasic(stringValue, true); + value_.string_ = + duplicateAndPrefixStringValue(beginValue, static_cast<unsigned>(endValue - beginValue)); +} + +Value::Value(const std::string& value) { + initBasic(stringValue, true); + value_.string_ = + duplicateAndPrefixStringValue(value.data(), static_cast<unsigned>(value.length())); +} + +Value::Value(const StaticString& value) { + initBasic(stringValue); + value_.string_ = const_cast<char*>(value.c_str()); +} + +#ifdef JSON_USE_CPPTL +Value::Value(const CppTL::ConstString& value) { + initBasic(stringValue, true); + value_.string_ = duplicateAndPrefixStringValue(value, static_cast<unsigned>(value.length())); +} +#endif + +Value::Value(bool value) { + initBasic(booleanValue); + value_.bool_ = value; +} + +Value::Value(Value const& other) + : type_(other.type_), allocated_(false) + , + comments_(0) +{ + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + value_ = other.value_; + break; + case stringValue: + if (other.value_.string_ && other.allocated_) { + unsigned len; + char const* str; + decodePrefixedString(other.allocated_, other.value_.string_, + &len, &str); + value_.string_ = duplicateAndPrefixStringValue(str, len); + allocated_ = true; + } else { + value_.string_ = other.value_.string_; + allocated_ = false; + } + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(*other.value_.map_); + break; + default: + JSON_ASSERT_UNREACHABLE; + } + if (other.comments_) { + comments_ = new CommentInfo[numberOfCommentPlacement]; + for (int comment = 0; comment < numberOfCommentPlacement; ++comment) { + const CommentInfo& otherComment = other.comments_[comment]; + if (otherComment.comment_) + comments_[comment].setComment( + otherComment.comment_, strlen(otherComment.comment_)); + } + } +} + +Value::~Value() { + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue: + if (allocated_) + releaseStringValue(value_.string_); + break; + case arrayValue: + case objectValue: + delete value_.map_; + break; + default: + JSON_ASSERT_UNREACHABLE; + } + + if (comments_) + delete[] comments_; +} + +Value &Value::operator=(const Value &other) { + Value temp(other); + swap(temp); + return *this; +} + +void Value::swapPayload(Value& other) { + ValueType temp = type_; + type_ = other.type_; + other.type_ = temp; + std::swap(value_, other.value_); + int temp2 = allocated_; + allocated_ = other.allocated_; + other.allocated_ = temp2 & 0x1; +} + +void Value::swap(Value& other) { + swapPayload(other); + std::swap(comments_, other.comments_); +} + +ValueType Value::type() const { return type_; } + +int Value::compare(const Value& other) const { + if (*this < other) + return -1; + if (*this > other) + return 1; + return 0; +} + +bool Value::operator<(const Value& other) const { + int typeDelta = type_ - other.type_; + if (typeDelta) + return typeDelta < 0 ? true : false; + switch (type_) { + case nullValue: + return false; + case intValue: + return value_.int_ < other.value_.int_; + case uintValue: + return value_.uint_ < other.value_.uint_; + case realValue: + return value_.real_ < other.value_.real_; + case booleanValue: + return value_.bool_ < other.value_.bool_; + case stringValue: + { + if ((value_.string_ == 0) || (other.value_.string_ == 0)) { + if (other.value_.string_) return true; + else return false; + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); + unsigned min_len = std::min(this_len, other_len); + int comp = memcmp(this_str, other_str, min_len); + if (comp < 0) return true; + if (comp > 0) return false; + return (this_len < other_len); + } + case arrayValue: + case objectValue: { + int delta = int(value_.map_->size() - other.value_.map_->size()); + if (delta) + return delta < 0; + return (*value_.map_) < (*other.value_.map_); + } + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator<=(const Value& other) const { return !(other < *this); } + +bool Value::operator>=(const Value& other) const { return !(*this < other); } + +bool Value::operator>(const Value& other) const { return other < *this; } + +bool Value::operator==(const Value& other) const { + // if ( type_ != other.type_ ) + // GCC 2.95.3 says: + // attempt to take address of bit-field structure member `Json::Value::type_' + // Beats me, but a temp solves the problem. + int temp = other.type_; + if (type_ != temp) + return false; + switch (type_) { + case nullValue: + return true; + case intValue: + return value_.int_ == other.value_.int_; + case uintValue: + return value_.uint_ == other.value_.uint_; + case realValue: + return value_.real_ == other.value_.real_; + case booleanValue: + return value_.bool_ == other.value_.bool_; + case stringValue: + { + if ((value_.string_ == 0) || (other.value_.string_ == 0)) { + return (value_.string_ == other.value_.string_); + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); + if (this_len != other_len) return false; + int comp = memcmp(this_str, other_str, this_len); + return comp == 0; + } + case arrayValue: + case objectValue: + return value_.map_->size() == other.value_.map_->size() && + (*value_.map_) == (*other.value_.map_); + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator!=(const Value& other) const { return !(*this == other); } + +const char* Value::asCString() const { + JSON_ASSERT_MESSAGE(type_ == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == 0) return 0; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + return this_str; +} + +bool Value::getString(char const** str, char const** cend) const { + if (type_ != stringValue) return false; + if (value_.string_ == 0) return false; + unsigned length; + decodePrefixedString(this->allocated_, this->value_.string_, &length, str); + *cend = *str + length; + return true; +} + +std::string Value::asString() const { + switch (type_) { + case nullValue: + return ""; + case stringValue: + { + if (value_.string_ == 0) return ""; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + return std::string(this_str, this_len); + } + case booleanValue: + return value_.bool_ ? "true" : "false"; + case intValue: + return valueToString(value_.int_); + case uintValue: + return valueToString(value_.uint_); + case realValue: + return valueToString(value_.real_); + default: + JSON_FAIL_MESSAGE("Type is not convertible to string"); + } +} + +#ifdef JSON_USE_CPPTL +CppTL::ConstString Value::asConstString() const { + unsigned len; + char const* str; + decodePrefixedString(allocated_, value_.string_, + &len, &str); + return CppTL::ConstString(str, len); +} +#endif + +Value::Int Value::asInt() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range"); + return Int(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range"); + return Int(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt), + "double out of Int range"); + return Int(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int."); +} + +Value::UInt Value::asUInt() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range"); + return UInt(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range"); + return UInt(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt), + "double out of UInt range"); + return UInt(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt."); +} + +#if defined(JSON_HAS_INT64) + +Value::Int64 Value::asInt64() const { + switch (type_) { + case intValue: + return Int64(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range"); + return Int64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64), + "double out of Int64 range"); + return Int64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int64."); +} + +Value::UInt64 Value::asUInt64() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range"); + return UInt64(value_.int_); + case uintValue: + return UInt64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64), + "double out of UInt64 range"); + return UInt64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt64."); +} +#endif // if defined(JSON_HAS_INT64) + +LargestInt Value::asLargestInt() const { +#if defined(JSON_NO_INT64) + return asInt(); +#else + return asInt64(); +#endif +} + +LargestUInt Value::asLargestUInt() const { +#if defined(JSON_NO_INT64) + return asUInt(); +#else + return asUInt64(); +#endif +} + +double Value::asDouble() const { + switch (type_) { + case intValue: + return static_cast<double>(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast<double>(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return integerToDouble(value_.uint_); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return value_.real_; + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0 : 0.0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to double."); +} + +float Value::asFloat() const { + switch (type_) { + case intValue: + return static_cast<float>(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast<float>(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return integerToDouble(value_.uint_); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return static_cast<float>(value_.real_); + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0f : 0.0f; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to float."); +} + +bool Value::asBool() const { + switch (type_) { + case booleanValue: + return value_.bool_; + case nullValue: + return false; + case intValue: + return value_.int_ ? true : false; + case uintValue: + return value_.uint_ ? true : false; + case realValue: + // This is kind of strange. Not recommended. + return (value_.real_ != 0.0) ? true : false; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to bool."); +} + +bool Value::isConvertibleTo(ValueType other) const { + switch (other) { + case nullValue: + return (isNumeric() && asDouble() == 0.0) || + (type_ == booleanValue && value_.bool_ == false) || + (type_ == stringValue && asString() == "") || + (type_ == arrayValue && value_.map_->size() == 0) || + (type_ == objectValue && value_.map_->size() == 0) || + type_ == nullValue; + case intValue: + return isInt() || + (type_ == realValue && InRange(value_.real_, minInt, maxInt)) || + type_ == booleanValue || type_ == nullValue; + case uintValue: + return isUInt() || + (type_ == realValue && InRange(value_.real_, 0, maxUInt)) || + type_ == booleanValue || type_ == nullValue; + case realValue: + return isNumeric() || type_ == booleanValue || type_ == nullValue; + case booleanValue: + return isNumeric() || type_ == booleanValue || type_ == nullValue; + case stringValue: + return isNumeric() || type_ == booleanValue || type_ == stringValue || + type_ == nullValue; + case arrayValue: + return type_ == arrayValue || type_ == nullValue; + case objectValue: + return type_ == objectValue || type_ == nullValue; + } + JSON_ASSERT_UNREACHABLE; + return false; +} + +/// Number of values in array or object +ArrayIndex Value::size() const { + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + case stringValue: + return 0; + case arrayValue: // size of the array is highest index + 1 + if (!value_.map_->empty()) { + ObjectValues::const_iterator itLast = value_.map_->end(); + --itLast; + return (*itLast).first.index() + 1; + } + return 0; + case objectValue: + return ArrayIndex(value_.map_->size()); + } + JSON_ASSERT_UNREACHABLE; + return 0; // unreachable; +} + +bool Value::empty() const { + if (isNull() || isArray() || isObject()) + return size() == 0u; + else + return false; +} + +bool Value::operator!() const { return isNull(); } + +void Value::clear() { + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue || + type_ == objectValue, + "in Json::Value::clear(): requires complex value"); + switch (type_) { + case arrayValue: + case objectValue: + value_.map_->clear(); + break; + default: + break; + } +} + +void Value::resize(ArrayIndex newSize) { + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue, + "in Json::Value::resize(): requires arrayValue"); + if (type_ == nullValue) + *this = Value(arrayValue); + ArrayIndex oldSize = size(); + if (newSize == 0) + clear(); + else if (newSize > oldSize) + (*this)[newSize - 1]; + else { + for (ArrayIndex index = newSize; index < oldSize; ++index) { + value_.map_->erase(index); + } + assert(size() == newSize); + } +} + +Value& Value::operator[](ArrayIndex index) { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == arrayValue, + "in Json::Value::operator[](ArrayIndex): requires arrayValue"); + if (type_ == nullValue) + *this = Value(arrayValue); + CZString key(index); + ObjectValues::iterator it = value_.map_->lower_bound(key); + if (it != value_.map_->end() && (*it).first == key) + return (*it).second; + + ObjectValues::value_type defaultValue(key, nullRef); + it = value_.map_->insert(it, defaultValue); + return (*it).second; +} + +Value& Value::operator[](int index) { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index): index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +const Value& Value::operator[](ArrayIndex index) const { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == arrayValue, + "in Json::Value::operator[](ArrayIndex)const: requires arrayValue"); + if (type_ == nullValue) + return nullRef; + CZString key(index); + ObjectValues::const_iterator it = value_.map_->find(key); + if (it == value_.map_->end()) + return nullRef; + return (*it).second; +} + +const Value& Value::operator[](int index) const { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index) const: index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +void Value::initBasic(ValueType vtype, bool allocated) { + type_ = vtype; + allocated_ = allocated; + comments_ = 0; +} + +// Access an object value by name, create a null member if it does not exist. +// @pre Type of '*this' is object or null. +// @param key is null-terminated. +Value& Value::resolveReference(const char* key) { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::resolveReference(): requires objectValue"); + if (type_ == nullValue) + *this = Value(objectValue); + CZString actualKey( + key, static_cast<unsigned>(strlen(key)), CZString::noDuplication); // NOTE! + ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullRef); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +// @param key is not null-terminated. +Value& Value::resolveReference(char const* key, char const* cend) +{ + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::resolveReference(key, end): requires objectValue"); + if (type_ == nullValue) + *this = Value(objectValue); + CZString actualKey( + key, static_cast<unsigned>(cend-key), CZString::duplicateOnCopy); + ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullRef); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +Value Value::get(ArrayIndex index, const Value& defaultValue) const { + const Value* value = &((*this)[index]); + return value == &nullRef ? defaultValue : *value; +} + +bool Value::isValidIndex(ArrayIndex index) const { return index < size(); } + +Value const* Value::find(char const* key, char const* cend) const +{ + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::find(key, end, found): requires objectValue or nullValue"); + if (type_ == nullValue) return NULL; + CZString actualKey(key, static_cast<unsigned>(cend-key), CZString::noDuplication); + ObjectValues::const_iterator it = value_.map_->find(actualKey); + if (it == value_.map_->end()) return NULL; + return &(*it).second; +} +const Value& Value::operator[](const char* key) const +{ + Value const* found = find(key, key + strlen(key)); + if (!found) return nullRef; + return *found; +} +Value const& Value::operator[](std::string const& key) const +{ + Value const* found = find(key.data(), key.data() + key.length()); + if (!found) return nullRef; + return *found; +} + +Value& Value::operator[](const char* key) { + return resolveReference(key, key + strlen(key)); +} + +Value& Value::operator[](const std::string& key) { + return resolveReference(key.data(), key.data() + key.length()); +} + +Value& Value::operator[](const StaticString& key) { + return resolveReference(key.c_str()); +} + +#ifdef JSON_USE_CPPTL +Value& Value::operator[](const CppTL::ConstString& key) { + return resolveReference(key.c_str(), key.end_c_str()); +} +Value const& Value::operator[](CppTL::ConstString const& key) const +{ + Value const* found = find(key.c_str(), key.end_c_str()); + if (!found) return nullRef; + return *found; +} +#endif + +Value& Value::append(const Value& value) { return (*this)[size()] = value; } + +Value Value::get(char const* key, char const* cend, Value const& defaultValue) const +{ + Value const* found = find(key, cend); + return !found ? defaultValue : *found; +} +Value Value::get(char const* key, Value const& defaultValue) const +{ + return get(key, key + strlen(key), defaultValue); +} +Value Value::get(std::string const& key, Value const& defaultValue) const +{ + return get(key.data(), key.data() + key.length(), defaultValue); +} + + +bool Value::removeMember(const char* key, const char* cend, Value* removed) +{ + if (type_ != objectValue) { + return false; + } + CZString actualKey(key, static_cast<unsigned>(cend-key), CZString::noDuplication); + ObjectValues::iterator it = value_.map_->find(actualKey); + if (it == value_.map_->end()) + return false; + *removed = it->second; + value_.map_->erase(it); + return true; +} +bool Value::removeMember(const char* key, Value* removed) +{ + return removeMember(key, key + strlen(key), removed); +} +bool Value::removeMember(std::string const& key, Value* removed) +{ + return removeMember(key.data(), key.data() + key.length(), removed); +} +Value Value::removeMember(const char* key) +{ + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == objectValue, + "in Json::Value::removeMember(): requires objectValue"); + if (type_ == nullValue) + return nullRef; + + Value removed; // null + removeMember(key, key + strlen(key), &removed); + return removed; // still null if removeMember() did nothing +} +Value Value::removeMember(const std::string& key) +{ + return removeMember(key.c_str()); +} + +bool Value::removeIndex(ArrayIndex index, Value* removed) { + if (type_ != arrayValue) { + return false; + } + CZString key(index); + ObjectValues::iterator it = value_.map_->find(key); + if (it == value_.map_->end()) { + return false; + } + *removed = it->second; + ArrayIndex oldSize = size(); + // shift left all items left, into the place of the "removed" + for (ArrayIndex i = index; i < (oldSize - 1); ++i){ + CZString keey(i); + (*value_.map_)[keey] = (*this)[i + 1]; + } + // erase the last one ("leftover") + CZString keyLast(oldSize - 1); + ObjectValues::iterator itLast = value_.map_->find(keyLast); + value_.map_->erase(itLast); + return true; +} + +#ifdef JSON_USE_CPPTL +Value Value::get(const CppTL::ConstString& key, + const Value& defaultValue) const { + return get(key.c_str(), key.end_c_str(), defaultValue); +} +#endif + +bool Value::isMember(char const* key, char const* cend) const +{ + Value const* value = find(key, cend); + return NULL != value; +} +bool Value::isMember(char const* key) const +{ + return isMember(key, key + strlen(key)); +} +bool Value::isMember(std::string const& key) const +{ + return isMember(key.data(), key.data() + key.length()); +} + +#ifdef JSON_USE_CPPTL +bool Value::isMember(const CppTL::ConstString& key) const { + return isMember(key.c_str(), key.end_c_str()); +} +#endif + +Value::Members Value::getMemberNames() const { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::getMemberNames(), value must be objectValue"); + if (type_ == nullValue) + return Value::Members(); + Members members; + members.reserve(value_.map_->size()); + ObjectValues::const_iterator it = value_.map_->begin(); + ObjectValues::const_iterator itEnd = value_.map_->end(); + for (; it != itEnd; ++it) { + members.push_back(std::string((*it).first.data(), + (*it).first.length())); + } + return members; +} +// +//# ifdef JSON_USE_CPPTL +// EnumMemberNames +// Value::enumMemberNames() const +//{ +// if ( type_ == objectValue ) +// { +// return CppTL::Enum::any( CppTL::Enum::transform( +// CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>() ), +// MemberNamesTransform() ) ); +// } +// return EnumMemberNames(); +//} +// +// +// EnumValues +// Value::enumValues() const +//{ +// if ( type_ == objectValue || type_ == arrayValue ) +// return CppTL::Enum::anyValues( *(value_.map_), +// CppTL::Type<const Value &>() ); +// return EnumValues(); +//} +// +//# endif + +static bool IsIntegral(double d) { + double integral_part; + return modf(d, &integral_part) == 0.0; +} + +bool Value::isNull() const { return type_ == nullValue; } + +bool Value::isBool() const { return type_ == booleanValue; } + +bool Value::isInt() const { + switch (type_) { + case intValue: + return value_.int_ >= minInt && value_.int_ <= maxInt; + case uintValue: + return value_.uint_ <= UInt(maxInt); + case realValue: + return value_.real_ >= minInt && value_.real_ <= maxInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isUInt() const { + switch (type_) { + case intValue: + return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt); + case uintValue: + return value_.uint_ <= maxUInt; + case realValue: + return value_.real_ >= 0 && value_.real_ <= maxUInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isInt64() const { +#if defined(JSON_HAS_INT64) + switch (type_) { + case intValue: + return true; + case uintValue: + return value_.uint_ <= UInt64(maxInt64); + case realValue: + // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a + // double, so double(maxInt64) will be rounded up to 2^63. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= double(minInt64) && + value_.real_ < double(maxInt64) && IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isUInt64() const { +#if defined(JSON_HAS_INT64) + switch (type_) { + case intValue: + return value_.int_ >= 0; + case uintValue: + return true; + case realValue: + // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a + // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= 0 && value_.real_ < maxUInt64AsDouble && + IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isIntegral() const { +#if defined(JSON_HAS_INT64) + return isInt64() || isUInt64(); +#else + return isInt() || isUInt(); +#endif +} + +bool Value::isDouble() const { return type_ == realValue || isIntegral(); } + +bool Value::isNumeric() const { return isIntegral() || isDouble(); } + +bool Value::isString() const { return type_ == stringValue; } + +bool Value::isArray() const { return type_ == arrayValue; } + +bool Value::isObject() const { return type_ == objectValue; } + +void Value::setComment(const char* comment, size_t len, CommentPlacement placement) { + if (!comments_) + comments_ = new CommentInfo[numberOfCommentPlacement]; + if ((len > 0) && (comment[len-1] == '\n')) { + // Always discard trailing newline, to aid indentation. + len -= 1; + } + comments_[placement].setComment(comment, len); +} + +void Value::setComment(const char* comment, CommentPlacement placement) { + setComment(comment, strlen(comment), placement); +} + +void Value::setComment(const std::string& comment, CommentPlacement placement) { + setComment(comment.c_str(), comment.length(), placement); +} + +bool Value::hasComment(CommentPlacement placement) const { + return comments_ != 0 && comments_[placement].comment_ != 0; +} + +std::string Value::getComment(CommentPlacement placement) const { + if (hasComment(placement)) + return comments_[placement].comment_; + return ""; +} + +std::string Value::toStyledString() const { + StyledWriter writer; + return writer.write(*this); +} + +Value::const_iterator Value::begin() const { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->begin()); + break; + default: + break; + } + return const_iterator(); +} + +Value::const_iterator Value::end() const { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->end()); + break; + default: + break; + } + return const_iterator(); +} + +Value::iterator Value::begin() { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->begin()); + break; + default: + break; + } + return iterator(); +} + +Value::iterator Value::end() { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->end()); + break; + default: + break; + } + return iterator(); +} + +// class PathArgument +// ////////////////////////////////////////////////////////////////// + +PathArgument::PathArgument() : key_(), index_(), kind_(kindNone) {} + +PathArgument::PathArgument(ArrayIndex index) + : key_(), index_(index), kind_(kindIndex) {} + +PathArgument::PathArgument(const char* key) + : key_(key), index_(), kind_(kindKey) {} + +PathArgument::PathArgument(const std::string& key) + : key_(key.c_str()), index_(), kind_(kindKey) {} + +// class Path +// ////////////////////////////////////////////////////////////////// + +Path::Path(const std::string& path, + const PathArgument& a1, + const PathArgument& a2, + const PathArgument& a3, + const PathArgument& a4, + const PathArgument& a5) { + InArgs in; + in.push_back(&a1); + in.push_back(&a2); + in.push_back(&a3); + in.push_back(&a4); + in.push_back(&a5); + makePath(path, in); +} + +void Path::makePath(const std::string& path, const InArgs& in) { + const char* current = path.c_str(); + const char* end = current + path.length(); + InArgs::const_iterator itInArg = in.begin(); + while (current != end) { + if (*current == '[') { + ++current; + if (*current == '%') + addPathInArg(path, in, itInArg, PathArgument::kindIndex); + else { + ArrayIndex index = 0; + for (; current != end && *current >= '0' && *current <= '9'; ++current) + index = index * 10 + ArrayIndex(*current - '0'); + args_.push_back(index); + } + if (current == end || *current++ != ']') + invalidPath(path, int(current - path.c_str())); + } else if (*current == '%') { + addPathInArg(path, in, itInArg, PathArgument::kindKey); + ++current; + } else if (*current == '.') { + ++current; + } else { + const char* beginName = current; + while (current != end && !strchr("[.", *current)) + ++current; + args_.push_back(std::string(beginName, current)); + } + } +} + +void Path::addPathInArg(const std::string& /*path*/, + const InArgs& in, + InArgs::const_iterator& itInArg, + PathArgument::Kind kind) { + if (itInArg == in.end()) { + // Error: missing argument %d + } else if ((*itInArg)->kind_ != kind) { + // Error: bad argument type + } else { + args_.push_back(**itInArg); + } +} + +void Path::invalidPath(const std::string& /*path*/, int /*location*/) { + // Error: invalid path. +} + +const Value& Path::resolve(const Value& root) const { + const Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) { + // Error: unable to resolve path (array value expected at position... + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: unable to resolve path (object value expected at position...) + } + node = &((*node)[arg.key_]); + if (node == &Value::nullRef) { + // Error: unable to resolve path (object has no member named '' at + // position...) + } + } + } + return *node; +} + +Value Path::resolve(const Value& root, const Value& defaultValue) const { + const Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) + return defaultValue; + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) + return defaultValue; + node = &((*node)[arg.key_]); + if (node == &Value::nullRef) + return defaultValue; + } + } + return *node; +} + +Value& Path::make(Value& root) const { + Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray()) { + // Error: node is not an array at position ... + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: node is not an object at position... + } + node = &((*node)[arg.key_]); + } + } + return *node; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_value.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_writer.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2011 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include <json/writer.h> +#include "json_tool.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include <iomanip> +#include <memory> +#include <sstream> +#include <utility> +#include <set> +#include <cassert> +#include <cstring> +#include <cstdio> + +#if defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1800 // Between VC++ 6.0 and VC++ 11.0 +#include <float.h> +#define isfinite _finite +#elif defined(__sun) && defined(__SVR4) //Solaris +#include <ieeefp.h> +#define isfinite finite +#else +#include <cmath> +#define isfinite std::isfinite +#endif + +#if defined(_MSC_VER) +#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above +#define snprintf sprintf_s +#elif _MSC_VER >= 1900 // VC++ 14.0 and above +#define snprintf std::snprintf +#else +#define snprintf _snprintf +#endif +#elif defined(__ANDROID__) +#define snprintf snprintf +#elif __cplusplus >= 201103L +#define snprintf std::snprintf +#endif + +#if defined(__BORLANDC__) +#include <float.h> +#define isfinite _finite +#define snprintf _snprintf +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +namespace Json { + +typedef std::auto_ptr<StreamWriter> StreamWriterPtr; + +static bool containsControlCharacter(const char* str) { + while (*str) { + if (isControlCharacter(*(str++))) + return true; + } + return false; +} + +static bool containsControlCharacter0(const char* str, unsigned len) { + char const* end = str + len; + while (end != str) { + if (isControlCharacter(*str) || 0==*str) + return true; + ++str; + } + return false; +} + +std::string valueToString(LargestInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + if (value == Value::minLargestInt) { + uintToString(LargestUInt(Value::maxLargestInt) + 1, current); + *--current = '-'; + } else if (value < 0) { + uintToString(LargestUInt(-value), current); + *--current = '-'; + } else { + uintToString(LargestUInt(value), current); + } + assert(current >= buffer); + return current; +} + +std::string valueToString(LargestUInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + uintToString(value, current); + assert(current >= buffer); + return current; +} + +#if defined(JSON_HAS_INT64) + +std::string valueToString(Int value) { + return valueToString(LargestInt(value)); +} + +std::string valueToString(UInt value) { + return valueToString(LargestUInt(value)); +} + +#endif // # if defined(JSON_HAS_INT64) + +std::string valueToString(double value, bool useSpecialFloats, unsigned int precision) { + // Allocate a buffer that is more than large enough to store the 16 digits of + // precision requested below. + char buffer[32]; + int len = -1; + + char formatString[6]; + sprintf(formatString, "%%.%dg", precision); + + // Print into the buffer. We need not request the alternative representation + // that always has a decimal point because JSON doesn't distingish the + // concepts of reals and integers. + if (isfinite(value)) { + len = snprintf(buffer, sizeof(buffer), formatString, value); + } else { + // IEEE standard states that NaN values will not compare to themselves + if (value != value) { + len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "NaN" : "null"); + } else if (value < 0) { + len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "-Infinity" : "-1e+9999"); + } else { + len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "Infinity" : "1e+9999"); + } + // For those, we do not need to call fixNumLoc, but it is fast. + } + assert(len >= 0); + fixNumericLocale(buffer, buffer + len); + return buffer; +} + +std::string valueToString(double value) { return valueToString(value, false, 17); } + +std::string valueToString(bool value) { return value ? "true" : "false"; } + +std::string valueToQuotedString(const char* value) { + if (value == NULL) + return ""; + // Not sure how to handle unicode... + if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && + !containsControlCharacter(value)) + return std::string("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to std::string is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + std::string::size_type maxsize = + strlen(value) * 2 + 3; // allescaped+quotes+NULL + std::string result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + for (const char* c = value; *c != 0; ++c) { + switch (*c) { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + // case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something. + // blep notes: actually escaping \/ may be useful in javascript to avoid </ + // sequence. + // Should add a flag to allow this compatibility mode and prevent this + // sequence from occurring. + default: + if (isControlCharacter(*c)) { + std::ostringstream oss; + oss << "\\u" << std::hex << std::uppercase << std::setfill('0') + << std::setw(4) << static_cast<int>(*c); + result += oss.str(); + } else { + result += *c; + } + break; + } + } + result += "\""; + return result; +} + +// https://github.com/upcaste/upcaste/blob/master/src/upcore/src/cstring/strnpbrk.cpp +static char const* strnpbrk(char const* s, char const* accept, size_t n) { + assert((s || !n) && accept); + + char const* const end = s + n; + for (char const* cur = s; cur < end; ++cur) { + int const c = *cur; + for (char const* a = accept; *a; ++a) { + if (*a == c) { + return cur; + } + } + } + return NULL; +} +static std::string valueToQuotedStringN(const char* value, unsigned length) { + if (value == NULL) + return ""; + // Not sure how to handle unicode... + if (strnpbrk(value, "\"\\\b\f\n\r\t", length) == NULL && + !containsControlCharacter0(value, length)) + return std::string("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to std::string is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + std::string::size_type maxsize = + length * 2 + 3; // allescaped+quotes+NULL + std::string result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + char const* end = value + length; + for (const char* c = value; c != end; ++c) { + switch (*c) { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + // case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something.) + // blep notes: actually escaping \/ may be useful in javascript to avoid </ + // sequence. + // Should add a flag to allow this compatibility mode and prevent this + // sequence from occurring. + default: + if ((isControlCharacter(*c)) || (*c == 0)) { + std::ostringstream oss; + oss << "\\u" << std::hex << std::uppercase << std::setfill('0') + << std::setw(4) << static_cast<int>(*c); + result += oss.str(); + } else { + result += *c; + } + break; + } + } + result += "\""; + return result; +} + +// Class Writer +// ////////////////////////////////////////////////////////////////// +Writer::~Writer() {} + +// Class FastWriter +// ////////////////////////////////////////////////////////////////// + +FastWriter::FastWriter() + : yamlCompatiblityEnabled_(false) {} + +void FastWriter::enableYAMLCompatibility() { yamlCompatiblityEnabled_ = true; } + +std::string FastWriter::write(const Value& root) { + document_ = ""; + writeValue(root); + document_ += "\n"; + return document_; +} + +void FastWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + document_ += "null"; + break; + case intValue: + document_ += valueToString(value.asLargestInt()); + break; + case uintValue: + document_ += valueToString(value.asLargestUInt()); + break; + case realValue: + document_ += valueToString(value.asDouble()); + break; + case stringValue: + { + // Is NULL possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) document_ += valueToQuotedStringN(str, static_cast<unsigned>(end-str)); + break; + } + case booleanValue: + document_ += valueToString(value.asBool()); + break; + case arrayValue: { + document_ += '['; + int size = value.size(); + for (int index = 0; index < size; ++index) { + if (index > 0) + document_ += ','; + writeValue(value[index]); + } + document_ += ']'; + } break; + case objectValue: { + Value::Members members(value.getMemberNames()); + document_ += '{'; + for (Value::Members::iterator it = members.begin(); it != members.end(); + ++it) { + const std::string& name = *it; + if (it != members.begin()) + document_ += ','; + document_ += valueToQuotedStringN(name.data(), static_cast<unsigned>(name.length())); + document_ += yamlCompatiblityEnabled_ ? ": " : ":"; + writeValue(value[name]); + } + document_ += '}'; + } break; + } +} + +// Class StyledWriter +// ////////////////////////////////////////////////////////////////// + +StyledWriter::StyledWriter() + : rightMargin_(74), indentSize_(3), addChildValues_() {} + +std::string StyledWriter::write(const Value& root) { + document_ = ""; + addChildValues_ = false; + indentString_ = ""; + writeCommentBeforeValue(root); + writeValue(root); + writeCommentAfterValueOnSameLine(root); + document_ += "\n"; + return document_; +} + +void StyledWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: + { + // Is NULL possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + const std::string& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + document_ += " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledWriter::writeArrayValue(const Value& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + writeIndent(); + writeValue(childValue); + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + document_ += "[ "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + document_ += ", "; + document_ += childValues_[index]; + } + document_ += " ]"; + } + } +} + +bool StyledWriter::isMultineArray(const Value& value) { + int size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (int index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = + isMultiLine || ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + int lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (int index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += int(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledWriter::pushValue(const std::string& value) { + if (addChildValues_) + childValues_.push_back(value); + else + document_ += value; +} + +void StyledWriter::writeIndent() { + if (!document_.empty()) { + char last = document_[document_.length() - 1]; + if (last == ' ') // already indented + return; + if (last != '\n') // Comments may add new-line + document_ += '\n'; + } + document_ += indentString_; +} + +void StyledWriter::writeWithIndent(const std::string& value) { + writeIndent(); + document_ += value; +} + +void StyledWriter::indent() { indentString_ += std::string(indentSize_, ' '); } + +void StyledWriter::unindent() { + assert(int(indentString_.size()) >= indentSize_); + indentString_.resize(indentString_.size() - indentSize_); +} + +void StyledWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + document_ += "\n"; + writeIndent(); + const std::string& comment = root.getComment(commentBefore); + std::string::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + document_ += *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + writeIndent(); + ++iter; + } + + // Comments are stripped of trailing newlines, so add one here + document_ += "\n"; +} + +void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + document_ += " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + document_ += "\n"; + document_ += root.getComment(commentAfter); + document_ += "\n"; + } +} + +bool StyledWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +// Class StyledStreamWriter +// ////////////////////////////////////////////////////////////////// + +StyledStreamWriter::StyledStreamWriter(std::string indentation) + : document_(NULL), rightMargin_(74), indentation_(indentation), + addChildValues_() {} + +void StyledStreamWriter::write(std::ostream& out, const Value& root) { + document_ = &out; + addChildValues_ = false; + indentString_ = ""; + indented_ = true; + writeCommentBeforeValue(root); + if (!indented_) writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *document_ << "\n"; + document_ = NULL; // Forget the stream, for safety. +} + +void StyledStreamWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: + { + // Is NULL possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + const std::string& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + *document_ << " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledStreamWriter::writeArrayValue(const Value& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *document_ << "[ "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *document_ << ", "; + *document_ << childValues_[index]; + } + *document_ << " ]"; + } + } +} + +bool StyledStreamWriter::isMultineArray(const Value& value) { + int size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (int index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = + isMultiLine || ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + int lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (int index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += int(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledStreamWriter::pushValue(const std::string& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *document_ << value; +} + +void StyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + *document_ << '\n' << indentString_; +} + +void StyledStreamWriter::writeWithIndent(const std::string& value) { + if (!indented_) writeIndent(); + *document_ << value; + indented_ = false; +} + +void StyledStreamWriter::indent() { indentString_ += indentation_; } + +void StyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void StyledStreamWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) writeIndent(); + const std::string& comment = root.getComment(commentBefore); + std::string::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *document_ << *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would include newline + *document_ << indentString_; + ++iter; + } + indented_ = false; +} + +void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + *document_ << ' ' << root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *document_ << root.getComment(commentAfter); + } + indented_ = false; +} + +bool StyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +////////////////////////// +// BuiltStyledStreamWriter + +/// Scoped enums are not available until C++11. +struct CommentStyle { + /// Decide whether to write comments. + enum Enum { + None, ///< Drop all comments. + Most, ///< Recover odd behavior of previous versions (not implemented yet). + All ///< Keep all comments. + }; +}; + +struct BuiltStyledStreamWriter : public StreamWriter +{ + BuiltStyledStreamWriter( + std::string const& indentation, + CommentStyle::Enum cs, + std::string const& colonSymbol, + std::string const& nullSymbol, + std::string const& endingLineFeedSymbol, + bool useSpecialFloats, + unsigned int precision); + virtual int write(Value const& root, std::ostream* sout); +private: + void writeValue(Value const& value); + void writeArrayValue(Value const& value); + bool isMultineArray(Value const& value); + void pushValue(std::string const& value); + void writeIndent(); + void writeWithIndent(std::string const& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(Value const& root); + void writeCommentAfterValueOnSameLine(Value const& root); + static bool hasCommentForValue(const Value& value); + + typedef std::vector<std::string> ChildValues; + + ChildValues childValues_; + std::string indentString_; + int rightMargin_; + std::string indentation_; + CommentStyle::Enum cs_; + std::string colonSymbol_; + std::string nullSymbol_; + std::string endingLineFeedSymbol_; + bool addChildValues_ : 1; + bool indented_ : 1; + bool useSpecialFloats_ : 1; + unsigned int precision_; +}; +BuiltStyledStreamWriter::BuiltStyledStreamWriter( + std::string const& indentation, + CommentStyle::Enum cs, + std::string const& colonSymbol, + std::string const& nullSymbol, + std::string const& endingLineFeedSymbol, + bool useSpecialFloats, + unsigned int precision) + : rightMargin_(74) + , indentation_(indentation) + , cs_(cs) + , colonSymbol_(colonSymbol) + , nullSymbol_(nullSymbol) + , endingLineFeedSymbol_(endingLineFeedSymbol) + , addChildValues_(false) + , indented_(false) + , useSpecialFloats_(useSpecialFloats) + , precision_(precision) +{ +} +int BuiltStyledStreamWriter::write(Value const& root, std::ostream* sout) +{ + sout_ = sout; + addChildValues_ = false; + indented_ = true; + indentString_ = ""; + writeCommentBeforeValue(root); + if (!indented_) writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *sout_ << endingLineFeedSymbol_; + sout_ = NULL; + return 0; +} +void BuiltStyledStreamWriter::writeValue(Value const& value) { + switch (value.type()) { + case nullValue: + pushValue(nullSymbol_); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_)); + break; + case stringValue: + { + // Is NULL is possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + std::string const& name = *it; + Value const& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedStringN(name.data(), static_cast<unsigned>(name.length()))); + *sout_ << colonSymbol_; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isMultiLine = (cs_ == CommentStyle::All) || isMultineArray(value); + if (isMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + Value const& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *sout_ << "["; + if (!indentation_.empty()) *sout_ << " "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *sout_ << ", "; + *sout_ << childValues_[index]; + } + if (!indentation_.empty()) *sout_ << " "; + *sout_ << "]"; + } + } +} + +bool BuiltStyledStreamWriter::isMultineArray(Value const& value) { + int size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (int index = 0; index < size && !isMultiLine; ++index) { + Value const& childValue = value[index]; + isMultiLine = + isMultiLine || ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + int lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (int index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += int(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void BuiltStyledStreamWriter::pushValue(std::string const& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *sout_ << value; +} + +void BuiltStyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + + if (!indentation_.empty()) { + // In this case, drop newlines too. + *sout_ << '\n' << indentString_; + } +} + +void BuiltStyledStreamWriter::writeWithIndent(std::string const& value) { + if (!indented_) writeIndent(); + *sout_ << value; + indented_ = false; +} + +void BuiltStyledStreamWriter::indent() { indentString_ += indentation_; } + +void BuiltStyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { + if (cs_ == CommentStyle::None) return; + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) writeIndent(); + const std::string& comment = root.getComment(commentBefore); + std::string::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *sout_ << *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would write extra newline + *sout_ << indentString_; + ++iter; + } + indented_ = false; +} + +void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine(Value const& root) { + if (cs_ == CommentStyle::None) return; + if (root.hasComment(commentAfterOnSameLine)) + *sout_ << " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *sout_ << root.getComment(commentAfter); + } +} + +// static +bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +/////////////// +// StreamWriter + +StreamWriter::StreamWriter() + : sout_(NULL) +{ +} +StreamWriter::~StreamWriter() +{ +} +StreamWriter::Factory::~Factory() +{} +StreamWriterBuilder::StreamWriterBuilder() +{ + setDefaults(&settings_); +} +StreamWriterBuilder::~StreamWriterBuilder() +{} +StreamWriter* StreamWriterBuilder::newStreamWriter() const +{ + std::string indentation = settings_["indentation"].asString(); + std::string cs_str = settings_["commentStyle"].asString(); + bool eyc = settings_["enableYAMLCompatibility"].asBool(); + bool dnp = settings_["dropNullPlaceholders"].asBool(); + bool usf = settings_["useSpecialFloats"].asBool(); + unsigned int pre = settings_["precision"].asUInt(); + CommentStyle::Enum cs = CommentStyle::All; + if (cs_str == "All") { + cs = CommentStyle::All; + } else if (cs_str == "None") { + cs = CommentStyle::None; + } else { + throwRuntimeError("commentStyle must be 'All' or 'None'"); + } + std::string colonSymbol = " : "; + if (eyc) { + colonSymbol = ": "; + } else if (indentation.empty()) { + colonSymbol = ":"; + } + std::string nullSymbol = "null"; + if (dnp) { + nullSymbol = ""; + } + if (pre > 17) pre = 17; + std::string endingLineFeedSymbol = ""; + return new BuiltStyledStreamWriter( + indentation, cs, + colonSymbol, nullSymbol, endingLineFeedSymbol, usf, pre); +} +static void getValidWriterKeys(std::set<std::string>* valid_keys) +{ + valid_keys->clear(); + valid_keys->insert("indentation"); + valid_keys->insert("commentStyle"); + valid_keys->insert("enableYAMLCompatibility"); + valid_keys->insert("dropNullPlaceholders"); + valid_keys->insert("useSpecialFloats"); + valid_keys->insert("precision"); +} +bool StreamWriterBuilder::validate(Json::Value* invalid) const +{ + Json::Value my_invalid; + if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL + Json::Value& inv = *invalid; + std::set<std::string> valid_keys; + getValidWriterKeys(&valid_keys); + Value::Members keys = settings_.getMemberNames(); + size_t n = keys.size(); + for (size_t i = 0; i < n; ++i) { + std::string const& key = keys[i]; + if (valid_keys.find(key) == valid_keys.end()) { + inv[key] = settings_[key]; + } + } + return 0u == inv.size(); +} +Value& StreamWriterBuilder::operator[](std::string key) +{ + return settings_[key]; +} +// static +void StreamWriterBuilder::setDefaults(Json::Value* settings) +{ + //! [StreamWriterBuilderDefaults] + (*settings)["commentStyle"] = "All"; + (*settings)["indentation"] = "\t"; + (*settings)["enableYAMLCompatibility"] = false; + (*settings)["dropNullPlaceholders"] = false; + (*settings)["useSpecialFloats"] = false; + (*settings)["precision"] = 17; + //! [StreamWriterBuilderDefaults] +} + +std::string writeString(StreamWriter::Factory const& builder, Value const& root) { + std::ostringstream sout; + StreamWriterPtr const writer(builder.newStreamWriter()); + writer->write(root, &sout); + return sout.str(); +} + +std::ostream& operator<<(std::ostream& sout, Value const& root) { + StreamWriterBuilder builder; + StreamWriterPtr const writer(builder.newStreamWriter()); + writer->write(root, &sout); + return sout; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_writer.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + diff --git a/src/lua/CMakeLists.txt b/lib/lua/CMakeLists.txt index 119dd6302..119dd6302 100644 --- a/src/lua/CMakeLists.txt +++ b/lib/lua/CMakeLists.txt diff --git a/src/lua/COPYRIGHT b/lib/lua/COPYRIGHT index 3a53e741e..3a53e741e 100644 --- a/src/lua/COPYRIGHT +++ b/lib/lua/COPYRIGHT diff --git a/src/lua/src/CMakeLists.txt b/lib/lua/src/CMakeLists.txt index 8f6cc1213..8f6cc1213 100644 --- a/src/lua/src/CMakeLists.txt +++ b/lib/lua/src/CMakeLists.txt diff --git a/src/lua/src/lapi.c b/lib/lua/src/lapi.c index 5d5145d2e..5d5145d2e 100644 --- a/src/lua/src/lapi.c +++ b/lib/lua/src/lapi.c diff --git a/src/lua/src/lapi.h b/lib/lua/src/lapi.h index 2c3fab244..2c3fab244 100644 --- a/src/lua/src/lapi.h +++ b/lib/lua/src/lapi.h diff --git a/src/lua/src/lauxlib.c b/lib/lua/src/lauxlib.c index be41ebcd3..be41ebcd3 100644 --- a/src/lua/src/lauxlib.c +++ b/lib/lua/src/lauxlib.c diff --git a/src/lua/src/lauxlib.h b/lib/lua/src/lauxlib.h index 34258235d..34258235d 100644 --- a/src/lua/src/lauxlib.h +++ b/lib/lua/src/lauxlib.h diff --git a/src/lua/src/lbaselib.c b/lib/lua/src/lbaselib.c index 2a4c079d3..2a4c079d3 100644 --- a/src/lua/src/lbaselib.c +++ b/lib/lua/src/lbaselib.c diff --git a/src/lua/src/lcode.c b/lib/lua/src/lcode.c index cff626b7f..cff626b7f 100644 --- a/src/lua/src/lcode.c +++ b/lib/lua/src/lcode.c diff --git a/src/lua/src/lcode.h b/lib/lua/src/lcode.h index b941c6072..b941c6072 100644 --- a/src/lua/src/lcode.h +++ b/lib/lua/src/lcode.h diff --git a/src/lua/src/ldblib.c b/lib/lua/src/ldblib.c index 67de1222a..67de1222a 100644 --- a/src/lua/src/ldblib.c +++ b/lib/lua/src/ldblib.c diff --git a/src/lua/src/ldebug.c b/lib/lua/src/ldebug.c index 50ad3d380..50ad3d380 100644 --- a/src/lua/src/ldebug.c +++ b/lib/lua/src/ldebug.c diff --git a/src/lua/src/ldebug.h b/lib/lua/src/ldebug.h index ba28a9724..ba28a9724 100644 --- a/src/lua/src/ldebug.h +++ b/lib/lua/src/ldebug.h diff --git a/src/lua/src/ldo.c b/lib/lua/src/ldo.c index 8de05f728..8de05f728 100644 --- a/src/lua/src/ldo.c +++ b/lib/lua/src/ldo.c diff --git a/src/lua/src/ldo.h b/lib/lua/src/ldo.h index 98fddac59..98fddac59 100644 --- a/src/lua/src/ldo.h +++ b/lib/lua/src/ldo.h diff --git a/src/lua/src/ldump.c b/lib/lua/src/ldump.c index c9d3d4870..c9d3d4870 100644 --- a/src/lua/src/ldump.c +++ b/lib/lua/src/ldump.c diff --git a/src/lua/src/lfunc.c b/lib/lua/src/lfunc.c index 813e88f58..813e88f58 100644 --- a/src/lua/src/lfunc.c +++ b/lib/lua/src/lfunc.c diff --git a/src/lua/src/lfunc.h b/lib/lua/src/lfunc.h index a68cf5151..a68cf5151 100644 --- a/src/lua/src/lfunc.h +++ b/lib/lua/src/lfunc.h diff --git a/src/lua/src/lgc.c b/lib/lua/src/lgc.c index d9e0b7829..d9e0b7829 100644 --- a/src/lua/src/lgc.c +++ b/lib/lua/src/lgc.c diff --git a/src/lua/src/lgc.h b/lib/lua/src/lgc.h index 5a8dc605b..5a8dc605b 100644 --- a/src/lua/src/lgc.h +++ b/lib/lua/src/lgc.h diff --git a/src/lua/src/linit.c b/lib/lua/src/linit.c index c1f90dfab..c1f90dfab 100644 --- a/src/lua/src/linit.c +++ b/lib/lua/src/linit.c diff --git a/src/lua/src/liolib.c b/lib/lua/src/liolib.c index e79ed1cb2..e79ed1cb2 100644 --- a/src/lua/src/liolib.c +++ b/lib/lua/src/liolib.c diff --git a/src/lua/src/llex.c b/lib/lua/src/llex.c index 98068c1aa..98068c1aa 100644 --- a/src/lua/src/llex.c +++ b/lib/lua/src/llex.c diff --git a/src/lua/src/llex.h b/lib/lua/src/llex.h index a9201cee4..a9201cee4 100644 --- a/src/lua/src/llex.h +++ b/lib/lua/src/llex.h diff --git a/src/lua/src/llimits.h b/lib/lua/src/llimits.h index ca8dcb722..ca8dcb722 100644 --- a/src/lua/src/llimits.h +++ b/lib/lua/src/llimits.h diff --git a/src/lua/src/lmathlib.c b/lib/lua/src/lmathlib.c index 441fbf736..441fbf736 100644 --- a/src/lua/src/lmathlib.c +++ b/lib/lua/src/lmathlib.c diff --git a/src/lua/src/lmem.c b/lib/lua/src/lmem.c index ae7d8c965..ae7d8c965 100644 --- a/src/lua/src/lmem.c +++ b/lib/lua/src/lmem.c diff --git a/src/lua/src/lmem.h b/lib/lua/src/lmem.h index 7c2dcb322..7c2dcb322 100644 --- a/src/lua/src/lmem.h +++ b/lib/lua/src/lmem.h diff --git a/src/lua/src/loadlib.c b/lib/lua/src/loadlib.c index 0d401eba1..0d401eba1 100644 --- a/src/lua/src/loadlib.c +++ b/lib/lua/src/loadlib.c diff --git a/src/lua/src/lobject.c b/lib/lua/src/lobject.c index 4ff50732a..4ff50732a 100644 --- a/src/lua/src/lobject.c +++ b/lib/lua/src/lobject.c diff --git a/src/lua/src/lobject.h b/lib/lua/src/lobject.h index f1e447ef3..f1e447ef3 100644 --- a/src/lua/src/lobject.h +++ b/lib/lua/src/lobject.h diff --git a/src/lua/src/lopcodes.c b/lib/lua/src/lopcodes.c index 4cc745230..4cc745230 100644 --- a/src/lua/src/lopcodes.c +++ b/lib/lua/src/lopcodes.c diff --git a/src/lua/src/lopcodes.h b/lib/lua/src/lopcodes.h index 41224d6ee..41224d6ee 100644 --- a/src/lua/src/lopcodes.h +++ b/lib/lua/src/lopcodes.h diff --git a/src/lua/src/loslib.c b/lib/lua/src/loslib.c index da06a572a..da06a572a 100644 --- a/src/lua/src/loslib.c +++ b/lib/lua/src/loslib.c diff --git a/src/lua/src/lparser.c b/lib/lua/src/lparser.c index 1e2a9a88b..1e2a9a88b 100644 --- a/src/lua/src/lparser.c +++ b/lib/lua/src/lparser.c diff --git a/src/lua/src/lparser.h b/lib/lua/src/lparser.h index 18836afd1..18836afd1 100644 --- a/src/lua/src/lparser.h +++ b/lib/lua/src/lparser.h diff --git a/src/lua/src/lstate.c b/lib/lua/src/lstate.c index 4313b83a0..4313b83a0 100644 --- a/src/lua/src/lstate.c +++ b/lib/lua/src/lstate.c diff --git a/src/lua/src/lstate.h b/lib/lua/src/lstate.h index 3bc575b6b..3bc575b6b 100644 --- a/src/lua/src/lstate.h +++ b/lib/lua/src/lstate.h diff --git a/src/lua/src/lstring.c b/lib/lua/src/lstring.c index 49113151c..49113151c 100644 --- a/src/lua/src/lstring.c +++ b/lib/lua/src/lstring.c diff --git a/src/lua/src/lstring.h b/lib/lua/src/lstring.h index 73a2ff8b3..73a2ff8b3 100644 --- a/src/lua/src/lstring.h +++ b/lib/lua/src/lstring.h diff --git a/src/lua/src/lstrlib.c b/lib/lua/src/lstrlib.c index 1b4763d4e..1b4763d4e 100644 --- a/src/lua/src/lstrlib.c +++ b/lib/lua/src/lstrlib.c diff --git a/src/lua/src/ltable.c b/lib/lua/src/ltable.c index ec84f4fab..ec84f4fab 100644 --- a/src/lua/src/ltable.c +++ b/lib/lua/src/ltable.c diff --git a/src/lua/src/ltable.h b/lib/lua/src/ltable.h index f5b9d5ead..f5b9d5ead 100644 --- a/src/lua/src/ltable.h +++ b/lib/lua/src/ltable.h diff --git a/src/lua/src/ltablib.c b/lib/lua/src/ltablib.c index b6d9cb4ac..b6d9cb4ac 100644 --- a/src/lua/src/ltablib.c +++ b/lib/lua/src/ltablib.c diff --git a/src/lua/src/ltm.c b/lib/lua/src/ltm.c index c27f0f6fa..c27f0f6fa 100644 --- a/src/lua/src/ltm.c +++ b/lib/lua/src/ltm.c diff --git a/src/lua/src/ltm.h b/lib/lua/src/ltm.h index 64343b781..64343b781 100644 --- a/src/lua/src/ltm.h +++ b/lib/lua/src/ltm.h diff --git a/src/lua/src/lua.c b/lib/lua/src/lua.c index 3a4660932..3a4660932 100644 --- a/src/lua/src/lua.c +++ b/lib/lua/src/lua.c diff --git a/src/lua/src/lua.h b/lib/lua/src/lua.h index e4bdfd3b9..e4bdfd3b9 100644 --- a/src/lua/src/lua.h +++ b/lib/lua/src/lua.h diff --git a/src/lua/src/luac.c b/lib/lua/src/luac.c index d07017391..d07017391 100644 --- a/src/lua/src/luac.c +++ b/lib/lua/src/luac.c diff --git a/src/lua/src/luaconf.h b/lib/lua/src/luaconf.h index e2cb26163..e2cb26163 100644 --- a/src/lua/src/luaconf.h +++ b/lib/lua/src/luaconf.h diff --git a/src/lua/src/lualib.h b/lib/lua/src/lualib.h index 469417f67..469417f67 100644 --- a/src/lua/src/lualib.h +++ b/lib/lua/src/lualib.h diff --git a/src/lua/src/lundump.c b/lib/lua/src/lundump.c index 8010a4579..8010a4579 100644 --- a/src/lua/src/lundump.c +++ b/lib/lua/src/lundump.c diff --git a/src/lua/src/lundump.h b/lib/lua/src/lundump.h index c80189dbf..c80189dbf 100644 --- a/src/lua/src/lundump.h +++ b/lib/lua/src/lundump.h diff --git a/src/lua/src/lvm.c b/lib/lua/src/lvm.c index ee3256ab9..ee3256ab9 100644 --- a/src/lua/src/lvm.c +++ b/lib/lua/src/lvm.c diff --git a/src/lua/src/lvm.h b/lib/lua/src/lvm.h index bfe4f5678..bfe4f5678 100644 --- a/src/lua/src/lvm.h +++ b/lib/lua/src/lvm.h diff --git a/src/lua/src/lzio.c b/lib/lua/src/lzio.c index 293edd59b..293edd59b 100644 --- a/src/lua/src/lzio.c +++ b/lib/lua/src/lzio.c diff --git a/src/lua/src/lzio.h b/lib/lua/src/lzio.h index 51d695d8c..51d695d8c 100644 --- a/src/lua/src/lzio.h +++ b/lib/lua/src/lzio.h diff --git a/src/lua/src/print.c b/lib/lua/src/print.c index e240cfc3c..e240cfc3c 100644 --- a/src/lua/src/print.c +++ b/lib/lua/src/print.c diff --git a/minetest.conf.example b/minetest.conf.example index 867d98584..c933047dd 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -87,6 +87,14 @@ # type: bool # enable_joysticks = false +# The identifier of the joystick to use +# type: int +# joystick_id = 0 + +# The type of joystick +# type: enum values: auto, generic, xbox +# joystick_type = auto + # The time in seconds it takes between repeated events # when holding down a joystick button combination. # type: float @@ -148,6 +156,11 @@ # type: key # keymap_cmd = / +# Key for opening the chat window to type local commands. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +# type: key +# keymap_cmd_local = . + # Key for opening the chat console. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 # type: key @@ -173,6 +186,31 @@ # type: key # keymap_noclip = KEY_KEY_H +# Key for selecting the next item in the hotbar. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +# type: key +# keymap_hotbar_next = KEY_KEY_N + +# Key for selecting the previous item in the hotbar. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +# type: key +# keymap_hotbar_previous = KEY_KEY_B + +# Key for muting the game. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +# type: key +# keymap_mute = KEY_KEY_M + +# Key for increasing the volume. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +# type: key +# keymap_increase_volume = + +# Key for decreasing the volume. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +# type: key +# keymap_decrease_volume = + # Key for toggling autorun. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 # type: key @@ -198,6 +236,11 @@ # type: key # keymap_drop = KEY_KEY_Q +# Key to use view zoom when possible. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +# type: key +# keymap_zoom = KEY_KEY_Z + # Key for toggling the display of the HUD. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 # type: key @@ -208,6 +251,11 @@ # type: key # keymap_toggle_chat = KEY_F2 +# Key for toggling the display of the large chat console. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +# type: key +# keymap_console = KEY_F10 + # Key for toggling the display of the fog. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 # type: key @@ -282,6 +330,11 @@ # type: bool # enable_remote_media_server = true +# Enable Lua modding support on client. +# This support is experimental and API can change. +# type: bool +# enable_client_modding = false + # URL to the server list displayed in the Multiplayer Tab. # type: string # serverlist_url = servers.minetest.net @@ -290,6 +343,10 @@ # type: string # serverlist_file = favoriteservers.txt +# Maximum size of the out chat queue. 0 to disable queueing and -1 to make the queue size unlimited +# type: int min: -1 +max_out_chat_queue_size = 20 + ## Graphics ### In-Game @@ -329,9 +386,13 @@ # enable_3d_clouds = true # Method used to highlight selected object. -# type: enum values: box, halo +# type: enum values: box, halo, none # node_highlighting = box +# Adds particles when digging a node. +# type: bool +# enable_particles = true + #### Filtering # Use mip mapping to scale textures. May slightly increase performance. @@ -372,13 +433,23 @@ # type: enum values: 0, 1, 2, 4, 8, 16 # fsaa = 0 +# Undersampling is similar to using lower screen resolution, but it applies +# to the game world only, keeping the GUI intact. +# It should give significant performance boost at the cost of less detailed image. +# type: enum values: 0, 2, 3, 4 +# undersampling = 0 + #### Shaders # Shaders allow advanced visual effects and may increase performance on some video cards. -# Thy only work with the OpenGL video backend. +# This only works with the OpenGL video backend. # type: bool # enable_shaders = true +# Path to shader directory. If no path is defined, default location will be used. +# type: path +# shader_path = + ##### Tone Mapping # Enables filmic tone mapping @@ -421,7 +492,7 @@ # Strength of parallax. # type: float -# 3d_parallax_strength = 0.025 +# 3d_paralax_strength = 0.025 # Number of parallax occlusion iterations. # type: int @@ -484,6 +555,10 @@ # type: int # screenH = 600 +# Save the window size automatically when modified. +# type: bool +# autosave_screensize = true + # Fullscreen mode. # type: bool # fullscreen = false @@ -502,13 +577,13 @@ # Field of view while zooming in degrees. # This requires the "zoom" privilege on the server. -# type: int min: 15 max: 160 +# type: int min: 7 max: 160 # zoom_fov = 15 -# Adjust the gamma encoding for the light tables. Lower numbers are brighter. +# Adjust the gamma encoding for the light tables. Higher numbers are brighter. # This setting is for the client only and is ignored by the server. # type: float min: 1 max: 3 -# display_gamma = 1.8 +# display_gamma = 2.2 # Path to texture directory. All textures are first searched from here. # type: path @@ -527,7 +602,7 @@ # type: int # cloud_radius = 12 -# Multiplier for view bobbing. +# Enable view bobbing and amount of view bobbing. # For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double. # type: float # view_bobbing_amount = 1.0 @@ -548,6 +623,10 @@ # type: enum values: none, anaglyph, interlaced, topbottom, sidebyside, pageflip # 3d_mode = none +# In-game chat console height, between 0.1 (10%) and 1.0 (100%). +# type: float min: 0.1 max: 1 +# console_height = 1.0 + # In-game chat console background color (R,G,B). # type: string # console_color = (0,0,0) @@ -581,10 +660,25 @@ # type: float # hud_hotbar_max_width = 1.0 +# Modifies the size of the hudbar elements. +# type: float +# hud_scaling = 1.0 + # Enables caching of facedir rotated meshes. # type: bool # enable_mesh_cache = false +# Delay between mesh updates on the client in ms. Increasing this will slow +# down the rate of mesh updates, thus reducing jitter on slower clients. +# type: int min: 0 max: 50 +# mesh_generation_interval = 0 + +# Size of the MapBlock cache of the mesh generator. Increasing this will +# increase the cache hit %, reducing the data being copied from the main +# thread, thus reducing jitter. +# type: int min: 0 max: 1000 +# meshgen_block_cache_size = 20 + # Enables minimap. # type: bool # enable_minimap = true @@ -614,10 +708,19 @@ # type: bool # inventory_items_animations = false +# Android systems only: Tries to create inventory textures from meshes +# when no supported render was found. +# type: bool +# inventory_image_hack = false + # Fraction of the visible distance at which fog starts to be rendered # type: float min: 0 max: 0.99 # fog_start = 0.4 +# Makes all liquids opaque +# type: bool +# opaque_water = false + ### Menus # Use a cloud animation for the main menu background. @@ -707,6 +810,11 @@ # type: int # screen_dpi = 72 +# Windows systems only: Start Minetest with the command line window in the background. +# Contains the same information as the file debug.txt (default name). +# type: bool +# enable_console = false + ## Sound # type: bool @@ -841,10 +949,18 @@ # type: int # item_entity_ttl = 900 +# If enabled, show the server status message on player connection. +# type: bool +# show_statusline_on_connect = true + # Enable players getting damage and dying. # type: bool # enable_damage = false +# Enable creative mode for new created maps. +# type: bool +# creative_mode = false + # A chosen map seed for a new map, leave empty for random. # Will be overridden when creating a new world in the main menu. # type: string @@ -913,7 +1029,7 @@ # How large area of blocks are subject to the active block stuff, stated in mapblocks (16 nodes). # In active blocks objects are loaded and ABMs run. # type: int -# active_block_range = 2 +# active_block_range = 3 # From how far blocks are sent to clients, stated in mapblocks (16 nodes). # type: int @@ -957,15 +1073,12 @@ # movement_speed_fast = 20 # type: float -# movement_speed_climb = 2 +# movement_speed_climb = 3 # type: float # movement_speed_jump = 6.5 # type: float -# movement_speed_descend = 6 - -# type: float # movement_liquid_fluidity = 1 # type: float @@ -1019,7 +1132,7 @@ # Length of time between NodeTimer execution cycles # type: float -# nodetimer_interval = 1.0 +# nodetimer_interval = 0.2 # If enabled, invalid world data won't cause the server to shut down. # Only enable this if you know what you are doing. @@ -1048,6 +1161,13 @@ # type: int min: 2 # block_send_optimize_distance = 4 +# If enabled the server will perform map block occlusion culling based on +# on the eye position of the player. This can reduce the number of blocks +# sent to the client 50-80%. The client will not longer receive most invisible +# so that the utility of noclip mode is reduced. +# type: bool +# server_side_occlusion_culling = true + ## Mapgen # Name of map generator to be used when creating a new world. @@ -1063,14 +1183,11 @@ # type: int # max_block_generate_distance = 6 -# Where the map generator stops. -# Please note: -# - Limited to 31000 (setting above has no effect) -# - The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks). -# - Those groups have an offset of -32, -32 nodes from the origin. -# - Only groups which are within the map_generation_limit are generated +# Limit of map generation, in nodes, in all 6 directions from (0, 0, 0). +# Only mapchunks completely within the mapgen limit are generated. +# Value is stored per-world. # type: int min: 0 max: 31000 -# map_generation_limit = 31000 +# mapgen_limit = 31000 # Global map generation attributes. # In Mapgen v6 the 'decorations' flag controls all decorations except trees @@ -1110,120 +1227,134 @@ # type: int # num_emerge_threads = 1 -#### Noise parameters and formats +#### Biome API temperature and humidity noise parameters -# Noise parameters can be specified as a set of positional values, for example: -# Offset, scale, (spread factors), seed offset, number of octaves, persistence, lacunarity -# mgv6_np_terrain_base = -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0 -# Or the group format can be used instead, for example: -# mgv6_np_terrain_base = { -# offset = -4, -# scale = 20, -# spread = (250, 250, 250), -# seed = 82341, -# octaves = 5, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = "defaults" -# } -# Only the group format supports noise flags which are needed for eased noise. -# Mgv5 uses eased noise for np_ground so this is shown in group format below. - -# Noise parameters for biome API temperature, humidity and biome blend. +# Temperature variation for biomes. # type: noise_params -# mg_biome_np_heat = 50, 50, (750, 750, 750), 5349, 3, 0.5, 2.0 +# mg_biome_np_heat = 50, 50, (1000, 1000, 1000), 5349, 3, 0.5, 2.0 +# Small-scale temperature variation for blending biomes on borders. # type: noise_params # mg_biome_np_heat_blend = 0, 1.5, (8, 8, 8), 13, 2, 1.0, 2.0 +# Humidity variation for biomes. # type: noise_params -# mg_biome_np_humidity = 50, 50, (750, 750, 750), 842, 3, 0.5, 2.0 +# mg_biome_np_humidity = 50, 50, (1000, 1000, 1000), 842, 3, 0.5, 2.0 +# Small-scale humidity variation for blending biomes on borders. # type: noise_params # mg_biome_np_humidity_blend = 0, 1.5, (8, 8, 8), 90003, 2, 1.0, 2.0 #### Mapgen v5 +# Map generation attributes specific to Mapgen v5. +# Flags that are not specified in the flag string are not modified from the default. +# Flags starting with 'no' are used to explicitly disable them. +# type: flags possible values: caverns, nocaverns +# mgv5_spflags = caverns + # Controls width of tunnels, a smaller value creates wider tunnels. # type: float # mgv5_cave_width = 0.125 +# Y-level of cavern upper limit. +# type: int +# mgv5_cavern_limit = -256 + +# Y-distance over which caverns expand to full size. +# type: int +# mgv5_cavern_taper = 256 + +# Defines full size of caverns, smaller values create larger caverns. +# type: float +# mgv5_cavern_threshold = 0.7 + +# Variation of biome filler depth. # type: noise_params # mgv5_np_filler_depth = 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0 +# Variation of terrain vertical scale. +# When noise is < -0.55 terrain is near-flat. # type: noise_params # mgv5_np_factor = 0, 1, (250, 250, 250), 920381, 3, 0.45, 2.0 +# Y-level of average terrain surface. # type: noise_params # mgv5_np_height = 0, 10, (250, 250, 250), 84174, 4, 0.5, 2.0 +# First of 2 3D noises that together define tunnels. # type: noise_params # mgv5_np_cave1 = 0, 12, (50, 50, 50), 52534, 4, 0.5, 2.0 +# Second of 2 3D noises that together define tunnels. # type: noise_params # mgv5_np_cave2 = 0, 12, (50, 50, 50), 10325, 4, 0.5, 2.0 -# Noise parameters in group format, unsupported by advanced settings -# menu but settable in minetest.conf. -# See documentation of noise parameter formats above. -# mgv5_np_ground = { -# offset = 0, -# scale = 40, -# spread = (80, 80, 80), -# seed = 983240, -# octaves = 4, -# persistence = 0.55, -# lacunarity = 2.0, -# flags = "eased" -# } +# 3D noise defining giant caverns. +# type: noise_params +# mgv5_np_cavern = 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 #### Mapgen v6 # Map generation attributes specific to Mapgen v6. -# When snowbiomes are enabled jungles are automatically enabled, the 'jungles' flag is ignored. +# The 'snowbiomes' flag enables the new 5 biome system. +# When the new biome system is enabled jungles are automatically enabled and +# the 'jungles' flag is ignored. # Flags that are not specified in the flag string are not modified from the default. # Flags starting with 'no' are used to explicitly disable them. # type: flags possible values: jungles, biomeblend, mudflow, snowbiomes, flat, trees, nojungles, nobiomeblend, nomudflow, nosnowbiomes, noflat, notrees # mgv6_spflags = jungles,biomeblend,mudflow,snowbiomes,trees -# Controls size of deserts and beaches in Mapgen v6. -# When snowbiomes are enabled 'mgv6_freq_desert' is ignored. +# Deserts occur when np_biome exceeds this value. +# When the new biome system is enabled, this is ignored. # type: float # mgv6_freq_desert = 0.45 +# Sandy beaches occur when np_beach exceeds this value. # type: float # mgv6_freq_beach = 0.15 +# Y-level of lower terrain and lakebeds. # type: noise_params # mgv6_np_terrain_base = -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0 +# Y-level of higher (cliff-top) terrain. # type: noise_params # mgv6_np_terrain_higher = 20, 16, (500, 500, 500), 85039, 5, 0.6, 2.0 +# Varies steepness of cliffs. # type: noise_params # mgv6_np_steepness = 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2.0 +# Defines areas of 'terrain_higher' (cliff-top terrain). # type: noise_params # mgv6_np_height_select = 0.5, 1, (250, 250, 250), 4213, 5, 0.69, 2.0 +# Varies depth of biome surface nodes. # type: noise_params # mgv6_np_mud = 4, 2, (200, 200, 200), 91013, 3, 0.55, 2.0 +# Defines areas with sandy beaches. # type: noise_params # mgv6_np_beach = 0, 1, (250, 250, 250), 59420, 3, 0.50, 2.0 +# Temperature variation for biomes. # type: noise_params # mgv6_np_biome = 0, 1, (500, 500, 500), 9130, 3, 0.50, 2.0 +# Variation of number of caves. # type: noise_params # mgv6_np_cave = 6, 6, (250, 250, 250), 34329, 3, 0.50, 2.0 +# Humidity variation for biomes. # type: noise_params # mgv6_np_humidity = 0.5, 0.5, (500, 500, 500), 72384, 3, 0.50, 2.0 +# Defines tree areas and tree density. # type: noise_params # mgv6_np_trees = 0, 1, (125, 125, 125), 2, 4, 0.66, 2.0 +# Defines areas where trees have apples. # type: noise_params # mgv6_np_apple_trees = 0, 1, (100, 100, 100), 342902, 3, 0.45, 2.0 @@ -1234,8 +1365,8 @@ # Floatlands are currently experimental and subject to change. # Flags that are not specified in the flag string are not modified from the default. # Flags starting with 'no' are used to explicitly disable them. -# type: flags possible values: mountains, ridges, floatlands, nomountains, noridges, nofloatlands -# mgv7_spflags = mountains,ridges +# type: flags possible values: mountains, ridges, floatlands, caverns, nomountains, noridges, nofloatlands, nocaverns +# mgv7_spflags = mountains,ridges,nofloatlands,caverns # Controls width of tunnels, a smaller value creates wider tunnels. # type: float @@ -1258,42 +1389,74 @@ # type: int # mgv7_shadow_limit = 1024 +# Y-level of cavern upper limit. +# type: int +# mgv7_cavern_limit = -256 + +# Y-distance over which caverns expand to full size. +# type: int +# mgv7_cavern_taper = 256 + +# Defines full size of caverns, smaller values create larger caverns. +# type: float +# mgv7_cavern_threshold = 0.7 + +# Y-level of higher (cliff-top) terrain. # type: noise_params # mgv7_np_terrain_base = 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0 +# Y-level of lower terrain and lakebeds. # type: noise_params # mgv7_np_terrain_alt = 4, 25, (600, 600, 600), 5934, 5, 0.6, 2.0 +# Varies roughness of terrain. +# Defines the 'persistence' value for terrain_base and terrain_alt noises. # type: noise_params # mgv7_np_terrain_persist = 0.6, 0.1, (2000, 2000, 2000), 539, 3, 0.6, 2.0 +# Defines areas of higher (cliff-top) terrain and affects steepness of cliffs. # type: noise_params # mgv7_np_height_select = -8, 16, (500, 500, 500), 4213, 6, 0.7, 2.0 +# Variation of biome filler depth. # type: noise_params # mgv7_np_filler_depth = 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0 +# Variation of maximum mountain height (in nodes). # type: noise_params # mgv7_np_mount_height = 256, 112, (1000, 1000, 1000), 72449, 3, 0.6, 2.0 +# Defines large-scale river channel structure. # type: noise_params # mgv7_np_ridge_uwater = 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0 +# Defines areas of floatland smooth terrain. +# Smooth floatlands occur when noise > 0. # type: noise_params # mgv7_np_floatland_base = -0.6, 1.5, (600, 600, 600), 114, 5, 0.6, 2.0 +# Variation of hill height and lake depth on floatland smooth terrain. # type: noise_params # mgv7_np_float_base_height = 48, 24, (300, 300, 300), 907, 4, 0.7, 2.0 +# 3D noise defining mountain structure and height. +# Also defines structure of floatland mountain terrain. # type: noise_params # mgv7_np_mountain = -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0 +# 3D noise defining structure of river canyon walls. # type: noise_params # mgv7_np_ridge = 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0 +# 3D noise defining giant caverns. +# type: noise_params +# mgv7_np_cavern = 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 + +# First of 2 3D noises that together define tunnels. # type: noise_params # mgv7_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 +# Second of 2 3D noises that together define tunnels. # type: noise_params # mgv7_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 @@ -1303,8 +1466,8 @@ # Occasional lakes and hills can be added to the flat world. # Flags that are not specified in the flag string are not modified from the default. # Flags starting with 'no' are used to explicitly disable them. -# type: flags possible values: lakes, hills, , nolakes, nohills -# mgflat_spflags = +# type: flags possible values: lakes, hills, nolakes, nohills +# mgflat_spflags = nolakes,nohills # Y of flat ground. # type: int @@ -1338,18 +1501,19 @@ # type: float # mgflat_hill_steepness = 64.0 -# Determines terrain shape. -# The 3 numbers in brackets control the scale of the -# terrain, the 3 numbers should be identical. +# Defines location and terrain of optional hills and lakes. # type: noise_params # mgflat_np_terrain = 0, 1, (600, 600, 600), 7244, 5, 0.6, 2.0 +# Variation of biome filler depth. # type: noise_params # mgflat_np_filler_depth = 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0 +# First of 2 3D noises that together define tunnels. # type: noise_params # mgflat_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 +# Second of 2 3D noises that together define tunnels. # type: noise_params # mgflat_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 @@ -1425,15 +1589,19 @@ # type: float # mgfractal_julia_w = 0.33 +# Y-level of seabed. # type: noise_params # mgfractal_np_seabed = -14, 9, (600, 600, 600), 41900, 5, 0.6, 2.0 +# Variation of biome filler depth. # type: noise_params # mgfractal_np_filler_depth = 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0 +# First of 2 3D noises that together define tunnels. # type: noise_params # mgfractal_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 +# Second of 2 3D noises that together define tunnels. # type: noise_params # mgfractal_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 @@ -1530,7 +1698,7 @@ # Prevent mods from doing insecure things like running shell commands. # type: bool -# secure.enable_security = false +# secure.enable_security = true # Comma-separated list of trusted mods that are allowed to access insecure # functions even when mod security is on (via request_insecure_environment()). @@ -1558,7 +1726,6 @@ # profiler.default_report_format = txt # The file path relative to your worldpath in which profiles will be saved to. -# # type: string # profiler.report_path = "" @@ -1622,7 +1789,7 @@ # - action # - info # - verbose -# type: enum values: , warning, action, info, verbose +# type: enum values: , none, error, warning, action, info, verbose # debug_log_level = action # IPv6 support. @@ -1674,4 +1841,3 @@ # Print the engine's profiling data in regular intervals (in seconds). 0 = disable. Useful for developers. # type: int # profiler_print_interval = 0 - diff --git a/minetest.conf.example.extra b/minetest.conf.example.extra new file mode 100644 index 000000000..7dd6c0939 --- /dev/null +++ b/minetest.conf.example.extra @@ -0,0 +1,63 @@ +# This file contains information (some of which was previously stored in +# minetest.conf.example) that cannot be automatically generated from +# builtin/settingtypes.txt. +# This file contains a list of settings and their default value for minetest.conf + +# By default, all the settings are commented and not functional. +# Uncomment settings by removing the preceding #. + +# minetest.conf is read by default from: +# ../minetest.conf +# ../../minetest.conf +# Any other path can be chosen by passing the path as a parameter +# to the program, eg. "minetest.exe --config ../minetest.conf.example". + +# Further documentation: +# http://wiki.minetest.net/ + + +# Mapgen + +# Noise parameters and formats + +# Noise parameters can be specified as a set of positional values, for example: +# +# Offset, scale, (x, y, z spread factors), seed offset, octaves, persistence, lacunarity +# mgv6_np_terrain_base = -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0 +# +# Or the group format can be used instead, for example: +# +# mgv6_np_terrain_base = { +# offset = -4, +# scale = 20, +# spread = (250, 250, 250), +# seed = 82341, +# octaves = 5, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = "defaults" +# } +# +# The advanced settings menu does not yet support the group format. +# Only the group format supports noise flags which are needed for eased noise. +# Mgv5 uses eased noise for np_ground so this is shown in group format below +# and is not present in the advanced settings menu. + +# Mapgen v5 + +# Noise parameter in group format, unsupported by advanced settings menu but +# settable in minetest.conf. +# See documentation of noise parameter formats above. +# +# 3D noise defining terrain. +# type: noise_params +# mgv5_np_ground = { +# offset = 0, +# scale = 40, +# spread = (80, 80, 80), +# seed = 983240, +# octaves = 4, +# persistence = 0.55, +# lacunarity = 2.0, +# flags = "eased" +# } diff --git a/misc/debpkg-control b/misc/debpkg-control new file mode 100644 index 000000000..b228f4c79 --- /dev/null +++ b/misc/debpkg-control @@ -0,0 +1,36 @@ +Section: games +Priority: extra +Standards-Version: 3.6.2 +Package: minetest-staging +Version: 0.4.15-DATEPLACEHOLDER +Depends: libc6, libcurl3-gnutls, libfreetype6, libirrlicht1.8, LEVELDB_PLACEHOLDER, liblua5.1-0, libluajit-5.1-2, libopenal1, libstdc++6, libvorbisfile3, libx11-6, zlib1g +Maintainer: Loic Blot <loic.blot@unix-experience.fr> +Homepage: http://minetest.net/ +Vcs-Git: https://github.com/minetest/minetest.git +Vcs-Browser: https://github.com/minetest/minetest.git +Architecture: amd64 +Build-Depends: + cmake, + gettext, + libbz2-dev, + libcurl4-gnutls-dev, + libfreetype6-dev, + libglu1-mesa-dev, + libirrlicht-dev (>= 1.7.0), + libjpeg-dev, + libjsoncpp-dev, + libleveldb-dev, + libluajit-5.1-dev | liblua5.1-dev, + libogg-dev, + libopenal-dev, + libpng-dev, + libsqlite3-dev, + libvorbis-dev, + libx11-dev, + zlib1g-dev +Description: Multiplayer infinite-world block sandbox (server) + Minetest is a minecraft-inspired game written from scratch and licensed + under the LGPL (version 2.1 or later). It supports both survival and creative + modes along with multiplayer support, dynamic lighting, and an "infinite" map + generator. +Conflicts: minetestc55, minetest, minetest-server, minetest-data diff --git a/misc/minetest.appdata.xml b/misc/net.minetest.minetest.appdata.xml index 65acf96ec..277225d4b 100644 --- a/misc/minetest.appdata.xml +++ b/misc/net.minetest.minetest.appdata.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> -<application> - <id type="desktop">minetest.desktop</id> +<component type="desktop-application"> + <id>net.minetest.minetest.desktop</id> <metadata_license>CC0-1.0</metadata_license> <project_license>LGPL-2.1+ and CC-BY-SA-3.0 and MIT and Apache-2.0</project_license> <name>Minetest</name> @@ -28,9 +28,15 @@ </ul> </description> <screenshots> - <screenshot type="default" width="1920" height="1080">http://www.minetest.net/media/gallery/1.jpg</screenshot> - <screenshot width="1920" height="1080">http://www.minetest.net/media/gallery/3.jpg</screenshot> - <screenshot width="1920" height="1080">http://www.minetest.net/media/gallery/5.jpg</screenshot> + <screenshot type="default"> + <image width="1920" height="1080">http://www.minetest.net/media/gallery/1.jpg</image> + </screenshot> + <screenshot> + <image width="1920" height="1080">http://www.minetest.net/media/gallery/3.jpg</image> + </screenshot> + <screenshot> + <image width="1920" height="1080">http://www.minetest.net/media/gallery/5.jpg</image> + </screenshot> </screenshots> <keywords> <keyword>sandbox</keyword> @@ -42,5 +48,11 @@ <url type="bugtracker">http://www.minetest.net/development/#reporting-issues</url> <url type="translate">http://dev.minetest.net/Translation</url> <url type="donation">http://www.minetest.net/development/#donate</url> - <updatecontact>sfan5@live.de</updatecontact> -</application> + <url type="faq">http://wiki.minetest.net/FAQ</url> + <url type="help">http://wiki.minetest.net</url> + <provides> + <binary>minetest</binary> + </provides> + <translation type="gettext">minetest</translation> + <update_contact>sfan5@live.de</update_contact> +</component> diff --git a/misc/minetest.desktop b/misc/net.minetest.minetest.desktop index ca493c44e..ca493c44e 100644 --- a/misc/minetest.desktop +++ b/misc/net.minetest.minetest.desktop diff --git a/po/be/minetest.po b/po/be/minetest.po index 25d8bf0af..263b05236 100644 --- a/po/be/minetest.po +++ b/po/be/minetest.po @@ -2,774 +2,869 @@ # Copyright (C) 2010 celeron55, Pertu Ahola <celeron55@gmail.com> # This file is distributed under the same license as the Minetest package. # Selat <LongExampleTestName@gmail.com>, 2014. +# Viktar Vauchkevich <victorenator@gmail.com>, 2017. msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2013-11-23 17:37+0100\n" -"Last-Translator: Selat <LongExampleTestName@gmail.com>\n" -"Language-Team: Belarusian\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-05-25 17:22+0000\n" +"Last-Translator: Viktar Vauchkevich <victorenator@gmail.com>\n" +"Language-Team: Belarusian " +"<https://hosted.weblate.org/projects/minetest/minetest/be/>\n" "Language: be\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 2.14.1\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Ðдрадзіцца" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Ð’Ñ‹ памерлі." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" -msgstr "" +msgstr "Памылка Ñž Ñкрыпце Lua, Ñ‚Ð°ÐºÐ°Ñ Ñк у модзе:" #: builtin/fstk/ui.lua msgid "An error occured:" -msgstr "" +msgstr "ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°:" #: builtin/fstk/ui.lua msgid "Main menu" -msgstr "" +msgstr "Галоўнае меню" #: builtin/fstk/ui.lua builtin/mainmenu/store.lua msgid "Ok" -msgstr "" +msgstr "Добра" #: builtin/fstk/ui.lua msgid "Reconnect" -msgstr "" +msgstr "Перазлучыцца" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "" +msgstr "Сервер патрабуе перазлучÑнне:" #: builtin/mainmenu/common.lua src/game.cpp msgid "Loading..." -msgstr "" +msgstr "Загрузка…" #: builtin/mainmenu/common.lua msgid "Protocol version mismatch. " -msgstr "" +msgstr "ÐеадпаведнаÑць верÑÑ–Ñ– пратакола. " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " -msgstr "" +msgstr "Сервер патрабуе верÑÑ–ÑŽ пратакола $1. " #: builtin/mainmenu/common.lua msgid "Server supports protocol versions between $1 and $2. " -msgstr "" +msgstr "Сервер падтрымлівае верÑÑ–Ñ– пратакола паміж $1 Ñ– $2. " #: builtin/mainmenu/common.lua msgid "Try reenabling public serverlist and check your internet connection." msgstr "" +"ПаÑпрабуйце паўторнае ўключÑнне ÑпіÑу публічных Ñервераў Ñ– праверце " +"падлучÑнне да ІнтÑрнÑту." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." -msgstr "" +msgstr "Мы падтрымліваем толькі $1 верÑÑ–ÑŽ пратакола." #: builtin/mainmenu/common.lua msgid "We support protocol versions between version $1 and $2." -msgstr "" +msgstr "Мы падтрымліваем верÑÑ–Ñ– пратакола паміж $1 Ñ– $2." #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" -msgstr "" +msgstr "ÐдмÑніць" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" -msgstr "" +msgid "Dependencies:" +msgstr "ЗалежнаÑці:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable MP" -msgstr "" +msgstr "Ðдключыць МП" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Ðдключыць уÑÑ‘" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" -msgstr "" +msgstr "Уключыць МП" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" -msgstr "" +msgstr "Уключыць уÑÑ‘" #: builtin/mainmenu/dlg_config_world.lua msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "chararacters [a-z0-9_] are allowed." msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "" +"Ðе атрымалаÑÑ ÑžÐºÐ»ÑŽÑ‡Ñ‹Ñ†ÑŒ мод «$1» бо ён ўтрымлівае Ð½ÐµÐ´Ð°Ð¿ÑƒÑˆÑ‡Ð°Ð»ÑŒÐ½Ñ‹Ñ Ñімвалы. " +"ДапуÑкаюцца толькі [a-z0-9_]." #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" -msgstr "" +msgstr "Мод:" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "ÐеабавÑÐ·ÐºÐ¾Ð²Ñ‹Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð°Ñці:" #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" -msgstr "" +msgstr "Захаваць" #: builtin/mainmenu/dlg_config_world.lua msgid "World:" -msgstr "" +msgstr "Свет:" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" -msgstr "" +msgstr "уключаны" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "" +msgstr "Свет з назвай «$1» ужо Ñ–Ñнуе" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" -msgstr "" +msgstr "Стварыць" #: builtin/mainmenu/dlg_create_world.lua msgid "Download a subgame, such as minetest_game, from minetest.net" -msgstr "" +msgstr "Спампаваць падгульню, Ñк minetest_game, з minetest.net" #: builtin/mainmenu/dlg_create_world.lua msgid "Download one from minetest.net" -msgstr "" +msgstr "Спампаваць з minetest.net" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Game" -msgstr "" +msgstr "ГульнÑ" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" -msgstr "" +msgstr "Генератар мапы" #: builtin/mainmenu/dlg_create_world.lua msgid "No worldname given or no game selected" -msgstr "" +msgstr "Дадзены Ñвет без назвы або не абрана гульнÑ" #: builtin/mainmenu/dlg_create_world.lua msgid "Seed" -msgstr "" +msgstr "Лікавы Ñтан" #: builtin/mainmenu/dlg_create_world.lua msgid "Warning: The minimal development test is meant for developers." -msgstr "" +msgstr "Увага: мінімальны Ñ‚ÑÑÑ‚ раÑпрацоўкі прызначаны Ð´Ð»Ñ Ñ€Ð°Ñпрацоўкі." #: builtin/mainmenu/dlg_create_world.lua msgid "World name" -msgstr "" +msgstr "Ðазва Ñвету" #: builtin/mainmenu/dlg_create_world.lua msgid "You have no subgames installed." -msgstr "" +msgstr "У Ð²Ð°Ñ Ð½Ñма уÑтаноўленых падгульнÑÑž." #: builtin/mainmenu/dlg_delete_mod.lua msgid "Are you sure you want to delete \"$1\"?" -msgstr "" +msgstr "Ð’Ñ‹ ўпÑўнены, што хочаце выдаліць «$1»?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" -msgstr "" +msgstr "Выдаліць" #: builtin/mainmenu/dlg_delete_mod.lua msgid "Modmgr: failed to delete \"$1\"" -msgstr "" +msgstr "Менеджар модаў: не атрымалаÑÑ Ð²Ñ‹Ð´Ð°Ð»Ñ–Ñ†ÑŒ «$1»" #: builtin/mainmenu/dlg_delete_mod.lua msgid "Modmgr: invalid modpath \"$1\"" -msgstr "" +msgstr "Менеджар модаў: некарÑктны шлÑÑ… да «$1»" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" -msgstr "" +msgstr "Выдаліць Ñвет «$1»?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" -msgstr "" +msgstr "ПрынÑць" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "" +msgstr "Пераназваць модпак:" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "\"$1\" is not a valid flag." -msgstr "" +msgstr "«$1» — некарÑктны параметр." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" -msgstr "" +msgstr "(ÐÑма апіÑÐ°Ð½Ð½Ñ Ð´Ð»Ñ Ð³Ñтай налады)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" -msgstr "" +msgstr "< Ðазад на Ñтаронку наладаў" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Browse" -msgstr "" +msgstr "ПраглÑдзець" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Disabled" -msgstr "" +msgstr "Ðдключаны" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Edit" -msgstr "" +msgstr "Правіць" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Enabled" -msgstr "" +msgstr "Уключаны" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Format is 3 numbers separated by commas and inside brackets." -msgstr "" +msgstr "Фармат: у дужках 3 лікі праз коÑку." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "" "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " "<octaves>, <persistence>" msgstr "" +"Фармат: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " +"<octaves>, <persistence>" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" -msgstr "" +msgstr "Гульні" #: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua msgid "Mods" -msgstr "" +msgstr "Моды" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Optionally the lacunarity can be appended with a leading comma." -msgstr "" +msgstr "Пры жаданні можа быць дабаўлена лакунарнаÑць праз коÑку." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a comma seperated list of flags." -msgstr "" +msgstr "Калі лаÑка, увÑдзіце ÑÐ¿Ñ–Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ñž, падзеленых коÑкамі." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." -msgstr "" +msgstr "Калі лаÑка, увÑдзіце карÑктны цÑлы лік." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid number." -msgstr "" +msgstr "Калі лаÑка, увÑдзіце карÑктны нумар." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Possible values are: " -msgstr "" +msgstr "ÐœÐ°Ð³Ñ‡Ñ‹Ð¼Ñ‹Ñ Ð·Ð½Ð°Ñ‡Ñнні: " #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Restore Default" -msgstr "" +msgstr "Ðднавіць агаданае" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Пошук" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" -msgstr "" +msgstr "Ðбраць шлÑÑ…" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Show technical names" -msgstr "" +msgstr "Паказваць Ñ‚ÑÑ…Ð½Ñ–Ñ‡Ð½Ñ‹Ñ Ð½Ð°Ð·Ð²Ñ‹" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." -msgstr "" +msgid "The value must be at least $1." +msgstr "ЗначÑнне павінна быць Ñк мінімум $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." -msgstr "" +msgid "The value must not be larger than $1." +msgstr "ЗначÑнне павінна быць не больш за $1." #: builtin/mainmenu/modmgr.lua msgid "" "\n" "Install Mod: unsupported filetype \"$1\" or broken archive" msgstr "" +"\n" +"УÑталÑванне моду: не падтрымліваецца файл тыпу «$1» або ÑапÑаваны архіў" #: builtin/mainmenu/modmgr.lua msgid "Failed to install $1 to $2" -msgstr "" +msgstr "Ðе атрымалаÑÑ ÑžÑталÑваць $1 у $2" #: builtin/mainmenu/modmgr.lua msgid "Install Mod: file: \"$1\"" -msgstr "" +msgstr "УÑталÑванне моду: файл: «$1»" #: builtin/mainmenu/modmgr.lua msgid "Install Mod: unable to find real modname for: $1" -msgstr "" +msgstr "УÑталÑванне моду: не ўдалоÑÑ Ð·Ð½Ð°Ð¹Ñці Ñ€Ñальную назву Ð´Ð»Ñ Â«$1»" #: builtin/mainmenu/modmgr.lua msgid "Install Mod: unable to find suitable foldername for modpack $1" -msgstr "" +msgstr "УÑталÑванне моду: не ўдалоÑÑ Ð·Ð½Ð°Ð¹Ñці прыдатны каталог Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¿Ð°ÐºÑƒ «$1»" + +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "ПадгульнÑÐ²Ñ‹Ñ Ð¼Ð¾Ð´Ñ‹" #: builtin/mainmenu/store.lua msgid "Close store" -msgstr "" +msgstr "Закрыць краму" #: builtin/mainmenu/store.lua msgid "Downloading $1, please wait..." -msgstr "" +msgstr "Запампоўка $1. Чакайце, калі лаÑка…" #: builtin/mainmenu/store.lua msgid "Install" -msgstr "" +msgstr "УÑталÑваць" #: builtin/mainmenu/store.lua msgid "Page $1 of $2" -msgstr "" +msgstr "Старонка $1 з $2" #: builtin/mainmenu/store.lua msgid "Rating" -msgstr "" - -#: builtin/mainmenu/store.lua -msgid "Search" -msgstr "" +msgstr "Ð Ñйтынг" #: builtin/mainmenu/store.lua msgid "Shortname:" -msgstr "" +msgstr "ÐšÐ°Ñ€Ð¾Ñ‚ÐºÐ°Ñ Ð½Ð°Ð·Ð²Ð°:" #: builtin/mainmenu/store.lua msgid "Successfully installed:" -msgstr "" +msgstr "ПаÑпÑхова ÑžÑталÑваны:" #: builtin/mainmenu/store.lua msgid "Unsorted" -msgstr "" +msgstr "Без ÑартаваннÑ" #: builtin/mainmenu/store.lua msgid "re-Install" -msgstr "" +msgstr "пераўÑталÑваць" #: builtin/mainmenu/tab_credits.lua msgid "Active Contributors" -msgstr "" +msgstr "ÐÐºÑ‚Ñ‹ÑžÐ½Ñ‹Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÑ–" #: builtin/mainmenu/tab_credits.lua msgid "Core Developers" -msgstr "" +msgstr "ÐÑÐ½Ð¾ÑžÐ½Ñ‹Ñ Ñ€Ð°Ñпрацоўнікі" #: builtin/mainmenu/tab_credits.lua msgid "Credits" -msgstr "" +msgstr "ПадзÑкі" #: builtin/mainmenu/tab_credits.lua msgid "Previous Contributors" -msgstr "" +msgstr "Ð‘Ñ‹Ð»Ñ‹Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÑ–" #: builtin/mainmenu/tab_credits.lua msgid "Previous Core Developers" -msgstr "" +msgstr "Ð‘Ñ‹Ð»Ñ‹Ñ Ð°ÑÐ½Ð¾ÑžÐ½Ñ‹Ñ Ñ€Ð°Ñпрацоўнікі" + +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "ÐнанÑаваць Ñервер" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "ÐÐ´Ñ€Ð°Ñ Ð¿Ñ€Ñ‹Ð²Ñзкі" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Канфігураваць" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Творчы Ñ€Ñжым" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Пашкоджанні" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "ГулÑць (Ñервер)" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "Сервер" + +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" +msgstr "Ð›Ð°ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð³ÑƒÐ»ÑŒÐ½Ñ" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "ІмÑ/Пароль" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Ðовы" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "ÐÑма Ñтворанага або абранага Ñвету!" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "ГулÑць" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Порт" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Ðбраць Ñвет:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Порт Ñервера" #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" -msgstr "" +msgstr "УÑталÑÐ²Ð°Ð½Ñ‹Ñ Ð¼Ð¾Ð´Ñ‹:" #: builtin/mainmenu/tab_mods.lua msgid "Mod information:" -msgstr "" +msgstr "Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð°Ð± модзе:" + +#: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "Без залежнаÑцей." #: builtin/mainmenu/tab_mods.lua msgid "No mod description available" -msgstr "" +msgstr "ÐÑма апіÑÐ°Ð½Ð½Ñ Ð¼Ð¾Ð´Ñƒ" #: builtin/mainmenu/tab_mods.lua msgid "Rename" -msgstr "" +msgstr "Пераназваць" #: builtin/mainmenu/tab_mods.lua msgid "Select Mod File:" -msgstr "" +msgstr "Ðбраць файл моду:" #: builtin/mainmenu/tab_mods.lua msgid "Uninstall selected mod" -msgstr "" +msgstr "Выдаліць абраны мод" #: builtin/mainmenu/tab_mods.lua msgid "Uninstall selected modpack" -msgstr "" +msgstr "Выдаліць абраны модпак" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" -msgstr "" - -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "" +msgstr "ÐÐ´Ñ€Ð°Ñ / Порт" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" -msgstr "" +msgstr "Злучыцца" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" -msgstr "" +msgstr "Творчы Ñ€Ñжым" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" -msgstr "" +msgstr "Пашкоджанні ўключаны" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" -msgstr "" +msgstr "Разлюбіць" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" -msgstr "" +msgstr "Упадабаны" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" -msgstr "" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "" +msgstr "Ð†Ð¼Ñ / Пароль" -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "Пінг" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "Граць анлайн" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "" - -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP уключаны" #: builtin/mainmenu/tab_settings.lua msgid "2x" -msgstr "" +msgstr "2x" #: builtin/mainmenu/tab_settings.lua msgid "3D Clouds" -msgstr "" +msgstr "3D-аблокі" #: builtin/mainmenu/tab_settings.lua msgid "4x" -msgstr "" +msgstr "4x" #: builtin/mainmenu/tab_settings.lua msgid "8x" -msgstr "" +msgstr "8x" #: builtin/mainmenu/tab_settings.lua msgid "Advanced Settings" -msgstr "" +msgstr "ÐŸÐ°ÑˆÑ‹Ñ€Ð°Ð½Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" -msgstr "" +msgstr "Згладжванне:" #: builtin/mainmenu/tab_settings.lua msgid "Are you sure to reset your singleplayer world?" -msgstr "" +msgstr "Ð’Ñ‹ ўпÑўнены, што хочаце анулÑваць Ñвет Ñамотнай гульні?" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "Ðўтаматычна захоўваць памеры Ñкрана" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" -msgstr "" +msgstr "Білінейны фільтр" #: builtin/mainmenu/tab_settings.lua msgid "Bump Mapping" -msgstr "" +msgstr "ТÑкÑтураванне маÑкамі" #: builtin/mainmenu/tab_settings.lua msgid "Change keys" -msgstr "" +msgstr "ЗмÑніць" #: builtin/mainmenu/tab_settings.lua msgid "Connected Glass" -msgstr "" +msgstr "Злучанае шкло" #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" -msgstr "" +msgstr "Ðздобнае ліÑце" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" -msgstr "" +msgstr "MIP-Ñ‚ÑкÑтураванне" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap + Aniso. Filter" -msgstr "" +msgstr "MIP-Ñ‚ÑкÑтураванне + анізатропны фільтр" #: builtin/mainmenu/tab_settings.lua msgid "No" -msgstr "" +msgstr "Ðе" #: builtin/mainmenu/tab_settings.lua msgid "No Filter" -msgstr "" +msgstr "Без фільтра" #: builtin/mainmenu/tab_settings.lua msgid "No Mipmap" -msgstr "" +msgstr "Без MIP-Ñ‚ÑкÑтураваннÑ" #: builtin/mainmenu/tab_settings.lua msgid "Node Highlighting" -msgstr "" +msgstr "ПадÑвÑтленне вузла" #: builtin/mainmenu/tab_settings.lua msgid "Node Outlining" -msgstr "" +msgstr "ÐÐ±Ñ€Ñ‹Ñ Ð²ÑƒÐ·Ð»Ð°" #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua msgid "None" -msgstr "" +msgstr "ÐÑма" #: builtin/mainmenu/tab_settings.lua msgid "Normal Mapping" -msgstr "" +msgstr "ТÑкÑтураванне нармалÑмі" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" -msgstr "" +msgstr "ÐепразрыÑтае ліÑце" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Water" -msgstr "" +msgstr "ÐепразрыÑÑ‚Ð°Ñ Ð²Ð°Ð´Ð°" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Parallax Occlusion" -msgstr "" +msgstr "ПаралакÑÐ½Ð°Ñ Ð°ÐºÐ»ÑŽÐ·Ñ–Ñ" #: builtin/mainmenu/tab_settings.lua msgid "Particles" -msgstr "" +msgstr "ЧаÑціцы" #: builtin/mainmenu/tab_settings.lua msgid "Reset singleplayer world" -msgstr "" +msgstr "Ðбнуліць Ñвет Ñамотнай гульні" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Ðкран:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" -msgstr "" +msgstr "Ðалады" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" -msgstr "" +msgstr "ШÑйдÑры" #: builtin/mainmenu/tab_settings.lua msgid "Simple Leaves" -msgstr "" +msgstr "ПроÑтае ліÑце" #: builtin/mainmenu/tab_settings.lua msgid "Smooth Lighting" -msgstr "" +msgstr "МÑккае аÑвÑтленне" #: builtin/mainmenu/tab_settings.lua msgid "Texturing:" -msgstr "" +msgstr "ТÑкÑтураванне:" #: builtin/mainmenu/tab_settings.lua msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" +msgstr "Ð”Ð»Ñ ÑžÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ ÑˆÑйдÑраў неабходна выкарыÑтоўваць OpenGL." #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" -msgstr "" +msgstr "Танальнае адлюÑтраванне" #: builtin/mainmenu/tab_settings.lua msgid "Touchthreshold (px)" -msgstr "" +msgstr "СÑнÑарны парог (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" -msgstr "" +msgstr "Трылінейны фільтр" #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" -msgstr "" +msgstr "Дрыготкае ліÑце" #: builtin/mainmenu/tab_settings.lua msgid "Waving Plants" -msgstr "" +msgstr "Ð”Ñ€Ñ‹Ð³Ð¾Ñ‚ÐºÑ–Ñ Ñ€Ð°Ñліны" #: builtin/mainmenu/tab_settings.lua msgid "Waving Water" -msgstr "" +msgstr "ХвалÑванне вады" #: builtin/mainmenu/tab_settings.lua msgid "Yes" -msgstr "" +msgstr "Так" #: builtin/mainmenu/tab_simple_main.lua msgid "Config mods" -msgstr "" +msgstr "Ðалады модаў" #: builtin/mainmenu/tab_simple_main.lua msgid "Main" -msgstr "" +msgstr "Галоўнае меню" #: builtin/mainmenu/tab_simple_main.lua msgid "Start Singleplayer" -msgstr "" - -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "" +msgstr "Старт Ñамотнай гульні" #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" -msgstr "" +msgstr "ÐÑма звеÑтак" #: builtin/mainmenu/tab_texturepacks.lua msgid "Select texture pack:" -msgstr "" +msgstr "Ðбраць пакет Ñ‚ÑкÑтур:" #: builtin/mainmenu/tab_texturepacks.lua msgid "Texturepacks" -msgstr "" +msgstr "Пакеты Ñ‚ÑкÑтур" #: src/client.cpp msgid "Connection timed out." -msgstr "" +msgstr "Таймаут злучÑннÑ." #: src/client.cpp msgid "Done!" -msgstr "" +msgstr "Гатова!" #: src/client.cpp msgid "Initializing nodes" -msgstr "" +msgstr "ІніцыÑÐ»Ñ–Ð·Ð°Ñ†Ñ‹Ñ Ð²ÑƒÐ·Ð»Ð¾Ñž" #: src/client.cpp msgid "Initializing nodes..." -msgstr "" +msgstr "ІніцыÑÐ»Ñ–Ð·Ð°Ñ†Ñ‹Ñ Ð²ÑƒÐ·Ð»Ð¾Ñžâ€¦" #: src/client.cpp msgid "Loading textures..." -msgstr "" +msgstr "Загрузка Ñ‚ÑкÑтур…" #: src/client.cpp msgid "Rebuilding shaders..." -msgstr "" +msgstr "Перабудова шÑйдÑраў…" #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" -msgstr "" +msgstr "Памылка злучÑÐ½Ð½Ñ (таймаут?)" #: src/client/clientlauncher.cpp msgid "Could not find or load game \"" -msgstr "" +msgstr "Ðемагчыма знайÑці ці загрузіць гульню \"" #: src/client/clientlauncher.cpp msgid "Invalid gamespec." -msgstr "" +msgstr "ÐекарÑÐºÑ‚Ð½Ð°Ñ ÑÐ¿ÐµÑ†Ñ‹Ñ„Ñ–ÐºÐ°Ñ†Ñ‹Ñ Ð³ÑƒÐ»ÑŒÐ½Ñ–." #: src/client/clientlauncher.cpp msgid "Main Menu" -msgstr "" +msgstr "Галоўнае меню" #: src/client/clientlauncher.cpp msgid "No world selected and no address provided. Nothing to do." -msgstr "" +msgstr "ÐÑма абранага Ñвету або адраÑу. Ðемагчыма прадоўжыць." #: src/client/clientlauncher.cpp msgid "Player name too long." -msgstr "" +msgstr "Ð†Ð¼Ñ Ð³ÑƒÐ»ÑŒÑ†Ð° задоўгае." + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Калі лаÑка, абÑрыце імÑ!" #: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " -msgstr "" +msgstr "ПрадÑтаўлены шлÑÑ… не Ñ–Ñнуе: " #: src/fontengine.cpp msgid "needs_fallback_font" -msgstr "" +msgstr "no" #: src/game.cpp msgid "" "\n" "Check debug.txt for details." msgstr "" +"\n" +"ПадрабÑзней у файле debug.txt." #: src/game.cpp -msgid "Change Keys" -msgstr "" +msgid "- Address: " +msgstr "- ÐдраÑ: " #: src/game.cpp -msgid "Change Password" -msgstr "" +msgid "- Creative Mode: " +msgstr "- Творчы Ñ€Ñжым: " #: src/game.cpp -msgid "Connecting to server..." -msgstr "" +msgid "- Damage: " +msgstr "- Пашкоджанні: " #: src/game.cpp -msgid "Continue" -msgstr "" +msgid "- Mode: " +msgstr "- Ð Ñжым: " #: src/game.cpp -msgid "Creating client..." -msgstr "" +msgid "- Port: " +msgstr "- Порт: " #: src/game.cpp -msgid "Creating server..." -msgstr "" +msgid "- Public: " +msgstr "- Публічны: " #: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +msgid "- PvP: " +msgstr "- PvP: " + +#: src/game.cpp +msgid "- Server Name: " +msgstr "- Ðазва Ñервера: " + +#: src/game.cpp +msgid "Change Keys" +msgstr "ЗмÑніць клавішы" + +#: src/game.cpp +msgid "Change Password" +msgstr "ЗмÑніць пароль" + +#: src/game.cpp +msgid "Connecting to server..." +msgstr "ЗлучÑнне з Ñерверам…" + +#: src/game.cpp +msgid "Continue" +msgstr "Прадоўжыць" + +#: src/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" -msgstr "" +"- %s: chat\n" +msgstr "" +"Ðгаданае кіраванне:\n" +"- %s: Ñ–Ñці ўперад\n" +"- %s: Ñ–Ñці назад\n" +"- %s: Ñ–Ñці ўлева\n" +"- %s: Ñ–Ñці ўправа\n" +"- %s: Ñкакаць/караÑкацца\n" +"- %s: краÑціÑÑ/ÑпуÑкацца\n" +"- %s: выкінуць прадмет\n" +"- %s: інвентар\n" +"- Mouse: круціцца/глÑдзець\n" +"- Mouse left: капаць/прабіваць\n" +"- Mouse right: змÑÑціць/ужыць\n" +"- Mouse wheel: абраць прадмет\n" +"- %s: чат\n" + +#: src/game.cpp +msgid "Creating client..." +msgstr "СтварÑнне кліента…" + +#: src/game.cpp +msgid "Creating server..." +msgstr "СтварÑнне Ñервера…" #: src/game.cpp msgid "" @@ -786,474 +881,508 @@ 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" #: src/game.cpp msgid "Exit to Menu" -msgstr "" +msgstr "Выхад у меню" #: src/game.cpp msgid "Exit to OS" -msgstr "" +msgstr "Выхад у ÑÑ–ÑÑ‚Ñму" + +#: src/game.cpp +msgid "Game info:" +msgstr "Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð¿Ñ€Ð° гульню:" + +#: src/game.cpp +msgid "Game paused" +msgstr "Ð“ÑƒÐ»ÑŒÐ½Ñ Ð¿Ñ€Ñ‹Ð¿Ñ‹Ð½ÐµÐ½Ð°Ñ" + +#: src/game.cpp +msgid "Hosting server" +msgstr "Сервер (хоÑÑ‚)" #: src/game.cpp msgid "Item definitions..." -msgstr "" +msgstr "ÐзначÑнне прадметаў…" #: src/game.cpp msgid "KiB/s" -msgstr "" +msgstr "КіБ/Ñек" #: src/game.cpp msgid "Media..." -msgstr "" +msgstr "МедыÑ…" #: src/game.cpp msgid "MiB/s" -msgstr "" +msgstr "МіБ/Ñек" #: src/game.cpp msgid "Node definitions..." -msgstr "" +msgstr "ÐзначÑнне вузлоў…" #: src/game.cpp -msgid "Resolving address..." -msgstr "" +msgid "Off" +msgstr "Ðдключаны" #: src/game.cpp -msgid "Respawn" -msgstr "" +msgid "On" +msgstr "Уключаны" + +#: src/game.cpp +msgid "Remote server" +msgstr "Ðддалены Ñервер" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "РаÑпазнаванне адраÑа…" #: src/game.cpp msgid "Shutting down..." -msgstr "" +msgstr "ÐдключÑнне…" + +#: src/game.cpp +msgid "Singleplayer" +msgstr "Ð¡Ð°Ð¼Ð¾Ñ‚Ð½Ð°Ñ Ð³ÑƒÐ»ÑŒÐ½Ñ" #: src/game.cpp msgid "Sound Volume" -msgstr "" +msgstr "ГучнаÑць гука" #: src/game.cpp -msgid "You died." -msgstr "" +#, c-format +msgid "Volume changed to %d%%" +msgstr "ГучнаÑць %d %%" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "ГучнаÑць 0 %" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "ГучнаÑць 100 %" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" -msgstr "" +msgstr "добра" #: src/guiFormSpecMenu.cpp msgid "Enter " -msgstr "" +msgstr "Увод " #: src/guiFormSpecMenu.cpp msgid "Proceed" -msgstr "" +msgstr "Прадоўжыць" #: src/guiKeyChangeMenu.cpp msgid "\"Use\" = climb down" -msgstr "" +msgstr "«Ужыць» = злазіць" #: src/guiKeyChangeMenu.cpp msgid "Backward" -msgstr "" +msgstr "Узад" #: src/guiKeyChangeMenu.cpp msgid "Chat" -msgstr "" +msgstr "Чат" #: src/guiKeyChangeMenu.cpp msgid "Command" -msgstr "" +msgstr "Каманда" #: src/guiKeyChangeMenu.cpp msgid "Console" -msgstr "" +msgstr "КанÑоль" + +#: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Зменшыць гучнаÑць" #: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" -msgstr "" +msgstr "Двайны «Ñкачок» = палёт" #: src/guiKeyChangeMenu.cpp msgid "Drop" -msgstr "" +msgstr "Выкінуць" #: src/guiKeyChangeMenu.cpp msgid "Forward" -msgstr "" +msgstr "Уперад" + +#: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "ПавÑлічыць гучнаÑць" #: src/guiKeyChangeMenu.cpp msgid "Inventory" -msgstr "" +msgstr "Інвентар" #: src/guiKeyChangeMenu.cpp msgid "Jump" -msgstr "" +msgstr "Скакаць" #: src/guiKeyChangeMenu.cpp msgid "Key already in use" -msgstr "" +msgstr "Клавіша ўжо выкарыÑтоўваецца" #: src/guiKeyChangeMenu.cpp msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" msgstr "" +"ПрывÑзкі клавіш. (Калі меню ÑапÑавана, выдаліце налады з minetest.conf)" #: src/guiKeyChangeMenu.cpp src/keycode.cpp msgid "Left" -msgstr "" +msgstr "Улева" + +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "Ð›Ð°ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÐºÐ°Ð¼Ð°Ð½Ð´Ð°" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Прыглушыць" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "ÐаÑтупны прадмет" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "ПапÑÑ€Ñдні прадмет" #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" -msgstr "" +msgstr "Друкаваць ÑÑ‚Ñк" #: src/guiKeyChangeMenu.cpp msgid "Range select" -msgstr "" +msgstr "ДалёкаÑць бачнаÑці" #: src/guiKeyChangeMenu.cpp src/keycode.cpp msgid "Right" -msgstr "" +msgstr "Управа" #: src/guiKeyChangeMenu.cpp msgid "Sneak" -msgstr "" +msgstr "КраÑціÑÑ" #: src/guiKeyChangeMenu.cpp msgid "Toggle Cinematic" -msgstr "" +msgstr "КінематаграфічнаÑць" #: src/guiKeyChangeMenu.cpp msgid "Toggle fast" -msgstr "" +msgstr "ШпаркаÑць" #: src/guiKeyChangeMenu.cpp msgid "Toggle fly" -msgstr "" +msgstr "Палёт" #: src/guiKeyChangeMenu.cpp msgid "Toggle noclip" -msgstr "" +msgstr "Сутыкненне" #: src/guiKeyChangeMenu.cpp msgid "Use" -msgstr "" +msgstr "Ужыць" #: src/guiKeyChangeMenu.cpp src/keycode.cpp msgid "Zoom" -msgstr "" +msgstr "ПавÑлічыць" #: src/guiKeyChangeMenu.cpp msgid "press key" -msgstr "" +msgstr "націÑні кнопку" #: src/guiPasswordChange.cpp msgid "Change" -msgstr "" +msgstr "ЗмÑніць" #: src/guiPasswordChange.cpp msgid "Confirm Password" -msgstr "" +msgstr "Пацвердзіць пароль" #: src/guiPasswordChange.cpp msgid "New Password" -msgstr "" +msgstr "Ðовы пароль" #: src/guiPasswordChange.cpp msgid "Old Password" -msgstr "" +msgstr "Стары пароль" #: src/guiPasswordChange.cpp msgid "Passwords do not match!" -msgstr "" +msgstr "Паролі не Ñупадаюць!" #: src/guiVolumeChange.cpp msgid "Exit" -msgstr "" +msgstr "Выхад" #: src/guiVolumeChange.cpp msgid "Sound Volume: " -msgstr "" +msgstr "ГучнаÑць: " #: src/keycode.cpp msgid "Apps" -msgstr "" - -#: src/keycode.cpp -msgid "Attn" -msgstr "" +msgstr "Праграмы" #: src/keycode.cpp msgid "Back" -msgstr "" +msgstr "Ðазад" #: src/keycode.cpp -msgid "Capital" -msgstr "" +msgid "Caps Lock" +msgstr "Caps Lock" #: src/keycode.cpp msgid "Clear" -msgstr "" - -#: src/keycode.cpp -msgid "Comma" -msgstr "" +msgstr "ÐчыÑціць" #: src/keycode.cpp msgid "Control" -msgstr "" - -#: src/keycode.cpp -msgid "Convert" -msgstr "" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "" +msgstr "Ctrl" #: src/keycode.cpp msgid "Down" -msgstr "" +msgstr "Уніз" #: src/keycode.cpp msgid "End" -msgstr "" +msgstr "У канец" #: src/keycode.cpp -msgid "Erase OEF" -msgstr "" - -#: src/keycode.cpp -msgid "Escape" -msgstr "" +msgid "Erase EOF" +msgstr "ÐчыÑціць EOF" #: src/keycode.cpp -msgid "ExSel" -msgstr "" +msgid "Execute" +msgstr "Выканаць" #: src/keycode.cpp -msgid "Execute" -msgstr "" +msgid "Help" +msgstr "Дапамога" #: src/keycode.cpp -msgid "Final" -msgstr "" +msgid "Home" +msgstr "У пачатак" #: src/keycode.cpp -msgid "Help" -msgstr "" +msgid "IME Accept" +msgstr "ПрынÑць IME" #: src/keycode.cpp -msgid "Home" -msgstr "" +msgid "IME Convert" +msgstr "Канвертаваць IME" #: src/keycode.cpp -msgid "Insert" -msgstr "" +msgid "IME Escape" +msgstr "IME Escape" #: src/keycode.cpp -msgid "Junja" -msgstr "" +msgid "IME Mode Change" +msgstr "ЗмÑніць Ñ€Ñжым IME" #: src/keycode.cpp -msgid "Kana" -msgstr "" +msgid "IME Nonconvert" +msgstr "IME без канвертаваннÑ" #: src/keycode.cpp -msgid "Kanji" -msgstr "" +msgid "Insert" +msgstr "УÑтавіць" #: src/keycode.cpp msgid "Left Button" -msgstr "" +msgstr "Ð›ÐµÐ²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°" #: src/keycode.cpp msgid "Left Control" -msgstr "" +msgstr "Левы Ctrl" #: src/keycode.cpp msgid "Left Menu" -msgstr "" +msgstr "Левае меню" #: src/keycode.cpp msgid "Left Shift" -msgstr "" +msgstr "Левы Shift" #: src/keycode.cpp msgid "Left Windows" -msgstr "" +msgstr "Левы Windows" #: src/keycode.cpp msgid "Menu" -msgstr "" +msgstr "Меню" #: src/keycode.cpp msgid "Middle Button" -msgstr "" - -#: src/keycode.cpp -msgid "Minus" -msgstr "" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "" +msgstr "СÑÑ€ÑднÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ°" #: src/keycode.cpp msgid "Next" -msgstr "" - -#: src/keycode.cpp -msgid "Nonconvert" -msgstr "" +msgstr "ÐаÑтупны" #: src/keycode.cpp msgid "Num Lock" -msgstr "" +msgstr "Num Lock" #: src/keycode.cpp msgid "Numpad *" -msgstr "" +msgstr "Дадат. *" #: src/keycode.cpp msgid "Numpad +" -msgstr "" +msgstr "Дадат. +" #: src/keycode.cpp msgid "Numpad -" -msgstr "" +msgstr "Дадат. -" + +#: src/keycode.cpp +msgid "Numpad ." +msgstr "Дадат. ." #: src/keycode.cpp msgid "Numpad /" -msgstr "" +msgstr "Дадат. /" #: src/keycode.cpp msgid "Numpad 0" -msgstr "" +msgstr "Дадат. 0" #: src/keycode.cpp msgid "Numpad 1" -msgstr "" +msgstr "Дадат. 1" #: src/keycode.cpp msgid "Numpad 2" -msgstr "" +msgstr "Дадат. 2" #: src/keycode.cpp msgid "Numpad 3" -msgstr "" +msgstr "Дадат. 3" #: src/keycode.cpp msgid "Numpad 4" -msgstr "" +msgstr "Дадат. 4" #: src/keycode.cpp msgid "Numpad 5" -msgstr "" +msgstr "Дадат. 5" #: src/keycode.cpp msgid "Numpad 6" -msgstr "" +msgstr "Дадат. 6" #: src/keycode.cpp msgid "Numpad 7" -msgstr "" +msgstr "Дадат. 7" #: src/keycode.cpp msgid "Numpad 8" -msgstr "" +msgstr "Дадат. 8" #: src/keycode.cpp msgid "Numpad 9" -msgstr "" +msgstr "Дадат. 9" #: src/keycode.cpp msgid "OEM Clear" -msgstr "" - -#: src/keycode.cpp -msgid "PA1" -msgstr "" +msgstr "ÐчыÑціць OEM" #: src/keycode.cpp msgid "Pause" -msgstr "" +msgstr "Паўза" #: src/keycode.cpp -msgid "Period" -msgstr "" - -#: src/keycode.cpp -msgid "Plus" -msgstr "" +msgid "Play" +msgstr "ГулÑць" #: src/keycode.cpp msgid "Print" -msgstr "" +msgstr "Друкаваць" #: src/keycode.cpp msgid "Prior" -msgstr "" +msgstr "ПапÑÑ€Ñдні" #: src/keycode.cpp msgid "Return" -msgstr "" +msgstr "Ð’Ñрнуцца" #: src/keycode.cpp msgid "Right Button" -msgstr "" +msgstr "ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°" #: src/keycode.cpp msgid "Right Control" -msgstr "" +msgstr "Правы Ctrl" #: src/keycode.cpp msgid "Right Menu" -msgstr "" +msgstr "Правае меню" #: src/keycode.cpp msgid "Right Shift" -msgstr "" +msgstr "Правы Shift" #: src/keycode.cpp msgid "Right Windows" -msgstr "" +msgstr "Правы Windows" #: src/keycode.cpp msgid "Scroll Lock" -msgstr "" +msgstr "Scroll Lock" #: src/keycode.cpp msgid "Select" -msgstr "" +msgstr "Ðбраць" #: src/keycode.cpp msgid "Shift" -msgstr "" +msgstr "Shift" #: src/keycode.cpp msgid "Sleep" -msgstr "" +msgstr "Сон" #: src/keycode.cpp msgid "Snapshot" -msgstr "" +msgstr "Здымак" #: src/keycode.cpp msgid "Space" -msgstr "" +msgstr "Прагал" #: src/keycode.cpp msgid "Tab" -msgstr "" +msgstr "ТабулÑцыÑ" #: src/keycode.cpp msgid "Up" -msgstr "" +msgstr "Уверх" #: src/keycode.cpp msgid "X Button 1" -msgstr "" +msgstr "Дадат. кнопка 1" #: src/keycode.cpp msgid "X Button 2" -msgstr "" +msgstr "Дадат. кнопка 2" #: src/settings_translation_file.cpp msgid "" @@ -1263,20 +1392,45 @@ msgid "" "sets.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" +"(X, Y, Z) зрух фрактала ад цÑнтра Ñвету Ñž адзінках шкалы.\n" +"ВыкарыÑтоўваецца Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð¼ÑшчÑÐ½Ð½Ñ Ð¿Ñ€Ñ‹Ð´Ð°Ñ‚Ð½Ð°Ð¹ воблаÑці Ð´Ð»Ñ ÑтварÑÐ½Ð½Ñ Ð½Ñ–Ð·ÐºÐ°Ð¹ " +"зÑмлі паблізу (0, 0).\n" +"Ðгаданае значÑнне падыходзіць Ð´Ð»Ñ Ð¼Ð½Ð¾Ñтва МандÑльброта, але павінна быць " +"зменена Ð´Ð»Ñ Ð¼Ð½Ð¾Ñтва ЖуліÑ.\n" +"ДыÑпазон прыкладна ад −2 да 2. Памножанае на адзінку шкалы Ð´Ð»Ñ Ð·Ñ€ÑƒÑ…Ñƒ Ñž " +"вузлах." #: src/settings_translation_file.cpp msgid "" "0 = parallax occlusion with slope information (faster).\n" "1 = relief mapping (slower, more accurate)." msgstr "" +"0 = паралакÑÐ½Ð°Ñ Ð°ÐºÐ»ÑŽÐ·Ñ–Ñ Ñа звеÑткамі аб нахіле (хутка).\n" +"1 = Ñ€Ñльефнае Ñ‚ÑкÑтураванне (павольней, але ÑкаÑней)." #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "" +msgstr "3D-аблокі" #: src/settings_translation_file.cpp msgid "3D mode" +msgstr "3D-Ñ€Ñжым" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "3D-шум вызначÑÐ½Ð½Ñ Ð³Ñ–Ð³Ð°Ð½Ñ†ÐºÑ–Ñ… гротаў." + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." msgstr "" +"3D-шум вызначÑÐ½Ð½Ñ Ñтруктуры Ñ– вышыні гор.\n" +"ТакÑама вызначае Ñтруктуру горнага Ñ€Ñльефу выÑпаў, што лÑцÑць." + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "3D-шум вызначÑÐ½Ð½Ñ Ñтруктуры Ñцен рачных каньёнаў." #: src/settings_translation_file.cpp msgid "" @@ -1289,48 +1443,59 @@ msgid "" "- sidebyside: split screen side by side.\n" "- pageflip: quadbuffer based 3d." msgstr "" +"3D-падтрымка.\n" +"Зараз падтрымліваюцца:\n" +"- none: без 3D-вываду.\n" +"- anaglyph: вывад на аÑнове блакітнага/пурпурнага колераў.\n" +"- interlaced: вывад на аÑнове палÑрызацыі цотных Ñ– нÑцотных радкоў.\n" +"- topbottom: падзÑліць Ñкран верх/ніз.\n" +"- sidebyside: падзÑліць Ñкран поплеч.\n" +"- pageflip: вывад на аÑнове квадра-буфера." #: src/settings_translation_file.cpp msgid "" "A chosen map seed for a new map, leave empty for random.\n" "Will be overridden when creating a new world in the main menu." msgstr "" +"Ðбраны лікавы Ñтан Ð´Ð»Ñ Ð½Ð¾Ð²Ð°Ð¹ мапы, пакіньце пуÑтым Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð°Ð´ÐºÐ¾Ð²Ð°Ð³Ð°.\n" +"ГÑта можна пераазначыць пры ÑтварÑнні новага Ñвету Ñž галоўным меню." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." -msgstr "" +msgstr "Паведамленне, Ñкое будзе паказана ÑžÑім кліентам пры крушÑнні Ñервера." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server shuts down." msgstr "" +"Паведамленне, Ñкое будзе паказана ÑžÑім кліентам пры выключÑнні Ñервера." #: src/settings_translation_file.cpp msgid "Absolute limit of emerge queues" -msgstr "" +msgstr "ÐбÑÐ°Ð»ÑŽÑ‚Ð½Ð°Ñ Ð³Ñ€Ð°Ð½Ñ–Ñ†Ð° чаргі вытворчаÑці" #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "ПаÑкарÑнне Ñž паветры" #: src/settings_translation_file.cpp msgid "Active Block Management interval" -msgstr "" +msgstr "ДалёкаÑць узаемадзеÑÐ½Ð½Ñ Ð· блокамі" #: src/settings_translation_file.cpp msgid "Active Block Modifier interval" -msgstr "" +msgstr "ДалёкаÑць дзеÑÐ½Ð½Ñ Ð¼Ð°Ð´Ñ‹Ñ„Ñ–ÐºÐ°Ñ‚Ð°Ñ€Ð° актыўных блокаў" #: src/settings_translation_file.cpp msgid "Active Block Modifiers" -msgstr "" +msgstr "Мадыфікатары актыўных блокаў" #: src/settings_translation_file.cpp msgid "Active block range" -msgstr "" +msgstr "Ð Ð°Ð´Ñ‹ÑƒÑ Ð´Ð·ÐµÑÐ½Ð½Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ð¹ актыўнаÑці" #: src/settings_translation_file.cpp msgid "Active object send range" -msgstr "" +msgstr "ДалёкаÑць адпраўкі актыўнага аб'екта" #: src/settings_translation_file.cpp msgid "" @@ -1338,46 +1503,67 @@ msgid "" "Leave this blank to start a local server.\n" "Note that the address field in the main menu overrides this setting." msgstr "" +"ÐÐ´Ñ€Ð°Ñ Ð´Ð»Ñ Ð·Ð»ÑƒÑ‡ÑннÑ.\n" +"Пакіньце Ñго пуÑтым Ð´Ð»Ñ Ñтарту лакальнага Ñервера.\n" +"Майце на ўвазе, што поле адраÑа Ñž галоўным меню пераазначае гÑтую наладу." + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "Дадаваць чаÑціцы пры капанні вузла." #: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "" +"Ð ÑгулÑванне канфігурацыі DPI (кропак на цалю) на Ñкране\n" +"(не толькі X11/Android), напрыклад, Ð´Ð»Ñ 4k-Ñкранаў." #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" +"Ð ÑгулÑванне гама-ÐºÐ°Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñветлавых табліц. Ð’Ñ‹ÑÐ¾ÐºÑ–Ñ Ð·Ð½Ð°Ñ‡Ñнні — больш " +"ÑрчÑйшыÑ.\n" +"ГÑты параметр прызначаны толькі Ð´Ð»Ñ ÐºÐ»Ñ–ÐµÐ½Ñ‚Ð° Ñ– ігнаруецца Ñерверам." #: src/settings_translation_file.cpp msgid "Advanced" -msgstr "" +msgstr "ПашыраныÑ" #: src/settings_translation_file.cpp msgid "Altitude Chill" -msgstr "" +msgstr "Ð’Ñ‹ÑˆÑ‹Ð½Ñ Ð´Ð° нівальнага поÑÑу" #: src/settings_translation_file.cpp msgid "Always fly and fast" -msgstr "" +msgstr "ЗаўÑёды Ñž палёце Ñ– шпарка" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" -msgstr "" +msgstr "Гама навакольнай аклюзіі" #: src/settings_translation_file.cpp msgid "Amplifies the valleys" +msgstr "Узмацненне далін" + +#: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." msgstr "" +"Толькі Ð´Ð»Ñ Ðндроід-ÑÑ–ÑÑ‚Ñм: Спрабуе Ñтварыць Ñ‚ÑкÑтуры інвентара з Ñетак,\n" +"калі знойдзены візуалізатар, што не падтрымліваецца." #: src/settings_translation_file.cpp msgid "Anisotropic filtering" -msgstr "" +msgstr "ÐÐ½Ñ–Ð·Ð°Ñ‚Ñ€Ð¾Ð¿Ð½Ð°Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ñ‹Ñ" #: src/settings_translation_file.cpp msgid "Announce server" -msgstr "" +msgstr "ÐнанÑаваць Ñервер" #: src/settings_translation_file.cpp msgid "" @@ -1385,102 +1571,174 @@ msgid "" "If you want to announce your ipv6 address, use serverlist_url = v6.servers." "minetest.net." msgstr "" +"Калі вы хочаце ананÑаваць Ñвой IPv6 адраÑ, выкарыÑтоўвайце\n" +"serverlist_url = v6.servers.minetest.net." + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "Шум Ñблынь" #: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." -msgstr "" +msgstr "Прыблізны (X,Y,Z) маштаб фракталаў у вузлах." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" +msgstr "Прапанаваць перазлучыцца паÑÐ»Ñ Ð¿Ð°Ð´Ð·ÐµÐ½Ð½Ñ" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" msgstr "" +"З гÑтай дыÑтанцыі Ñервер будзе агрÑÑіўна аптымізаваць ÑÐºÑ–Ñ Ð±Ð»Ð¾ÐºÑ– адÑылаць " +"кліентам.\n" +"ÐœÐ°Ð»Ñ‹Ñ Ð·Ð½Ð°Ñ‡Ñнні патÑнцыйна палепшаць працаздольнаÑць за кошт бачных глюкаў " +"візуалізацыі.\n" +"(Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ Ð±Ð»Ð¾ÐºÑ– не будзець адлюÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ñ‹Ñ Ð¿Ð°Ð´ вадой Ñ– Ñž пÑчорах, а такÑама " +"чаÑам на Ñушы)\n" +"УÑтаноўка гÑтага значÑÐ½Ð½Ñ Ð±Ð¾Ð»ÑŒÑˆ чым max_block_send_distance адключыць " +"аптымізацыю.\n" +"Задаецца Ñž блоках мапы (16 вузлоў)" #: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." -msgstr "" +msgstr "Ðўтаматычна дадаваць у ÑÐ¿Ñ–Ñ Ñервераў." #: src/settings_translation_file.cpp msgid "Autorun key" -msgstr "" +msgstr "Клавіша аўтабегу" #: src/settings_translation_file.cpp msgid "Backward key" -msgstr "" +msgstr "Клавіша ўзад" #: src/settings_translation_file.cpp msgid "Base terrain height" -msgstr "" +msgstr "Ð’Ñ‹ÑˆÑ‹Ð½Ñ Ð°Ñноўнай мÑÑцоваÑці" #: src/settings_translation_file.cpp msgid "Basic" -msgstr "" +msgstr "БазавыÑ" #: src/settings_translation_file.cpp msgid "Basic Privileges" -msgstr "" +msgstr "ÐÑÐ½Ð¾ÑžÐ½Ñ‹Ñ Ð¿Ñ€Ñ‹Ð²Ñ–Ð»ÐµÑ–" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "Шум плÑжа" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "Парог шуму плÑжа" #: src/settings_translation_file.cpp msgid "Bilinear filtering" -msgstr "" +msgstr "Ð‘Ñ–Ð»Ñ–Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ñ‹Ñ" #: src/settings_translation_file.cpp msgid "Bind address" -msgstr "" +msgstr "ÐÐ´Ñ€Ð°Ñ Ð¿Ñ€Ñ‹Ð²Ñзкі" + +#: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "Шум Ñ‚Ñмпературы Ñ– вільготнаÑці API біёму" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "Шум біёму" #: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" +msgstr "Біты на пікÑель (Ð³Ð»Ñ‹Ð±Ñ–Ð½Ñ ÐºÐ¾Ð»ÐµÑ€Ñƒ) у поўнаÑкранным Ñ€Ñжыме." #: src/settings_translation_file.cpp msgid "Build inside player" -msgstr "" +msgstr "Будаваць на меÑцы гульца" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "Убудаваны" #: src/settings_translation_file.cpp msgid "Bumpmapping" -msgstr "" +msgstr "Ð Ñльефнае Ñ‚ÑкÑтураванне" #: src/settings_translation_file.cpp msgid "Camera smoothing" -msgstr "" +msgstr "Згладжванне камеры" #: src/settings_translation_file.cpp msgid "Camera smoothing in cinematic mode" -msgstr "" +msgstr "Згладжванне камеры Ñž кінематаграфічным Ñ€Ñжыме" #: src/settings_translation_file.cpp msgid "Camera update toggle key" -msgstr "" +msgstr "Клавіша пераключÑÐ½Ð½Ñ Ð°Ð±Ð½Ð°ÑžÐ»ÐµÐ½Ð½Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "Шум пÑчор" #: src/settings_translation_file.cpp msgid "Cave noise #1" -msgstr "" +msgstr "Шум пÑчоры â„– 1" #: src/settings_translation_file.cpp msgid "Cave noise #2" -msgstr "" +msgstr "Шум пÑчоры â„– 2" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "" +msgstr "Ð¨Ñ‹Ñ€Ñ‹Ð½Ñ Ð¿Ñчор" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "Шум пÑчоры 1" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "Шум пÑчоры 2" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "Ðбмежаванне гротаў" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "Шум гротаў" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "ÐšÐ¾Ð½ÑƒÑ Ð³Ñ€Ð¾Ñ‚Ð°Ñž" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "Парог гротаў" #: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" -msgstr "" +msgstr "ПÑчоры Ñ– тунÑлі ўтвараюцца на Ñкрыжаванні двух шумаў" #: src/settings_translation_file.cpp msgid "Chat key" -msgstr "" +msgstr "Клавіша чату" #: src/settings_translation_file.cpp msgid "Chat toggle key" -msgstr "" +msgstr "Клавіша пераключÑÐ½Ð½Ñ Ñ‡Ð°Ñ‚Ñƒ" #: src/settings_translation_file.cpp msgid "Chatcommands" -msgstr "" +msgstr "Каманды чату" #: src/settings_translation_file.cpp msgid "" @@ -1504,106 +1762,142 @@ msgid "" "17 = 4D \"Mandelbulb\" mandelbrot set.\n" "18 = 4D \"Mandelbulb\" julia set." msgstr "" +"Выбар 18 фракталаў з 9 формул.\n" +"1. 4D-«круглае» мноÑтва МандÑльброта.\n" +"2. 4D-«круглае» мноÑтва ЖуліÑ.\n" +"3. 4D-«квадратнае» мноÑтва МандÑльброта.\n" +"4. 4D-«квадратнае» мноÑтва ЖуліÑ.\n" +"5. 4D-мноÑтва МандÑльброта «КузÑна МÑндзі».\n" +"6. 4D-мноÑтва Ð–ÑƒÐ»Ñ–Ñ Â«ÐšÑƒÐ·Ñна МÑндзі».\n" +"7. 4D-мноÑтва МандÑльброта «ВарыÑцыÑ».\n" +"8. 4D-мноÑтва Ð–ÑƒÐ»Ñ–Ñ Â«Ð’Ð°Ñ€Ñ‹ÑцыÑ».\n" +"9. 3D-мноÑтва МандÑльброта «МандÑльброт/МандÑльбар».\n" +"10. 3D-мноÑтва Ð–ÑƒÐ»Ñ–Ñ Â«ÐœÐ°Ð½Ð´Ñльброт/МандÑльбар».\n" +"11. 3D-мноÑтва МандÑльброта «КалÑÐ´Ð½Ð°Ñ Ñліна».\n" +"12. 3D-мноÑтва Ð–ÑƒÐ»Ñ–Ñ Â«ÐšÐ°Ð»ÑÐ´Ð½Ð°Ñ Ñліна».\n" +"13. 3D-мноÑтва МандÑльброта «МандÑльбульб».\n" +"14. 3D-мноÑтва Ð–ÑƒÐ»Ñ–Ñ Â«ÐœÐ°Ð½Ð´Ñльбульб».\n" +"15. 3D-мноÑтва МандÑльброта «КузÑн МандÑльбульб».\n" +"16. 3D-мноÑтва Ð–ÑƒÐ»Ñ–Ñ Â«ÐšÑƒÐ·Ñн МандÑльбульб».\n" +"17. 4D-мноÑтва МандÑльброта «МандÑльбульб».\n" +"18. 4D-мноÑтва Ð–ÑƒÐ»Ñ–Ñ Â«ÐœÐ°Ð½Ð´Ñльбульб»." #: src/settings_translation_file.cpp msgid "Chunk size" -msgstr "" +msgstr "Памер кавалка" #: src/settings_translation_file.cpp msgid "Cinematic mode" -msgstr "" +msgstr "Кінематаграфічны Ñ€Ñжым" #: src/settings_translation_file.cpp msgid "Cinematic mode key" -msgstr "" +msgstr "Клавіша кінематаграфічнага Ñ€Ñжыму" #: src/settings_translation_file.cpp msgid "Clean transparent textures" -msgstr "" +msgstr "ЧыÑÑ‚Ñ‹Ñ Ð¿Ñ€Ð°Ð·Ñ€Ñ‹ÑÑ‚Ñ‹Ñ Ñ‚ÑкÑтуры" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "Кліент" #: src/settings_translation_file.cpp msgid "Client and Server" -msgstr "" +msgstr "Кліент Ñ– Ñервер" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "Модынг кліента" #: src/settings_translation_file.cpp msgid "Climbing speed" -msgstr "" +msgstr "ХуткаÑць караÑканнÑ" #: src/settings_translation_file.cpp msgid "Cloud height" -msgstr "" +msgstr "Ð’Ñ‹ÑˆÑ‹Ð½Ñ Ð½Ñ–Ð¶Ð½Ñй мÑжы аблокаў" #: src/settings_translation_file.cpp msgid "Cloud radius" -msgstr "" +msgstr "Ð Ð°Ð´Ñ‹ÑƒÑ Ð°Ð±Ð»Ð¾ÐºÐ°Ñž" #: src/settings_translation_file.cpp msgid "Clouds" -msgstr "" +msgstr "Ðблокі" #: src/settings_translation_file.cpp msgid "Clouds are a client side effect." -msgstr "" +msgstr "Ðблокі — Ñфект на баку кліента." #: src/settings_translation_file.cpp msgid "Clouds in menu" -msgstr "" +msgstr "Ðблокі Ñž меню" #: src/settings_translation_file.cpp msgid "Colored fog" -msgstr "" +msgstr "КалÑровы туман" #: src/settings_translation_file.cpp msgid "" "Comma-separated list of mods that are allowed to access HTTP APIs, which\n" "allow them to upload and download data to/from the internet." msgstr "" +"Ð¡Ð¿Ñ–Ñ Ð¼Ð¾Ð´Ð°Ñž, падзеленых коÑкамі, Ñкім дазволены доÑтуп да HTTP API, Ñкі\n" +"дазвалÑе ім адпраўлÑць Ñ– атрымліваць Ð´Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ Ð¿Ñ€Ð°Ð· ІнтÑрнÑÑ‚." #: src/settings_translation_file.cpp msgid "" "Comma-separated list of trusted mods that are allowed to access insecure\n" "functions even when mod security is on (via request_insecure_environment())." msgstr "" +"Ð¡Ð¿Ñ–Ñ Ð´Ð°Ð²ÐµÑ€Ð°Ð½Ñ‹Ñ… модаў, падзеленых коÑкамі, ÑÐºÑ–Ñ Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ñ‹ доÑтуп да\n" +"небÑÑпечных функцый, нават калі мод бÑÑпекі ўключаны\n" +"(праз request_insecure_environment())." #: src/settings_translation_file.cpp msgid "Command key" -msgstr "" +msgstr "Клавіша каманды" #: src/settings_translation_file.cpp msgid "Connect glass" -msgstr "" +msgstr "Злучыць шкло" #: src/settings_translation_file.cpp msgid "Connect to external media server" -msgstr "" +msgstr "Злучацца Ñа знешнім Ñерверам медыÑ" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." -msgstr "" +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 "Ð’Ñ‹ÑˆÑ‹Ð½Ñ ÐºÐ°Ð½Ñолі" #: src/settings_translation_file.cpp msgid "Console key" -msgstr "" +msgstr "Клавіша канÑолі" #: src/settings_translation_file.cpp msgid "Continuous forward" -msgstr "" +msgstr "БеÑперапынна Ñ–Ñці ўперад" #: src/settings_translation_file.cpp msgid "Continuous forward movement (only used for testing)." -msgstr "" +msgstr "БеÑперапынны рух ўперад (толькі Ð´Ð»Ñ Ñ‚ÑÑтаваннÑ)." #: src/settings_translation_file.cpp msgid "Controls" -msgstr "" +msgstr "Кіраванне" #: src/settings_translation_file.cpp msgid "" @@ -1611,171 +1905,258 @@ msgid "" "Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays " "unchanged." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" +"Кіруе працÑглаÑцю цыкла днÑ/ночы.\n" +"Прыклады: 72 = 20 мін, 360 = 4 мін, 1 = 24 г, 0 — дзень Ñ– ноч не змÑнÑюцца." #: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." -msgstr "" +msgstr "Кіруе крутаÑцю/глыбінёй азёр." #: src/settings_translation_file.cpp msgid "Controls steepness/height of hills." +msgstr "Кіруе крутаÑцю/вышынёй узгоркаў." + +#: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" +"Кантралюе шчыльнаÑць горнага Ñ€Ñльефу выÑпаў, што лÑцÑць.\n" +"ГÑты зрух дабаўлÑецца да значÑÐ½Ð½Ñ 'np_mountain'." #: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." -msgstr "" +msgstr "Кіруе шырынёй тунÑлÑÑž. Меншае значÑнне Ñтварае больш ÑˆÑ‹Ñ€Ð¾ÐºÑ–Ñ Ñ‚ÑƒÐ½Ñлі." #: src/settings_translation_file.cpp msgid "Crash message" -msgstr "" +msgstr "Паведамленне пры крушÑнні" #: src/settings_translation_file.cpp msgid "" "Creates unpredictable lava features in caves.\n" "These can make mining difficult. Zero disables them. (0-10)" msgstr "" +"Стварае Ð½ÐµÐ¿Ñ€Ð°Ð´ÐºÐ°Ð·Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð¿Ð°Ñ‚Ð¾ÐºÑ– лавы Ñž пÑчорах.\n" +"ГÑта можа зрабіць цÑжкім здабычу карыÑных выкапнÑÑž.\n" +"Ðуль адключае гÑта. (0–10)" #: src/settings_translation_file.cpp msgid "" "Creates unpredictable water features in caves.\n" "These can make mining difficult. Zero disables them. (0-10)" msgstr "" +"Стварае Ð½ÐµÐ¿Ñ€Ð°Ð´ÐºÐ°Ð·Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð¿Ð°Ñ‚Ð¾ÐºÑ– вады Ñž пÑчорах.\n" +"ГÑта можа зрабіць цÑжкім здабычу карыÑных выкапнÑÑž.\n" +"Ðуль адключае гÑта. (0–10)" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "ТворчаÑць" #: src/settings_translation_file.cpp msgid "Crosshair alpha" -msgstr "" +msgstr "ПразрыÑтаÑць перакрыжаваннÑ" #: src/settings_translation_file.cpp msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "" +msgstr "ПразрыÑтаÑць Ð¿ÐµÑ€Ð°ÐºÑ€Ñ‹Ð¶Ð°Ð²Ð°Ð½Ð½Ñ (паміж 0 Ñ– 255)." #: src/settings_translation_file.cpp msgid "Crosshair color" -msgstr "" +msgstr "Колер перакрыжаваннÑ" #: src/settings_translation_file.cpp msgid "Crosshair color (R,G,B)." -msgstr "" +msgstr "Колер Ð¿ÐµÑ€Ð°ÐºÑ€Ñ‹Ð¶Ð°Ð²Ð°Ð½Ð½Ñ (R,G,B)." #: src/settings_translation_file.cpp msgid "Crouch speed" -msgstr "" +msgstr "ХуткаÑць поўзаннÑ" #: src/settings_translation_file.cpp msgid "DPI" -msgstr "" +msgstr "DPI (кропак на цалю)" #: src/settings_translation_file.cpp msgid "Damage" -msgstr "" +msgstr "Пашкоджанні" #: src/settings_translation_file.cpp msgid "Debug info toggle key" -msgstr "" +msgstr "Клавіша пераключÑÐ½Ð½Ñ Ð°Ð´Ð»Ð°Ð´Ð°Ñ‡Ð½Ñ‹Ñ… звеÑтак" #: src/settings_translation_file.cpp msgid "Debug log level" -msgstr "" +msgstr "Узровень журналÑÐ²Ð°Ð½Ð½Ñ Ð°Ð´Ð»Ð°Ð´ÐºÑ–" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "Кнопка змÑншÑÐ½Ð½Ñ Ð³ÑƒÑ‡Ð½Ð°Ñці" #: src/settings_translation_file.cpp msgid "Dedicated server step" -msgstr "" +msgstr "Крок выдзеленага Ñервера" #: src/settings_translation_file.cpp msgid "Default acceleration" -msgstr "" +msgstr "Ðгаданае паÑкарÑнне" #: src/settings_translation_file.cpp msgid "Default game" -msgstr "" +msgstr "ÐÐ³Ð°Ð´Ð°Ð½Ð°Ñ Ð³ÑƒÐ»ÑŒÐ½Ñ" #: src/settings_translation_file.cpp msgid "" "Default game when creating a new world.\n" "This will be overridden when creating a world from the main menu." msgstr "" +"ÐÐ³Ð°Ð´Ð°Ð½Ð°Ñ Ð³ÑƒÐ»ÑŒÐ½Ñ Ð¿Ñ€Ñ‹ ÑтварÑнні новага Ñвету.\n" +"ГÑта можна пераазначыць пры ÑтварÑнні Ñвету Ñž галоўным меню." #: src/settings_translation_file.cpp msgid "Default password" -msgstr "" +msgstr "Ðгаданы пароль" #: src/settings_translation_file.cpp msgid "Default privileges" -msgstr "" +msgstr "ÐÐ³Ð°Ð´Ð°Ð½Ñ‹Ñ Ð¿Ñ€Ñ‹Ð²Ñ–Ð»ÐµÑ–" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "Ðгаданы фармат Ñправаздачы" #: src/settings_translation_file.cpp msgid "" "Default timeout for cURL, stated in milliseconds.\n" "Only has an effect if compiled with cURL." msgstr "" +"Ðгаданы таймаут Ð´Ð»Ñ cURL, зададзены Ñž міліÑекундах.\n" +"Уплывае толькі пры кампілÑцыі з cURL." + +#: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "Вызначае воблаÑці 'terrain_higher' (мÑÑцоваÑць на вÑршынÑÑ… уцеÑаў)." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" +"Вызначае воблаÑці гладкага Ñ€Ñльефу выÑпаў, што лÑцÑць.\n" +"Ð“Ð»Ð°Ð´ÐºÐ°Ñ Ð¿Ð°Ð²ÐµÑ€Ñ…Ð½Ñ Ð·'ÑўлÑецца, калі шум больш нулÑ." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "Вызначае воблаÑці ўзвышÑннÑÑž паверхні Ñ– ўплывае на крутаÑць Ñкал." + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "Вызначае воблаÑці, дзе на дрÑвах Ñ‘Ñць Ñблыкі." + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "Вызначае воблаÑці з пÑшчанымі плÑжамі." + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "Вызначае поўны памер пÑчор. ÐœÐ°Ð»Ñ‹Ñ Ð·Ð½Ð°Ñ‡Ñнні Ñтраваюць вÑÐ»Ñ–ÐºÑ–Ñ Ð¿Ñчоры." + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "Вызначае буйнамаштабную Ñтруктуру Ñ€Ñчышч." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "Вызначае размÑшчÑнне Ñ– Ñ€Ñльеф дадатковых пагоркаў Ñ– азёр." #: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." msgstr "" +"Вызначае крок дыÑкрÑтызацыі Ñ‚ÑкÑтуры.\n" +"Больш выÑокае значÑнне прыводзіць да больш гладкіх мапаў нармалÑÑž." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" +"Вызначае макÑімальную дыÑтанцыю перадачы дадзеных гульца Ñž блоках\n" +"(0 — неабмежаванаÑ)." #: src/settings_translation_file.cpp -msgid "Delay in sending blocks after building" +msgid "Defines tree areas and tree density." +msgstr "Вызначае воблаÑці Ñ– шчыльнаÑць дрÑÑž." + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." msgstr "" +"Затрымка паміж абнаўленнÑмі Ñетак на кліенце Ñž міліÑекундах. ПавелічÑнне " +"гÑтага значÑннÑ\n" +"запаволіць Ñ‚Ñмп Ð°Ð±Ð½Ð°ÑžÐ»ÐµÐ½Ð½Ñ Ñетак, Ñ– такім чынам зменшыць дрыжанне на " +"павольных кліентах." + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "Затрымка Ñž адпраўцы блокаў паÑÐ»Ñ Ð±ÑƒÐ´Ð°ÑžÐ½Ñ–Ñ†Ñ‚Ð²Ð°" #: src/settings_translation_file.cpp msgid "Delay showing tooltips, stated in milliseconds." -msgstr "" +msgstr "Затрымка паказу падказак, Ð·Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ð°Ñ Ñž міліÑекундах." #: src/settings_translation_file.cpp msgid "Deprecated Lua API handling" -msgstr "" +msgstr "Ðпрацоўка ÑаÑтарÑлых выклікаў Lua API" #: src/settings_translation_file.cpp msgid "Depth below which you'll find large caves." -msgstr "" +msgstr "ГлыбінÑ, ніжÑй Ñкой вы знойдзеце вÑÐ»Ñ–ÐºÑ–Ñ Ð¿Ñчоры." #: src/settings_translation_file.cpp msgid "Depth below which you'll find massive caves." -msgstr "" +msgstr "ГлыбінÑ, ніжÑй Ñкой вы знойдзеце маÑÑ–ÑžÐ½Ñ‹Ñ Ð¿Ñчоры." #: src/settings_translation_file.cpp msgid "Descending speed" -msgstr "" +msgstr "ХуткаÑць апуÑканнÑ" #: src/settings_translation_file.cpp msgid "" "Description of server, to be displayed when players join and in the " "serverlist." msgstr "" +"ÐпіÑанне Ñервера, Ñкое паказваецца пры далучÑнні гульцоў Ñ– Ñž ÑпіÑе Ñервераў." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "" +msgid "Desert noise threshold" +msgstr "Парог шума пуÑтынь" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" +"ПуÑтыні з'ÑўлÑюцца, калі np_biome перавыÑіць гÑта значÑнне.\n" +"ГÑта ігнаруецца, калі ўключана Ð½Ð¾Ð²Ð°Ñ ÑÑ–ÑÑ‚Ñма біёмаў." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "ДÑÑінхранізаваць анімацыю блока" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "ЧаÑціцы пры капанні" #: src/settings_translation_file.cpp msgid "Disable anticheat" -msgstr "" +msgstr "Ðдключыць анты-чыт" #: src/settings_translation_file.cpp msgid "Disable escape sequences" -msgstr "" +msgstr "Ðдключыць escape-паÑлÑдоўнаÑці" #: src/settings_translation_file.cpp msgid "" @@ -1784,56 +2165,77 @@ msgid "" "disable\n" "the escape sequences generated by mods." msgstr "" +"Ðдключыць escape-паÑлÑдоўнаÑці, напрыклад, размалёўку чату.\n" +"ВыкарыÑтоўвайце гÑта, калі вы хочаце запуÑціць Ñервер з pre-0.4.14 кліентамі " +"Ñ– калі вы хочаце адключыць escape-паÑлÑдоўнаÑці, ÑÐºÑ–Ñ Ð³ÐµÐ½ÐµÑ€ÑƒÑŽÑ†Ñ†Ð° модамі." #: src/settings_translation_file.cpp msgid "Disallow empty passwords" -msgstr "" +msgstr "Забараніць пуÑÑ‚Ñ‹Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ–" #: src/settings_translation_file.cpp msgid "Domain name of server, to be displayed in the serverlist." -msgstr "" +msgstr "Даменнае Ñ–Ð¼Ñ Ñервера, Ñкое будзе паказвацца Ñž ÑпіÑе Ñервераў." #: src/settings_translation_file.cpp msgid "Double tap jump for fly" -msgstr "" +msgstr "Двайны націÑк «Ñкачка» пераключае Ñ€Ñжым палёту" #: src/settings_translation_file.cpp msgid "Double-tapping the jump key toggles fly mode." -msgstr "" +msgstr "Двайное націÑканне клавішы Ñкачка пераключае Ñ€Ñжым палёту." #: src/settings_translation_file.cpp msgid "Drop item key" -msgstr "" +msgstr "Клавіша Ð²Ñ‹ÐºÑ–Ð´Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð´Ð¼ÐµÑ‚Ð°" #: src/settings_translation_file.cpp msgid "Dump the mapgen debug infos." -msgstr "" +msgstr "Зваліць Ð°Ð´Ð»Ð°Ð´Ð°Ñ‡Ð½Ñ‹Ñ Ð·Ð²ÐµÑткі генератара мапы." #: src/settings_translation_file.cpp msgid "Enable Joysticks" +msgstr "Уключыць джойÑцікі" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." msgstr "" +"Уключыць падтрымку Lua-модзінга на кліенце.\n" +"ГÑта падтрымка ÑкÑÐ¿ÐµÑ€Ñ‹Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ– API можа змÑніцца." #: src/settings_translation_file.cpp msgid "Enable VBO" -msgstr "" +msgstr "Уключыць VBO" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Уключаць акно канÑолі" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "Уключыць творчы Ñ€Ñжым Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… мап." #: src/settings_translation_file.cpp msgid "Enable mod security" -msgstr "" +msgstr "Уключыць бÑÑпеку модаў" #: src/settings_translation_file.cpp msgid "Enable players getting damage and dying." -msgstr "" +msgstr "Дазволіць гульцам атрымоўваць пашкоджанні Ñ– паміраюць." #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." -msgstr "" +msgstr "Уключыць выпадковы карыÑтальніцкі ўвод (толькі Ð´Ð»Ñ Ñ‚ÑÑтаваннÑ)." #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." msgstr "" +"Уключыць мÑккае аÑвÑтленне з проÑтай навакольнай аклюзіÑй.\n" +"Ðдключыць Ð´Ð»Ñ Ñ…ÑƒÑ‚ÐºÐ°Ñці ці другога выглÑду." #: src/settings_translation_file.cpp msgid "" @@ -1843,6 +2245,10 @@ msgid "" "to new servers, but they may not support all new features that you are " "expecting." msgstr "" +"Забараніць падлучÑнне Ñтарых кліентаў.\n" +"Ð¡Ñ‚Ð°Ñ€Ñ‹Ñ ÐºÐ»Ñ–ÐµÐ½Ñ‚Ñ‹ — ÑумÑÑˆÑ‡Ð°Ð»ÑŒÐ½Ñ‹Ñ Ñž ÑÑнÑе, што Ñны не падаюць пры злучÑнні\n" +"Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ñ– Ñерверамі, але Ñны могуць не падтрымліваць уÑе Ð½Ð¾Ð²Ñ‹Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ–,\n" +"ÑÐºÑ–Ñ Ð²Ñ‹ чакаеце." #: src/settings_translation_file.cpp msgid "" @@ -1851,6 +2257,21 @@ msgid "" "textures)\n" "when connecting to the server." msgstr "" +"Уключыць выкарыÑтанне аддаленага медыÑ-Ñервера (калі забÑÑпечана Ñерверам).\n" +"ÐÐ´Ð´Ð°Ð»ÐµÐ½Ñ‹Ñ Ñерверы прапануюць значна больш хуткі ÑпоÑаб Ñпампоўкі Ð¼ÐµÐ´Ñ‹Ñ " +"(напрыклад Ñ‚ÑкÑтур) пры злучÑнні з Ñерверам." + +#: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "Уключыць калыханне праглÑду" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Множнік ÐºÐ°Ð»Ñ‹Ñ…Ð°Ð½Ð½Ñ Ð¿Ñ€Ñ‹ праглÑдзе.\n" +"Ðапрыклад: 0 — нÑма, 1.0 — звычайнае, 2.0 — падвойнае." #: src/settings_translation_file.cpp msgid "" @@ -1858,10 +2279,13 @@ msgid "" "to IPv6 clients, depending on system configuration.\n" "Ignored if bind_address is set." msgstr "" +"Уключыць/адключыць падтрымку IPv6. Сервер IPv6 можа быць абмежаваны\n" +"падтрымкай толькі IPv6-кліентаў, у залежнаÑці ад ÑÑ–ÑÑ‚Ñмнай канфігурацыі.\n" +"Ігнаруецца, калі зададзены «bind_address»." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." -msgstr "" +msgstr "Уключае анімацыю прадметаў інвентару." #: src/settings_translation_file.cpp msgid "" @@ -1870,126 +2294,153 @@ msgid "" "or need to be auto-generated.\n" "Requires shaders to be enabled." msgstr "" +"Уключае Ñ€Ñльефнае Ñ‚ÑкÑтураванне. Мапы нармалÑÑž павінны быць прадÑтаўлены " +"пакетам Ñ‚ÑкÑтур ці павінны быць аўтаматычна згенераваны.\n" +"Патрабуе шÑйдÑры." #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." -msgstr "" +msgstr "Уключае кÑшаванне вонкава павернутых Ñетак." #: src/settings_translation_file.cpp msgid "Enables filmic tone mapping" -msgstr "" +msgstr "Уключае кінематаграфічнае танальнае адлюÑтраванне" #: src/settings_translation_file.cpp msgid "Enables minimap." -msgstr "" +msgstr "Уключае мінімапу." #: src/settings_translation_file.cpp msgid "" "Enables on the fly normalmap generation (Emboss effect).\n" "Requires bumpmapping to be enabled." msgstr "" +"Уключае генерацыю мапаў нармалÑÑž лётма (Ñфект Emboss).\n" +"Патрабуе Ñ€Ñльефнае Ñ‚ÑкÑтураванне." #: src/settings_translation_file.cpp msgid "" "Enables parallax occlusion mapping.\n" "Requires shaders to be enabled." msgstr "" +"Уключае паралакÑнае аклюзіўнае Ñ‚ÑкÑтураванне.\n" +"Патрабуе шÑйдÑры." + +#: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "Уключае калыханне пра хадзьбе." #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" -msgstr "" +msgstr "ІнтÑрвал Ð´Ñ€ÑƒÐºÐ°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ… прафілÑÐ²Ð°Ð½Ð½Ñ Ñ€ÑƒÑ…Ð°Ð²Ñ–ÐºÐ°" #: src/settings_translation_file.cpp msgid "Entity methods" -msgstr "" +msgstr "Метады ÑутнаÑці" #: src/settings_translation_file.cpp msgid "" "Experimental option, might cause visible spaces between blocks\n" "when set to higher number than 0." msgstr "" +"ÐкÑперыментальны параметр, Ñкі можа прывеÑці да візуальных прагалаў\n" +"паміж блокамі пры значÑнні большым чым 0." #: src/settings_translation_file.cpp msgid "FPS in pause menu" -msgstr "" +msgstr "FPS у меню паўзы" #: src/settings_translation_file.cpp msgid "FSAA" -msgstr "" +msgstr "FSAA (паўнаÑцÑннае згладжванне)" #: src/settings_translation_file.cpp -msgid "Fall bobbing" -msgstr "" +msgid "Factor noise" +msgstr "КаÑфіцыентны шум" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "КаÑфіцыент ÐºÐ°Ð»Ñ‹Ñ…Ð°Ð½Ð½Ñ Ð¿Ñ€Ñ‹ падзенні" #: src/settings_translation_file.cpp msgid "Fallback font" -msgstr "" +msgstr "ЗапаÑны шрыфт" #: src/settings_translation_file.cpp msgid "Fallback font shadow" -msgstr "" +msgstr "Цень запаÑнога шрыфту" #: src/settings_translation_file.cpp msgid "Fallback font shadow alpha" -msgstr "" +msgstr "ПразрыÑтаÑць цені запаÑнога шрыфту" #: src/settings_translation_file.cpp msgid "Fallback font size" -msgstr "" +msgstr "Памер запаÑнога шрыфту" #: src/settings_translation_file.cpp msgid "Fast key" -msgstr "" +msgstr "Клавіша шпаркаÑці" #: src/settings_translation_file.cpp msgid "Fast mode acceleration" -msgstr "" +msgstr "ПаÑкарÑнне шпаркага Ñ€Ñжыму" #: src/settings_translation_file.cpp msgid "Fast mode speed" -msgstr "" +msgstr "ХуткаÑць шпаркага Ñ€Ñжыму" #: src/settings_translation_file.cpp msgid "Fast movement" -msgstr "" +msgstr "Шпаркае перамÑшчÑнне" #: src/settings_translation_file.cpp msgid "" "Fast movement (via use key).\n" "This requires the \"fast\" privilege on the server." msgstr "" +"Шпаркае перамÑшчÑнне (з дапамогай клавішы выкарыÑтаннÑ).\n" +"Ðеабходна Ð¿Ñ€Ñ‹Ð²Ñ–Ð»ÐµÑ Â«fast» на Ñерверы." #: src/settings_translation_file.cpp msgid "Field of view" -msgstr "" +msgstr "Поле зроку" #: src/settings_translation_file.cpp msgid "Field of view for zoom" -msgstr "" +msgstr "Поле зроку пры павелічÑнні" #: src/settings_translation_file.cpp msgid "Field of view in degrees." -msgstr "" +msgstr "Поле зроку Ñž градуÑах." #: src/settings_translation_file.cpp msgid "" "Field of view while zooming in degrees.\n" "This requires the \"zoom\" privilege on the server." msgstr "" +"Поле зроку пры павелічÑнні Ñž градуÑах.\n" +"Ðеабходна Ð¿Ñ€Ñ‹Ð²Ñ–Ð»ÐµÑ Â«zoom» на Ñерверы." #: src/settings_translation_file.cpp msgid "" "File in client/serverlist/ that contains your favorite servers displayed in " "the Multiplayer Tab." msgstr "" +"Файл, Ñкі змÑшчае вашы Ð°Ð±Ñ€Ð°Ð½Ñ‹Ñ Ñерверы, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð²Ð°ÑŽÑ†Ñ†Ð°\n" +"ва ўкладцы ÑумеÑнай гульні." #: src/settings_translation_file.cpp msgid "Filler Depth" -msgstr "" +msgstr "Ð“Ð»Ñ‹Ð±Ñ–Ð½Ñ Ð·Ð°Ð¿Ð°ÑžÐ½Ñльніка" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "Шум глыбіні запаўнÑльніка" #: src/settings_translation_file.cpp msgid "Filmic tone mapping" -msgstr "" +msgstr "Кінематаграфічнае танальнае адлюÑтраванне" #: src/settings_translation_file.cpp msgid "" @@ -1998,122 +2449,164 @@ msgid "" "light edge to transparent textures. Apply this filter to clean that up\n" "at texture load time." msgstr "" +"ÐÐ´Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°Ð²Ð°Ð½Ñ‹Ñ Ñ‚ÑкÑтуры могуць змешваць значÑнні RGB з цалкам празрыÑтымі " +"ÑуÑедзÑмі, ÑÐºÑ–Ñ PNG-аптымізатары звычайна адкідваюць, што прыводзіць чаÑам " +"да цёмнага ці Ñветлага краю празрыÑтых Ñ‚ÑкÑтур." #: src/settings_translation_file.cpp msgid "Filtering" -msgstr "" +msgstr "ФільтрацыÑ" + +#: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "Першы з двух 3D-шумоў, ÑÐºÑ–Ñ Ñ€Ð°Ð·Ð°Ð¼ вызначаюць тунÑлі." #: src/settings_translation_file.cpp msgid "Fixed map seed" -msgstr "" +msgstr "ФікÑаваны лікавы Ñтан" + +#: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "Шум базавай вышыні выÑпаў, што лÑцÑць" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "Базавы шум выÑпаў, што лÑцÑць" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "Узровень выÑпаў, што лÑцÑць" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "ШчыльнаÑць гор на выÑпах, што лÑцÑць" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "Ð’Ñ‹ÑˆÑ‹Ð½Ñ Ð³Ð¾Ñ€ на выÑпах, што лÑцÑць" #: src/settings_translation_file.cpp msgid "Fly key" -msgstr "" +msgstr "Клавіша палёту" #: src/settings_translation_file.cpp msgid "Flying" -msgstr "" +msgstr "Палёт" #: src/settings_translation_file.cpp msgid "Fog" -msgstr "" +msgstr "Туман" + +#: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "Пачатак туману" #: src/settings_translation_file.cpp msgid "Fog toggle key" -msgstr "" +msgstr "Клавіша пераключÑÐ½Ð½Ñ Ñ‚ÑƒÐ¼Ð°Ð½Ñƒ" #: src/settings_translation_file.cpp msgid "Font path" -msgstr "" +msgstr "Шрыфт" #: src/settings_translation_file.cpp msgid "Font shadow" -msgstr "" +msgstr "Цень шрыфту" #: src/settings_translation_file.cpp msgid "Font shadow alpha" -msgstr "" +msgstr "ПразрыÑтаÑць цені шрыфту" #: src/settings_translation_file.cpp msgid "Font shadow alpha (opaqueness, between 0 and 255)." -msgstr "" +msgstr "ПразрыÑтаÑць цені шрыфту (ад 0 да 255)." #: src/settings_translation_file.cpp msgid "Font shadow offset, if 0 then shadow will not be drawn." -msgstr "" +msgstr "Зрух цені шрыфту. Калі 0, то цень не будзе паказана." #: src/settings_translation_file.cpp msgid "Font size" -msgstr "" +msgstr "Памер шрыфту" #: src/settings_translation_file.cpp msgid "Format of screenshots." -msgstr "" +msgstr "Фармат здымкаў Ñкрана." #: src/settings_translation_file.cpp msgid "Forward key" -msgstr "" +msgstr "Клавіша ўперад" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "Тып фрактала" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "ЧаÑтка дыÑтанцыі бачнаÑці, на Ñкой пачынае з'ÑўлÑцца туман" #: src/settings_translation_file.cpp msgid "Freetype fonts" -msgstr "" +msgstr "Шрыфты FreeType" #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " "nodes)." msgstr "" +"Як далёка блокі фармуюцца ад кліента. Задаецца Ñž блоках мапы (16 вузлоў)." #: src/settings_translation_file.cpp msgid "" "From how far blocks are sent to clients, stated in mapblocks (16 nodes)." msgstr "" +"Як далёка блокі адпраўлÑюцца кліенту. Задаецца Ñž блоках мапы (16 вузлоў)." #: src/settings_translation_file.cpp msgid "" "From how far clients know about objects, stated in mapblocks (16 nodes)." msgstr "" +"Як далёка кліент даведваецца аб аб'ектах. Задаецца Ñž блоках мапы (16 вузлоў)." #: src/settings_translation_file.cpp msgid "Full screen" -msgstr "" +msgstr "Ва ўвеÑÑŒ Ñкран" #: src/settings_translation_file.cpp msgid "Full screen BPP" -msgstr "" +msgstr "ПоўнаÑкранны BPP (бітаў на пікÑель)" #: src/settings_translation_file.cpp msgid "Fullscreen mode." -msgstr "" +msgstr "ПоўнаÑкранны Ñ€Ñжым." #: src/settings_translation_file.cpp msgid "GUI scaling" -msgstr "" +msgstr "Маштабаванне графічнага інтÑрфейÑу" #: src/settings_translation_file.cpp msgid "GUI scaling filter" -msgstr "" +msgstr "Фільтр Ð¼Ð°ÑˆÑ‚Ð°Ð±Ð°Ð²Ð°Ð½Ð½Ñ Ð³Ñ€Ð°Ñ„Ñ–Ñ‡Ð½Ð°Ð³Ð° інтÑрфейÑу" #: src/settings_translation_file.cpp msgid "GUI scaling filter txr2img" -msgstr "" +msgstr "Фільтр txr2img Ð¼Ð°ÑˆÑ‚Ð°Ð±Ð°Ð²Ð°Ð½Ð½Ñ Ð³Ñ€Ð°Ñ„Ñ–Ñ‡Ð½Ð°Ð³Ð° інтÑрфейÑу" #: src/settings_translation_file.cpp msgid "Gamma" -msgstr "" +msgstr "Гама" #: src/settings_translation_file.cpp msgid "General" -msgstr "" +msgstr "ÐÑноўныÑ" #: src/settings_translation_file.cpp msgid "Generate normalmaps" -msgstr "" +msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ñ‹Ñ Ð¼Ð°Ð¿Ñ‹ нармалÑÑž" #: src/settings_translation_file.cpp msgid "Global callbacks" -msgstr "" +msgstr "Ð“Ð»Ð°Ð±Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð·Ð²Ð°Ñ€Ð¾Ñ‚Ð½Ñ‹Ñ Ð²Ñ‹ÐºÐ»Ñ–ÐºÑ–" #: src/settings_translation_file.cpp msgid "" @@ -2124,22 +2617,37 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Ð“Ð»Ð°Ð±Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ генерацыі мапы.\n" +"У генератары мапы 6 параметр «decorations» кантралюе ÑžÑе мадыфікатары,\n" +"Ð°ÐºÑ€Ð°Ð¼Ñ Ð´Ñ€Ñваў Ñ– травы джунглÑÑž, а Ñž аÑтатніх генератарах гÑты параметр\n" +"кантралюе ÑžÑе дÑкаратары.\n" +"Параметры, ÑÐºÑ–Ñ Ð½Ðµ пазначаны Ñž радку, не адрозніваюцца ад агаданых " +"значÑннÑÑž.\n" +"Параметры, ÑÐºÑ–Ñ Ð¿Ð°Ñ‡Ñ‹Ð½Ð°ÑŽÑ†Ñ†Ð° з «no», выкарыÑтоўваюцца Ð´Ð»Ñ Ñўнага адключÑннÑ." #: src/settings_translation_file.cpp msgid "Graphics" -msgstr "" +msgstr "Графіка" #: src/settings_translation_file.cpp msgid "Gravity" -msgstr "" +msgstr "ГравітацыÑ" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "Узровень зÑмлі" #: src/settings_translation_file.cpp msgid "HTTP Mods" -msgstr "" +msgstr "HTTP-моды" + +#: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "КаÑфіцыент Ð¼Ð°ÑˆÑ‚Ð°Ð±Ð°Ð²Ð°Ð½Ð½Ñ HUD" #: src/settings_translation_file.cpp msgid "HUD toggle key" -msgstr "" +msgstr "Клавіша пераключÑÐ½Ð½Ñ HUD" #: src/settings_translation_file.cpp msgid "" @@ -2148,6 +2656,13 @@ msgid "" "- log: mimic and log backtrace of deprecated call (default for debug).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" +"Ðпрацоўка ÑаÑтарÑлых выклікаў Lua API:\n" +"- legacy: (паÑпрабаваць) імітаваць ÑÑ‚Ð°Ñ€Ñ‹Ñ Ð¿Ð°Ð²Ð¾Ð´Ð·Ñ–Ð½Ñ‹ (агаданае Ð´Ð»Ñ " +"Ñ€Ñлізу).\n" +"- log: імітаваць Ñ– журналÑваць ÑаÑтарÑÐ»Ñ‹Ñ Ð²Ñ‹ÐºÐ»Ñ–ÐºÑ– (агаданае Ð´Ð»Ñ " +"адладкі).\n" +"- error: прыпыніць пры ÑаÑтарÑлым выкліку (пажадана Ð´Ð»Ñ Ñ€Ð°Ñпрацоўнікаў " +"модаў)." #: src/settings_translation_file.cpp msgid "" @@ -2157,26 +2672,62 @@ msgid "" "call).\n" "* Instrument the sampler being used to update the statistics." msgstr "" +"ÐаÑўнаÑць Ñамога прафілера Ñамо па Ñабе інÑтрументацыÑ:\n" +"* ІнÑÑ‚Ñ€ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ‹Ñ Ð¿ÑƒÑтой функцыі.\n" +"ГÑта дадае Ð½Ð°ÐºÐ»Ð°Ð´Ð½Ñ‹Ñ Ð²Ñ‹Ð´Ð°Ñ‚ÐºÑ– (+1 выклік функцыі).\n" +"* ІнÑÑ‚Ñ€ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ‹Ñ ÑÑмплера выкарыÑтоўваецца Ð´Ð»Ñ Ð°Ð±Ð½Ð°ÑžÐ»ÐµÐ½Ð½Ñ ÑтатыÑтыкі." + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "Шум цеплавога змешваннÑ" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "Цеплавы шум" #: src/settings_translation_file.cpp msgid "Height component of the initial window size." -msgstr "" +msgstr "Кампанента вышыні пачатковага памеру вакна." + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "Ð’Ñ‹Ñотны шум" #: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." -msgstr "" +msgstr "ВышынÑ, на Ñкой з'ÑўлÑюцца аблокі." + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "Ð’Ñ‹ÑокаÑелектыўны шум" #: src/settings_translation_file.cpp msgid "High-precision FPU" -msgstr "" +msgstr "Ð’Ñ‹Ñокадакладны FPU" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "КрутаÑць узгоркаў" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "Парог узгоркаў" #: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." -msgstr "" +msgstr "ХатнÑÑ Ñтаронка Ñервера, ÑÐºÐ°Ñ Ð±ÑƒÐ´Ð·Ðµ паказвацца Ñž ÑпіÑе Ñервераў." + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "ÐаÑтупны прадмет у хуткай панÑлі" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "ПапÑÑ€Ñдні прадмет у хуткай панÑлі" #: src/settings_translation_file.cpp msgid "How deep to make rivers" -msgstr "" +msgstr "Ð“Ð»Ñ‹Ð±Ñ–Ð½Ñ Ñ€Ñк" #: src/settings_translation_file.cpp msgid "" @@ -2184,40 +2735,75 @@ msgid "" "mapblocks (16 nodes).\n" "In active blocks objects are loaded and ABMs run." msgstr "" +"Ðаколькі вÑÐ»Ñ–ÐºÐ°Ñ Ð¿Ð»Ð¾ÑˆÑ‡Ð° блокаў, ÑÐºÐ°Ñ Ð¿Ð°Ð´Ð»Ñгае актыўнаму ўздзеÑнню,\n" +"Ð·Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ð°Ñ Ñž блоках мапы (16 вузлоў).\n" +"Ð”Ð»Ñ Ð°ÐºÑ‚Ñ‹ÑžÐ½Ñ‹Ñ… блокаў загружаюцца аб'екты Ñ– запуÑкаюцца ABM'Ñ‹." #: src/settings_translation_file.cpp msgid "" "How much the server will wait before unloading unused mapblocks.\n" "Higher value is smoother, but will use more RAM." msgstr "" +"Як доўга Ñервер будзе чакаць перад выгрузкай блокаў мапы,\n" +"ÑÐºÑ–Ñ Ð½Ðµ выкарыÑтоўваюцца.\n" +"Больш выÑокае значÑнне прыводзіць да гладкаÑці, але патрабуе больш памÑці." #: src/settings_translation_file.cpp msgid "How wide to make rivers" -msgstr "" +msgstr "Ð¨Ñ‹Ñ€Ñ‹Ð½Ñ Ñ€Ñк" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "Шум Ð·Ð¼ÐµÑˆÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð»ÑŒÐ³Ð¾Ñ‚Ð½Ð°Ñці" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "Шум вільготнаÑці" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "ВарыÑÑ†Ñ‹Ñ Ð²Ñ–Ð»ÑŒÐ³Ð¾Ñ‚Ð½Ð°Ñці Ð´Ð»Ñ Ð±Ñ–Ñ‘Ð¼Ð°Ñž." #: src/settings_translation_file.cpp msgid "IPv6" -msgstr "" +msgstr "IPv6" #: src/settings_translation_file.cpp msgid "IPv6 server" -msgstr "" +msgstr "IPv6-Ñервер" #: src/settings_translation_file.cpp msgid "IPv6 support." -msgstr "" +msgstr "Падтрымка IPv6." #: src/settings_translation_file.cpp msgid "" "If FPS would go higher than this, limit it by sleeping\n" "to not waste CPU power for no benefit." msgstr "" +"Калі FPS перавыÑіць гÑта значÑнне, абмежаваць праÑтоем,\n" +"каб не марнаваць дарма магутнаÑць працÑÑара." #: src/settings_translation_file.cpp msgid "" "If disabled \"use\" key is used to fly fast if both fly and fast mode are " "enabled." msgstr "" +"Калі адключаны, то клавіша «use» выкарыÑтоўваецца Ð´Ð»Ñ Ñ…ÑƒÑ‚ÐºÐ°Ð³Ð° палёту, калі " +"палёт Ñ– шпаркі Ñ€Ñжым уключаны." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" +"Калі ўключаны, то Ñервер будзе выконваць адÑÑканне блокаў, заходзÑчы\n" +"з размÑшчÑÐ½Ð½Ñ Ð²Ð°Ñ‡Ñй гульца. ГÑта можа зменшыць колькаÑць пераÑылаемых\n" +"блокаў на 50–60 %. Кліент не будзе атрымоўваць большую чаÑтку небачных\n" +"блокаў, па-гÑтаму Ñ€Ñжым noclip Ñтане менш карыÑным." #: src/settings_translation_file.cpp msgid "" @@ -2225,32 +2811,48 @@ msgid "" "nodes.\n" "This requires the \"noclip\" privilege on the server." msgstr "" +"Калі ўключаны разам з Ñ€Ñжымам палёту, то гулец будзе мець магчымаÑць лÑтаць " +"Ñкрозь Ñ†Ð²Ñ‘Ñ€Ð´Ñ‹Ñ Ñ†ÐµÐ»Ñ‹.\n" +"Ðеабходна Ð¿Ñ€Ñ‹Ð²Ñ–Ð»ÐµÑ Â«noclip» на Ñерверы." #: src/settings_translation_file.cpp msgid "" "If enabled, \"use\" key instead of \"sneak\" key is used for climbing down " "and descending." msgstr "" +"Калі ўключаны, то клавіша «use» замеÑÑ‚ «sneak» выкарыÑтоўваецца Ð´Ð»Ñ " +"ÑпуÑÐºÐ°Ð½Ð½Ñ Ñ– апуÑканнÑ." #: src/settings_translation_file.cpp msgid "" "If enabled, actions are recorded for rollback.\n" "This option is only read when server starts." msgstr "" +"Калі ўключаны, то дзеÑнні запіÑваюцца Ð´Ð»Ñ Ð°Ð´ÐºÐ°Ñ‚Ñƒ.\n" +"ГÑты параметр чытаецца толькі пры запуÑку Ñервера." #: src/settings_translation_file.cpp msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "" +msgstr "Калі ўключаны, то адключае прадухіленне падману Ñž ÑумеÑнай гульне." #: src/settings_translation_file.cpp msgid "" "If enabled, invalid world data won't cause the server to shut down.\n" "Only enable this if you know what you are doing." msgstr "" +"Калі ўключаны, то некарÑÐºÑ‚Ð½Ñ‹Ñ Ð´Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ Ñвету не прывÑдуць Ñервер ды " +"адключÑннÑ.\n" +"Уключайце гÑта толькі, калі ведаеце, што робіце." #: src/settings_translation_file.cpp msgid "If enabled, new players cannot join with an empty password." +msgstr "Калі ўключаны, то гульцы не змогуць далучыцца з пуÑтым паролем." + +#: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." msgstr "" +"Калі ўключанае, паказаць паведамленне Ñтану Ñервера Ð´Ð»Ñ Ð³ÑƒÐ»ÑŒÑ†Ð¾Ñž, ÑÐºÑ–Ñ " +"падлучаюцца." #: src/settings_translation_file.cpp msgid "" @@ -2258,102 +2860,136 @@ msgid "" "you stand.\n" "This is helpful when working with nodeboxes in small areas." msgstr "" +"Калі ўключаны, то вы зможаце паÑтавіць блокі Ñž меÑцы (ногі + узровень " +"вачÑй), дзе вы Ñтаіце.\n" +"ГÑта дапамагае працаваць з блокамі Ñž ÑціÑнутых умовах." #: src/settings_translation_file.cpp msgid "If this is set, players will always (re)spawn at the given position." -msgstr "" +msgstr "Калі гÑта зададзена, гульцы заўÑёды (ад)нараджаюцца Ñž дадзеным меÑцы." #: src/settings_translation_file.cpp msgid "Ignore world errors" -msgstr "" +msgstr "Ігнараваць памылкі Ñвету" #: src/settings_translation_file.cpp msgid "In-Game" -msgstr "" +msgstr "ГульнÑваÑ" #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." -msgstr "" +msgstr "ПразрыÑтаÑць фону гульнÑвой канÑолі чату (паміж 0 Ñ– 255)." #: src/settings_translation_file.cpp msgid "In-game chat console background color (R,G,B)." -msgstr "" +msgstr "Колер фону гульнÑвой канÑолі чату (R,G,B)." + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "Ð’Ñ‹ÑˆÑ‹Ð½Ñ ÑžÐ½ÑƒÑ‚Ñ€Ñ‹Ð³ÑƒÐ»ÑŒÐ½Ñвой канÑолі чату, паміж 0,1 (10 %) Ñ– 1,0 (100 %)." + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "Кнопка павелічÑÐ½Ð½Ñ Ð³ÑƒÑ‡Ð½Ð°Ñці" #: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" msgstr "" +"Ð£Ð±ÑƒÐ´Ð°Ð²Ð°Ð½Ð°Ñ Ñ–Ð½ÑтрументацыÑ.\n" +"ГÑта звычайна неабходна толькі Ð´Ð»Ñ Ð°Ñноўным удзельнікам" #: src/settings_translation_file.cpp msgid "Instrument chatcommands on registration." -msgstr "" +msgstr "ІнÑтрументаваць каманды чату пры Ñ€ÑгіÑтрацыі." #: src/settings_translation_file.cpp msgid "" "Instrument global callback functions on registration.\n" "(anything you pass to a minetest.register_*() function)" msgstr "" +"ІнÑтрументаваць функцыі глабальных Ð·Ð²Ð°Ñ€Ð¾Ñ‚Ð½Ñ‹Ñ Ð²Ñ‹ÐºÐ»Ñ–ÐºÐ°Ñž пры Ñ€ÑгіÑтрацыі.\n" +"(уÑÑ‘, што вы перадаÑце у функцыю minetest.register_*())" #: src/settings_translation_file.cpp msgid "" "Instrument the action function of Active Block Modifiers on registration." -msgstr "" +msgstr "ІнÑтрументаваць функцыі мадыфікатараў актыўных блокаў пры Ñ€ÑгіÑтрацыі." #: src/settings_translation_file.cpp msgid "" "Instrument the action function of Loading Block Modifiers on registration." msgstr "" +"ІнÑтрументаваць функцыі мадыфікатараў нагрузачных блокаў пры Ñ€ÑгіÑтрацыі." #: src/settings_translation_file.cpp msgid "Instrument the methods of entities on registration." -msgstr "" +msgstr "ІнÑтрументаваць метады ÑутнаÑці пры Ñ€ÑгіÑтрацыі." #: src/settings_translation_file.cpp msgid "Instrumentation" -msgstr "" +msgstr "ІнÑтрументаванне" #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." -msgstr "" +msgstr "ІнтÑрвал Ð·Ð°Ñ…Ð°Ð²Ð°Ð½Ð½Ñ Ð²Ð°Ð¶Ð½Ñ‹Ñ… змÑненнÑÑž Ñвету, зададзены Ñž Ñекундах." #: src/settings_translation_file.cpp msgid "Interval of sending time of day to clients." -msgstr "" +msgstr "ІнтÑрвал адпраўкі кліентам чаÑу днÑ." + +#: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "Хак Ð´Ð»Ñ Ð²Ñ‹ÑÑž інвентару" #: src/settings_translation_file.cpp msgid "Inventory items animations" -msgstr "" +msgstr "ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ‹Ñ Ð¿Ñ€Ð°Ð´Ð¼ÐµÑ‚Ð°Ñž інвентару" #: src/settings_translation_file.cpp msgid "Inventory key" -msgstr "" +msgstr "Клавіша інвентару" #: src/settings_translation_file.cpp msgid "Invert mouse" -msgstr "" +msgstr "Інвертаваць мыш" #: src/settings_translation_file.cpp msgid "Invert vertical mouse movement." -msgstr "" +msgstr "Інвертуе вертыкальны рух мышы." #: src/settings_translation_file.cpp msgid "Item entity TTL" -msgstr "" +msgstr "Ð§Ð°Ñ Ð¶Ñ‹Ñ†Ñ†Ñ Ð²Ñ‹ÐºÑ–Ð½ÑƒÑ‚Ð°Ð¹ Ñ€Ñчы" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "ІтÑрацыі" #: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" +"ІтÑрацыі Ñ€ÑкурÑіўнай функцыі.\n" +"Кантралюе колькаÑць дробных дÑталÑÑž." + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "ID джойÑціка" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "Тып джойÑціка" #: src/settings_translation_file.cpp msgid "Joystick button repetition interval" -msgstr "" +msgstr "ІнтÑрвал паўтору кнопкі джойÑціка" #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" -msgstr "" +msgstr "ÐдчувальнаÑць адÑÑчÑÐ½Ð½Ñ Ð´Ð¶Ð¾Ð¹Ñціка" #: src/settings_translation_file.cpp msgid "" @@ -2362,6 +2998,10 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" +"Ð”Ð»Ñ Ð¼Ð½Ð¾Ñтва Ð–ÑƒÐ»Ñ–Ñ Ñ‚Ð¾Ð»ÑŒÐºÑ–: кампанента W гіперкомплекÑнай канÑтанты,\n" +"ÑÐºÐ°Ñ Ð·Ð°Ð´Ð°Ðµ форму мноÑтва ЖуліÑ.\n" +"Ðе дае Ñфекту Ð´Ð»Ñ 3D-фракталаў.\n" +"ДыÑпазон прыкладна ад −2 да 2." #: src/settings_translation_file.cpp msgid "" @@ -2369,6 +3009,9 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Ð”Ð»Ñ Ð¼Ð½Ð¾Ñтва Ð–ÑƒÐ»Ñ–Ñ Ñ‚Ð¾Ð»ÑŒÐºÑ–: кампанента X гіперкомплекÑнай канÑтанты,\n" +"ÑÐºÐ°Ñ Ð·Ð°Ð´Ð°Ðµ форму мноÑтва ЖуліÑ.\n" +"ДыÑпазон прыкладна ад −2 да 2." #: src/settings_translation_file.cpp msgid "" @@ -2376,6 +3019,10 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Ð”Ð»Ñ Ð¼Ð½Ð¾Ñтва Ð–ÑƒÐ»Ñ–Ñ Ñ‚Ð¾Ð»ÑŒÐºÑ–: кампанента Y гіперкомплекÑнай канÑтанты,\n" +"ÑÐºÐ°Ñ Ð·Ð°Ð´Ð°Ðµ форму мноÑтва ЖуліÑ.\n" +"Ðе дае Ñфекту Ð´Ð»Ñ 3D-фракталаў.\n" +"ДыÑпазон прыкладна ад −2 да 2." #: src/settings_translation_file.cpp msgid "" @@ -2383,14 +3030,34 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Ð”Ð»Ñ Ð¼Ð½Ð¾Ñтва Ð–ÑƒÐ»Ñ–Ñ Ñ‚Ð¾Ð»ÑŒÐºÑ–: кампанента Z гіперкомплекÑнай канÑтанты,ÑÐºÐ°Ñ Ð·Ð°Ð´Ð°Ðµ " +"форму мноÑтва ЖуліÑ.\n" +"Ðе дае Ñфекту Ð´Ð»Ñ 3D-фракталаў.\n" +"ДыÑпазон прыкладна ад −2 да 2." + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "Ð–ÑƒÐ»Ñ–Ñ W" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "Ð–ÑƒÐ»Ñ–Ñ X" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "ЖуліÑ" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "Ð–ÑƒÐ»Ñ–Ñ Z" #: src/settings_translation_file.cpp msgid "Jump key" -msgstr "" +msgstr "Клавіша Ñкачка" #: src/settings_translation_file.cpp msgid "Jumping speed" -msgstr "" +msgstr "ХуткаÑць Ñкачка" #: src/settings_translation_file.cpp msgid "" @@ -2398,6 +3065,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿Ð°Ð¼ÑншÑÐ½Ð½Ñ Ð´Ñ‹Ñпазону праглÑду.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Кнопка Ð´Ð»Ñ Ð¿Ð°Ð¼ÑншÑÐ½Ð½Ñ Ð³ÑƒÑ‡Ð½Ð°Ñці.\n" +"ГлÑдзіце http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" +"01735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2405,6 +3085,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð²Ñ‹ÐºÑ–Ð´Ð°Ð½Ð½Ñ Ð°Ð±Ñ€Ð°Ð½Ð°Ð³Ð° прадмета.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2412,6 +3095,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿Ð°Ð²ÐµÐ»Ñ–Ñ‡ÑÐ½Ð½Ñ Ð´Ñ‹Ñпазону праглÑду.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Кнопка Ð´Ð»Ñ Ð¿Ð°Ð²ÐµÐ»Ñ–Ñ‡ÑÐ½Ð½Ñ Ð³ÑƒÑ‡Ð½Ð°Ñці.\n" +"ГлÑдзіце http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" +"01735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2419,6 +3115,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ñкачка.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2426,6 +3125,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ñ…ÑƒÑ‚ÐºÐ°Ð³Ð° руху Ñž шпаркім Ñ€Ñжыме.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2433,6 +3135,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ñ€ÑƒÑ…Ñƒ гульца ўзад.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2440,6 +3145,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ñ€ÑƒÑ…Ñƒ гульца ўперад.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2447,6 +3155,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ñ€ÑƒÑ…Ñƒ гульца ўлева.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2454,6 +3165,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ñ€ÑƒÑ…Ñƒ гульца ўправа.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Кнопка Ð´Ð»Ñ Ð¿Ñ€Ñ‹Ð³Ð»ÑƒÑˆÑÐ½Ð½Ñ Ð³ÑƒÐ»ÑŒÐ½Ñ–.\n" +"ГлÑдзіце http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" +"01735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2461,6 +3185,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð°Ð´ÐºÑ€Ñ‹Ñ†Ñ†Ñ ÐºÐ°Ð½Ñолі чату.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2468,6 +3195,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð°Ð´ÐºÑ€Ñ‹Ñ†Ñ†Ñ Ð²Ð°ÐºÐ½Ð° чату Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÐ°Ð²Ð°Ð½Ð½Ñ ÐºÐ°Ð¼Ð°Ð½Ð´.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Кнопка Ð´Ð»Ñ Ð°Ð´ÐºÑ€Ñ‹Ñ†Ñ†Ñ Ð²Ð°ÐºÐ½Ð° чату Ð´Ð»Ñ ÑžÐ²Ð¾Ð´Ñƒ лакальных каманд.\n" +"ГлÑдзіце http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" +"01735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2475,6 +3215,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð°Ð´ÐºÑ€Ñ‹Ñ†Ñ†Ñ Ð²Ð°ÐºÐ½Ð° чату.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2482,6 +3225,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð°Ð´ÐºÑ€Ñ‹Ñ†Ñ†Ñ Ñ–Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñƒ.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2489,6 +3235,29 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÐ°Ð²Ð°Ð½Ð½Ñ ÑÑ‚Ñкаў адладкі. ВыкарыÑтоўваецца Ð´Ð»Ñ Ñ€Ð°Ñпрацоўкі.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Кнопка Ð´Ð»Ñ Ð²Ñ‹Ð±Ð°Ñ€Ñƒ наÑтупнага Ñлемента Ñž хотбары.\n" +"ГлÑдзіце http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" +"01735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Кнопка Ð´Ð»Ñ Ð²Ñ‹Ð±Ð°Ñ€Ñƒ папÑÑ€ÑднÑга Ñлемента хотбара.\n" +"ГлÑдзіце http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" +"01735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2498,6 +3267,11 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð²Ð°Ð»Ð°Ñ‡ÑннÑ.\n" +"ТакÑама выкарыÑтоўваецца Ð´Ð»Ñ ÑпуÑÐºÐ°Ð½Ð½Ñ Ñ– апуÑÐºÐ°Ð½Ð½Ñ Ñž вадзе, калі " +"aux1_descends адключаны.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2505,6 +3279,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð¿Ð°Ð¼Ñ–Ð¶ камерай ад першай аÑобы Ñ– ад трÑцÑй аÑобы.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2512,6 +3289,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°Ð½Ð½Ñ Ð·Ð´Ñ‹Ð¼ÐºÐ°Ñž Ñкрана.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2519,6 +3299,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð°ÑžÑ‚Ð°Ð±ÐµÐ³Ñƒ.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2526,6 +3309,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ ÐºÑ–Ð½ÐµÐ¼Ð°Ñ‚Ð°Ð³Ñ€Ð°Ñ„Ñ–Ñ‡Ð½Ð°Ð³Ð° Ñ€Ñжыму.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2533,6 +3319,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð°Ð´Ð»ÑŽÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð½Ñ–Ð¼Ð°Ð¿Ñ‹.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2540,6 +3329,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ ÑˆÐ¿Ð°Ñ€ÐºÐ°Ð³Ð° Ñ€Ñжыму.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2547,6 +3339,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ñ€Ñжыму палёту.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2554,6 +3349,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ñ€Ñжыму ÑутыкненнÑÑž.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2561,6 +3359,10 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð°Ð±Ð½Ð°ÑžÐ»ÐµÐ½Ð½Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹. ВыкарыÑтоўваецца толькі Ð´Ð»Ñ " +"раÑпрацоўкі.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2568,6 +3370,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð°Ð´Ð»ÑŽÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð·Ð²ÐµÑтак адладкі.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2575,6 +3380,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð°Ð´Ð»ÑŽÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ð½Ñ HUD.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2582,6 +3390,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð°Ð´Ð»ÑŽÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ñ‡Ð°Ñ‚Ñƒ.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2589,6 +3400,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð°Ð´Ð»ÑŽÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ñ‚ÑƒÐ¼Ð°Ð½Ñƒ.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Кнопка Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð°Ð´Ð»ÑŽÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð²Ñлікай канÑолі чату.\n" +"ГлÑдзіце http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" +"01735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2596,6 +3420,10 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð°Ð´Ð»ÑŽÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ñ„Ñ–Ð»ÐµÑ€Ð°. ВыкарыÑтоўваецца Ð´Ð»Ñ " +"раÑпрацоўкі.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2603,26 +3431,51 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð½ÐµÐ°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð°Ð³Ð° дыÑпазону праглÑду.\n" +"ГлÑдзі http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -msgid "Key use for climbing/descending" +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Кнопка Ð´Ð»Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð±Ð»Ñ–Ð¶ÑннÑ, калі гÑта магчыма.\n" +"ГлÑдзіце http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" +"01735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "Key use for climbing/descending" +msgstr "Клавіша Ð´Ð»Ñ ÐºÐ°Ñ€Ð°ÑканнÑ/апуÑканнÑ" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "КрутаÑць азёр" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "Парог азёр" #: src/settings_translation_file.cpp msgid "Language" -msgstr "" +msgstr "Мова" #: src/settings_translation_file.cpp msgid "Large cave depth" -msgstr "" +msgstr "Ð“Ð»Ñ‹Ð±Ñ–Ð½Ñ Ð²Ñлікай пÑчоры" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "Кнопка вÑлікай канÑолі чату" #: src/settings_translation_file.cpp msgid "Lava Features" -msgstr "" +msgstr "ÐÑабліваÑці лавы" #: src/settings_translation_file.cpp msgid "Leaves style" -msgstr "" +msgstr "Стыль ліÑцÑ" #: src/settings_translation_file.cpp msgid "" @@ -2631,24 +3484,31 @@ msgid "" "- Simple: only outer faces, if defined special_tiles are used\n" "- Opaque: disable transparency" msgstr "" +"Стыль ліÑтоты:\n" +"- Fancy: бачны ÑžÑе бакі\n" +"- Simple: бачны Ð·Ð½ÐµÑˆÐ½Ñ–Ñ Ð±Ð°ÐºÑ–, калі выкарыÑтоўваюцца адмыÑÐ»Ð¾Ð²Ñ‹Ñ " +"special_tiles\n" +"- Opaque: адключыць празрыÑтаÑць" #: src/settings_translation_file.cpp msgid "Left key" -msgstr "" +msgstr "Клавіша ўлева" #: src/settings_translation_file.cpp msgid "" "Length of a server tick and the interval at which objects are generally " "updated over network." msgstr "" +"Ð”Ð°ÑžÐ¶Ñ‹Ð½Ñ Ñ†Ñ‹ÐºÐ»Ð° Ñервера Ñ– інтÑрвал, па Ñкім аб'екты, Ñк правіла, абнаўлÑюцца " +"па Ñетцы." #: src/settings_translation_file.cpp msgid "Length of time between ABM execution cycles" -msgstr "" +msgstr "ІнтÑрвал чаÑу паміж выкананнем ABM-цыклаў" #: src/settings_translation_file.cpp msgid "Length of time between NodeTimer execution cycles" -msgstr "" +msgstr "ІнтÑрвал чаÑу паміж выкананнем NodeTimer-цыклаў" #: src/settings_translation_file.cpp msgid "" @@ -2661,14 +3521,32 @@ msgid "" "- info\n" "- verbose" msgstr "" +"Узровень дÑталізацыі журнала, Ñкі пішацца Ñž debug.txt:\n" +"- <nothing> (без журналÑваннÑ)\n" +"- none (паведамленні без ўзроўню)\n" +"- error (памылкі)\n" +"- warning (папÑÑ€Ñджанні)\n" +"- action (дзеÑнні)\n" +"- info (інфармацыÑ)\n" +"- verbose (дÑталі)" #: src/settings_translation_file.cpp msgid "Limit of emerge queues on disk" -msgstr "" +msgstr "Гранічны памер чаргі з дыÑка" #: src/settings_translation_file.cpp msgid "Limit of emerge queues to generate" +msgstr "Гранічны памер чаргі на генерацыю" + +#: src/settings_translation_file.cpp +msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." msgstr "" +"МÑжа генерацыі мапы, у вузлах, ва ÑžÑÑ–Ñ… 6 напрамках ад (0, 0, 0).\n" +"Генеруюцца толькі блокі, ÑÐºÑ–Ñ Ñ†Ð°Ð»ÐºÐ°Ð¼ заходзÑцца Ñž дадзеных межах.\n" +"ЗначÑнне захоўваецца Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð°Ð³Ð° Ñвету." #: src/settings_translation_file.cpp msgid "" @@ -2678,38 +3556,43 @@ msgid "" "- Downloads performed by main menu (e.g. mod manager).\n" "Only has an effect if compiled with cURL." msgstr "" +"ÐбмÑжоўвае колькаÑць паралельных HTTP-запытаў. Уплывае на:\n" +"- Выбарку медыÑ, калі Ñервер выкарыÑтоўвае опцыю remote_media.\n" +"- Спампоўку ÑпіÑу Ñервераў Ñ– аб'ÑÑž Ñервера.\n" +"- Спампоўкі, Ð²Ñ‹ÐºÐ°Ð½Ð°Ð½Ñ‹Ñ Ñž галоўным меню (напрыклад менеджар модаў).\n" +"Ўплывае толькі пры кампілÑцыі з cURL." #: src/settings_translation_file.cpp msgid "Liquid fluidity" -msgstr "" +msgstr "ЦÑкучаÑць вадкаÑці" #: src/settings_translation_file.cpp msgid "Liquid fluidity smoothing" -msgstr "" +msgstr "Згладжванне цÑкучаÑці вадкаÑці" #: src/settings_translation_file.cpp msgid "Liquid loop max" -msgstr "" +msgstr "МакÑімум вадкаÑці за цыкл" #: src/settings_translation_file.cpp msgid "Liquid queue purge time" -msgstr "" +msgstr "Ð§Ð°Ñ Ð°Ñ‡Ñ‹ÑˆÑ‡ÑÐ½Ð½Ñ Ñ‡Ð°Ñ€Ð³Ñ– вадкаÑці" #: src/settings_translation_file.cpp msgid "Liquid sink" -msgstr "" +msgstr "Сцёк вадкаÑці" #: src/settings_translation_file.cpp msgid "Liquid update interval in seconds." -msgstr "" +msgstr "ІнтÑрвал Ð°Ð±Ð½Ð°ÑžÐ»ÐµÐ½Ð½Ñ Ð²Ð°Ð´ÐºÐ°Ñці Ñž Ñекундах." #: src/settings_translation_file.cpp msgid "Liquid update tick" -msgstr "" +msgstr "Цік Ð°Ð±Ð½Ð°ÑžÐ»ÐµÐ½Ð½Ñ Ð²Ð°Ð´ÐºÐ°Ñці" #: src/settings_translation_file.cpp msgid "Load the game profiler" -msgstr "" +msgstr "Загрузіць прафілер гульні" #: src/settings_translation_file.cpp msgid "" @@ -2717,35 +3600,47 @@ msgid "" "Provides a /profiler command to access the compiled profile.\n" "Useful for mod developers and server operators." msgstr "" +"Загрузіць прафілер гульні Ð´Ð»Ñ Ð·Ð±Ð¾Ñ€Ñƒ дадзеных.\n" +"ЗабÑÑпечвае камандай /profiler каб атрымаць доÑтуп да ÑкампілÑванага " +"профілю.\n" +"КарыÑна Ð´Ð»Ñ Ñ€Ð°Ñпрацоўнікаў модаў Ñ– аператараў Ñервераў." #: src/settings_translation_file.cpp msgid "Loading Block Modifiers" -msgstr "" +msgstr "Загрузка мадыфікатараў блокаў" #: src/settings_translation_file.cpp msgid "Main menu game manager" -msgstr "" +msgstr "Менеджар гульнÑÑž у галоўным меню" #: src/settings_translation_file.cpp msgid "Main menu mod manager" -msgstr "" +msgstr "Менеджар модаў у галоўным меню" #: src/settings_translation_file.cpp msgid "Main menu script" -msgstr "" +msgstr "Скрыпт галоўнага меню" #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" +"Зрабіць колер туману Ñ– неба залежным ад чаÑу Ñутак (Ñвітанне, захад) Ñ– " +"напрамку поглÑду." #: src/settings_translation_file.cpp msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" +"Робіць так, каб DirectX працаваў з DirectX. Ðдключыце, калі гÑта выклікае " +"праблемы." + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "Робіць уÑе вадкаÑці непразрыÑтымі" #: src/settings_translation_file.cpp msgid "Map directory" -msgstr "" +msgstr "Каталог мапы" #: src/settings_translation_file.cpp msgid "" @@ -2759,6 +3654,14 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"ÐдмыÑÐ»Ð¾Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð°Ñ€Ð° далін.\n" +"«altitude_chill» робіць больш выÑÐ¾ÐºÑ–Ñ ÑƒÐ·Ð²Ñ‹ÑˆÑˆÑ‹ больш халоднымі, што можа\n" +"выклікаць ÑкладанаÑці Ð´Ð»Ñ Ð±Ñ–Ñ‘Ð¼Ñƒ.\n" +"«humid_rivers» змÑнÑе вільготнаÑць вакол Ñ€Ñк Ñ– Ñž раёнах, дзе вада мае\n" +"Ñ‚ÑндÑнцыю збірацца, што можа перашкодзіць далікатным біёмам.\n" +"Параметры, ÑÐºÑ–Ñ Ð½Ðµ пазначаны Ñž радку, не адрозніваюцца ад агаданых " +"значÑннÑÑž.\n" +"Параметры, ÑÐºÑ–Ñ Ð¿Ð°Ñ‡Ñ‹Ð½Ð°ÑŽÑ†Ñ†Ð° з «no», выкарыÑтоўваюцца Ð´Ð»Ñ Ñўнага адключÑннÑ." #: src/settings_translation_file.cpp msgid "" @@ -2768,411 +3671,226 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"ÐдмыÑÐ»Ð¾Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð°Ñ€Ð° плоÑкай мапы.\n" +"МеÑцамі азёры Ñ– пагоркі могуць быць Ð´Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ Ñž плоÑкі Ñвет.\n" +"Параметры, ÑÐºÑ–Ñ Ð½Ðµ пазначаны Ñž радку, не адрозніваюцца ад агаданых " +"значÑннÑÑž.\n" +"Параметры, ÑÐºÑ–Ñ Ð¿Ð°Ñ‡Ñ‹Ð½Ð°ÑŽÑ†Ñ†Ð° з «no», выкарыÑтоўваюцца Ð´Ð»Ñ Ñўнага адключÑннÑ." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"ÐдмыÑÐ»Ð¾Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð°Ñ€Ð° мапы 5.\n" +"Параметры, ÑÐºÑ–Ñ Ð½Ðµ пазначаны Ñž радку, не адрозніваюцца ад агаданых значÑннÑÑž." +"\n" +"Параметры, ÑÐºÑ–Ñ Ð¿Ð°Ñ‡Ñ‹Ð½Ð°ÑŽÑ†Ñ†Ð° з «no», выкарыÑтоўваюцца Ð´Ð»Ñ Ñўнага адключÑннÑ." #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"ÐдмыÑÐ»Ð¾Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð°Ñ€Ð° мапы 6.\n" +"Параметр «snowbiomes» (ÑÐ½ÐµÐ¶Ð½Ñ‹Ñ Ð±Ñ–Ñ‘Ð¼Ñ‹) ўключае новую пÑцібіёмнай ÑÑ–ÑÑ‚Ñмы.\n" +"Калі Ð½Ð¾Ð²Ð°Ñ Ð±Ñ–Ñ‘Ð¼Ð½Ð°Ñ ÑÑ–ÑÑ‚Ñма ўключанаÑ, то джунглі такÑама аўтаматычна\n" +"ÑžÐºÐ»ÑŽÑ‡Ð°Ð½Ñ‹Ñ Ñ– параметр «jungles» ігнаруецца.\n" +"Параметры, ÑÐºÑ–Ñ Ð½Ðµ пазначаны Ñž радку, не адрозніваюцца ад агаданых значÑннÑÑž." +"\n" +"Параметры, ÑÐºÑ–Ñ Ð¿Ð°Ñ‡Ñ‹Ð½Ð°ÑŽÑ†Ñ†Ð° з «no», выкарыÑтоўваюцца Ð´Ð»Ñ Ñўнага адключÑннÑ." #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"ÐдмыÑÐ»Ð¾Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð°Ñ€Ð° мапы 7.\n" +"Параметр «ridges» (грÑбені) уключае Ñ€Ñкі.\n" +"Ð’Ñ‹Ñпы, што лÑцÑць, ÑкÑÐ¿ÐµÑ€Ñ‹Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ñ‹Ñ Ñž цÑперашні Ñ‡Ð°Ñ Ñ– могуць змÑніцца.\n" +"Параметры, ÑÐºÑ–Ñ Ð½Ðµ пазначаны Ñž радку, не адрозніваюцца ад агаданых значÑннÑÑž." +"\n" +"Параметры, ÑÐºÑ–Ñ Ð¿Ð°Ñ‡Ñ‹Ð½Ð°ÑŽÑ†Ñ†Ð° з «no», выкарыÑтоўваюцца Ð´Ð»Ñ Ñўнага адключÑннÑ." #: src/settings_translation_file.cpp msgid "Map generation limit" -msgstr "" +msgstr "Ðбмежаванне генерацыі мапы" #: src/settings_translation_file.cpp msgid "Map save interval" -msgstr "" +msgstr "ІнтÑрвал Ð·Ð°Ñ…Ð°Ð²Ð°Ð½Ð½Ñ Ð¼Ð°Ð¿Ñ‹" #: src/settings_translation_file.cpp msgid "Mapblock limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "" +msgstr "МÑжа блокаў мапы" #: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "" +msgid "Mapblock mesh generation delay" +msgstr "Затрымка генерацыі Ñеткі блокаў мапы" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "Памер кÑшу блокаў у генератары Ñетак у МБ" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "" +msgid "Mapblock unload timeout" +msgstr "Таймаут выгрузкі блокаў мапы" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +msgid "Mapgen Valleys" +msgstr "Генератар мапы: даліны" #: src/settings_translation_file.cpp msgid "Mapgen debug" -msgstr "" +msgstr "Генератар мапы: адладка" #: src/settings_translation_file.cpp msgid "Mapgen flags" -msgstr "" +msgstr "Генератар мапы: параметры" #: src/settings_translation_file.cpp msgid "Mapgen flat" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" +msgstr "Генератар плоÑкай мапы" #: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" +msgid "Mapgen flat specific flags" +msgstr "Генератар плоÑкай мапы: ÑÐ¿ÐµÑ†Ñ‹Ñ„Ñ–Ñ‡Ð½Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹" #: src/settings_translation_file.cpp msgid "Mapgen fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" +msgstr "Генератар фрактальнай мапы" #: src/settings_translation_file.cpp msgid "Mapgen name" -msgstr "" +msgstr "Ðазва генератара мапы" #: src/settings_translation_file.cpp msgid "Mapgen v5" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "" +msgstr "Генератар мапы 5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" +msgid "Mapgen v5 specific flags" +msgstr "Генератар мапы 5: ÑÐ¿ÐµÑ‡Ñ‹Ñ„Ñ–Ñ‡Ð½Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹" #: src/settings_translation_file.cpp msgid "Mapgen v6" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" +msgstr "Генератар мапы 6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" +msgid "Mapgen v6 specific flags" +msgstr "Генератар мапы 6: ÑÐ¿ÐµÑ†Ñ‹Ñ„Ñ–Ñ‡Ð½Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹" #: src/settings_translation_file.cpp msgid "Mapgen v7" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" +msgstr "Генератар мапы 7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" +msgid "Mapgen v7 specific flags" +msgstr "Генератар мапы 7: ÑÐ¿ÐµÑ†Ñ‹Ñ„Ñ–Ñ‡Ð½Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹" #: src/settings_translation_file.cpp msgid "Massive cave depth" -msgstr "" +msgstr "Ð“Ð»Ñ‹Ð±Ñ–Ð½Ñ Ð¼Ð°Ñіўнай пÑчоры" #: src/settings_translation_file.cpp msgid "Massive cave noise" -msgstr "" +msgstr "Шум маÑіўнай пÑчоры" #: src/settings_translation_file.cpp msgid "Massive caves form here." -msgstr "" +msgstr "МаÑÑ–ÑžÐ½Ñ‹Ñ Ð¿Ñчоры ўтвараюцца тут." #: src/settings_translation_file.cpp msgid "Max block generate distance" -msgstr "" +msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ñ‹ÑÑ‚Ð°Ð½Ñ†Ñ‹Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ‹Ñ– блокаў" #: src/settings_translation_file.cpp msgid "Max block send distance" -msgstr "" +msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ñ‹ÑÑ‚Ð°Ð½Ñ†Ñ‹Ñ Ð°Ð´Ð¿Ñ€Ð°ÑžÐ»ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÐ°Ñž" #: src/settings_translation_file.cpp msgid "Max liquids processed per step." -msgstr "" +msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць вадкаÑці, ÑÐºÐ°Ñ Ð°Ð¿Ñ€Ð°Ñ†Ð¾ÑžÐ²Ð°ÐµÑ†Ñ†Ð° за крок." #: src/settings_translation_file.cpp msgid "Max. clearobjects extra blocks" -msgstr "" +msgstr "МакÑімум дадатковых блокаў clearobjects" #: src/settings_translation_file.cpp msgid "Max. packets per iteration" -msgstr "" +msgstr "МакÑімум пакетаў на Ñ–Ñ‚Ñрацыю" #: src/settings_translation_file.cpp msgid "Maximum FPS" -msgstr "" +msgstr "МакÑімальны FPS (кадраў у Ñекунду)" #: src/settings_translation_file.cpp msgid "Maximum FPS when game is paused." -msgstr "" +msgstr "МакÑімальны FPS, калі Ð³ÑƒÐ»ÑŒÐ½Ñ Ð¿Ñ€Ñ‹Ð¿Ñ‹Ð½ÐµÐ½Ð°." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" -msgstr "" +msgstr "МакÑімум блокаў, ÑÐºÑ–Ñ Ð°Ð±Ð°Ð²Ñзкова загружаюцца" #: src/settings_translation_file.cpp msgid "Maximum hotbar width" -msgstr "" +msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÑ‹Ñ€Ñ‹Ð½Ñ Ñ…ÑƒÑ‚ÐºÐ°Ð¹ панÑлі" #: src/settings_translation_file.cpp msgid "Maximum number of blocks that are simultaneously sent in total." msgstr "" +"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць блокаў, ÑÐºÑ–Ñ Ð¼Ð¾Ð³ÑƒÑ†ÑŒ адпраўлены адначаÑова, у цÑлым." #: src/settings_translation_file.cpp msgid "Maximum number of blocks that are simultaneously sent per client." msgstr "" +"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць блокаў, ÑÐºÑ–Ñ Ð¼Ð¾Ð³ÑƒÑ†ÑŒ адпраўлены адначаÑова, на аднаго " +"кліента." #: src/settings_translation_file.cpp msgid "Maximum number of blocks that can be queued for loading." msgstr "" +"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць блокаў, ÑÐºÑ–Ñ Ð¼Ð¾Ð³ÑƒÑ†ÑŒ паÑтаўлены Ñž чаргу на загрузку." #: src/settings_translation_file.cpp msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "Set to blank for an appropriate amount to be chosen automatically." msgstr "" +"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць блокаў, ÑÐºÑ–Ñ Ð¼Ð¾Ð³ÑƒÑ†ÑŒ паÑтаўлены Ñž чаргу на генерацыю.\n" +"Задайце пуÑтое значÑнне Ð´Ð»Ñ Ð°ÑžÑ‚Ð°Ð¼Ð°Ñ‚Ñ‹Ñ‡Ð½Ð°Ð³Ð° выбару адпаведнай колькаÑці." #: src/settings_translation_file.cpp msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "Set to blank for an appropriate amount to be chosen automatically." msgstr "" +"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць блокаў, ÑÐºÑ–Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ паÑтаўлены Ñž чаргу на загрузку з " +"файла.\n" +"Задайце пуÑтое значÑнне Ð´Ð»Ñ Ð°ÑžÑ‚Ð°Ð¼Ð°Ñ‚Ñ‹Ñ‡Ð½Ð°Ð³Ð° выбару адпаведнай колькаÑці." #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." -msgstr "" +msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць блокаў мапы, ÑÐºÑ–Ñ Ð°Ð±Ð°Ð²Ñзкова загружаюцца." #: src/settings_translation_file.cpp msgid "" "Maximum number of mapblocks for client to be kept in memory.\n" "Set to -1 for unlimited amount." msgstr "" +"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць блокаў мапы Ð´Ð»Ñ ÐºÐ»Ñ–ÐµÐ½Ñ‚Ð°, ÑÐºÑ–Ñ Ð·Ð°Ñтануцца Ñž памÑці.\n" +"ЗначÑнне -1 Ð´Ð»Ñ Ð½ÐµÐ°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð°Ð¹ колькаÑці." #: src/settings_translation_file.cpp msgid "" @@ -3180,126 +3898,154 @@ msgid "" "try reducing it, but don't reduce it to a number below double of targeted\n" "client number." msgstr "" +"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць пакетаў, ÑÐºÑ–Ñ Ð°Ð´Ð¿Ñ€Ð°ÑžÐ»Ñюцца за крок адпраўкі.\n" +"Калі вы маеце маруднае злучÑнне, паÑпрабуйце зменшыць гÑта, але не " +"змÑншайце\n" +"ніжÑй за двайную колькаÑць кліентаў." #: src/settings_translation_file.cpp msgid "Maximum number of players that can connect simultaneously." -msgstr "" +msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць гульцоў, ÑÐºÑ–Ñ Ð¼Ð¾Ð³ÑƒÑ†ÑŒ адначаÑова гулÑць." #: src/settings_translation_file.cpp msgid "Maximum number of statically stored objects in a block." -msgstr "" +msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць Ñтатычна захаваных аб'ектаў у блоку." #: src/settings_translation_file.cpp msgid "Maximum objects per block" -msgstr "" +msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць аб'ектаў у блоку" #: src/settings_translation_file.cpp msgid "" "Maximum proportion of current window to be used for hotbar.\n" "Useful if there's something to be displayed right or left of hotbar." msgstr "" +"МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¾Ð»Ñ Ð³Ñтага вакна, ÑÐºÐ°Ñ Ð±ÑƒÐ´Ð·Ðµ выкарыÑтоўвацца Ð´Ð»Ñ Ñ…ÑƒÑ‚ÐºÐ°Ð¹ " +"панÑлі.\n" +"КарыÑна, калі Ñ‘Ñць што-небудзь, што будзе паказвацца Ñправа ці злева панÑлі." #: src/settings_translation_file.cpp msgid "Maximum simultaneous block sends per client" -msgstr "" +msgstr "МакÑімум адначаÑовай адпраўкі блокаў на кліента" #: src/settings_translation_file.cpp msgid "Maximum simultaneous block sends total" -msgstr "" +msgstr "МакÑімум адначаÑовай адпраўкі блокаў у цÑлым" #: src/settings_translation_file.cpp msgid "Maximum time in ms a file download (e.g. a mod download) may take." msgstr "" +"МакÑімальны Ñ‡Ð°Ñ Ñƒ міліÑекундах, Ñкі можа занÑць Ñпампоўка файла\n" +"(напрыклад Ñпампоўка моду)." #: src/settings_translation_file.cpp msgid "Maximum users" -msgstr "" +msgstr "МакÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць карыÑтальнікаў" #: src/settings_translation_file.cpp msgid "Menus" -msgstr "" +msgstr "Меню" #: src/settings_translation_file.cpp msgid "Mesh cache" -msgstr "" +msgstr "КÑш мÑша" #: src/settings_translation_file.cpp msgid "Message of the day" -msgstr "" +msgstr "Паведамленне днÑ" #: src/settings_translation_file.cpp msgid "Message of the day displayed to players connecting." -msgstr "" +msgstr "Паведамленне, Ñкое паказваецца Ð´Ð»Ñ Ð³ÑƒÐ»ÑŒÑ†Ð¾Ñž, ÑÐºÑ–Ñ Ð¿Ð°Ð´Ð»ÑƒÑ‡Ð°ÑŽÑ†Ñ†Ð°." #: src/settings_translation_file.cpp msgid "Method used to highlight selected object." -msgstr "" +msgstr "Метад, Ñкі выкарыÑтоўваецца Ð´Ð»Ñ Ð°ÑвÑÑ‚Ð»ÐµÐ½Ð½Ñ Ð°Ð±Ñ€Ð°Ð½Ð°Ð³Ð° аб'екта." #: src/settings_translation_file.cpp msgid "Minimap" -msgstr "" +msgstr "Мінімапа" #: src/settings_translation_file.cpp msgid "Minimap key" -msgstr "" +msgstr "Клавіша мінімапы" #: src/settings_translation_file.cpp msgid "Minimap scan height" -msgstr "" +msgstr "Ð’Ñ‹ÑˆÑ‹Ð½Ñ Ñкану мінімапы" #: src/settings_translation_file.cpp msgid "Minimum texture size for filters" -msgstr "" +msgstr "Мінімальны памер Ñ‚ÑкÑтуры Ð´Ð»Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°Ñž" #: src/settings_translation_file.cpp msgid "Mipmapping" -msgstr "" +msgstr "MIP-Ñ‚ÑкÑтураванне" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "ЗмÑнÑе памер Ñлеметаў панÑлі HUD." #: src/settings_translation_file.cpp msgid "Modstore details URL" -msgstr "" +msgstr "URL дÑталізацыі модаў Ñž краме" #: src/settings_translation_file.cpp msgid "Modstore download URL" -msgstr "" +msgstr "URL Ñпампоўкі модаў Ñž краме" #: src/settings_translation_file.cpp msgid "Modstore mods list URL" -msgstr "" +msgstr "URL ÑпіÑу модаў Ñž краме" #: src/settings_translation_file.cpp msgid "Monospace font path" -msgstr "" +msgstr "Роўнашырокі шрыфт" #: src/settings_translation_file.cpp msgid "Monospace font size" -msgstr "" +msgstr "Памер роўнашырокага шрыфту" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "Шум вышыні гор" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "Шум гор" #: src/settings_translation_file.cpp msgid "Mouse sensitivity" -msgstr "" +msgstr "ÐдчувальнаÑць мышы" #: src/settings_translation_file.cpp msgid "Mouse sensitivity multiplier." -msgstr "" +msgstr "Множнік адчувальнаÑці мышы." + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "Шум бруду" #: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" +"Множнік ÐºÐ°Ð»Ñ‹Ñ…Ð°Ð½Ð½Ñ Ð¿Ñ€Ñ‹ падзенні.\n" +"Ðапрыклад: 0 — нÑма, 1.0 — звычайнае, 2.0 — падвойнае." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" +msgid "Mute key" +msgstr "Кнопка прыглушÑннÑ" #: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." msgstr "" +"Ðазва генератара мапы, Ñкі будзе выкарыÑтоўвацца пры ÑтварÑнні новага " +"Ñвету.\n" +"ГÑта можна пераазначыць пры ÑтварÑнні Ñвету Ñž галоўным меню." #: src/settings_translation_file.cpp msgid "" @@ -3307,61 +4053,65 @@ msgid "" "When running a server, clients connecting with this name are admins.\n" "When starting from the main menu, this is overridden." msgstr "" +"Ð†Ð¼Ñ Ð³ÑƒÐ»ÑŒÑ†Ð°.\n" +"Пры запуÑку Ñервера, кліенты, ÑÐºÑ–Ñ Ð¿Ð°Ð´Ð»ÑƒÑ‡Ð°ÑŽÑ†Ñ†Ð° з гÑтым імем, " +"адмініÑтратары.\n" +"ГÑта можна пераазначыць пры Ñтарце Ñž галоўным меню." #: src/settings_translation_file.cpp msgid "" "Name of the server, to be displayed when players join and in the serverlist." msgstr "" +"Ðазва Ñервера, ÑÐºÐ°Ñ Ð±ÑƒÐ´Ð·Ðµ паказана, калі гульцы злучаюцца, Ñ– Ñž ÑпіÑе " +"Ñервераў." #: src/settings_translation_file.cpp msgid "Network" -msgstr "" +msgstr "Сетка" #: src/settings_translation_file.cpp msgid "" "Network port to listen (UDP).\n" "This value will be overridden when starting from the main menu." msgstr "" +"Сеткавы порт Ð´Ð»Ñ Ð¿Ñ€Ð°ÑÐ»ÑƒÑ…Ð¾ÑžÐ²Ð°Ð½Ð½Ñ (UDP).\n" +"ГÑта значÑнне можна пераазначыць пры запуÑку Ñž галоўным меню." #: src/settings_translation_file.cpp msgid "New users need to input this password." -msgstr "" +msgstr "ÐÐ¾Ð²Ñ‹Ñ ÐºÐ°Ñ€Ñ‹Ñтальнікі павінны ўвеÑці гÑты пароль." #: src/settings_translation_file.cpp msgid "Noclip" -msgstr "" +msgstr "Без ÑутыкненнÑÑž" #: src/settings_translation_file.cpp msgid "Noclip key" -msgstr "" +msgstr "Клавіша noclip" #: src/settings_translation_file.cpp msgid "Node highlighting" -msgstr "" +msgstr "ПадÑвÑтленне вузла" #: src/settings_translation_file.cpp msgid "NodeTimer interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" +msgstr "ІнтÑрвал NodeTimer" #: src/settings_translation_file.cpp msgid "Noises" -msgstr "" +msgstr "Шумы" #: src/settings_translation_file.cpp msgid "Normalmaps sampling" -msgstr "" +msgstr "ДыÑкрÑÑ‚Ñ‹Ð·Ð°Ñ†Ñ‹Ñ Ð¼Ð°Ð¿Ñ‹ нармалÑÑž" #: src/settings_translation_file.cpp msgid "Normalmaps strength" -msgstr "" +msgstr "Сіла мапы нармалÑÑž" #: src/settings_translation_file.cpp msgid "Number of emerge threads" -msgstr "" +msgstr "КолькаÑць вытворчых патокаў" #: src/settings_translation_file.cpp msgid "" @@ -3371,6 +4121,12 @@ msgid "" "speed greatly\n" "at the cost of slightly buggy caves." msgstr "" +"КолькаÑць патокаў, ÑÐºÑ–Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹Ñтоўваюцца Ð´Ð»Ñ Ð²Ñ‹Ñ‚Ð²Ð¾Ñ€Ñ‡Ð°Ñці.\n" +"Пакіньце пуÑтым або павÑлічце гÑта значÑнне Ð´Ð»Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹ÑÑ‚Ð°Ð½Ð½Ñ Ð½ÐµÐºÐ°Ð»ÑŒÐºÑ–Ñ… " +"патокаў.\n" +"Ðа мультыпрацÑÑарных ÑÑ–ÑÑ‚Ñмах гÑта значна палепшыць хуткаÑць генерацыі " +"мапы,\n" +"але за кошт злёгку памылковых пÑчор." #: src/settings_translation_file.cpp msgid "" @@ -3378,108 +4134,137 @@ msgid "" "This is a trade-off between sqlite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" +"КолькаÑць дадатковых блокаў, ÑÐºÑ–Ñ Ð¼Ð¾Ð³ÑƒÑ†ÑŒ загружаны за раз камандай /" +"clearobjects.\n" +"ГÑта ÐºÐ°Ð¼Ð¿Ñ€Ð°Ð¼Ñ–Ñ Ð¿Ð°Ð¼Ñ–Ð¶ накладнымі выдаткамі на транзакцыю sqlite\n" +"Ñ– Ñпажываннем памÑці (4096 = 100 МБ, Ñк правіла)." #: src/settings_translation_file.cpp msgid "Number of parallax occlusion iterations." -msgstr "" +msgstr "КолькаÑць Ñ–Ñ‚Ñрацый паралакÑнай аклюзіі." + +#: src/settings_translation_file.cpp +msgid "Offset" +msgstr "Зрух" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "ÐепразрыÑÑ‚Ñ‹Ñ Ð²Ð°Ð´ÐºÐ°Ñці" #: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" +msgstr "Ðгульны нахіл Ñфекту паралакÑнай аклюзіі. Звычайна маштаб/2." #: src/settings_translation_file.cpp msgid "Overall scale of parallax occlusion effect." -msgstr "" +msgstr "Ðгульны маштаб Ñфекту паралакÑнай аклюзіі." #: src/settings_translation_file.cpp msgid "Parallax occlusion" -msgstr "" +msgstr "ПаралакÑÐ½Ð°Ñ Ð°ÐºÐ»ÑŽÐ·Ñ–Ñ" #: src/settings_translation_file.cpp msgid "Parallax occlusion Scale" -msgstr "" +msgstr "Маштаб паралакÑнай аклюзіі" #: src/settings_translation_file.cpp msgid "Parallax occlusion bias" -msgstr "" +msgstr "Ðахіл паралакÑнай аклюзіі" #: src/settings_translation_file.cpp msgid "Parallax occlusion iterations" -msgstr "" +msgstr "ІтÑрацыі паралакÑнай аклюзіі" #: src/settings_translation_file.cpp msgid "Parallax occlusion mode" -msgstr "" +msgstr "Ð Ñжым паралакÑнай аклюзіі" #: src/settings_translation_file.cpp msgid "Parallax occlusion strength" -msgstr "" +msgstr "ІнтÑнÑіўнаÑць паралакÑнай аклюзіі" #: src/settings_translation_file.cpp msgid "Path to TrueTypeFont or bitmap." -msgstr "" +msgstr "ШлÑÑ… да TrueTypeFont ці раÑтравага шрыфту." #: src/settings_translation_file.cpp msgid "Path to save screenshots at." +msgstr "Каталог Ð´Ð»Ñ Ð·Ð°Ñ…Ð¾ÑžÐ²Ð°Ñ†ÑŒ здымкаў Ñкрана." + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." msgstr "" +"ШлÑÑ… да каталога з шÑйдÑрамі. Калі не зададзены, то будзе выкарыÑтоўвацца " +"агаданы шлÑÑ…." #: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." -msgstr "" +msgstr "ШлÑÑ… да каталога Ñ‚ÑкÑтур. УÑе Ñ‚ÑкÑтуры Ñž першую чаргу шукаюцца тут." #: src/settings_translation_file.cpp msgid "Physics" -msgstr "" +msgstr "Фізіка" #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" "This requires the \"fly\" privilege on the server." msgstr "" +"Гулец можа лётаць без ўплыву дзеÑÐ½Ð½Ñ Ñілы цÑжару.\n" +"Ðеабходна Ð¿Ñ€Ñ‹Ð²Ñ–Ð»ÐµÑ Â«noclip» на Ñерверы." #: src/settings_translation_file.cpp msgid "Player name" -msgstr "" +msgstr "Ð†Ð¼Ñ Ð³ÑƒÐ»ÑŒÑ†Ð°" #: src/settings_translation_file.cpp msgid "Player transfer distance" -msgstr "" +msgstr "ДыÑÑ‚Ð°Ð½Ñ†Ñ‹Ñ Ð¿ÐµÑ€Ð°Ð´Ð°Ñ‡Ñ‹ дадзеных гульца" #: src/settings_translation_file.cpp msgid "Player versus Player" -msgstr "" +msgstr "Гулец Ñупраць гульца" #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" "Note that the port field in the main menu overrides this setting." msgstr "" +"Порт Ð´Ð»Ñ Ð·Ð»ÑƒÑ‡ÑÐ½Ð½Ñ (UDP).\n" +"Майце на ўвазе, што поле порта Ñž галоўным меню пераазначае гÑтую наладу." #: src/settings_translation_file.cpp msgid "Prevent mods from doing insecure things like running shell commands." msgstr "" +"Прадухіліць моды ад Ñпроб рабіць небÑÑÐ¿ÐµÑ‡Ð½Ñ‹Ñ Ñ€Ñчы, Ñ‚Ð°ÐºÑ–Ñ Ñк выкананне каманд " +"абалонкі." #: src/settings_translation_file.cpp msgid "" "Print the engine's profiling data in regular intervals (in seconds). 0 = " "disable. Useful for developers." msgstr "" +"Друкаваць Ð´Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ Ð¿Ñ€Ð°Ñ„Ñ–Ð»ÑÐ²Ð°Ð½Ð½Ñ Ñ€ÑƒÑ…Ð°Ð²Ñ–ÐºÐ° Ñž Ñ€ÑгулÑÑ€Ð½Ñ‹Ñ Ñ–Ð½Ñ‚Ñрвалы чаÑу (у " +"Ñекундах).\n" +"0 Ð´Ð»Ñ Ð°Ð´ÐºÐ»ÑŽÑ‡ÑннÑ. КарыÑна Ð´Ð»Ñ Ñ€Ð°Ñпрацоўнікаў." #: src/settings_translation_file.cpp msgid "Privileges that players with basic_privs can grant" -msgstr "" +msgstr "Прывілеі, ÑÐºÑ–Ñ Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°ÑŽÑ†ÑŒ гульцы з basic_privs" #: src/settings_translation_file.cpp msgid "Profiler" -msgstr "" +msgstr "Прафілер" #: src/settings_translation_file.cpp msgid "Profiler toggle key" -msgstr "" +msgstr "Клавіша пераключÑÐ½Ð½Ñ Ð¿Ñ€Ð°Ñ„Ñ–Ð»ÐµÑ€Ð°" #: src/settings_translation_file.cpp msgid "Profiling" -msgstr "" +msgstr "ПрафілÑванне" #: src/settings_translation_file.cpp msgid "" @@ -3487,74 +4272,93 @@ msgid "" "Values larger than 26 will start to produce sharp cutoffs at cloud area " "corners." msgstr "" +"Ð Ð°Ð´Ñ‹ÑƒÑ Ð·Ð¾Ð½Ñ‹ воблачнаÑці задаецца Ñк колькаÑці 64 вузлавых воблачных " +"квадратаў.\n" +"ЗначÑнне вышÑй 26 прывÑдзе да Ñ€Ñзкіх адрÑзаў у кутах зоны воблачнаÑці." #: src/settings_translation_file.cpp msgid "Raises terrain to make valleys around the rivers" -msgstr "" +msgstr "Падымае мÑÑцоваÑць, каб зрабіць даліны вакол Ñ€Ñк" #: src/settings_translation_file.cpp msgid "Random input" -msgstr "" +msgstr "Выпадковы ўвод" #: src/settings_translation_file.cpp msgid "Range select key" -msgstr "" +msgstr "Клавіша выбару дыÑпазону" #: src/settings_translation_file.cpp msgid "Remote media" -msgstr "" +msgstr "Ðддаленае медыÑ" #: src/settings_translation_file.cpp msgid "Remote port" -msgstr "" +msgstr "Ðддалены порт" #: src/settings_translation_file.cpp msgid "Replaces the default main menu with a custom one." -msgstr "" +msgstr "ЗмÑнÑе агаданае галоўнае меню на карыÑтальніцкае." #: src/settings_translation_file.cpp msgid "Report path" -msgstr "" +msgstr "ШлÑÑ… да Ñправаздачы" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "Шум хрыбтоў" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "Шум падводных хрыбтоў" #: src/settings_translation_file.cpp msgid "Right key" -msgstr "" +msgstr "Клавіша ўправа" #: src/settings_translation_file.cpp msgid "Rightclick repetition interval" -msgstr "" +msgstr "ІнтÑрвал паўтору правай кнопкі мышы" #: src/settings_translation_file.cpp msgid "River Depth" -msgstr "" +msgstr "Ð“Ð»Ñ‹Ð±Ñ–Ð½Ñ Ñ€Ð°ÐºÑ–" #: src/settings_translation_file.cpp msgid "River Noise" -msgstr "" +msgstr "Шум ракі" #: src/settings_translation_file.cpp msgid "River Size" -msgstr "" +msgstr "Памер ракі" #: src/settings_translation_file.cpp msgid "River noise -- rivers occur close to zero" -msgstr "" +msgstr "Шум ракі. Ð Ñкі размешчаны блізка да нулÑ" #: src/settings_translation_file.cpp msgid "Rollback recording" -msgstr "" +msgstr "Ð—Ð°Ð¿Ñ–Ñ Ð°Ð´ÐºÐ°Ñ‚Ñƒ" #: src/settings_translation_file.cpp msgid "Round minimap" -msgstr "" +msgstr "ÐšÑ€ÑƒÐ³Ð»Ð°Ñ Ð¼Ñ–Ð½Ñ–Ð¼Ð°Ð¿Ð°" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "ПÑÑÑ‡Ð°Ð½Ñ‹Ñ Ð¿Ð»Ð°Ð¶Ñ‹ з'ÑўлÑюцца, калі np_beach перавышае гÑта значÑнне." #: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." -msgstr "" +msgstr "Захоўваць мапу, атрыманай кліентам, на дыÑк." #: src/settings_translation_file.cpp msgid "Saving map received from server" -msgstr "" +msgstr "Захаванне мапы, атрыманай з Ñервера" + +#: src/settings_translation_file.cpp +msgid "Scale" +msgstr "Маштаб" #: src/settings_translation_file.cpp msgid "" @@ -3564,30 +4368,35 @@ msgid "" "pixels when scaling down, at the cost of blurring some\n" "edge pixels when images are scaled by non-integer sizes." msgstr "" +"Маштабаваць графічны інтÑÑ€Ñ„ÐµÐ¹Ñ Ð´Ð° зададзенага значÑннÑ.\n" +"ВыкарыÑтоўвае фільтр бліжÑйшых ÑуÑедзÑÑž Ñа згладжваннем.\n" +"ГÑта дазволіць згладзіць Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ Ð³Ñ€ÑƒÐ±Ñ‹Ñ ÐºÑ€Ð°Ñ–, Ñ– змÑшаць пікÑелі\n" +"пры маштабаванні ўніз, за кошт Ñ€Ð°Ð·Ð¼Ñ‹Ñ†Ñ†Ñ Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ… краÑвых пікÑелÑÑž,\n" +"калі выÑва маштабуецца да не цÑлых памераў." #: src/settings_translation_file.cpp msgid "Screen height" -msgstr "" +msgstr "Ð’Ñ‹ÑˆÑ‹Ð½Ñ Ñкрана" #: src/settings_translation_file.cpp msgid "Screen width" -msgstr "" +msgstr "Ð¨Ñ‹Ñ€Ñ‹Ð½Ñ Ñкрана" #: src/settings_translation_file.cpp msgid "Screenshot" -msgstr "" +msgstr "Здымак Ñкрана" #: src/settings_translation_file.cpp msgid "Screenshot folder" -msgstr "" +msgstr "Каталог Ð´Ð»Ñ Ð·Ð´Ñ‹Ð¼ÐºÐ°Ñž Ñкрана" #: src/settings_translation_file.cpp msgid "Screenshot format" -msgstr "" +msgstr "Фармат здымкаў Ñкрана" #: src/settings_translation_file.cpp msgid "Screenshot quality" -msgstr "" +msgstr "ЯкаÑць здымкаў Ñкрана" #: src/settings_translation_file.cpp msgid "" @@ -3595,141 +4404,203 @@ msgid "" "1 means worst quality; 100 means best quality.\n" "Use 0 for default quality." msgstr "" +"ЯкаÑць здымкаў Ñкрана выкарыÑтоўваецца толькі Ð´Ð»Ñ Ñ„Ð°Ñ€Ð¼Ð°Ñ‚Ñƒ JPEG.\n" +"1 азначае найгоршую ÑкаÑць, а 100 — найлепшую.\n" +"ВыкарыÑтоўвайце 0 Ð´Ð»Ñ Ð°Ð³Ð°Ð´Ð°Ð½Ð°Ð¹ ÑкаÑці." + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "Шум марÑкога дна" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "Другі з двух 3D-шумоў, што разам вызначаюць тунелі." #: src/settings_translation_file.cpp msgid "Security" -msgstr "" +msgstr "БÑÑпека" #: src/settings_translation_file.cpp msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous" -msgstr "" +msgstr "ГлÑдзі http://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp msgid "Selection box border color (R,G,B)." -msgstr "" +msgstr "Колер рамкі воблаÑці выбару (R,G,B)." #: src/settings_translation_file.cpp msgid "Selection box color" -msgstr "" +msgstr "Колер воблаÑці выбару" #: src/settings_translation_file.cpp msgid "Selection box width" -msgstr "" +msgstr "Ð¨Ñ‹Ñ€Ñ‹Ð½Ñ Ð²Ð¾Ð±Ð»Ð°Ñці выбару" #: src/settings_translation_file.cpp msgid "Server / Singleplayer" -msgstr "" +msgstr "Сервер / Ð¡Ð°Ð¼Ð¾Ñ‚Ð½Ð°Ñ Ð³ÑƒÐ»ÑŒÐ½Ñ" #: src/settings_translation_file.cpp msgid "Server URL" -msgstr "" +msgstr "URL Ñервера" #: src/settings_translation_file.cpp msgid "Server address" -msgstr "" +msgstr "ÐÐ´Ñ€Ð°Ñ Ñервера" #: src/settings_translation_file.cpp msgid "Server description" -msgstr "" +msgstr "ÐпіÑанне Ñервера" #: src/settings_translation_file.cpp msgid "Server name" -msgstr "" +msgstr "Ðазва Ñервера" #: src/settings_translation_file.cpp msgid "Server port" -msgstr "" +msgstr "Порт Ñервера" + +#: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "ÐдÑÑчÑнне аклюзіі на баку Ñервера" #: src/settings_translation_file.cpp msgid "Serverlist URL" -msgstr "" +msgstr "URL ÑпіÑа Ñервераў" #: src/settings_translation_file.cpp msgid "Serverlist file" -msgstr "" +msgstr "Файл ÑпіÑу Ñервераў" #: src/settings_translation_file.cpp msgid "" "Set the language. Leave empty to use the system language.\n" "A restart is required after changing this." msgstr "" +"УÑтавіць мову. Пакіньце пуÑтым, каб ÑкарыÑтаць мову ÑÑ–ÑÑ‚Ñмы.\n" +"Ðеабходны перазапуÑк паÑÐ»Ñ Ð·Ð¼ÐµÐ½Ñ‹ мовы." #: src/settings_translation_file.cpp msgid "" "Set to true enables waving leaves.\n" "Requires shaders to be enabled." msgstr "" +"Уключае трапÑтанне ліÑцÑ.\n" +"Патрабуе шÑйдÑры." #: src/settings_translation_file.cpp msgid "" "Set to true enables waving plants.\n" "Requires shaders to be enabled." msgstr "" +"Уключае трапÑтанне раÑлін.\n" +"Патрабуе шÑйдÑры." #: src/settings_translation_file.cpp msgid "" "Set to true enables waving water.\n" "Requires shaders to be enabled." msgstr "" +"Уключае хвалÑванне вады.\n" +"Патрабуе шÑйдÑры." + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "ШлÑÑ… да шÑйдÑраў" #: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" +"ШÑйдÑры дазвалÑюць атрымаць Ð¿Ð°Ð»ÐµÐ¿ÑˆÐ°Ð½Ñ‹Ñ Ð²Ñ–Ð·ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ Ñфекты Ñ– могуць павÑлічыць " +"прадукцыйнаÑць на некаторых відÑакартах.\n" +"Яны працуюць толькі з OpenGL." + +#: src/settings_translation_file.cpp +msgid "Shadow limit" +msgstr "МÑжа ценю" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." -msgstr "" +msgstr "Форма мінімапы. Уключана — круг, выключана — квадрат." #: src/settings_translation_file.cpp msgid "Show debug info" -msgstr "" +msgstr "Паказаць звеÑткі адладкі" #: src/settings_translation_file.cpp msgid "Show entity selection boxes" -msgstr "" +msgstr "Паказаць воблаÑць выбару аб'екта" #: src/settings_translation_file.cpp msgid "Shutdown message" -msgstr "" +msgstr "Паведамленне пры выключÑнні" #: src/settings_translation_file.cpp msgid "" "Size of chunks to be generated at once by mapgen, stated in mapblocks (16 " "nodes)." msgstr "" +"Памер кавалка, Ñкі будзе згенераваны за раз, зададзены у блоках мапы (16 " +"вузлоў)." #: src/settings_translation_file.cpp -msgid "Slope and fill work together to modify the heights" +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." msgstr "" +"Памер кÑшу блокаў у генератары Ñетак. ПавелічÑнне гÑтага значÑннÑ\n" +"павÑлічыць адÑотак пападаннÑÑž у кÑш, змешыць капіÑванне даных\n" +"з галоўнага патоку гульні, тым Ñамым змешыць дрыжанне." + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "W-чаÑтка" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights" +msgstr "Ðахіл Ñ– заліўка працуюць разам, каб змÑніць вышыню" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "ÐевÑÐ»Ñ–ÐºÑ–Ñ Ð²Ð°Ñ€Ñ‹Ð°Ñ†Ñ‹Ñ– вільготнаÑці Ð´Ð»Ñ Ð·Ð¼ÐµÑˆÐ²Ð°Ð½Ð½Ñ Ð±Ñ–Ñ‘Ð¼Ð°Ñž на межах." + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "ÐевÑÐ»Ñ–ÐºÑ–Ñ Ð²Ð°Ñ€Ñ‹Ð°Ñ†Ñ‹Ñ– Ñ‚Ñмпературы Ð´Ð»Ñ Ð·Ð¼ÐµÑˆÐ²Ð°Ð½Ð½Ñ Ð±Ñ–Ñ‘Ð¼Ð°Ñž на межах." #: src/settings_translation_file.cpp msgid "Smooth lighting" -msgstr "" +msgstr "МÑккае аÑвÑтленне" #: src/settings_translation_file.cpp msgid "" "Smooths camera when looking around. Also called look or mouse smoothing.\n" "Useful for recording videos." msgstr "" +"Згладжвае камеру пры аглÑдзе наўкол. ТакÑама завецца Ñк згладжванне выглÑду " +"або мышы.\n" +"КарыÑна Ð´Ð»Ñ Ð·Ð°Ð¿Ñ–Ñу відÑа." #: src/settings_translation_file.cpp msgid "Smooths rotation of camera in cinematic mode. 0 to disable." msgstr "" +"Згладжвае кручÑнне камеры Ñž кінематаграфічным Ñ€Ñжыме. 0 Ð´Ð»Ñ Ð°Ð´ÐºÐ»ÑŽÑ‡ÑннÑ." #: src/settings_translation_file.cpp msgid "Smooths rotation of camera. 0 to disable." -msgstr "" +msgstr "Згладжвае кручÑнне камеры. 0 Ð´Ð»Ñ Ð°Ð´ÐºÐ»ÑŽÑ‡ÑннÑ." #: src/settings_translation_file.cpp msgid "Sneak key" -msgstr "" +msgstr "Клавіша валачÑннÑ" #: src/settings_translation_file.cpp msgid "Sound" -msgstr "" +msgstr "Гук" #: src/settings_translation_file.cpp msgid "" @@ -3738,34 +4609,66 @@ msgid "" "(obviously, remote_media should end with a slash).\n" "Files that are not present will be fetched the usual way." msgstr "" +"Вызначае URL, з Ñкога кліент атрымоўвае Ð¼ÐµÐ´Ñ‹Ñ Ð·Ð°Ð¼ÐµÑÑ‚ выкарыÑÑ‚Ð°Ð½Ð½Ñ UDP.\n" +"$filename павінна быць даÑтупна з $remote_media$filename праз cURL\n" +"(відавочна, што remote_media павінна заканчвацца каÑой рыÑкай).\n" +"ÐедаÑÑÐ¶Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹ будуць Ñпампаваны звычайным чынам." #: src/settings_translation_file.cpp msgid "Static spawnpoint" -msgstr "" +msgstr "Ð¡Ñ‚Ð°Ñ‚Ñ‹Ñ‡Ð½Ð°Ñ ÐºÑ€Ð¾Ð¿ÐºÐ° нараджÑннÑ" + +#: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "Паведамленне Ñтану пры злучÑнні" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "Шум крутаÑці" #: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." -msgstr "" +msgstr "Сіла згенераваных мапаў нармалÑÑž." #: src/settings_translation_file.cpp msgid "Strength of parallax." -msgstr "" +msgstr "Сіла паралакÑа." #: src/settings_translation_file.cpp msgid "Strict protocol checking" -msgstr "" +msgstr "Ð¡Ñ‚Ñ€Ð¾Ð³Ð°Ñ Ð¿Ñ€Ð°Ð²ÐµÑ€ÐºÐ° пратакола" #: src/settings_translation_file.cpp msgid "Support older servers" -msgstr "" +msgstr "Падтрымка Ñтарых Ñервераў" #: src/settings_translation_file.cpp msgid "Synchronous SQLite" -msgstr "" +msgstr "Сінхронны SQLite" + +#: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "ВарыÑÑ†Ñ‹Ñ Ñ‚Ñмпературы Ñž біёмах." #: src/settings_translation_file.cpp msgid "Terrain Height" -msgstr "" +msgstr "Ð’Ñ‹ÑˆÑ‹Ð½Ñ Ð¼ÑÑцоваÑці" + +#: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "Шум вышыні Ñ€Ñльефу" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "Базавы шум Ñ€Ñльефу" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "Ð’Ñ‹Ñотны шум Ñ€Ñльефу" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "Шум Ñ€Ñльефу" #: src/settings_translation_file.cpp msgid "" @@ -3773,6 +4676,9 @@ msgid "" "Controls proportion of world area covered by hills.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"Парог шуму Ñ€Ñльефу Ð´Ð»Ñ ÑžÐ·Ð³Ð¾Ñ€ÐºÐ°Ñž.\n" +"Ð Ñгулюе прапорцыю плошчы Ñвету, пакрытую ўзгоркамі.\n" +"ЗначÑнне ÐºÐ°Ð»Ñ 0.0 дае большую прапорцыю." #: src/settings_translation_file.cpp msgid "" @@ -3780,50 +4686,64 @@ msgid "" "Controls proportion of world area covered by lakes.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"Парог шуму Ñ€Ñльефу Ð´Ð»Ñ Ð°Ð·Ñ‘Ñ€.\n" +"Ð Ñгулюе прапорцыю плошчы Ñвету, пакрытую азёрамі.\n" +"ЗначÑнне ÐºÐ°Ð»Ñ 0.0 дае большую прапорцыю." + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "Шум уÑтойліваці Ñ€Ñльефу" #: src/settings_translation_file.cpp msgid "Texture path" -msgstr "" +msgstr "ШлÑÑ… да Ñ‚ÑкÑтур" #: src/settings_translation_file.cpp msgid "The altitude at which temperature drops by 20C" -msgstr "" +msgstr "ВышынÑ, пры Ñкой Ñ‚Ñмпература паніжаецца на 20 °C" #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" "when calling `/profiler save [format]` without format." msgstr "" +"Ðгаданы фармат, у Ñкім захоўваюцца профілі,\n" +"пры запуÑку `/profiler save [format]` без фармату." #: src/settings_translation_file.cpp msgid "The depth of dirt or other filler" -msgstr "" +msgstr "Ð“Ð»Ñ‹Ð±Ñ–Ð½Ñ Ð±Ñ€ÑƒÐ´Ñƒ або іншага запаўнÑльніка" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" -msgstr "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "ШлÑÑ… да файла адноÑна каталога Ñвету, у Ñкім будуць захоўвацца профілі." + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "ІдÑнтыфікатар джойÑціка Ð´Ð»Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹ÑтаннÑ" #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." -msgstr "" +msgstr "Сеткавы інтÑрфейÑ, Ñкі праÑлухоўвае Ñервер." #: src/settings_translation_file.cpp msgid "" "The privileges that new users automatically get.\n" "See /privs in game for a full list on your server and mod configuration." msgstr "" +"Прывілеі, ÑÐºÑ–Ñ Ð°Ñ‚Ñ€Ñ‹Ð¼Ð¾ÑžÐ²Ð°ÑŽÑ†ÑŒ Ð½Ð¾Ð²Ñ‹Ñ ÐºÐ°Ñ€Ñ‹Ñтальнікі аўтаматычна.\n" +"ГлÑдзіце /privs у гульні Ð´Ð»Ñ Ð¿Ð¾ÑžÐ½Ð°Ð³Ð° ÑпіÑу Ð´Ð»Ñ Ð²Ð°ÑˆÐ°Ð¹ канфігурацыі." #: src/settings_translation_file.cpp msgid "The rendering back-end for Irrlicht." -msgstr "" +msgstr "Драйвер Ñ€ÑндÑрынга Ð´Ð»Ñ Irrlicht." #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" "ingame view frustum around." -msgstr "" +msgstr "ÐдчувальнаÑць воÑей джойÑціка пры праглÑдзе навокал Ñž гульні." #: src/settings_translation_file.cpp msgid "" @@ -3832,6 +4752,11 @@ msgid "" "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n" "set to the nearest valid value." msgstr "" +"ІнтÑнÑіўнаÑць навакольнага аклюзіўнага зацÑÐ¼Ð½ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ð°.\n" +"ÐÑ–Ð·ÐºÑ–Ñ Ð·Ð½Ð°Ñ‡Ñнні — цёмныÑ, выÑÐ¾ÐºÑ–Ñ â€” ÑветлыÑ.\n" +"ДыÑпазон карÑктных значÑннÑÑž ад 0,25 да 4,0 уключна.\n" +"Калі значÑнне будзе па-за дыÑпазону, то будзе брацца бліжÑйшае карÑктнае " +"значÑнне." #: src/settings_translation_file.cpp msgid "" @@ -3839,44 +4764,58 @@ msgid "" "capacity until an attempt is made to decrease its size by dumping old queue\n" "items. A value of 0 disables the functionality." msgstr "" +"Ð§Ð°Ñ (у Ñекундах), на Ñкі чарга вадкаÑці можа выйÑці за межы,\n" +"пакуль не зроблена Ñпроба зменшыць Ñе памер шлÑхам ÑÐºÑ–Ð´Ð²Ð°Ð½Ð½Ñ Ñтарых " +"Ñлементаў.\n" +"ЗначÑнне 0 адключае гÑтую функцыю." #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" "when holding down a joystick button combination." msgstr "" +"Ð§Ð°Ñ Ñƒ Ñекундах паміж паўторамі падзей пры ўтрыманні камбінацыі кнопак " +"джойÑціка." #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated right clicks when holding the " "right mouse button." msgstr "" +"Ð§Ð°Ñ Ñƒ Ñекундах паміж паўторамі падзей пры ўтрыманні правай кнопкі мышы." + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "Тып джойÑціка" #: src/settings_translation_file.cpp msgid "This font will be used for certain languages." -msgstr "" +msgstr "ГÑты шрыфт будзе выкарыÑтоўваецца Ð´Ð»Ñ Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ… моў." #: src/settings_translation_file.cpp msgid "Time in between active block management cycles" -msgstr "" +msgstr "Ð§Ð°Ñ Ð¿Ð°Ð¼Ñ–Ð¶ цыкламі ÐºÑ–Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ñ‹ÑžÐ½Ñ‹Ð¼Ñ– блокамі (ABM)" #: 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 "" +"Ð§Ð°Ñ Ð¶Ñ‹Ñ†Ñ†Ñ Ð²Ñ‹ÐºÑ–Ð½ÑƒÑ‚Ð°Ð¹ Ñ€Ñчы Ñž Ñекундах.\n" +"Задайце −1 Ð´Ð»Ñ Ð°Ð´ÐºÐ»ÑŽÑ‡ÑÐ½Ð½Ñ Ð³Ñтай аÑабліваÑці." #: src/settings_translation_file.cpp msgid "Time send interval" -msgstr "" +msgstr "ІнтÑрвал адпраўкі чаÑу" #: src/settings_translation_file.cpp msgid "Time speed" -msgstr "" +msgstr "ХуткаÑць чаÑу" #: src/settings_translation_file.cpp msgid "Timeout for client to remove unused map data from memory." msgstr "" +"Таймаут Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ…, ÑÐºÑ–Ñ ÑžÐ¶Ð¾ не выкарыÑтоўваюцца, з памÑці кліента." #: src/settings_translation_file.cpp msgid "" @@ -3885,18 +4824,25 @@ msgid "" "This determines how long they are slowed down after placing or removing a " "node." msgstr "" +"Ð”Ð»Ñ Ð¿Ð°Ð¼ÑншÑÐ½Ð½Ñ Ð·Ð°Ñ‚Ñ€Ñ‹Ð¼ÐºÑ–, перадачы блокаў запаволена, калі гулец будуе " +"нешта.\n" +"ГÑта вызначае, Ñк доўга Ñна запаволіцца паÑÐ»Ñ ÑžÑтаноўкі або Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ð°." #: src/settings_translation_file.cpp msgid "Toggle camera mode key" -msgstr "" +msgstr "Клавіша пераключÑÐ½Ð½Ñ Ñ€Ñжыму камеры" #: src/settings_translation_file.cpp msgid "Tooltip delay" -msgstr "" +msgstr "Затрымка падказкі" + +#: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "Шум дрÑÑž" #: src/settings_translation_file.cpp msgid "Trilinear filtering" -msgstr "" +msgstr "Ð¢Ñ€Ñ‹Ð»Ñ–Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ñ‹Ñ" #: src/settings_translation_file.cpp msgid "" @@ -3904,112 +4850,187 @@ msgid "" "False = 128\n" "Useable to make minimap smoother on slower machines." msgstr "" +"True = 256\n" +"False = 128\n" +"КарыÑна Ð´Ð»Ñ Ð·Ð³Ð»Ð°Ð´Ð¶Ð²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð½Ñ–Ð¼Ð°Ð¿Ñ‹ на павольных машынах." #: src/settings_translation_file.cpp msgid "Trusted mods" +msgstr "Ð”Ð°Ð²ÐµÑ€Ð°Ð½Ñ‹Ñ Ð¼Ð¾Ð´Ñ‹" + +#: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." msgstr "" +"Ð¢Ñ‹Ð¿Ð¾Ð²Ð°Ñ Ð¼Ð°ÐºÑÑ–Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹ÑˆÑ‹Ð½Ñ, вышÑй Ñ– ніжÑй ÑÑÑ€ÑднÑй кропкі, Ñ€Ñльефу выÑпаў, " +"што лÑцÑць." #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "URL ÑпіÑу Ñервераў, Ñкі паказваецца ва ўкладцы ÑумеÑнай гульні." + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "СубдыÑкрÑтызацыÑ" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." msgstr "" +"СубдыÑкрÑÑ‚Ñ‹Ð·Ð°Ñ†Ñ‹Ñ Ð¿Ð°Ð´Ð¾Ð±Ð½Ð°Ñ Ð½Ð° выкарыÑтанне нізкага Ñ€Ð°Ð·Ñ€Ð¾Ð·Ð½ÐµÐ½Ð½Ñ Ñкрана,\n" +"але Ñна прымÑнÑецца толькі да гульнÑвога Ñвету, пакідаючы інтÑÑ€Ñ„ÐµÐ¹Ñ Ð½Ðµ " +"кранутым.\n" +"Яна павінна даць значнае павелічÑнне працаздольнаÑці за кошт менш дÑталёвай " +"выÑвы." #: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" -msgstr "" +msgstr "ÐÐµÐ°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð°Ñ Ð´Ñ‹ÑÑ‚Ð°Ð½Ñ†Ñ‹Ñ Ð¿ÐµÑ€Ð°Ð´Ð°Ñ‡Ñ‹ дадзеных гульца" #: src/settings_translation_file.cpp msgid "Unload unused server data" -msgstr "" +msgstr "Выгрузіць Ð´Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ Ñервера, ÑÐºÑ–Ñ Ð½Ðµ выкарыÑтоўваюцца" #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." -msgstr "" +msgstr "Ðб'Ñ‘Ð¼Ð½Ñ‹Ñ Ð°Ð±Ð»Ð¾ÐºÑ– замеÑÑ‚ плоÑкіх." #: src/settings_translation_file.cpp msgid "Use a cloud animation for the main menu background." -msgstr "" +msgstr "ВыкарыÑтоўваць анімацыю аблокаў Ð´Ð»Ñ Ñ„Ð¾Ð½Ð° галоўнага меню." #: src/settings_translation_file.cpp msgid "Use anisotropic filtering when viewing at textures from an angle." msgstr "" +"ВыкарыÑтоўваць анізатропную фільтрацыю пры поглÑдзе на Ñ‚ÑкÑтуру пад вуглом." #: src/settings_translation_file.cpp msgid "Use bilinear filtering when scaling textures." -msgstr "" +msgstr "ВыкарыÑтоўваць білінейную фільтрацыю пры маштабаванні Ñ‚ÑкÑтур." #: src/settings_translation_file.cpp msgid "Use key" -msgstr "" +msgstr "Клавіша ўжываннÑ" #: src/settings_translation_file.cpp msgid "Use mip mapping to scale textures. May slightly increase performance." msgstr "" +"ВыкарыÑтоўвае MIP-Ñ‚ÑкÑтураванне Ð´Ð»Ñ Ð¼Ð°ÑˆÑ‚Ð°Ð±Ð°Ð²Ð°Ð½Ð½Ñ Ñ‚ÑкÑтур. Можа трохі " +"павÑлічыць прадукцыйнаÑць." #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." -msgstr "" +msgstr "ВыкарыÑтоўваць трылінейную фільтрацыю пры маштабаванні Ñ‚ÑкÑтур." #: src/settings_translation_file.cpp msgid "V-Sync" -msgstr "" +msgstr "Ð’ÐµÑ€Ñ‚Ñ‹ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑінхранізацыÑ" #: src/settings_translation_file.cpp msgid "VBO" -msgstr "" +msgstr "VBO" #: src/settings_translation_file.cpp msgid "Valley Depth" -msgstr "" +msgstr "Узровень даліны" #: src/settings_translation_file.cpp msgid "Valley Fill" -msgstr "" +msgstr "Заліўка даліны" #: src/settings_translation_file.cpp msgid "Valley Profile" -msgstr "" +msgstr "Профіль даліны" #: src/settings_translation_file.cpp msgid "Valley Slope" -msgstr "" +msgstr "Схіл даліны" #: src/settings_translation_file.cpp msgid "Valleys C Flags" -msgstr "" +msgstr "Параметры даліны" #: src/settings_translation_file.cpp -msgid "Vertical screen synchronization." -msgstr "" +msgid "Variation of biome filler depth." +msgstr "ВарыÑÑ†Ñ‹Ñ Ð³Ð»Ñ‹Ð±Ñ–Ð½Ñ– запаўнÑльніка біёму." #: src/settings_translation_file.cpp -msgid "Video driver" +msgid "Variation of hill height and lake depth on floatland smooth terrain." msgstr "" +"ВарыÑÑ†Ñ‹Ñ Ð²Ñ‹ÑˆÑ‹Ð½Ñ– пагоркаў Ñ– глыбінь азёр на гладкай мÑÑцоваÑці выÑпаў, што " +"лÑцÑць." + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "ВарыÑÑ†Ñ‹Ñ Ð¼Ð°ÐºÑімальнай вышыні гор (у вузлах)." + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "ВарыÑÑ†Ñ‹Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñці пÑчор." #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." msgstr "" +"ВарыÑÑ†Ñ‹Ñ Ð²ÐµÑ€Ñ‚Ñ‹ÐºÐ°Ð»ÑŒÐ½Ð°Ð³Ð° Ð¼Ð°ÑˆÑ‚Ð°Ð±Ð°Ð²Ð°Ð½Ð½Ñ Ñ€Ñльефу.\n" +"Ð Ñльеф Ñтановіцца амаль плоÑкім, калі шум менш -0.55." + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "Вар'іруе глыбіню паверхневых вузлоў біёму." #: src/settings_translation_file.cpp msgid "" -"View distance in nodes.\n" -"Min = 20" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." msgstr "" +"Вар'іруе нÑроўнаÑць Ñ€Ñльефу.\n" +"Вызначае значÑнне «persistence» Ð´Ð»Ñ ÑˆÑƒÐ¼Ð¾Ñž terrain_base Ñ– terrain_alt." + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "Кіруе крутаÑцю Ñкал." + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "Ð’ÐµÑ€Ñ‚Ñ‹ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑінхранізацыÑ." + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "ВідÑадрайвер" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "КаÑфіцыент ÐºÐ°Ð»Ñ‹Ñ…Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð³Ð»Ñду" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "ДыÑÑ‚Ð°Ð½Ñ†Ñ‹Ñ Ð¿Ñ€Ð°Ð³Ð»Ñду Ñž вузлах." #: src/settings_translation_file.cpp msgid "View range decrease key" -msgstr "" +msgstr "Клавіша памÑншÑÐ½Ð½Ñ Ð´Ñ‹Ñпазону праглÑду" #: src/settings_translation_file.cpp msgid "View range increase key" -msgstr "" +msgstr "Клавіша павелічÑÐ½Ð½Ñ Ð´Ñ‹Ñпазону праглÑду" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "Кнопка прыбліжннÑ" #: src/settings_translation_file.cpp msgid "Viewing range" -msgstr "" +msgstr "ДыÑпазон праглÑду" #: src/settings_translation_file.cpp msgid "Volume" -msgstr "" +msgstr "ГучнаÑць" #: src/settings_translation_file.cpp msgid "" @@ -4018,50 +5039,54 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" +"Каардыната W згенераванай 3D-чаÑткі 4D-фрактала.\n" +"Вызначае, ÑÐºÐ°Ñ 3D-чаÑтка 4D-формы згенеруецца.\n" +"Ðе дае Ñфекту Ð´Ð»Ñ 3D-фракталаў.\n" +"ДыÑпазон прыкладна ад −2 да 2." #: src/settings_translation_file.cpp msgid "Walking speed" -msgstr "" +msgstr "ХуткаÑць хады" #: src/settings_translation_file.cpp msgid "Water Features" -msgstr "" +msgstr "ÐÑабліваÑці вады" #: src/settings_translation_file.cpp msgid "Water level" -msgstr "" +msgstr "Узровень вады" #: src/settings_translation_file.cpp msgid "Water surface level of the world." -msgstr "" +msgstr "Узровень воднай паверхні Ñвету." #: src/settings_translation_file.cpp msgid "Waving Nodes" -msgstr "" +msgstr "Ð”Ñ€Ñ‹Ð³Ð¾Ñ‚ÐºÑ–Ñ Ð²ÑƒÐ·Ð»Ñ‹" #: src/settings_translation_file.cpp msgid "Waving leaves" -msgstr "" +msgstr "Дрыготкае ліÑце" #: src/settings_translation_file.cpp msgid "Waving plants" -msgstr "" +msgstr "Ð”Ñ€Ñ‹Ð³Ð¾Ñ‚ÐºÑ–Ñ Ñ€Ð°Ñліны" #: src/settings_translation_file.cpp msgid "Waving water" -msgstr "" +msgstr "ХвалÑванне вады" #: src/settings_translation_file.cpp msgid "Waving water height" -msgstr "" +msgstr "Ð’Ñ‹ÑˆÑ‹Ð½Ñ Ñ…Ð²Ð°Ð»Ñ– вады" #: src/settings_translation_file.cpp msgid "Waving water length" -msgstr "" +msgstr "Ð”Ð°ÑžÐ¶Ñ‹Ð½Ñ Ñ…Ð²Ð°Ð»Ñ– вады" #: src/settings_translation_file.cpp msgid "Waving water speed" -msgstr "" +msgstr "ХуткаÑць хвалі вады" #: src/settings_translation_file.cpp msgid "" @@ -4069,6 +5094,9 @@ msgid "" "filtered in software, but some images are generated directly\n" "to hardware (e.g. render-to-texture for nodes in inventory)." msgstr "" +"Пры ўключÑнні gui_scaling_filter уÑе выÑвы графічнага інтÑрфейÑу павінны " +"быць адфільтраваны праграмна, але Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ Ð²Ñ‹Ñвы генеруюцца Ñž апаратуры " +"(напрыклад, Ñ€ÑндÑрынг у Ñ‚ÑкÑтуру Ð´Ð»Ñ Ñлементаў інвентару)." #: src/settings_translation_file.cpp msgid "" @@ -4077,6 +5105,10 @@ msgid "" "to the old scaling method, for video drivers that don't\n" "properly support downloading textures back from hardware." msgstr "" +"Калі gui_scaling_filter_txr2img уключаны, ÑкапіÑваць гÑÑ‚Ñ‹Ñ Ð²Ñ‹Ñвы з апаратуры " +"Ñž праграмнае аÑÑроддзе Ð´Ð»Ñ Ð¼Ð°ÑˆÑ‚Ð°Ð±Ð°Ð²Ð°Ð½Ð½Ñ. Калі не, то адÑтупіць да Ñтарога " +"метаду Ð¼Ð°ÑˆÑ‚Ð°Ð±Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ñадрайвераў, ÑÐºÑ–Ñ Ð½Ðµ падтрымліваюць перадачу " +"Ñ‚ÑкÑтур з апаратуры назад." #: src/settings_translation_file.cpp msgid "" @@ -4088,50 +5120,57 @@ msgid "" "have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" "enabled." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" +"Пры выкарыÑтанні білінейнага, трылінейнага або анізатропнага фільтра,\n" +"Ñ‚ÑкÑтуры малога памеры могуць быць раÑплывіÑтыÑ, таму адбываецца\n" +"аўтаматычнае маштабаванне Ñ–Ñ… з інтÑрпалÑцыÑй па бліжÑйшым ÑуÑедзÑм,\n" +"каб захаваць Ð²Ñ‹Ñ€Ð°Ð·Ð½Ñ‹Ñ Ð¿Ñ–ÐºÑелі.\n" +"ГÑÑ‚Ð°Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ задае мінімальны памер Ð´Ð»Ñ Ð¿Ð°Ð²Ñлічаных Ñ‚ÑкÑтур.\n" +"Пры выÑокіх значÑннÑÑ… выглÑдае больш выразна, але патрабуе больш памÑці.\n" +"Ð Ñкамендуюцца выкарыÑтоўваць Ñтупені 2.\n" +"Заданне гÑтага параметру вышÑй за 1 можа не мець бачнага Ñфекту,\n" +"калі не ўключана білінейнаÑ, Ñ‚Ñ€Ñ‹Ð»Ñ–Ð½ÐµÐ¹Ð½Ð°Ñ Ð°Ð±Ð¾ Ð°Ð½Ñ–Ð·Ð°Ñ‚Ñ€Ð¾Ð¿Ð½Ð°Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ñ‹Ñ." #: src/settings_translation_file.cpp msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" +"Ці выкарыÑтоўваюцца шрыфты FreeType. Патрабуе ÑкампілÑванай падтрымкі " +"FreeType." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." msgstr "" +"Ці павінна быць паміж блокамі мапы дÑÑÑ–Ð½Ñ…Ñ€Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ‹Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ‹Ñ– Ñ‚ÑкÑтур вузлоў." #: src/settings_translation_file.cpp msgid "" "Whether players are shown to clients without any range limit.\n" "Deprecated, use the setting player_transfer_distance instead." msgstr "" +"Ці паказваюцца гульцы кліентам без Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð»Ñ‘ÐºÐ°Ñці.\n" +"СаÑтарÑлы, выкарыÑтоўвайце параметр «player_transfer_distance» змеÑÑ‚." #: src/settings_translation_file.cpp msgid "Whether to allow players to damage and kill each other." -msgstr "" +msgstr "Ці дазвалÑць гульцам прычынÑць шкоду Ñ– забіваць іншых." #: src/settings_translation_file.cpp msgid "" "Whether to ask clients to reconnect after a (Lua) crash.\n" "Set this to true if your server is set up to restart automatically." msgstr "" +"Ці Ñпытаць кліентаў аб перазлучÑнні паÑÐ»Ñ Ð¿Ð°Ð´Ð·ÐµÐ½Ð½Ñ (Lua).\n" +"УÑталюйце гÑта, калі ваш Ñервер наÑтроены на аўтаматычны перазапуÑк." #: src/settings_translation_file.cpp msgid "Whether to fog out the end of the visible area." -msgstr "" +msgstr "Ці затуманены канец зоны бачнаÑці." #: src/settings_translation_file.cpp msgid "" "Whether to show the client debug info (has the same effect as hitting F5)." msgstr "" +"Ці паказаць Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð°Ð´Ð»Ð°Ð´ÐºÑ– кліента (так ж Ñфект, што Ñ– націÑканне F5)." #: src/settings_translation_file.cpp msgid "" @@ -4140,37 +5179,322 @@ msgid "" "Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n" "Disabling this option will protect your password better." msgstr "" +"Ці падтрымліваць ÑÑ‚Ð°Ñ€Ñ‹Ñ Ñерверы з пратаколам да 25.\n" +"Уключыце, калі хочаце злучыцца з Ñерверамі 0.4.12 Ñ– ÑтарÑй.\n" +"Серверы пачынаючы з 0.4.13 будуць працаваць, Ñерверы 0.4.12-dev магчыма " +"будуць.\n" +"ÐдключÑнне гÑтага лепш абароніць ваш пароль." #: src/settings_translation_file.cpp msgid "Width component of the initial window size." -msgstr "" +msgstr "Кампанента шырыні пачатковага памеру вакна." #: src/settings_translation_file.cpp msgid "Width of the selectionbox's lines around nodes." +msgstr "Ð¨Ñ‹Ñ€Ñ‹Ð½Ñ Ð»Ñ–Ð½Ñ–Ð¹ воблаÑці выбару вакол вузлоў." + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." msgstr "" +"Толькі Ð´Ð»Ñ Windows-ÑÑ–ÑÑ‚Ñм: запуÑкае Minetest з акном каманднага радка Ñž фоне." +"\n" +"ЗмÑшчае тую ж інфармацыю, што Ñ– файл debug.txt (Ð°Ð³Ð°Ð´Ð°Ð½Ð°Ñ Ð½Ð°Ð·Ð²Ð°)." #: src/settings_translation_file.cpp msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" +"Каталог Ñвету (уÑÑ‘ Ñž Ñвеце захоўваецца тут).\n" +"Ðе патрабуецца, калі запуÑкаецца з галоўнага меню." #: src/settings_translation_file.cpp msgid "Y of flat ground." -msgstr "" +msgstr "Каардыната Y плоÑкай зÑмлі." #: src/settings_translation_file.cpp msgid "Y of upper limit of large pseudorandom caves." -msgstr "" +msgstr "Каардыната Y верхнÑй мÑжы шырокіх пÑеўдавыпадковых пÑчор." + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "Y-адлеглаÑць, на Ñкой грот пашырыцца да поўнага памеру." + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "Y-узровень ÑÑÑ€ÑднÑй паверхні Ñ€Ñльефу." + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "Y-узровень верхнÑй мÑжы гроту." + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "Y-узровень ÑÑÑ€ÑднÑй кропкі Ñ– паверхні азёр выÑпаў, што лÑцÑць." + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "Y-узровень вышÑйшага (на вÑршыні Ñкалы) Ñ€Ñльефу." + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "Y-узровень нізкага Ñ€Ñльефу Ñ– азёрнага дна." + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "Y-узровень марÑкога дна." + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "Y-узровень, да Ñкога раÑпаўÑюджваюцца цені выÑпаў, што лÑцÑць." + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "Ð°Ð¿Ñ‚Ñ‹Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ñ‹ÑÑ‚Ð°Ð½Ñ†Ñ‹Ñ Ð°Ð´Ð¿Ñ€Ð°ÑžÐ»ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÐ°Ñž" #: src/settings_translation_file.cpp msgid "cURL file download timeout" -msgstr "" +msgstr "Таймаут Ñпампоўкі файла" #: src/settings_translation_file.cpp msgid "cURL parallel limit" -msgstr "" +msgstr "Граніца паралельнаÑці cURL" #: src/settings_translation_file.cpp msgid "cURL timeout" -msgstr "" +msgstr "Таймаут cURL" + +#~ msgid "Hide mp content" +#~ msgstr "Схаваць змеÑÑ‚ пакета модаў" + +#~ msgid "Attn" +#~ msgstr "Увага" + +#~ msgid "Capital" +#~ msgstr "Caps Lock" + +#~ msgid "Comma" +#~ msgstr "КоÑка" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Канец" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Кана" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "МінуÑ" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "ПерыÑд" + +#~ msgid "Plus" +#~ msgstr "ПлюÑ" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Кіруе памерам пуÑтынь Ñ– плÑжаў у генератары мапаў 6.\n" +#~ "Калі параметр «snowbiomes» уключаны, то «mgv6_freq_desert» ігнаруецца." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Вызначае форму мÑÑцоваÑці.\n" +#~ "Тры лікі Ñž дужках кантралююць маштаб Ñ€Ñльефу Ñ– павінны быць аднолькавымі." + +#~ msgid "Mapgen biome heat noise parameters" +#~ msgstr "Генератар мапы: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ цеплыні біёму" + +#~ msgid "Mapgen biome humidity blend noise parameters" +#~ msgstr "Генератар мапы: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ змÑшÑÐ½Ð½Ñ Ð²Ñ–Ð»ÑŒÐ³Ð¾Ñ‚Ð½Ð°Ñці біёма" + +#~ msgid "Mapgen biome humidity noise parameters" +#~ msgstr "Генератар мапы: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ вільготнаÑці біёма" + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Генератар плоÑкай мапы: ÑˆÑ‹Ñ€Ñ‹Ð½Ñ Ð¿Ñчоры" + +#~ msgid "Mapgen flat cave1 noise parameters" +#~ msgstr "Генератар плоÑкай мапы: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ пÑчоры1" + +#~ msgid "Mapgen flat cave2 noise parameters" +#~ msgstr "Генератар плоÑкай мапы: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ пÑчоры2" + +#~ msgid "Mapgen flat filler depth noise parameters" +#~ msgstr "Генератар плоÑкай мапы: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ глыбіні запаўнÑльніка" + +#~ msgid "Mapgen flat large cave depth" +#~ msgstr "Генератар плоÑкай мапы: Ð³Ð»Ñ‹Ð±Ñ–Ð½Ñ Ð²Ñлікай пÑчоры" + +#~ msgid "Mapgen flat terrain noise parameters" +#~ msgstr "Генератар плоÑкай мапы: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ мÑÑцоваÑці" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Генератар фрактальнай мапы: ÑˆÑ‹Ñ€Ñ‹Ð½Ñ Ð¿Ñчор" + +#~ msgid "Mapgen fractal cave1 noise parameters" +#~ msgstr "Генератар фрактальнай мапы: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ пÑчоры1" + +#~ msgid "Mapgen fractal cave2 noise parameters" +#~ msgstr "Генератар фрактальнай мапы: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ пÑчоры2" + +#~ msgid "Mapgen fractal filler depth noise parameters" +#~ msgstr "Генератар фрактальнай мапы: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ глыбіні запаўнÑльніка" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Генератар фрактальнай мапы: фрактал" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Генератар фрактальнай мапы: Ñ–Ñ‚Ñрацыі" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "Генератар фрактальнай мапы: Ð–ÑƒÐ»Ñ–Ñ W" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "Генератар фрактальнай мапы: Ð–ÑƒÐ»Ñ–Ñ X" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "Генератар фрактальнай мапы: Ð–ÑƒÐ»Ñ–Ñ Y" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "Генератар фрактальнай мапы: Ð–ÑƒÐ»Ñ–Ñ Z" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "Генератар фрактальнай мапы: зрух" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Генератар фрактальнай мапы: маштаб" + +#~ msgid "Mapgen fractal seabed noise parameters" +#~ msgstr "Генератар фрактальнай мапы: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ марÑкога дна" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Генератар фрактальнай мапы: плоÑкаÑць W" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Генератар мапы 5: ÑˆÑ‹Ñ€Ñ‹Ð½Ñ Ð¿Ñчор" + +#~ msgid "Mapgen v5 cave1 noise parameters" +#~ msgstr "Генератар мапы 5: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ пÑчоры1" + +#~ msgid "Mapgen v5 cave2 noise parameters" +#~ msgstr "Генератар мапы 5: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ пÑчоры2" + +#~ msgid "Mapgen v5 factor noise parameters" +#~ msgstr "Генератар мапы 5: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ каÑфіцыента" + +#~ msgid "Mapgen v5 filler depth noise parameters" +#~ msgstr "Генератар мапы 5: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ глыбіні запаўнÑльніка" + +#~ msgid "Mapgen v5 height noise parameters" +#~ msgstr "Генератар мапы 5: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ вышыні" + +#~ msgid "Mapgen v6 apple trees noise parameters" +#~ msgstr "Генератар мапы 6: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ Ñблынь" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "Генератар мапы 6: чаÑтата плÑжу" + +#~ msgid "Mapgen v6 beach noise parameters" +#~ msgstr "Генератар мапы 6: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ плÑжу" + +#~ msgid "Mapgen v6 biome noise parameters" +#~ msgstr "Генератар мапы 6: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ біёму" + +#~ msgid "Mapgen v6 cave noise parameters" +#~ msgstr "Генератар мапы 6: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ пÑчоры" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "Генератар мапы 6: чаÑтата пуÑтыні" + +#~ msgid "Mapgen v6 mud noise parameters" +#~ msgstr "Генератар мапы 6: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ бруду" + +#~ msgid "Mapgen v6 steepness noise parameters" +#~ msgstr "Генератар мапы 6: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ крутаÑці" + +#~ msgid "Mapgen v6 terrain altitude noise parameters" +#~ msgstr "Генератар мапы 6: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ вышыні мÑÑцоваÑці" + +#~ msgid "Mapgen v6 terrain base noise parameters" +#~ msgstr "Генератар мапы 6: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ аÑноўнай мÑÑцоваÑці" + +#~ msgid "Mapgen v6 trees noise parameters" +#~ msgstr "Генератар мапы 6: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ дрÑÑž" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Генератар мапы 7: ÑˆÑ‹Ñ€Ñ‹Ð½Ñ Ð¿Ñчор" + +#~ msgid "Mapgen v7 cave1 noise parameters" +#~ msgstr "Генератар мапы 7: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ пÑчоры1" + +#~ msgid "Mapgen v7 cave2 noise parameters" +#~ msgstr "Генератар мапы 7: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ пÑчоры2" + +#~ msgid "Mapgen v7 filler depth noise parameters" +#~ msgstr "Генератар мапы 7: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ глыбіні запаўнÑльніка" + +#~ msgid "Mapgen v7 height select noise parameters" +#~ msgstr "Генератар мапы 7: выÑокаÑÐµÐ»ÐµÐºÑ‚Ñ‹ÑžÐ½Ñ‹Ñ ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹" + +#~ msgid "Mapgen v7 mountain noise parameters" +#~ msgstr "Генератар мапы 7: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ гор" + +#~ msgid "Mapgen v7 ridge noise parameters" +#~ msgstr "Генератар мапы 7: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ хрыбтоў" + +#~ msgid "Mapgen v7 ridge water noise parameters" +#~ msgstr "Генератар мапы 7: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ водных хрыбтоў" + +#~ msgid "Mapgen v7 terrain altitude noise parameters" +#~ msgstr "Генератар мапы 7: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ вышыні мÑÑцоваÑці" + +#~ msgid "Mapgen v7 terrain base noise parameters" +#~ msgstr "Генератар мапы 7: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ аÑноўнай мÑÑцоваÑці" + +#~ msgid "Mapgen v7 terrain persistation noise parameters" +#~ msgstr "Генератар мапы 7: ÑˆÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ ÑžÑтойліваÑці мÑÑцоваÑці" + +#~ msgid "" +#~ "Noise parameters for biome API temperature, humidity and biome blend." +#~ msgstr "Ð¨ÑƒÐ¼Ð°Ð²Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ Ð´Ð»Ñ Ñ‚Ñмпературы, вільготнаÑці Ñ– змÑшÑÐ½Ð½Ñ Ð±Ñ–Ñ‘Ð¼Ñƒ." + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "Дзе генератар мапы ÑпынÑецца.\n" +#~ "Майце на ўвазе:\n" +#~ "- Ðбмежаваны 31000 (уÑтаноўка вышÑй не мае ніÑкага Ñфекту).\n" +#~ "- Генератар мапы працуе групамі па 80x80x80 вузлоў (5x5x5 блокаў " +#~ "мапы).\n" +#~ "- ГÑÑ‚Ñ‹Ñ Ð³Ñ€ÑƒÐ¿Ñ‹ маюць зрух -32, -32 вузлоў ад пачатку.\n" +#~ "- Генеруюцца толькі групы, ÑÐºÑ–Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð·Ñцца Ñž межах " +#~ "map_generation_limit." diff --git a/po/ca/minetest.po b/po/ca/minetest.po index eaf350f89..67d6a00bb 100644 --- a/po/ca/minetest.po +++ b/po/ca/minetest.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: 2016-10-26 09:14+0000\n" "Last-Translator: tonibm19 <bennasar99@gmail.com>\n" "Language-Team: Catalan <https://hosted.weblate.org/projects/minetest/" @@ -19,6 +19,14 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 2.9-dev\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Reaparèixer" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Has mort." + #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" msgstr "S'ha produït un error en un script Lua, com per exemple un mod." @@ -78,12 +86,13 @@ msgstr "Nosaltres suportem versions del protocol entre la versió $1 i la $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Cancel·lar" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Dependències:" #: builtin/mainmenu/dlg_config_world.lua @@ -91,6 +100,11 @@ msgid "Disable MP" msgstr "Desactivar MP" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Desactivar MP" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Activar MP" @@ -107,17 +121,13 @@ msgstr "" "estan permesos els carà cters [a-z0-9_]." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Ocultar Joc" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Ocultar contingut MP" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -183,8 +193,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Realment desitja esborrar \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Esborrar" @@ -200,7 +209,7 @@ msgstr "Modmgr: Ruta del mod \"$1\" invà lida" msgid "Delete World \"$1\"?" msgstr "Eliminar el món \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Acceptar" @@ -281,6 +290,11 @@ msgstr "Els possibles valors són: " msgid "Restore Default" msgstr "Restablir per defecte" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Buscar" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Seleccioneu la ruta" @@ -290,11 +304,13 @@ msgid "Show technical names" msgstr "Mostrar els noms tècnics" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "El valor ha de ser major que $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "El valor ha de ser menor que $1." #: builtin/mainmenu/modmgr.lua @@ -323,6 +339,10 @@ msgstr "" "Instal·lar mod: Impossible de trobar el nom de la carpeta adequat per al " "paquet de mods $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Tancar repositori" @@ -344,10 +364,6 @@ msgid "Rating" msgstr "Classificació" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Buscar" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Nom curt:" @@ -383,6 +399,71 @@ msgstr "Antics Col·laboradors" msgid "Previous Core Developers" msgstr "Antics Desenvolupadors del nucli" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "Anunciar servidor" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Adreça BIND" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Configurar" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Mode Creatiu" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Permetre Danys" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Ocultar Joc" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Servidor" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Començar Joc" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nom/Contrasenya" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Nou" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "No s'ha creat ningun món o no s'ha seleccionat!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Començar Joc" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Port" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Seleccionar un món:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Port del Servidor" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Mods Instal·lats:" @@ -392,6 +473,10 @@ msgid "Mod information:" msgstr "Informació del mod:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Cap descripció del mod disponible" @@ -411,95 +496,45 @@ msgstr "Desinstal·lar el mod seleccionat" msgid "Uninstall selected modpack" msgstr "Desinstal·lar el paquet de mods seleccionat" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Adreça / Port" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Client" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Connectar" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Mode creatiu" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Dany activat" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Esborra preferit" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Preferit" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Nom / Contrasenya" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP activat" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Adreça BIND" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Configurar" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Mode Creatiu" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Permetre Danys" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Nom/Contrasenya" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Nou" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "No s'ha creat ningun món o no s'ha seleccionat!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Port" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Públic" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Seleccionar un món:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Servidor" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Port del Servidor" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Començar Joc" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP activat" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -530,6 +565,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Esteu segur que voleu reiniciar el seu món d'un sol jugador?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Filtre Bilineal" @@ -608,6 +647,10 @@ msgid "Reset singleplayer world" msgstr "Reiniciar el mon individual" #: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Configuració" @@ -671,14 +714,6 @@ msgstr "Principal" msgid "Start Singleplayer" msgstr "Començar Un Jugador" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Jugar" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Un jugador" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Sense informació disponible" @@ -740,6 +775,10 @@ msgid "Player name too long." msgstr "Nom del jugador massa llarg." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "La ruta del món especificat no existeix: " @@ -756,6 +795,43 @@ msgstr "" "Comprovi debug.txt per a detalls." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Adreça BIND" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Mode Creatiu" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Dany" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Port" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Públic" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +msgid "- Server Name: " +msgstr "" + +#: src/game.cpp msgid "Change Keys" msgstr "Configurar Controls" @@ -772,26 +848,22 @@ msgid "Continue" msgstr "Continuar" #: src/game.cpp -msgid "Creating client..." -msgstr "Creant client ..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Creant servidor ..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Controls predeterminats:\n" "- WASD: moure\n" @@ -806,6 +878,14 @@ msgstr "" "- T: xat\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Creant client ..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Creant servidor ..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -842,6 +922,20 @@ msgid "Exit to OS" msgstr "Eixir al S.O" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Jocs" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Creant servidor ..." + +#: src/game.cpp msgid "Item definitions..." msgstr "Definicions d'objectes ..." @@ -862,24 +956,46 @@ msgid "Node definitions..." msgstr "Definicions dels nodes ..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Resolent adreça ..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Reaparèixer" +msgid "On" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "Anunciar servidor" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Resolent adreça ..." #: src/game.cpp msgid "Shutting down..." msgstr "Tancant ..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Un jugador" + +#: src/game.cpp msgid "Sound Volume" msgstr "Volum del so" #: src/game.cpp -msgid "You died." -msgstr "Has mort." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -914,6 +1030,10 @@ msgid "Console" msgstr "Consola" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Dos tocs \"botar\" per volar" @@ -926,6 +1046,11 @@ msgid "Forward" msgstr "Avant" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Volum del so" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventari" @@ -947,6 +1072,24 @@ msgstr "" msgid "Left" msgstr "Esquerra" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Comands de xat" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Següent" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Imprimir piles" @@ -1024,39 +1167,22 @@ msgid "Apps" msgstr "Aplicacions" #: src/keycode.cpp -msgid "Attn" -msgstr "Atentament" - -#: src/keycode.cpp msgid "Back" msgstr "Enrere" #: src/keycode.cpp -msgid "Capital" -msgstr "Bloq Maj" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Netejar" #: src/keycode.cpp -msgid "Comma" -msgstr "Coma" - -#: src/keycode.cpp msgid "Control" msgstr "Control" #: src/keycode.cpp -msgid "Convert" -msgstr "Convertir" - -#: src/keycode.cpp -#, fuzzy -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Avall" @@ -1065,26 +1191,15 @@ msgid "End" msgstr "Fi" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Esborrar OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Esc" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Executar" #: src/keycode.cpp -msgid "Final" -msgstr "Fi" - -#: src/keycode.cpp msgid "Help" msgstr "Ajuda" @@ -1093,23 +1208,33 @@ msgid "Home" msgstr "Inici" #: src/keycode.cpp -msgid "Insert" -msgstr "Introduir" +#, fuzzy +msgid "IME Accept" +msgstr "Acceptar" #: src/keycode.cpp #, fuzzy -msgid "Junja" -msgstr "Junja" +msgid "IME Convert" +msgstr "Convertir" #: src/keycode.cpp #, fuzzy -msgid "Kana" -msgstr "Kana" +msgid "IME Escape" +msgstr "Esc" #: src/keycode.cpp #, fuzzy -msgid "Kanji" -msgstr "Kanji" +msgid "IME Mode Change" +msgstr "Canvi de mode" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "No convertir" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Introduir" #: src/keycode.cpp msgid "Left Button" @@ -1140,22 +1265,10 @@ msgid "Middle Button" msgstr "Botó del mig" #: src/keycode.cpp -msgid "Minus" -msgstr "Menys" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Canvi de mode" - -#: src/keycode.cpp msgid "Next" msgstr "Següent" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "No convertir" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Bloq Num" @@ -1172,6 +1285,11 @@ msgid "Numpad -" msgstr "Teclat Num. -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Teclat Num. *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Teclat Num. /" @@ -1220,21 +1338,12 @@ msgid "OEM Clear" msgstr "Netejar OEM" #: src/keycode.cpp -#, fuzzy -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pausa" #: src/keycode.cpp -msgid "Period" -msgstr "PerÃode" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Més" +msgid "Play" +msgstr "Jugar" #: src/keycode.cpp msgid "Print" @@ -1341,6 +1450,20 @@ msgid "3D mode" msgstr "Mode 3D" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1421,6 +1544,10 @@ msgstr "" "parà metre." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1429,8 +1556,10 @@ msgstr "" "X11/Sols Android) Ex. per a pantalles amb 4K." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "Ajusta la codificació gamma per les taules de llum. Els nombrés nés petits " @@ -1458,6 +1587,12 @@ msgid "Amplifies the valleys" msgstr "Amplifica les valls" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Filtrat anisotròpic" @@ -1476,6 +1611,10 @@ msgstr "" "servers.minetest.net." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "Aproximar (X, Y, Z) escala del fractal en els nodes." @@ -1484,6 +1623,19 @@ msgid "Ask to reconnect after crash" msgstr "Preguntar per tornar a connectar després d'una caiguda" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Automà ticament informar a la llista del servidor." @@ -1509,6 +1661,14 @@ msgid "Basic Privileges" msgstr "Privilegis per defecte" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Filtre bilineal" @@ -1517,6 +1677,14 @@ msgid "Bind address" msgstr "Adreça BIND" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "Bits per pÃxel (profunditat de color) en el mode de pantalla completa." @@ -1545,6 +1713,11 @@ msgid "Camera update toggle key" msgstr "Tecla alternativa per a l'actualització de la cà mera" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "Soroll de cova #1" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "Soroll de cova #1" @@ -1557,6 +1730,34 @@ msgid "Cave width" msgstr "Amplada de les coves" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "Soroll de cova #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "Soroll de cova #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "Amplada de les coves" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "Soroll de cova #1" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "Coves i túnels es formen en la intersecció dels dos sorolls" @@ -1631,10 +1832,19 @@ msgid "Clean transparent textures" msgstr "Netejar textures transparents" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Client" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Client i Servidor" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Client" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Velocitat d'escalada" @@ -1707,6 +1917,11 @@ msgid "Console color" msgstr "Color de la consola" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Tecla de la consola" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Tecla de la consola" @@ -1733,14 +1948,6 @@ msgstr "" "queda inalterat." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Controla la mida dels deserts i platges a Mapgen v6.\n" -"Quan \"snowbiomes\" estan activats 'mgv6_freq_desert' és ignorat." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Controla el pendent o la profunditat de les depressions de llac." @@ -1749,6 +1956,12 @@ msgid "Controls steepness/height of hills." msgstr "Controla la pendent i alçada dels turons." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "" "Controla l'amplada dels túnels, un valor més petit crea túnels més amples." @@ -1774,6 +1987,11 @@ msgstr "" "Aquestes poden fer difÃcil minar. Zero els inhabilita (0-10)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Crear" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Punt de mira Alpha" @@ -1810,6 +2028,10 @@ msgid "Debug log level" msgstr "Nivell de registre de depuració" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Pas de servidor dedicat" @@ -1850,6 +2072,41 @@ msgstr "" "Només té un efecte si és compilat amb cURL." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1860,6 +2117,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "Retrà s per enviar blocs després de col•locarlos" @@ -1890,17 +2157,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "PartÃcules" + +#: src/settings_translation_file.cpp msgid "Disable anticheat" msgstr "" @@ -1945,10 +2220,24 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "Activar VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "" @@ -1984,6 +2273,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2027,6 +2326,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2049,7 +2352,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2123,6 +2430,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2139,10 +2450,34 @@ msgid "Filtering" msgstr "" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "" @@ -2155,6 +2490,10 @@ msgid "Fog" msgstr "" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -2191,6 +2530,14 @@ msgid "Forward key" msgstr "Tecla Avançar" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2269,10 +2616,18 @@ msgid "Gravity" msgstr "" #: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "Mods HTTP" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2294,22 +2649,56 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "Soroll de cova #1" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Windows dret" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2331,6 +2720,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2356,6 +2757,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2388,6 +2798,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2415,6 +2829,15 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Tecla de la consola" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2457,6 +2880,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Tecla Inventari" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2477,12 +2905,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Joystick button repetition interval" msgstr "Interval de repetició del click dret" @@ -2522,6 +2962,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Tecla botar" @@ -2541,6 +2997,18 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla per disminuir el rang de visió.\n" +"Mira\n" +"http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2559,6 +3027,18 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla per incrementar el rang de visió.\n" +"Mira\n" +"http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2616,6 +3096,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla per botar.\n" +"Veure http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2630,6 +3121,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla per obrir el inventari.\n" +"Veure http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2654,6 +3156,28 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla per obrir el inventari.\n" +"Veure http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla per obrir el inventari.\n" +"Veure http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " @@ -2762,6 +3286,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla per moure el jugador cap a la dreta.\n" +"Veure http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2776,10 +3311,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla per botar.\n" +"Veure http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "Utilitzar la tecla \"utilitzar\" per escalar/descendir" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2788,6 +3342,11 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Tecla de la consola" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2843,6 +3402,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2916,6 +3482,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2943,9 +3513,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2954,7 +3533,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2973,25 +3553,21 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen Valleys" -msgstr "Generador de mapes" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen Valleys" +msgstr "Generador de mapes" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3006,51 +3582,7 @@ msgid "Mapgen flat" msgstr "Generador de mapes plans" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Amplada de les coves del generador de mapes plans" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" +msgid "Mapgen flat specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3058,67 +3590,6 @@ msgid "Mapgen fractal" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal cave width" -msgstr "Generador de mapes" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "" @@ -3127,27 +3598,7 @@ msgid "Mapgen v5" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Mapgen v5 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3155,59 +3606,7 @@ msgid "Mapgen v6" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3215,55 +3614,7 @@ msgid "Mapgen v7" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3430,6 +3781,10 @@ msgid "Mipmapping" msgstr "" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3450,6 +3805,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "Sensibilitat del ratolÃ" @@ -3458,18 +3821,21 @@ msgid "Mouse sensitivity multiplier." msgstr "Multiplicador de sensibilitat del ratolÃ." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "Utilitza la tecla" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3518,10 +3884,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3558,6 +3920,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3598,6 +3968,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3692,6 +4068,14 @@ msgid "Report path" msgstr "Seleccioneu la ruta" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Tecla dreta" @@ -3724,6 +4108,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3732,6 +4120,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3772,6 +4164,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "Soroll de cova #1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3816,6 +4217,10 @@ msgid "Server port" msgstr "" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "" @@ -3848,10 +4253,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Ombres" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3877,10 +4291,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "" @@ -3922,6 +4355,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -3942,10 +4383,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3960,6 +4421,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "" @@ -3979,8 +4444,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -4036,6 +4504,10 @@ msgstr "" "s'està mantenint el botó dret del ratolÃ." #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -4078,6 +4550,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "" @@ -4093,10 +4569,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4161,6 +4655,43 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "Controla la pendent i alçada dels turons." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4169,13 +4700,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4187,6 +4716,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4274,16 +4807,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4334,6 +4857,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4349,6 +4879,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4360,6 +4926,67 @@ msgstr "" msgid "cURL timeout" msgstr "" +#~ msgid "Hide mp content" +#~ msgstr "Ocultar contingut MP" + +#~ msgid "Attn" +#~ msgstr "Atentament" + +#~ msgid "Capital" +#~ msgstr "Bloq Maj" + +#~ msgid "Comma" +#~ msgstr "Coma" + +#, fuzzy +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Fi" + +#, fuzzy +#~ msgid "Junja" +#~ msgstr "Junja" + +#, fuzzy +#~ msgid "Kana" +#~ msgstr "Kana" + +#, fuzzy +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Menys" + +#, fuzzy +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "PerÃode" + +#~ msgid "Plus" +#~ msgstr "Més" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Controla la mida dels deserts i platges a Mapgen v6.\n" +#~ "Quan \"snowbiomes\" estan activats 'mgv6_freq_desert' és ignorat." + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Amplada de les coves del generador de mapes plans" + +#, fuzzy +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Generador de mapes" + #~ msgid "No of course not!" #~ msgstr "No, per descomptat que no!" diff --git a/po/cs/minetest.po b/po/cs/minetest.po index c7d1720f0..5dd2eda07 100644 --- a/po/cs/minetest.po +++ b/po/cs/minetest.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: 2016-10-25 11:59+0000\n" "Last-Translator: Jakub VanÄ›k <vanek.jakub4@seznam.cz>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/minetest/minetest/" @@ -19,6 +19,14 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Weblate 2.9-dev\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Znovu stvoÅ™it" + +#: builtin/client/init.lua +msgid "You died." +msgstr "ZemÅ™el jsi." + #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" msgstr "Nastala chyba v Lua skriptu, což může být napÅ™. mod:" @@ -77,12 +85,13 @@ msgstr "Podporujeme verze protokolů mezi $1 a $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "ZruÅ¡it" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Závislosti:" #: builtin/mainmenu/dlg_config_world.lua @@ -90,6 +99,11 @@ msgid "Disable MP" msgstr "Zakázat balÃÄek" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Zakázat balÃÄek" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Povolit balÃÄek" @@ -106,17 +120,13 @@ msgstr "" "jsou pouze znaky a-z, 0-9." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Skrýt vnitÅ™nÃ" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Skrýt obsahy balÃÄků" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -179,8 +189,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "SkuteÄnÄ› chcete odstranit \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Smazat" @@ -196,7 +205,7 @@ msgstr "Modmgr: Neplatná cesta k modu \"$1\"" msgid "Delete World \"$1\"?" msgstr "Doopravdy chcete smazat svÄ›t \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "PÅ™ijmout" @@ -276,6 +285,11 @@ msgstr "Možné hodnoty jsou: " msgid "Restore Default" msgstr "Obnovit výchozÃ" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "HledánÃ" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Vyberte cestu" @@ -285,11 +299,13 @@ msgid "Show technical names" msgstr "Zobrazit technické názvy" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "Hodnota musà být vÄ›tšà než $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "Hodnota musà být nižšà než $1." #: builtin/mainmenu/modmgr.lua @@ -317,6 +333,10 @@ msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" "Instalace modu: nenalezen vhodný adresář s pÅ™ÃsluÅ¡ným názvem pro balÃÄek $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "ZavÅ™Ãt obchod" @@ -338,10 +358,6 @@ msgid "Rating" msgstr "HodnocenÃ" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "HledánÃ" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Zkratka:" @@ -377,6 +393,71 @@ msgstr "Bývalà pÅ™ispÄ›vatelé" msgid "Previous Core Developers" msgstr "Bývalà klÃÄovà vývojáři" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "ZveÅ™ejnit server" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Svázat adresu" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Nastavit" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Kreativnà mód" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Povolit poÅ¡kozenÃ" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Skrýt vnitÅ™nÃ" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Server" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "MÃstnà instalace" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Jméno/Heslo" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Nový" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Žádný svÄ›t nebyl vytvoÅ™en ani vybrán!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Jméno hráÄe" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Port" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Vyberte svÄ›t:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Port serveru" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Nainstalované mody:" @@ -386,6 +467,10 @@ msgid "Mod information:" msgstr "Informace o modu:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Popis modu nenà dostupný" @@ -405,96 +490,47 @@ msgstr "Odinstalovat vybraný mod" msgid "Uninstall selected modpack" msgstr "Odinstalovat oznaÄený balÃÄek" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Adresa / Port" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Klient" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "PÅ™ipojit" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Kreativnà mód" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "PoÅ¡kozenà povoleno" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Del. Favorite" msgstr "OblÃbené:" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "OblÃbené" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Jméno / Heslo" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP povoleno" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Svázat adresu" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Nastavit" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Kreativnà mód" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Povolit poÅ¡kozenÃ" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Jméno/Heslo" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Nový" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Žádný svÄ›t nebyl vytvoÅ™en ani vybrán!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Port" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "VeÅ™ejný" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Vyberte svÄ›t:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Server" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Port serveru" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Play Online" +msgstr "Jméno hráÄe" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Spustit hru" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP povoleno" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -525,6 +561,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Jste si jisti, že chcete resetovat mÃstnà svÄ›t?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Bilineárnà filtrovánÃ" @@ -604,6 +644,11 @@ msgid "Reset singleplayer world" msgstr "Reset mÃstnÃho svÄ›ta" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "SnÃmek obrazovky" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "NastavenÃ" @@ -667,14 +712,6 @@ msgstr "Hlavnà nabÃdka" msgid "Start Singleplayer" msgstr "Start mÃstnà hry" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Hrát" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "MÃstnà hra" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Informace nejsou dostupné" @@ -737,6 +774,10 @@ msgid "Player name too long." msgstr "Jméno hráÄe je pÅ™ÃliÅ¡ dlouhé." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Uvedená cesta ke svÄ›tu neexistuje: " @@ -753,6 +794,44 @@ msgstr "" "Pro detaily se podÃvejte do debug.txt." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Svázat adresu" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Kreativnà mód" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "ZranÄ›nÃ" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Port" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "VeÅ™ejný" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Jméno serveru" + +#: src/game.cpp msgid "Change Keys" msgstr "ZmÄ›nit klávesy" @@ -769,26 +848,22 @@ msgid "Continue" msgstr "PokraÄovat" #: src/game.cpp -msgid "Creating client..." -msgstr "VytvářÃm klienta..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "VytvářÃm server..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Výchozà ovládánÃ:\n" "- WASD: pohyb\n" @@ -803,6 +878,14 @@ msgstr "" "- T: chat\n" #: src/game.cpp +msgid "Creating client..." +msgstr "VytvářÃm klienta..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "VytvářÃm server..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -839,6 +922,20 @@ msgid "Exit to OS" msgstr "UkonÄit hru" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Název hry" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "VytvářÃm server..." + +#: src/game.cpp msgid "Item definitions..." msgstr "Definice vÄ›cÃ..." @@ -859,24 +956,46 @@ msgid "Node definitions..." msgstr "Definice bloků..." #: src/game.cpp -msgid "Resolving address..." -msgstr "PÅ™ekládám adresu..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Znovu stvoÅ™it" +msgid "On" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "Vzdálený port" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "PÅ™ekládám adresu..." #: src/game.cpp msgid "Shutting down..." msgstr "VypÃnánÃ..." #: src/game.cpp +msgid "Singleplayer" +msgstr "MÃstnà hra" + +#: src/game.cpp msgid "Sound Volume" msgstr "Hlasitost" #: src/game.cpp -msgid "You died." -msgstr "ZemÅ™el jsi." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -911,6 +1030,10 @@ msgid "Console" msgstr "Konzole" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Dvojstisk klávesy \"skok\" zapne létánÃ" @@ -923,6 +1046,11 @@ msgid "Forward" msgstr "VpÅ™ed" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Hlasitost" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventář" @@ -944,6 +1072,24 @@ msgstr "" msgid "Left" msgstr "Doleva" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "PÅ™Ãkazy" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "DalÅ¡Ã" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Vypsat hromádky" @@ -1021,38 +1167,22 @@ msgid "Apps" msgstr "Aplikace" #: src/keycode.cpp -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" msgstr "ZpÄ›t" #: src/keycode.cpp -msgid "Capital" -msgstr "Klávesa velkého pÃsmene" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "VyÄistit" #: src/keycode.cpp -msgid "Comma" -msgstr "Čárka" - -#: src/keycode.cpp msgid "Control" msgstr "Control" #: src/keycode.cpp -msgid "Convert" -msgstr "Convert" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Dolů" @@ -1061,26 +1191,15 @@ msgid "End" msgstr "End" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Smazat EOF" #: src/keycode.cpp -msgid "Escape" -msgstr "Esc" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Spustit" #: src/keycode.cpp -msgid "Final" -msgstr "Final" - -#: src/keycode.cpp msgid "Help" msgstr "Pomoc" @@ -1089,20 +1208,33 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +#, fuzzy +msgid "IME Accept" +msgstr "PÅ™ijmout" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Convert" +msgstr "Convert" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +#, fuzzy +msgid "IME Escape" +msgstr "Esc" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +#, fuzzy +msgid "IME Mode Change" +msgstr "ZmÄ›na režimu" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "Nonconvert" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1133,22 +1265,10 @@ msgid "Middle Button" msgstr "ProstÅ™ednà tlaÄÃtko myÅ¡i" #: src/keycode.cpp -msgid "Minus" -msgstr "MÃnus" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "ZmÄ›na režimu" - -#: src/keycode.cpp msgid "Next" msgstr "DalÅ¡Ã" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nonconvert" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1165,6 +1285,11 @@ msgid "Numpad -" msgstr "Numerická klávesnice: -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Numerická klávesnice: *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Numerická klávesnice: /" @@ -1213,20 +1338,12 @@ msgid "OEM Clear" msgstr "OEM Clear" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pauza" #: src/keycode.cpp -msgid "Period" -msgstr "TeÄka" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Plus" +msgid "Play" +msgstr "Hrát" #: src/keycode.cpp msgid "Print" @@ -1326,6 +1443,20 @@ msgid "3D mode" msgstr "Režim 3D zobrazenÃ" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1400,6 +1531,10 @@ msgstr "" "Poznámka: pole adresy v hlavnÃm menu pÅ™episuje toto nastavenÃ." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1409,7 +1544,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" @@ -1434,6 +1570,12 @@ msgid "Amplifies the valleys" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Anizotropnà filtrovánÃ" @@ -1452,6 +1594,10 @@ msgstr "" "servers.minetest.net." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" @@ -1460,6 +1606,19 @@ msgid "Ask to reconnect after crash" msgstr "Zeptat se na znovupÅ™ipojenà po havárii" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Automaticky hlásit seznamu serverů." @@ -1484,6 +1643,14 @@ msgid "Basic Privileges" msgstr "Základnà práva" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Bilineárnà filtrovánÃ" @@ -1492,6 +1659,15 @@ msgid "Bind address" msgstr "Svázat adresu" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome noise" +msgstr "HluÄnost Å™eky" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "Bitová hloubka (bity na pixel) v celoobrazovkovém režimu." @@ -1520,6 +1696,11 @@ msgid "Camera update toggle key" msgstr "Klávesa pro pÅ™epÃnánà aktualizace pohledu" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "HluÄnost Å™eky" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "" @@ -1532,6 +1713,34 @@ msgid "Cave width" msgstr "Å ÃÅ™ka jeskynÄ›" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "HluÄnost Å™eky" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "HluÄnost Å™eky" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "Å ÃÅ™ka jeskynÄ›" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "HluÄnost Å™eky" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1587,10 +1796,19 @@ msgid "Clean transparent textures" msgstr "Vynulovat průhledné textury" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Klient" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Klient a Server" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Klient" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Rychlost Å¡plhánÃ" @@ -1660,6 +1878,11 @@ msgid "Console color" msgstr "Barva konzole" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Klávesa konzole" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Klávesa konzole" @@ -1686,17 +1909,17 @@ msgstr "" "nebo den." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp @@ -1720,6 +1943,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "VytvoÅ™it" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Průhlednost zaměřovaÄe" @@ -1756,6 +1984,11 @@ msgid "Debug log level" msgstr "Úroveň minimálnà důležitosti ladÃcÃch informacÃ" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "Klávesa pro pÅ™epnutà HUD (Head-Up Display)" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "" @@ -1794,6 +2027,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1804,6 +2072,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "Definuje maximálnà posun hráÄe v blocÃch (0 = bez limitu)." #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1836,17 +2114,25 @@ msgstr "" "uveden v seznamu serverů." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Částice" + +#: src/settings_translation_file.cpp msgid "Disable anticheat" msgstr "Zakázat anticheat" @@ -1891,10 +2177,24 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "Povolit VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Povolit zabezpeÄenà módů" @@ -1937,6 +2237,16 @@ msgstr "" "média (napÅ™. textury) pÅ™i pÅ™ipojovánà k serveru." #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -1980,6 +2290,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2002,7 +2316,11 @@ msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2076,6 +2394,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2092,10 +2414,35 @@ msgid "Filtering" msgstr "FiltrovánÃ" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "Fixované seedové Äislo" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Floatland level" +msgstr "Hladina vody" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Klávesa létánÃ" @@ -2108,6 +2455,10 @@ msgid "Fog" msgstr "Mlha" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Klávesa pro pÅ™epnutà mlhy" @@ -2144,6 +2495,14 @@ msgid "Forward key" msgstr "VpÅ™ed" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "PÃsma Freetype" @@ -2222,10 +2581,19 @@ msgid "Gravity" msgstr "Gravitace" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "Hladina vody" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "HTTP mody" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Klávesa pro pÅ™epnutà HUD (Head-Up Display)" @@ -2247,22 +2615,55 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Pravá klávesa Windows" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "VýpoÄty ve FPU s vysokou pÅ™esnostÃ" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Jak hluboké dÄ›lat Å™eky" @@ -2284,6 +2685,18 @@ msgid "How wide to make rivers" msgstr "Jak Å¡iroké dÄ›lat Å™eky" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2309,6 +2722,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2341,6 +2763,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2368,6 +2794,15 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Klávesa konzole" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2410,6 +2845,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Klávesa inventáře" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2430,12 +2870,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2473,6 +2925,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Skok" @@ -2489,6 +2957,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2503,6 +2978,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2545,6 +3027,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2559,6 +3048,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2580,6 +3076,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2680,6 +3190,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2693,10 +3210,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "Klávesa PoužÃt pro Å¡plhánÃ/slézánÃ" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "Jazyk" @@ -2705,6 +3237,11 @@ msgid "Large cave depth" msgstr "Hloubka velké jeskynÄ›" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Klávesa konzole" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "Vlastnosti lávy" @@ -2760,6 +3297,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2832,6 +3376,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2859,9 +3407,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2870,7 +3427,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2889,24 +3447,20 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Mapgen údolÃ" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +msgid "Mapgen Valleys" +msgstr "Mapgen údolÃ" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -2921,52 +3475,7 @@ msgid "Mapgen flat" msgstr "Mapgen plochy" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat cave width" -msgstr "Mapgen plochy" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" +msgid "Mapgen flat specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -2974,67 +3483,6 @@ msgid "Mapgen fractal" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal cave width" -msgstr "Mapgen plochy" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Jméno generátoru mapy" @@ -3043,28 +3491,7 @@ msgid "Mapgen v5" msgstr "Mapgen v5" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen v5 cave width" -msgstr "Mapgen v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Mapgen v5 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3072,59 +3499,7 @@ msgid "Mapgen v6" msgstr "Mapgen v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3132,56 +3507,7 @@ msgid "Mapgen v7" msgstr "Mapgen v7" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen v7 cave width" -msgstr "Mapgen v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3348,6 +3674,10 @@ msgid "Mipmapping" msgstr "Mip-mapovánÃ" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3368,6 +3698,14 @@ msgid "Monospace font size" msgstr "Velikost neproporcionálnÃho pÃsma" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "Citlivost myÅ¡i" @@ -3376,18 +3714,21 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "Klávesa použÃt" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3436,10 +3777,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3476,6 +3813,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3517,6 +3862,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3611,6 +3962,15 @@ msgid "Report path" msgstr "Cesta k pÃsmu" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ridge noise" +msgstr "HluÄnost Å™eky" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Klávesa doprava" @@ -3643,6 +4003,10 @@ msgid "Round minimap" msgstr "Kulatá minimapa" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3651,6 +4015,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3694,6 +4062,14 @@ msgstr "" "Použijte 0 pro výchozà kvalitu." #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "ZabezpeÄenÃ" @@ -3738,6 +4114,10 @@ msgid "Server port" msgstr "Port serveru" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "Adresa seznamu veÅ™ejných serverů" @@ -3770,10 +4150,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Shadery" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3799,10 +4188,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "Plynulé osvÄ›tlenÃ" @@ -3841,6 +4249,14 @@ msgid "Static spawnpoint" msgstr "Stálé mÃsto oživenÃ" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "SÃla vygenerovaných normálových map." @@ -3861,10 +4277,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3879,6 +4315,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "Cesta k texturám" @@ -3898,8 +4338,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -3950,6 +4393,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -3992,6 +4439,10 @@ msgid "Tooltip delay" msgstr "ZpoždÄ›nà nápovÄ›dy" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Trilineárnà filtrovánÃ" @@ -4007,10 +4458,29 @@ msgid "Trusted mods" msgstr "DůvÄ›ryhodné mody" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Undersampling" +msgstr "RenderovánÃ:" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4075,6 +4545,42 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4083,13 +4589,11 @@ msgid "Video driver" msgstr "OvladaÄ grafiky" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4101,6 +4605,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4188,16 +4696,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4248,6 +4746,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4261,6 +4766,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4272,6 +4813,67 @@ msgstr "cURL limit paralelnÃch stahovánÃ" msgid "cURL timeout" msgstr "cURL timeout" +#~ msgid "Hide mp content" +#~ msgstr "Skrýt obsahy balÃÄků" + +#~ msgid "Start Game" +#~ msgstr "Spustit hru" + +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "Klávesa velkého pÃsmene" + +#~ msgid "Comma" +#~ msgstr "Čárka" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Final" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "MÃnus" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "TeÄka" + +#~ msgid "Plus" +#~ msgstr "Plus" + +#, fuzzy +#~ msgid "Mapgen flat cave width" +#~ msgstr "Mapgen plochy" + +#, fuzzy +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Mapgen plochy" + +#, fuzzy +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Mapgen v5" + +#, fuzzy +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Mapgen v7" + #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "Detailnà profilovacà data modů. UžiteÄné pro vývojáře modů." @@ -4302,9 +4904,6 @@ msgstr "cURL timeout" #~ msgid "If enabled, " #~ msgstr "Je-li povoleno, " -#~ msgid "Rendering:" -#~ msgstr "RenderovánÃ:" - #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "Aby se zmÄ›na ovladaÄe projevila, restartujte Minetest" @@ -4312,9 +4911,6 @@ msgstr "cURL timeout" #~ msgstr "" #~ "Levý klik: PÅ™esunout vÅ¡echny pÅ™edmÄ›ty, Pravý klik: PÅ™esunout jeden pÅ™edmÄ›t" -#~ msgid "Local install" -#~ msgstr "MÃstnà instalace" - #~ msgid "Add mod:" #~ msgstr "PÅ™idat mod:" @@ -4369,9 +4965,6 @@ msgstr "cURL timeout" #~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\"" #~ msgstr "Gamemgr: Nepovedlo se zkopÃrovat mod \"$1\" do hry \"$2\"" -#~ msgid "Game Name" -#~ msgstr "Název hry" - #~ msgid "Downloading" #~ msgstr "Stahuji" diff --git a/po/da/minetest.po b/po/da/minetest.po index b1aa649ba..eda77999f 100644 --- a/po/da/minetest.po +++ b/po/da/minetest.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: 2016-11-24 16:48+0100\n" "Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n" "Language-Team: Danish <https://hosted.weblate.org/projects/minetest/minetest/" @@ -19,6 +19,14 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 2.9-dev\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "GenopstÃ¥" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Du døde." + #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" msgstr "Der skete en fejt i Lua scriptet, sÃ¥ som et mod:" @@ -77,12 +85,13 @@ msgstr "Vi understøtter protokol versioner mellem $1 og $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Anuller" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Afhænger af:" #: builtin/mainmenu/dlg_config_world.lua @@ -90,6 +99,11 @@ msgid "Disable MP" msgstr "Deaktivér MP" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Deaktivér MP" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Aktivér MP" @@ -106,17 +120,13 @@ msgstr "" "[a-z0-9_] er tilladte." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Skjul spil" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Skjul mp indhold" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -180,8 +190,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Er du sikker pÃ¥, at du vil slette »$1«?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Slet" @@ -197,7 +206,7 @@ msgstr "Modmgr: ugyldig mod-sti \"$1\"" msgid "Delete World \"$1\"?" msgstr "Slet verden \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Accepter" @@ -278,6 +287,11 @@ msgstr "Mulige værdier er: " msgid "Restore Default" msgstr "Gendan standard" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Søg" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Vælg sti" @@ -287,11 +301,13 @@ msgid "Show technical names" msgstr "Vis tekniske navne" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "Værdien skal være større end $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "Værdien skal være mindre end $1." #: builtin/mainmenu/modmgr.lua @@ -319,6 +335,10 @@ msgstr "Installer Mod: kunne ikke finde det rigtige mod navn for: $1" msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "Installer Mod: kunne ikke finde passende mappe navn for modpack $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Luk marked" @@ -340,10 +360,6 @@ msgid "Rating" msgstr "Bedømmelse" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Søg" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Kort navn:" @@ -379,6 +395,72 @@ msgstr "Tidligere bidragere" msgid "Previous Core Developers" msgstr "Tidligere hoved udviklere" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "Meddelelsesserver" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Bind adresse" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Konfigurér" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Kreativ tilstand" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Aktivér skade" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Skjul spil" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Server" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Start spil / Forbind" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Navn/kodeord" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Ny" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Ingen verden oprettet eller valgt!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Spillerens navn" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Port" +msgstr "Port" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Vælg verden:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Server port" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Installerede mods:" @@ -388,6 +470,10 @@ msgid "Mod information:" msgstr "Information om mod:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Der er ikke nogen beskrivelse af tilgængelig af det valgte mod" @@ -407,97 +493,47 @@ msgstr "Afinstaller det valgte mod" msgid "Uninstall selected modpack" msgstr "Afinstaller den valgte modpack" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Adresse/port" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Klient" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Forbind" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Kreativ tilstand" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Skade aktiveret" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Del. Favorite" msgstr "Vis favoritter" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Favorit" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Navn/adgangskode" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Spiller mod spiller aktiveret" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Bind adresse" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Konfigurér" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Kreativ tilstand" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Aktivér skade" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Navn/kodeord" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Ny" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Ingen verden oprettet eller valgt!" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua +#: builtin/mainmenu/tab_online.lua #, fuzzy -msgid "Port" -msgstr "Port" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Offentlig" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Vælg verden:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Server" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Server port" +msgid "Play Online" +msgstr "Spillerens navn" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Start spil / Forbind" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "Spiller mod spiller aktiveret" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -528,6 +564,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Er du sikker pÃ¥, at du vil nulstille din enkelt spiller-verden?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Bi-lineær filtréring" @@ -606,6 +646,11 @@ msgid "Reset singleplayer world" msgstr "Nulstil spillerverden" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "Skærmbillede" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Indstillinger" @@ -669,14 +714,6 @@ msgstr "Hovedmenu" msgid "Start Singleplayer" msgstr "Enlig spiller" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Spil" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Enlig spiller" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Der er ikke nogen information tilgængelig" @@ -739,6 +776,10 @@ msgid "Player name too long." msgstr "Spillerens navn er for langt." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Angivne sti til verdenen findes ikke: " @@ -755,6 +796,44 @@ msgstr "" "Tjek debug.txt for detaljer." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Bind adresse" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Kreativ tilstand" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Skade" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Port" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Offentlig" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Servernavn" + +#: src/game.cpp msgid "Change Keys" msgstr "Skift tastatur-bindinger" @@ -771,26 +850,22 @@ msgid "Continue" msgstr "Fortsæt" #: src/game.cpp -msgid "Creating client..." -msgstr "Opretter klient ..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Opretter server ..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Standardstyring:\n" "- WASD: Bevæge sig rundt\n" @@ -805,6 +880,14 @@ msgstr "" "- T: Snakke (chat)\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Opretter klient ..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Opretter server ..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -841,6 +924,20 @@ msgid "Exit to OS" msgstr "Afslut til operativsystemet" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Spil" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Opretter server ..." + +#: src/game.cpp msgid "Item definitions..." msgstr "Elementdefinitioner ..." @@ -861,24 +958,46 @@ msgid "Node definitions..." msgstr "Knudepunktsdefinitioner ..." #: src/game.cpp -msgid "Resolving address..." -msgstr "SlÃ¥r adresse op ..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "GenopstÃ¥" +msgid "On" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "Fjernport" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "SlÃ¥r adresse op ..." #: src/game.cpp msgid "Shutting down..." msgstr "Lukker ned..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Enlig spiller" + +#: src/game.cpp msgid "Sound Volume" msgstr "Lydniveau" #: src/game.cpp -msgid "You died." -msgstr "Du døde." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -913,6 +1032,10 @@ msgid "Console" msgstr "Konsol" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "" "Tryk pÃ¥ \"hop\" hurtigt to gange for at skifte frem og tilbage mellem flyve-" @@ -927,6 +1050,11 @@ msgid "Forward" msgstr "Fremad" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Lydniveau" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Beholdning" @@ -948,6 +1076,24 @@ msgstr "" msgid "Left" msgstr "Venstre" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Snakkekommandoer" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Næste" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Udskriv stakke" @@ -1025,38 +1171,22 @@ msgid "Apps" msgstr "Prg." #: src/keycode.cpp -msgid "Attn" -msgstr "Giv agt" - -#: src/keycode.cpp msgid "Back" msgstr "Tilbage" #: src/keycode.cpp -msgid "Capital" -msgstr "Store bogstaver" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Ryd" #: src/keycode.cpp -msgid "Comma" -msgstr "Komma" - -#: src/keycode.cpp msgid "Control" msgstr "Control" #: src/keycode.cpp -msgid "Convert" -msgstr "Konvertér" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Ned" @@ -1065,26 +1195,15 @@ msgid "End" msgstr "End" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Udvisk Slut-PÃ¥-Fil" #: src/keycode.cpp -msgid "Escape" -msgstr "Escape" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Eksekvér" #: src/keycode.cpp -msgid "Final" -msgstr "Endelig" - -#: src/keycode.cpp msgid "Help" msgstr "Hjælp" @@ -1093,20 +1212,33 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +#, fuzzy +msgid "IME Accept" +msgstr "Accepter" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Convert" +msgstr "Konvertér" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +#, fuzzy +msgid "IME Escape" +msgstr "Escape" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +#, fuzzy +msgid "IME Mode Change" +msgstr "Tilstandsskift" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "Nonconvert" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1137,22 +1269,10 @@ msgid "Middle Button" msgstr "Midterste knap" #: src/keycode.cpp -msgid "Minus" -msgstr "Minus" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Tilstandsskift" - -#: src/keycode.cpp msgid "Next" msgstr "Næste" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nonconvert" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1169,6 +1289,11 @@ msgid "Numpad -" msgstr "Numpad -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Numpad *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Numpad /" @@ -1217,20 +1342,12 @@ msgid "OEM Clear" msgstr "OEM Ryd" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pause" #: src/keycode.cpp -msgid "Period" -msgstr "Punktum" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Plus" +msgid "Play" +msgstr "Spil" #: src/keycode.cpp msgid "Print" @@ -1334,6 +1451,20 @@ msgid "3D mode" msgstr "3D-tilstand" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1409,6 +1540,10 @@ msgstr "" "Bemærk, at adressefeltet i hovedmenuen tilsidesætter denne indstilling." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1417,8 +1552,10 @@ msgstr "" "4k-skærme." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "Juster gammakodningen for lystabellerne. Et mindre tal betyder lysere.\n" @@ -1445,6 +1582,12 @@ msgid "Amplifies the valleys" msgstr "Forstærker dalene" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Anisotropisk filtrering" @@ -1463,6 +1606,10 @@ msgstr "" "servers.minetest.net." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "Omtrentlig (X, Y, Z) fraktalskala i knudepunkter." @@ -1471,6 +1618,19 @@ msgid "Ask to reconnect after crash" msgstr "Spørg om at forbinde igen efter nedbrud" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Rapporter automatisk til serverlisten." @@ -1495,6 +1655,14 @@ msgid "Basic Privileges" msgstr "Grundlæggende privilegier" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Bilineær filtrering" @@ -1503,6 +1671,16 @@ msgid "Bind address" msgstr "Bind adresse" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome API temperature and humidity noise parameters" +msgstr "Støjparametre for biotopfugtighed for Mapgen" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome noise" +msgstr "Flodstøj" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "Bit per billedpunkt (a.k.a. farvedybde) i fuldskærmtilstand." @@ -1532,6 +1710,11 @@ msgid "Camera update toggle key" msgstr "Tast til ændring af kameraopdatering" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "Hulestøj #1" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "Hulestøj #1" @@ -1544,6 +1727,35 @@ msgid "Cave width" msgstr "Grottebredde" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "Hulestøj #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "Hulestøj #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "Grottebredde" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "Hulestøj #1" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Flad bakketærskel for Mapgen" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "Huler og tunneler dannes ved skæringspunktet for de to støjkilder" @@ -1618,10 +1830,19 @@ msgid "Clean transparent textures" msgstr "Rene gennemsigtige teksturer" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Klient" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Klient og server" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Klient" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Klatringshastighed" @@ -1693,6 +1914,11 @@ msgid "Console color" msgstr "Konsolfarve" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Konsoltast" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Konsoltast" @@ -1719,14 +1945,6 @@ msgstr "" "helst forbliver uændret." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Kontroller størrelse for ørkener og strande i Mapgen v6.\n" -"NÃ¥r snebiomer er aktiveret ignoreres »mgv6_freq_desert«." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Kontrollerer hældning/dybe for sødybder." @@ -1735,6 +1953,12 @@ msgid "Controls steepness/height of hills." msgstr "Styrer stejlheden/højden af bakkerne." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "Styrer bredden af tunneller. En lavere værdi giver bredere tunneller." @@ -1757,6 +1981,11 @@ msgstr "" "Disse kan gøre vanskeliggøre minedrift. Nul deaktiverer dem (0-10)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Skab" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Crosshair alpha" @@ -1793,6 +2022,11 @@ msgid "Debug log level" msgstr "Logniveau for fejlsøgning" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "Tast for HUD" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Dedikeret server-trin" @@ -1831,6 +2065,41 @@ msgstr "" "Har kun effekt hvis kompileret med cURL." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1844,6 +2113,16 @@ msgstr "" "Definerer den maksimale spillerflytningsafstand i blokke (0 = ubegrænset)." #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "Forsinkelse i afsendelse af blokke efter bygning" @@ -1876,18 +2155,23 @@ msgstr "" "serverlisten." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "Afsynkroniser blokanimation" +msgid "Desert noise threshold" +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"Bestemmer terrænform.\n" -"De tre tal i parenteser kontrollerer skalaen for\n" -"terrænet, de tre tal skal være identiske." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Afsynkroniser blokanimation" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Partikler" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1939,10 +2223,24 @@ msgid "Enable Joysticks" msgstr "Aktivér joysticks" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "Aktiver VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Aktiver mod-sikkerhed" @@ -1988,6 +2286,17 @@ msgstr "" "ved forbindelse til serveren." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Enable view bobbing" +msgstr "Faldrystelse" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2043,6 +2352,10 @@ msgstr "" "Kræver at dybdeskabere er aktiveret." #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Udskrivningsinterval for motorprofileringsdata" @@ -2067,7 +2380,12 @@ msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Fall bobbing factor" msgstr "Faldrystelse" #: src/settings_translation_file.cpp @@ -2143,6 +2461,11 @@ msgid "Filler Depth" msgstr "Fyldstofdybde" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Filler depth noise" +msgstr "Fyldstofdybde" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "Filmisk toneoversættelse" @@ -2165,10 +2488,35 @@ msgid "Filtering" msgstr "Filtrering" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "Fast kortfødning" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Floatland level" +msgstr "Vandstand" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Flyvetast" @@ -2181,6 +2529,10 @@ msgid "Fog" msgstr "TÃ¥ge" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Tast for tÃ¥ge" @@ -2218,6 +2570,14 @@ msgid "Forward key" msgstr "Fremadtast" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "Freetype-skrifttyper" @@ -2309,10 +2669,19 @@ msgid "Gravity" msgstr "Tyngdekraft" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "Flade grundniveauer for Mapgen" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "HTTP-Mod'er" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Tast for HUD" @@ -2344,22 +2713,60 @@ msgstr "" "* Instruer sampleren i brug til at opdatere statistikken." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat blend noise" +msgstr "Støjparametre for Mapgen varmeblanding" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "Hulestøj #1" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "Højdekomponent for den oprindelige vinduestørrelse." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Højre meta" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "Højde hvor skyer fremkommer." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height select noise" +msgstr "Mapgen v6 – støjparametre for højdevalg" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "Højpræcisions FPU" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Flad bakkestejlhed for Mapgen" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Flad bakketærskel for Mapgen" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Hjemmeside for serveren, som vist i serverlisten." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Dybde for floder" @@ -2386,6 +2793,18 @@ msgid "How wide to make rivers" msgstr "Hvor brede floder skal være" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2415,6 +2834,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2458,6 +2886,11 @@ msgstr "" "Hvis aktiveret kan nye spillere ikke slutte sig til uden en tom adgangskode." #: src/settings_translation_file.cpp +#, fuzzy +msgid "If enabled, show the server status message on player connection." +msgstr "Dagens besked" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2491,6 +2924,18 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Baggrundsfarve for snakkekonsollen i spillet (R,G,B)." #: src/settings_translation_file.cpp +#, fuzzy +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" +"Baggrundsalfa for snakkekonsollen i spillet (uigennemsigtighed, mellem 0 og " +"255)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Konsoltast" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2539,6 +2984,11 @@ msgid "Interval of sending time of day to clients." msgstr "Interval for afsendelse af tidspunkt pÃ¥ dagen til klienter." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Lagertast" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "Animationer for lagerelementer" @@ -2559,6 +3009,11 @@ msgid "Item entity TTL" msgstr "Elemententitet TTL" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Iterations" +msgstr "Instrumentering" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." @@ -2567,6 +3022,14 @@ msgstr "" "Kontrollerer mængden af smÃ¥ detaljer." #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "Joystick-knaps gentagelsesinterval" @@ -2617,6 +3080,22 @@ msgstr "" "Interval cirka -2 til 2." #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Hop-tast" @@ -2635,6 +3114,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast for mindskning af den sete afstand.\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2655,6 +3145,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast for øgning af den sete afstand.\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2715,6 +3216,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast for hop.\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2735,6 +3247,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast til at Ã¥bne snakkevinduet for at indtaste kommandoer.\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2765,6 +3288,28 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast til at Ã¥bne lageret.\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast til at Ã¥bne lageret.\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " @@ -2909,6 +3454,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast til at skifte visningen af snakken (chat).\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2930,10 +3486,31 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast for hop.\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "Tast brugt til at klatre op/ned" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Flad søstejlhed for Mapgen" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Flad søtærskel for Mapgen" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "Sprog" @@ -2942,6 +3519,11 @@ msgid "Large cave depth" msgstr "Dybde for stor hule" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Konsoltast" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "Lavafunktioner" @@ -3011,6 +3593,13 @@ msgstr "Begrænsning af fremkomsten af køer at oprette" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -3094,6 +3683,10 @@ msgstr "" "FÃ¥r DirectX til at fungere med LuaJIT. Deaktiver hvis det giver problemer." #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "Kortmappe" @@ -3132,10 +3725,25 @@ msgstr "" "Flag der starter med »no« bruges til eksplicit at deaktivere dem." #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Kortoprettelsesattributter specifikek til Mapgen v7.\n" +"Flaget »ridges« kontroller floderne.\n" +"Flag som ikke er specificeret i flag-strengen ændres ikke fra standarden.\n" +"Flag der starter med »no« bruges til eksplicit at deaktivere dem." + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3147,9 +3755,11 @@ msgstr "" "Flag der starter med »no« bruges til eksplicit at deaktivere dem." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3172,24 +3782,21 @@ msgid "Mapblock limit" msgstr "Kortblokbegrænsning" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "Tidsudløb for kortblokfjernelse" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Mapgen-daler" +#, fuzzy +msgid "Mapblock mesh generation delay" +msgstr "Kortoprettelsesbegrænsning" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "Støjparametre til biotopvarme for Mapgen" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "Støjparametre til biotopfugtighedsblanding for Mapgen" +msgid "Mapblock unload timeout" +msgstr "Tidsudløb for kortblokfjernelse" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "Støjparametre for biotopfugtighed for Mapgen" +msgid "Mapgen Valleys" +msgstr "Mapgen-daler" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3204,118 +3811,15 @@ msgid "Mapgen flat" msgstr "Mapgen-flad" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Mapgen - flad hulebredde" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "Støjparametre til flade cave1 for Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "Støjparametre til flade cave2 for Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "Mapgen - støjparametre for flad fyldstofdybde" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" +#, fuzzy +msgid "Mapgen flat specific flags" msgstr "Flade flag for Mapgen" #: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "Flade grundniveauer for Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "Flad bakkestejlhed for Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "Flad bakketærskel for Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "Flad søstejlhed for Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "Flad søtærskel for Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "Flad stor hule-dybde for Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "Støjparametre til flad terræn for Mapgen" - -#: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "Fraktral for Mapgen" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "Mapgen - fraktal hulebredde" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "Støjparametre for Mapgen fraktal grotte1" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "Støjparametre for Mapgen fraktal grotte2" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "Mapgen - støjparametre for fraktal fyldstofdybde" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "Mapgen fraktal fraktal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "Mapgen fraktaliterationer" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "Mapgen fraktal Julia w" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "Mapgen fraktal Julia x" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "Mapgen fraktal Julia y" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "Mapgen fraktal Julia z" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "Mapgen fraktal forskydning" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "Mapgen fraktal skalering" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "Støjparametre for Mapgen fraktal havbund" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "Mapgen fraktal udsnit w" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "Støjparametre for Mapgen varmeblanding" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Mapgen-navn" @@ -3324,146 +3828,29 @@ msgid "Mapgen v5" msgstr "Mapgen v5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "Mapgen v5 grottebredde" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "Støjparametre for Mapgen v5 grotte1" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "Støjparametre for Mapgen v5 grotte2" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "Støjparametre for Mapgen v5 faktor" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "Mapgen v5 - støjparametre for fyldstofdybde" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "Mapgen v5 – støjparametre for højde" +#, fuzzy +msgid "Mapgen v5 specific flags" +msgstr "Mapgen v6 – flag" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "Mapgen v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "Mapgen v6 – støjparametre for æbletræer" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "Mapgen v6 – strandhyppighed" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "Mapgen v6 – støjparametre for strand" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "Mapgen v6 – støjparametre for økosystem" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "Mapgen v6 – støjparametre for grotter" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "Mapgen v6 – ørkenhyppighed" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" +#, fuzzy +msgid "Mapgen v6 specific flags" msgstr "Mapgen v6 – flag" #: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "Mapgen v6 – støjparametre for højdevalg" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "Mapgen v7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "Mapgen v7 - støjparametre for fyldstofdybde" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" +#, fuzzy +msgid "Mapgen v7 specific flags" msgstr "Mapgen v7 – flag" #: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "Mapgen v7 – støjparametre for højdevalg" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Massive cave depth" msgstr "" @@ -3628,6 +4015,10 @@ msgid "Mipmapping" msgstr "Mipmapping" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3648,6 +4039,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3656,18 +4055,21 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "Brug-tast" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3716,10 +4118,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "Lyde" @@ -3756,6 +4154,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3796,6 +4202,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3890,6 +4302,15 @@ msgid "Report path" msgstr "Rapportsti" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ridge noise" +msgstr "Flodstøj" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Højretast" @@ -3922,6 +4343,10 @@ msgid "Round minimap" msgstr "Rundt minikort" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3930,6 +4355,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3970,6 +4399,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "Hulestøj #1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "Sikkerhed" @@ -4014,6 +4452,10 @@ msgid "Server port" msgstr "Serverport" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "" @@ -4052,16 +4494,27 @@ msgstr "" "Kræver at dybdeskabere er aktiveret." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Dybdeskabere" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" "Dybdeskabere tillader avancerede visuelle effekter og kan forøge ydelsen pÃ¥ " "nogle videokort.\n" "De fungerer kun med OpenGL-videomotoren." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow limit" +msgstr "Kortblokbegrænsning" + +#: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." msgstr "" @@ -4084,10 +4537,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "Blød belysning" @@ -4126,6 +4598,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -4146,10 +4626,33 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "Terrænhøjde" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain base noise" +msgstr "Terrænhøjde" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain higher noise" +msgstr "Terrænhøjde" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain noise" +msgstr "Terrænhøjde" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4164,6 +4667,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "" @@ -4183,8 +4690,11 @@ msgstr "Dybde for smuds eller andet fyldstof" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -4235,6 +4745,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -4277,6 +4791,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Trilineær filtrering" @@ -4292,10 +4810,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4360,6 +4896,43 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "Styrer stejlheden/højden af bakkerne." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4368,13 +4941,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4386,6 +4957,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4473,16 +5048,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4533,6 +5098,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4546,6 +5118,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4557,6 +5165,172 @@ msgstr "" msgid "cURL timeout" msgstr "cURL-tidsudløb" +#~ msgid "Hide mp content" +#~ msgstr "Skjul mp indhold" + +#~ msgid "Attn" +#~ msgstr "Giv agt" + +#~ msgid "Capital" +#~ msgstr "Store bogstaver" + +#~ msgid "Comma" +#~ msgstr "Komma" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Endelig" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Minus" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Punktum" + +#~ msgid "Plus" +#~ msgstr "Plus" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Kontroller størrelse for ørkener og strande i Mapgen v6.\n" +#~ "NÃ¥r snebiomer er aktiveret ignoreres »mgv6_freq_desert«." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Bestemmer terrænform.\n" +#~ "De tre tal i parenteser kontrollerer skalaen for\n" +#~ "terrænet, de tre tal skal være identiske." + +#~ msgid "Mapgen biome heat noise parameters" +#~ msgstr "Støjparametre til biotopvarme for Mapgen" + +#~ msgid "Mapgen biome humidity blend noise parameters" +#~ msgstr "Støjparametre til biotopfugtighedsblanding for Mapgen" + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Mapgen - flad hulebredde" + +#~ msgid "Mapgen flat cave1 noise parameters" +#~ msgstr "Støjparametre til flade cave1 for Mapgen" + +#~ msgid "Mapgen flat cave2 noise parameters" +#~ msgstr "Støjparametre til flade cave2 for Mapgen" + +#~ msgid "Mapgen flat filler depth noise parameters" +#~ msgstr "Mapgen - støjparametre for flad fyldstofdybde" + +#~ msgid "Mapgen flat large cave depth" +#~ msgstr "Flad stor hule-dybde for Mapgen" + +#~ msgid "Mapgen flat terrain noise parameters" +#~ msgstr "Støjparametre til flad terræn for Mapgen" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Mapgen - fraktal hulebredde" + +#~ msgid "Mapgen fractal cave1 noise parameters" +#~ msgstr "Støjparametre for Mapgen fraktal grotte1" + +#~ msgid "Mapgen fractal cave2 noise parameters" +#~ msgstr "Støjparametre for Mapgen fraktal grotte2" + +#~ msgid "Mapgen fractal filler depth noise parameters" +#~ msgstr "Mapgen - støjparametre for fraktal fyldstofdybde" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Mapgen fraktal fraktal" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Mapgen fraktaliterationer" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "Mapgen fraktal Julia w" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "Mapgen fraktal Julia x" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "Mapgen fraktal Julia y" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "Mapgen fraktal Julia z" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "Mapgen fraktal forskydning" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Mapgen fraktal skalering" + +#~ msgid "Mapgen fractal seabed noise parameters" +#~ msgstr "Støjparametre for Mapgen fraktal havbund" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Mapgen fraktal udsnit w" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Mapgen v5 grottebredde" + +#~ msgid "Mapgen v5 cave1 noise parameters" +#~ msgstr "Støjparametre for Mapgen v5 grotte1" + +#~ msgid "Mapgen v5 cave2 noise parameters" +#~ msgstr "Støjparametre for Mapgen v5 grotte2" + +#~ msgid "Mapgen v5 factor noise parameters" +#~ msgstr "Støjparametre for Mapgen v5 faktor" + +#~ msgid "Mapgen v5 filler depth noise parameters" +#~ msgstr "Mapgen v5 - støjparametre for fyldstofdybde" + +#~ msgid "Mapgen v5 height noise parameters" +#~ msgstr "Mapgen v5 – støjparametre for højde" + +#~ msgid "Mapgen v6 apple trees noise parameters" +#~ msgstr "Mapgen v6 – støjparametre for æbletræer" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "Mapgen v6 – strandhyppighed" + +#~ msgid "Mapgen v6 beach noise parameters" +#~ msgstr "Mapgen v6 – støjparametre for strand" + +#~ msgid "Mapgen v6 biome noise parameters" +#~ msgstr "Mapgen v6 – støjparametre for økosystem" + +#~ msgid "Mapgen v6 cave noise parameters" +#~ msgstr "Mapgen v6 – støjparametre for grotter" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "Mapgen v6 – ørkenhyppighed" + +#~ msgid "Mapgen v7 filler depth noise parameters" +#~ msgstr "Mapgen v7 - støjparametre for fyldstofdybde" + +#~ msgid "Mapgen v7 height select noise parameters" +#~ msgstr "Mapgen v7 – støjparametre for højdevalg" + #~ msgid "No of course not!" #~ msgstr "Nej selvfølgelig ikke!" @@ -4572,10 +5346,6 @@ msgstr "cURL-tidsudløb" #~ msgstr "aktiveret" #, fuzzy -#~ msgid "Game Name" -#~ msgstr "Spil" - -#, fuzzy #~ msgid "Password" #~ msgstr "Gammelt kodeord" diff --git a/po/de/minetest.po b/po/de/minetest.po index a81fd0d56..0e7d61bd5 100644 --- a/po/de/minetest.po +++ b/po/de/minetest.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-12-14 02:46+0000\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-05-30 19:42+0000\n" "Last-Translator: Wuzzy <almikes@aol.com>\n" "Language-Team: German " "<https://hosted.weblate.org/projects/minetest/minetest/de/>\n" @@ -17,7 +17,15 @@ 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 2.10-dev\n" +"X-Generator: Weblate 2.14.1\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Wiederbeleben" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Sie sind gestorben." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -77,25 +85,29 @@ msgstr "Wir unterstützen Protokollversionen zwischen $1 und $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Abbrechen" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" -msgstr "Abhängig von:" +msgid "Dependencies:" +msgstr "Abhängigkeiten:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable MP" msgstr "MP deaktivieren" #: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Alle deaktivieren" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "MP aktivieren" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" -msgstr "Alle an" +msgstr "Alle aktivieren" #: builtin/mainmenu/dlg_config_world.lua msgid "" @@ -106,17 +118,13 @@ msgstr "" "sind erlaubt: [a-z0-9_]." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Spiel ausblenden" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Modpacks verstecken" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "Optionale Abhängigkeiten:" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -181,8 +189,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Sind Sie sich sicher, dass Sie „$1“ löschen wollen?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Entfernen" @@ -198,7 +205,7 @@ msgstr "Modmgr: Unzulässiger Modpfad „$1“" msgid "Delete World \"$1\"?" msgstr "Welt „$1“ löschen?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Annehmen" @@ -266,9 +273,7 @@ msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a comma seperated list of flags." -msgstr "" -"Bitte geben Sie eine mit Kommata getrennte Liste von\n" -"Flags an." +msgstr "Bitte geben Sie eine mit Kommata getrennte Liste von Flags an." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." @@ -286,6 +291,11 @@ msgstr "Mögliche Werte sind: " msgid "Restore Default" msgstr "Standardwert" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Suchen" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Pfad auswählen" @@ -295,12 +305,12 @@ msgid "Show technical names" msgstr "Technische Namen zeigen" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." -msgstr "Der Wert muss größer als $1 sein." +msgid "The value must be at least $1." +msgstr "Der Wert muss mindestens $1 sein." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." -msgstr "Der Wert muss kleiner als $1 sein." +msgid "The value must not be larger than $1." +msgstr "Der Wert darf nicht größer als $1 sein." #: builtin/mainmenu/modmgr.lua msgid "" @@ -325,8 +335,12 @@ msgstr "Mod installieren: Echter Modname für $1 konnte nicht gefunden werden" #: builtin/mainmenu/modmgr.lua msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" -"Mod installieren: Geeigneter Ordnername für Modpack $1 konnte nicht gefunden " -"werden" +"Mod installieren: Geeigneter Verzeichnisname für Modpack $1 konnte nicht " +"gefunden werden" + +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "Spiel-Mods" #: builtin/mainmenu/store.lua msgid "Close store" @@ -349,10 +363,6 @@ msgid "Rating" msgstr "Bewertung" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Suchen" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Kurzname:" @@ -388,6 +398,66 @@ msgstr "Frühere Mitwirkende" msgid "Previous Core Developers" msgstr "Ehemalige Hauptentwickler" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "Server ankündigen" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Bind-Adresse" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Konfigurieren" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Kreativmodus" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Schaden einschalten" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "Spiel hosten" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "Server hosten" + +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" +msgstr "Lokales Spiel" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Name/Passwort" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Neu" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Keine Welt angegeben oder ausgewählt!" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Spiel starten" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Port" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Welt wählen:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Serverport" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Installierte Mods:" @@ -397,6 +467,10 @@ msgid "Mod information:" msgstr "Modinformation:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "Keine Abhängigkeiten." + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Keine Modbeschreibung verfügbar" @@ -416,95 +490,45 @@ msgstr "Ausgewählte Mod deinstallieren" msgid "Uninstall selected modpack" msgstr "Ausgewähltes Modpack deinstallieren" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Adresse / Port" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Client" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Verbinden" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Kreativmodus" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Schaden aktiviert" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Favorit löschen" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Favorit" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Name / Passwort" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Spielerkampf aktiviert" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Bind-Adresse" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Konfigurieren" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Kreativmodus" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Schaden einschalten" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Name/Passwort" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Neu" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Keine Welt angegeben oder ausgewählt!" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "Latenz" -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Port" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "Online spielen" -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Öffentlich" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Welt wählen:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Server" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Serverport" - -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Spiel starten" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "Spielerkampf aktiviert" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -512,7 +536,7 @@ msgstr "2x" #: builtin/mainmenu/tab_settings.lua msgid "3D Clouds" -msgstr "3D-Wolken" +msgstr "3-D-Wolken" #: builtin/mainmenu/tab_settings.lua msgid "4x" @@ -535,6 +559,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Sind Sie sicher, dass Sie die Einzelspielerwelt löschen wollen?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "Monitorgröße merken" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Bilinearer Filter" @@ -611,6 +639,10 @@ msgid "Reset singleplayer world" msgstr "Einzelspielerwelt zurücksetzen" #: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Monitor:" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Einstellungen" @@ -674,14 +706,6 @@ msgstr "Hauptmenü" msgid "Start Singleplayer" msgstr "Einzelspieler starten" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Spielen" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Einzelspieler" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Keine Informationen vorhanden" @@ -724,7 +748,7 @@ msgstr "Verbindungsfehler (Zeitüberschreitung?)" #: src/client/clientlauncher.cpp msgid "Could not find or load game \"" -msgstr "Kann Spiel nicht finden oder laden \"" +msgstr "Spiel konnte nicht gefunden oder geladen werden: \"" #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -743,6 +767,10 @@ msgid "Player name too long." msgstr "Spielername zu lang." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Bitte wählen Sie einen Namen!" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Angegebener Weltpfad existiert nicht: " @@ -759,6 +787,38 @@ msgstr "" "Siehe debug.txt für Details." #: src/game.cpp +msgid "- Address: " +msgstr "- Addresse: " + +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "- Kreativmodus: " + +#: src/game.cpp +msgid "- Damage: " +msgstr "- Schaden: " + +#: src/game.cpp +msgid "- Mode: " +msgstr "- Modus: " + +#: src/game.cpp +msgid "- Port: " +msgstr "- Port: " + +#: src/game.cpp +msgid "- Public: " +msgstr "- Öffentlich: " + +#: src/game.cpp +msgid "- PvP: " +msgstr "- Spielerkampf: " + +#: src/game.cpp +msgid "- Server Name: " +msgstr "- Servername: " + +#: src/game.cpp msgid "Change Keys" msgstr "Tasten ändern" @@ -775,6 +835,39 @@ msgid "Continue" msgstr "Weiter" #: src/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse left: dig/punch\n" +"- Mouse right: place/use\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" +msgstr "" +"Steuerung:\n" +"- %s: Vorwärts\n" +"- %s: Rückwärts\n" +"- %s: Nach links\n" +"- %s: Nach rechts\n" +"- %s: Springen/klettern\n" +"- %s: Kriechen/nach unten\n" +"- %s: Gegenstand fallen lassen\n" +"- %s: Inventar\n" +"- Maus: Drehen/Umschauen\n" +"- Maus links: Graben/Schlagen\n" +"- Maus rechts: Platzieren/Benutzen\n" +"- Mausrad: Gegenstand auswählen\n" +"- %s: Chat\n" + +#: src/game.cpp msgid "Creating client..." msgstr "Client erstellen …" @@ -785,32 +878,6 @@ msgstr "Erstelle Server …" #: src/game.cpp msgid "" "Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" -"- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" -"- Mouse wheel: select item\n" -"- T: chat\n" -msgstr "" -"Standardsteuerung:\n" -"- WASD: bewegen\n" -"- Leertaste: springen/klettern\n" -"- Umschalt: kriechen/herunterklettern\n" -"- Q: Item fallen lassen\n" -"- I: Inventar\n" -"- Maus: drehen/umschauen\n" -"- Maus links: graben/schlagen\n" -"- Maus rechts: platzieren/benutzen\n" -"- Mausrad: Gegenstand auswählen\n" -"- T: Chat\n" - -#: src/game.cpp -msgid "" -"Default Controls:\n" "No menu visible:\n" "- single tap: button activate\n" "- double tap: place/use\n" @@ -845,8 +912,20 @@ msgid "Exit to OS" msgstr "Programm beenden" #: src/game.cpp +msgid "Game info:" +msgstr "Spielinfo:" + +#: src/game.cpp +msgid "Game paused" +msgstr "Spiel pausiert" + +#: src/game.cpp +msgid "Hosting server" +msgstr "Gehosteter Server" + +#: src/game.cpp msgid "Item definitions..." -msgstr "Item-Definitionen …" +msgstr "Gegenstands-Definitionen …" #: src/game.cpp msgid "KiB/s" @@ -865,24 +944,45 @@ msgid "Node definitions..." msgstr "Blockdefinitionen …" #: src/game.cpp -msgid "Resolving address..." -msgstr "Löse Adresse auf …" +msgid "Off" +msgstr "Aus" #: src/game.cpp -msgid "Respawn" -msgstr "Wiederbeleben" +msgid "On" +msgstr "Ein" + +#: src/game.cpp +msgid "Remote server" +msgstr "Entfernter Server" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Löse Adresse auf …" #: src/game.cpp msgid "Shutting down..." msgstr "Herunterfahren …" #: src/game.cpp +msgid "Singleplayer" +msgstr "Einzelspieler" + +#: src/game.cpp msgid "Sound Volume" msgstr "Tonlautstärke" #: src/game.cpp -msgid "You died." -msgstr "Sie sind gestorben." +#, c-format +msgid "Volume changed to %d%%" +msgstr "Lautstärke auf %d%% gesetzt" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "Lautstärke auf 0% gesetzt" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "Lautstärke auf 100% gesetzt" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -917,6 +1017,10 @@ msgid "Console" msgstr "Konsole" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Leiser" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "2×Sprungtaste zum Fliegen" @@ -929,6 +1033,10 @@ msgid "Forward" msgstr "Vorwärts" #: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "Lauter" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventar" @@ -950,6 +1058,22 @@ msgstr "" msgid "Left" msgstr "Links" +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "Lokaler Befehl" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Stumm" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "Nächst. Ggnstd." + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "Vorh. Ggnstd." + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Stack ausgeben" @@ -1000,7 +1124,7 @@ msgstr "Ändern" #: src/guiPasswordChange.cpp msgid "Confirm Password" -msgstr "Passwort bestätigen" +msgstr "Passw. bestätigen" #: src/guiPasswordChange.cpp msgid "New Password" @@ -1027,38 +1151,22 @@ msgid "Apps" msgstr "Anwendungen" #: src/keycode.cpp -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" msgstr "Rücktaste" #: src/keycode.cpp -msgid "Capital" -msgstr "Feststellen" +msgid "Caps Lock" +msgstr "Feststellt." #: src/keycode.cpp msgid "Clear" msgstr "sauber" #: src/keycode.cpp -msgid "Comma" -msgstr "Komma" - -#: src/keycode.cpp msgid "Control" msgstr "Strg" #: src/keycode.cpp -msgid "Convert" -msgstr "Convert" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Runter" @@ -1067,26 +1175,14 @@ msgid "End" msgstr "Ende" #: src/keycode.cpp -msgid "Erase OEF" +msgid "Erase EOF" msgstr "Erase OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Escape" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Ausführen" #: src/keycode.cpp -msgid "Final" -msgstr "Final" - -#: src/keycode.cpp msgid "Help" msgstr "Hilfe" @@ -1095,20 +1191,28 @@ msgid "Home" msgstr "Pos1" #: src/keycode.cpp -msgid "Insert" -msgstr "Einfg" +msgid "IME Accept" +msgstr "IME: Akzept." + +#: src/keycode.cpp +msgid "IME Convert" +msgstr "IME: Konvert." #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +msgid "IME Escape" +msgstr "IME: Escape" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +msgid "IME Mode Change" +msgstr "IME: Moduswechsel" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +msgid "IME Nonconvert" +msgstr "IME: Nonconvert" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Einfg" #: src/keycode.cpp msgid "Left Button" @@ -1139,22 +1243,10 @@ msgid "Middle Button" msgstr "Mittlere Taste" #: src/keycode.cpp -msgid "Minus" -msgstr "Minus" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Modus wechseln" - -#: src/keycode.cpp msgid "Next" msgstr "Bild runter" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nonconvert" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num" @@ -1171,6 +1263,10 @@ msgid "Numpad -" msgstr "Ziffernblock -" #: src/keycode.cpp +msgid "Numpad ." +msgstr "Ziffernblock ." + +#: src/keycode.cpp msgid "Numpad /" msgstr "Ziffernblock /" @@ -1219,20 +1315,12 @@ msgid "OEM Clear" msgstr "OEM Clear" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pause" #: src/keycode.cpp -msgid "Period" -msgstr "Punkt" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Plus" +msgid "Play" +msgstr "Spielen" #: src/keycode.cpp msgid "Print" @@ -1332,11 +1420,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "3D-Wolken" +msgstr "3-D-Wolken" #: src/settings_translation_file.cpp msgid "3D mode" -msgstr "3D-Modus" +msgstr "3-D-Modus" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "3-D-Rauschen, welches riesige Hohlräume definiert." + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" +"3-D-Rauschen, welches Bergformationen- und Höhe\n" +"definiert. Außerdem definiert dies die Formationen\n" +"der Berge in den Schwebeländern." + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" +"3-D-Rauschen, welches die Form von Erdwällen von\n" +"Flusscanyons definiert." #: src/settings_translation_file.cpp msgid "" @@ -1349,15 +1456,15 @@ msgid "" "- sidebyside: split screen side by side.\n" "- pageflip: quadbuffer based 3d." msgstr "" -"3D-Unterstützung.\n" +"3-D-Unterstützung.\n" "Aktuell verfügbar:\n" -"- none: Keine 3D-Ausgabe.\n" -"- anaglyph: Türkises / magenta 3D.\n" +"- none: Keine 3-D-Ausgabe.\n" +"- anaglyph: Türkises / magenta 3-D.\n" "- interlaced: Bildschirmunterstützung für gerade / ungerade " "zeilenbasierte Polarisation.\n" "- topbottom: Bildschirm horizontal teilen.\n" "- sidebyside: Bildschirm vertikal teilen.\n" -"- pageflip: Quadbuffer-basiertes 3D." +"- pageflip: Quadbuffer-basiertes 3-D." #: src/settings_translation_file.cpp msgid "" @@ -1420,6 +1527,10 @@ msgstr "" "Die Adresse im Hauptmenü überschreibt diese Einstellung." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "Zeigt Partikel, wenn man einen Block ausgräbt." + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1427,7 +1538,8 @@ msgstr "DPI des Bildschirms (nicht für X11/Android) z.B. für 4K-Bildschirme." #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "Ändert die Gammakodierung der Lichttabellen. Kleinere Werte sind heller.\n" @@ -1454,6 +1566,14 @@ msgid "Amplifies the valleys" msgstr "Verstärkt die Täler" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" +"Nur für Androidsysteme: Versucht, Inventartexturen aus 3-D-Modellen\n" +"zu erzeugen, wenn kein unterstützender Render gefunden wurde." + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Anisotroper Filter" @@ -1472,6 +1592,10 @@ msgstr "" "v6.servers.minetest.net gesetzt werden." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "Apfelbaumrauschen" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "Julia-Menge: Approximative (X,Y,Z)-Skalierungen in Blöcken." @@ -1480,6 +1604,30 @@ msgid "Ask to reconnect after crash" msgstr "Zum Neuverbinden nach Absturz auffordern" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" +"In dieser Distanz wird der Server die zu den Clients gesendeten Blöcke " +"aggressiv\n" +"optimieren. 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). Wird dieser Wert auf " +"eine\n" +"Zahl größer als max_block_send_distance gesetzt, wird diese Optimierung " +"deaktiviert.\n" +"In Kartenblöcken (16 Blöcke) angegeben." + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Automatisch bei der Serverliste melden." @@ -1504,6 +1652,14 @@ msgid "Basic Privileges" msgstr "Grundprivilegien" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "Strandrauschen" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "Strandrauschschwellwert" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Bilinearer Filter" @@ -1512,6 +1668,14 @@ msgid "Bind address" msgstr "Bind-Adresse" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "Biom-API-Temperatur- und Luftfeuchtigkeits-Rauschparameter" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "Biomrauschen" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "Bits pro Pixel (Farbtiefe) im Vollbildmodus." @@ -1540,6 +1704,10 @@ msgid "Camera update toggle key" msgstr "Taste zum Umschalten der Kameraaktualisierung" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "Höhlenrauschen" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "Höhlenrauschen Nr. 1" @@ -1552,6 +1720,30 @@ msgid "Cave width" msgstr "Höhlenbreite" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "Höhlenrauschen Nr. 1" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "Höhlenrauschen Nr. 2" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "Hohlraumbegrenzung" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "Hohlraumrauschen" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "Hohlraumzuspitzung" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "Hohlraumschwellwert" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "Höhlen und Tunnel bilden sich am Schnittpunkt der zwei Rauschen" @@ -1590,24 +1782,24 @@ msgid "" "18 = 4D \"Mandelbulb\" julia set." msgstr "" "Auswahl von 18 Fraktalen aus 9 Formeln.\n" -"1 = 4D-Mangelbrotmenge, Typ „rund“.\n" -"2 = 4D-Juliamenge, Typ „rund“.\n" -"3 = 4D-Mangelbrotmenge, Typ „eckig“.\n" -"4 = 4D-Juliamenge, Typ „eckig“.\n" -"5 = 4D-Mangelbrotmenge, Typ „Mandel-Cousin“.\n" -"6 = 4D-Juliamenge, Typ „Mandel-Cousin“.\n" -"7 = 4D-Mangelbrotmenge, Typ „Variante“.\n" -"8 = 4D-Juliamenge, Typ „Variante“.\n" -"9 = 3D-Mangelbrotmenge, Typ „Madelbrot/Mandelbar“.\n" -"10 = 3D-Juliamenge, Typ „Madelbrot/Mandelbar“.\n" -"11 = 3D-Mangelbrotmenge, Typ „Weihnachtsbaum“.\n" -"12 = 3D-Juliamenge, Typ „Weihnachtsbaum“.\n" -"13 = 3D-Mangelbrotmenge, Typ „Mandelbulb“.\n" -"14 = 3D-Juliamenge, Typ „Mandelbulb“.\n" -"15 = 3D-Mangelbrotmenge, Typ „Kosinus-Mandelbulb“.\n" -"16 = 3D-Juliamenge, Typ „Kosinus-Mandelbulb“.\n" -"17 = 4D-Mangelbrotmenge, Typ „Mandelbulb“.\n" -"18 = 4D-Juliamenge, Typ „Mandelbulb“." +"1 = 4-D-Mangelbrotmenge, Typ „rund“.\n" +"2 = 4-D-Juliamenge, Typ „rund“.\n" +"3 = 4-D-Mangelbrotmenge, Typ „eckig“.\n" +"4 = 4-D-Juliamenge, Typ „eckig“.\n" +"5 = 4-D-Mangelbrotmenge, Typ „Mandel-Cousin“.\n" +"6 = 4-D-Juliamenge, Typ „Mandel-Cousin“.\n" +"7 = 4-D-Mangelbrotmenge, Typ „Variante“.\n" +"8 = 4-D-Juliamenge, Typ „Variante“.\n" +"9 = 3-D-Mangelbrotmenge, Typ „Madelbrot/Mandelbar“.\n" +"10 = 3-D-Juliamenge, Typ „Madelbrot/Mandelbar“.\n" +"11 = 3-D-Mangelbrotmenge, Typ „Weihnachtsbaum“.\n" +"12 = 3-D-Juliamenge, Typ „Weihnachtsbaum“.\n" +"13 = 3-D-Mangelbrotmenge, Typ „Mandelbulb“.\n" +"14 = 3-D-Juliamenge, Typ „Mandelbulb“.\n" +"15 = 3-D-Mangelbrotmenge, Typ „Kosinus-Mandelbulb“.\n" +"16 = 3-D-Juliamenge, Typ „Kosinus-Mandelbulb“.\n" +"17 = 4-D-Mangelbrotmenge, Typ „Mandelbulb“.\n" +"18 = 4-D-Juliamenge, Typ „Mandelbulb“." #: src/settings_translation_file.cpp msgid "Chunk size" @@ -1626,10 +1818,18 @@ msgid "Clean transparent textures" msgstr "Transparente Texturen säubern" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Client" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Client und Server" #: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "Client-Modding" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Klettergeschwindigkeit" @@ -1701,6 +1901,10 @@ msgid "Console color" msgstr "Konsolenfarbe" #: src/settings_translation_file.cpp +msgid "Console height" +msgstr "Konsolenhöhe" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Konsolentaste" @@ -1727,15 +1931,6 @@ msgstr "" "Veränderung." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Verändert die Größe der Wüsten und Strände im\n" -"Kartengenerator v6. Falls Schneebiome aktiviert sind, wird\n" -"„mgv6_freq_desert“ ignoriert." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Steuert die Steilheit/Tiefe von Seesenken." @@ -1744,6 +1939,14 @@ msgid "Controls steepness/height of hills." msgstr "Steuert die Steilheit/Höhe von Hügeln." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" +"Legt die Dichte von Gebirgen in den Schwebeländern fest.\n" +"Dies ist ein Versatz, der zum Rauschwert „np_mountain“ addiert wird." + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "" "Legt die Breite von Tunneln fest; ein kleinerer Wert erzeugt breitere Tunnel." @@ -1769,6 +1972,10 @@ msgstr "" "Sie können das Graben erschweren. Null deaktiviert sie. (0-10)" #: src/settings_translation_file.cpp +msgid "Creative" +msgstr "Kreativ" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Fadenkreuzundurchsichtigkeit" @@ -1805,6 +2012,10 @@ msgid "Debug log level" msgstr "Debugausgabelevel" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "Leiser-Taste" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Taktung dedizierter Server" @@ -1846,6 +2057,51 @@ msgstr "" "Hat nur eine Wirkung, wenn mit cURL kompiliert wurde." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" +"Definiert Bereiche von „terrain_higher“ (Gelände auf der Oberseite von " +"Klippen)." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" +"Definiert Gebiete von ruhig verlaufendem\n" +"Gelände in den Schwebeländern. Weiche\n" +"Schwebeländer treten auf, wenn der\n" +"Rauschwert > 0 ist." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" +"Definiert Gebiete von erhöhtem Terrain (Oberseite von Klippen) und\n" +"beeinflusst die Steilheit von Klippen." + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "Definiert Gebiete, in denen Bäume Äpfel tragen." + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "Definiert Gebiete mit Sandstränden." + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" +"Definiert die volle Größe von Hohlräumen, kleinere Werte erzeugen\n" +"größere Hohlräume." + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "Definiert große Flusskanalformationen." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "Definiert Ort und Gelände der optionalen Hügel und Seen." + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1860,6 +2116,20 @@ msgstr "" "in Kartenblöcken (0 = unbegrenzt)." #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "Definiert Baumgebiete und Baumdichte." + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" +"Zeitabstand zwischen Mesh-Updates auf dem Client in ms. Wenn dieser Wert\n" +"erhöht wird, wird die Rate der Mesh-Updates verringert, was das Stottern " +"auf\n" +"langsameren Clients reduziert." + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "Verzögerung beim Senden von Blöcken nach dem Bauen" @@ -1892,18 +2162,24 @@ msgstr "" "angezeigt." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "Blockanimationen desynchronisieren" +msgid "Desert noise threshold" +msgstr "Wüstenrauschschwellwert" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"Legt die Geländeform fest.\n" -"Die 3 Zahlen in Klammern steuern die Skalierung des\n" -"Geländes, die 3 Zahlen sollten gleich sein." +"Wüsten treten auf, wenn np_biome diesen Wert überschreitet.\n" +"Falls das neue Biomsystem aktiviert ist, wird dies ignoriert." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Blockanimationen desynchronisieren" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "Grabepartikel" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1955,10 +2231,26 @@ msgid "Enable Joysticks" msgstr "Joysticks aktivieren" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" +"Lua-Modding-Unterstützung auf dem Client aktivieren.\n" +"Diese Unterstützung ist experimentell und die API kann sich ändern." + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "VBO aktivieren" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Konsolenfenster aktivieren" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "Kreativmodus für neu erstellte Karten aktivieren." + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Modsicherheit aktivieren" @@ -2007,6 +2299,21 @@ msgstr "" "während des Verbindungsaufbaus zum Server herunterzuladen." #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "Wackeln der Ansicht aktivieren" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Hiermit aktiviert man die Auf- und Abbewegung\n" +"der Ansicht und legt außerdem die Stärke des\n" +"Effekts fest.\n" +"Zum Beispiel: 0 für keine Auf- und Abbewegung,\n" +"1.0 für den Standardwert, 2.0 für doppelte Geschwindigkeit." + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2018,7 +2325,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." -msgstr "Aktiviert die Animation von Inventaritems." +msgstr "Aktiviert die Animation von Inventargegenständen." #: src/settings_translation_file.cpp msgid "" @@ -2036,8 +2343,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" -"Aktiviert das Zwischenspeichern von 3D-Modellen, die mittels facedir rotiert " -"werden." +"Aktiviert das Zwischenspeichern von 3-D-Modellen, die mittels facedir " +"rotiert werden." #: src/settings_translation_file.cpp msgid "Enables filmic tone mapping" @@ -2064,6 +2371,10 @@ msgstr "" "Hierfür müssen Shader aktiviert sein." #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "Aktiviert die Auf- und Abbewegung der Ansicht beim Gehen." + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Engine-Profiling-Datenausgabeintervall" @@ -2088,8 +2399,12 @@ msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" -msgstr "Kameraschütteln beim Aufprallen" +msgid "Factor noise" +msgstr "Faktorrauschen" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "Kameraschütteln beim Sturz" #: src/settings_translation_file.cpp msgid "Fallback font" @@ -2164,6 +2479,10 @@ msgid "Filler Depth" msgstr "Fülltiefe" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "Fülltiefenrauschen" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "Filmisches Tone-Mapping" @@ -2185,10 +2504,34 @@ msgid "Filtering" msgstr "Filter" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "Das erste von zwei 3-D-Rauschen, welche gemeinsam Tunnel definieren." + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "Fester Karten-Seed" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "Schwebeland-Basishöhenrauschen" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "Schwebelandbasisrauschen" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "Schwebelandhöhe" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "Schwebelandbergdichte" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "Schwebelandberghöhe" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Flugtaste" @@ -2201,6 +2544,10 @@ msgid "Fog" msgstr "Nebel" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "Nebelbeginn" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Taste für Nebel umschalten" @@ -2233,13 +2580,23 @@ msgstr "Schriftgröße" #: src/settings_translation_file.cpp msgid "Format of screenshots." -msgstr "Format von Bildschirmfotos." +msgstr "Dateiformat von Bildschirmfotos." #: src/settings_translation_file.cpp msgid "Forward key" msgstr "Vorwärtstaste" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "Fraktaltyp" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" +"Anteil der sichtbaren Ertfernung, in welcher begonnen wird, den\n" +"Nebel zu rendern" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "FreeType-Schriften" @@ -2332,10 +2689,18 @@ msgid "Gravity" msgstr "Gravitation" #: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "Bodenhöhe" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "HTTP-Mods" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "HUD-Skalierungsfaktor" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Taste zum Umschalten des HUD" @@ -2351,9 +2716,8 @@ msgstr "" "- log: Imitieren, und den Backtrace des veralteten Funktionsaufrufs " "protokollieren\n" " (Standard für Debug).\n" -"- error: Bei Verwendung eines veralteten Funktionsaufrufs abbrechen (" -"empfohlen für Mod-\n" -" Entwickler)." +"- error: Bei Verwendung eines veralteten Funktionsaufrufs abbrechen\n" +" (empfohlen für Mod- Entwickler)." #: src/settings_translation_file.cpp msgid "" @@ -2365,28 +2729,60 @@ msgid "" msgstr "" "Den Profiler sich selbst instrumentieren lassen:\n" "* Instrumentiert eine leere Funktion.\n" -"Dies schätzt den Overhead, der von der Instrumentierung hinzugefügt wird, ab " -"(+1 Funktionsaufruf).\n" +"Dies schätzt den Overhead, der von der Instrumentierung\n" +"hinzugefügt wird, ab (+1 Funktionsaufruf).\n" "* Instrumentiert die Abtastfunktion, die zur Aktualisierung der Statistiken " "benutzt wird." #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "Hitzenübergangsrauschen" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "Hitzenrauschen" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "Höhenkomponente der anfänglichen Fenstergröße." #: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "Höhenrauschen" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "Höhe, in der Wolken auftauchen." #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "Höhenauswahlrauschen" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "Hochpräzisions-FPU" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "Hügelsteilheilt" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "Hügelschwellwert" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Homepage des Servers. Wird in der Serverliste angezeigt." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "Taste für nächsten Ggnstd. in Schnellleiste" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "Taste für vorherigen Ggnstd. in Schnellleiste" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Wie tief Flüsse sein sollen" @@ -2396,9 +2792,10 @@ msgid "" "mapblocks (16 nodes).\n" "In active blocks objects are loaded and ABMs run." msgstr "" -"Wie groß das Gebiet ist, in dem Kartenblöcke aktiv sind.\n" -"In aktiven Kartenblöcken werden Objekte geladen und ABMs ausgeführt.\n" -"1 Kartenblock = 16×16×16 Blöcke." +"Wie groß das Gebiet ist, in dem Kartenblöcke aktiv sind, in Kartenblöcken (" +"16 Blöcke)\n" +"angegeben.\n" +"In aktiven Kartenblöcken werden Objekte geladen und ABMs ausgeführt." #: src/settings_translation_file.cpp msgid "" @@ -2414,6 +2811,18 @@ msgid "How wide to make rivers" msgstr "Wie breit Flüsse sein sollen" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "Luftfeuchtigkeitsübergangsrauschen" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "Luftfeuchtigkeitsrauschen" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "Luftfeuchtigkeitsvariierung für Biome." + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2445,6 +2854,21 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" +"Falls aktiviert, wird der Server Occlusion Culling für Kartenblöcke " +"basierend\n" +"auf der Augenposition des Spielers anwenden. Dadurch kann die Anzahl\n" +"der Kartenblöcke, die zum Client gesendet werden, um 50-80% reduziert\n" +"werden. Der Client wird nicht mehr die meisten unsichtbaren Kartenblöcke\n" +"empfangen, was den Nutzen vom Geistmodus reduziert." + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2487,10 +2911,14 @@ msgstr "" #: src/settings_translation_file.cpp msgid "If enabled, new players cannot join with an empty password." msgstr "" -"Falls aktiviert, können neue Spieler nicht mit einem leeren Passwort\n" +"Falls aktiviert, können neue Spieler nicht mit einem leeren Passwort " "beitreten." #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "Falls aktiviert, wird die Serverstatusmeldung beim Verbinden angezeigt." + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2526,6 +2954,17 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Hintergrundfarbe (R,G,B) der Chat-Konsole im Spiel." #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" +"Chatkonsolenhöhe im Spiel, zwischen 0.1 (10%) und 1.0 (100%).\n" +"(Beachten Sie die englische Notation mit Punkt als\n" +"Dezimaltrennzeichen.)" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "Lauter-Taste" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2570,16 +3009,19 @@ msgstr "Instrumentierung" #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." msgstr "" -"Zeitintervall des Abspeicherns wichtiger Änderungen in der Welt,\n" -"in Sekunden." +"Zeitintervall des Abspeicherns wichtiger Änderungen in der Welt, in Sekunden." #: src/settings_translation_file.cpp msgid "Interval of sending time of day to clients." msgstr "Zeitintervall, in dem die Tageszeit an Clients gesendet wird." #: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "Inventarbild-Hack" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" -msgstr "Animierte Inventaritems" +msgstr "Animierte Inventargegenstände" #: src/settings_translation_file.cpp msgid "Inventory key" @@ -2598,6 +3040,10 @@ msgid "Item entity TTL" msgstr "Item-Entity-TTL" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "Iterationen" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." @@ -2606,6 +3052,14 @@ msgstr "" "Steuert die Skalierung mit einem sehr hohem Detailgrad." #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "Joystick-ID" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "Joystick-Typ" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "Joystick-Button-Wiederholungsrate" @@ -2622,7 +3076,7 @@ msgid "" msgstr "" "Nur für Juliamenge: W-Komponente der hyperkomplexen Konstanten, welche die " "Juliaform\n" -"festlegt. Hat keine Wirkung auf 3D-Fraktale.\n" +"festlegt. Hat keine Wirkung auf 3-D-Fraktale.\n" "Reichweite liegt grob zwischen -2 und 2." #: src/settings_translation_file.cpp @@ -2656,6 +3110,22 @@ msgstr "" "Weite liegt grob zwischen -2 und 2." #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "Julia-w" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "Julia-x" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "Julia-y" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "Julia-z" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Sprungtaste" @@ -2675,6 +3145,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Taste zur Reduzierung der Lautstärke.\n" +"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2695,6 +3175,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Taste zur Erhöhung der Lautstärke.\n" +"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2755,6 +3245,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Taste, um das Spiel stumm zu schalten.\n" +"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2775,6 +3275,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Taste, um das Chat-Fenster zu öffnen, um lokale Befehle einzugeben.\n" +"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2805,6 +3315,26 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Taste zum Auswählen des nächsten Gegenstands in der Schnellleiste.\n" +"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Taste zum Auswählen des vorherigen Gegenstands in der Schnellleiste.\n" +"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2950,6 +3480,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Taste, um die Anzeige der großen Chatkonsole umzuschalten.\n" +"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2969,10 +3509,28 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Taste, um die Zoom-Ansicht zu verwenden, falls möglich.\n" +"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "„Benutzen“-Taste zum Runterklettern" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "See-Steilheit" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "See-Schwellwert" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "Sprache" @@ -2981,6 +3539,10 @@ msgid "Large cave depth" msgstr "Tiefe für große Höhlen" #: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "Taste für große Chatkonsole" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "Lavakammern" @@ -3053,6 +3615,17 @@ msgstr "Limit der Erzeugungswarteschlangen" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" +"Grenze der Kartengenerierung, in Blöcken, in alle 6 Richtungen von\n" +"(0, 0, 0). Nur Mapchunks, die sich vollständig in der Kartengenerator-\n" +"grenze befinden, werden generiert. Der Wert wird für jede Welt\n" +"getrennt abgespeichert." + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -3138,8 +3711,12 @@ msgstr "" "falls es Probleme verursacht." #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "Macht alle Flüssigkeiten undurchsichtig" + +#: src/settings_translation_file.cpp msgid "Map directory" -msgstr "Kartenordner" +msgstr "Kartenverzeichnis" #: src/settings_translation_file.cpp msgid "" @@ -3184,17 +3761,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"Map generation attributes specific to Mapgen v5.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" -"Kartengenerierungsattribute speziell für den Kartengenerator v6.\n" -"Falls Schneebiome aktiviert, werden Dschungel aktiviert und das „jungles“-" -"Flag\n" -"wird ignoriert.\n" +"Kartengenerierungsattribute speziell für Kartengenerator v5.\n" "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n" "werden von der Standardeinstellung unverändert gelassen.\n" "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n" @@ -3202,14 +3774,37 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Kartengenerierungsattribute speziell für den Kartengenerator v6.\n" +"Das Flag „snowbiomes“ aktiviert das neue 5-Biom-System.\n" +"Falls das neue Biomsystem aktiviert ist, werden Dschungel automatisch " +"aktiviert\n" +"und das „jungles“-Flag wird ignoriert.\n" +"Flags, welche in der Flags-Zeichenkette nicht angegeben sind, werden von\n" +"der Standardeinstellung unverändert gelassen.\n" +"Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit zu\n" +"deaktivieren." + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" "Kartengenerierungsattribute speziell für Kartengenerator v7.\n" -"Das „ridges“-Flag steuert die Flüsse.\n" +"Das „ridges“-Flag aktviert die Flüsse.\n" +"Schwebeländer (engl. „floatlands“) sind momentan experimentell\n" +"und können in Zukunft geändert werden.\n" "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n" "werden von der Standardeinstellung unverändert gelassen.\n" "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n" @@ -3228,24 +3823,20 @@ msgid "Mapblock limit" msgstr "Kartenblock-Grenze" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "Timeout zum Entladen von Kartenblöcken" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Täler-Kartengenerator" +msgid "Mapblock mesh generation delay" +msgstr "Kartenblockmesh-Generierungsverzögerung" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "Biomhitzen-Rauschparameter" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "Cachegröße des Kartenblock-Meshgenerators in MB" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "Biomluftfeuchtigkeitsübergangs-Rauschparameter" +msgid "Mapblock unload timeout" +msgstr "Timeout zum Entladen von Kartenblöcken" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "Biomluftfeuchtigkeits-Rauschparameter" +msgid "Mapgen Valleys" +msgstr "Täler-Kartengenerator" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3260,118 +3851,14 @@ msgid "Mapgen flat" msgstr "Flacher Kartengenerator" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Höhlenbreite für den flachen Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "cave1-Rauschparameter für flachen Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "cave2-Rauschparameter für flachen Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "Fülltiefenrauschparameter für flachen Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "Flags für flachen Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "Basishöhe für flachen Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "Hügelsteilheilt für flachen Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "Hügel-Schwellwert für flachen Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "See-Steilheit für flachen Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "See-Schwellwert für flachen Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "Tiefe für große Höhlen für den flachen Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "Gelände-Rauschparameter für flachen Kartengenerator" +msgid "Mapgen flat specific flags" +msgstr "Flags spezifisch für flachen Kartengenerator" #: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "Fraktale-Kartengenerator" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "Höhlenbreite für den Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "cave1-Rauschparameter für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "cave2-Rauschparameter für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "Fülltiefenrauschparameter für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "Fraktale-Kartengenerator-Fraktal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "Iterationen für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "w-Parameter für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "x-Parameter für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "y-Parameter für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "z-Parameter für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "Versatz für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "Skalierung für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "Meeresgrundrauschparameter für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "w-Ausschnitt für Fraktale-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "Hitzenübergangs-Rauschparameter" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Kartengeneratorname" @@ -3380,144 +3867,24 @@ msgid "Mapgen v5" msgstr "v5-Kartengenerator" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "Höhlenbreite für v5-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "cave1-Höhlen-Rauschparameter für v5-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "cave2-Höhlen-Rauschparameter für v5-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "Faktor-Rauschparameter für v5-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "Fülltiefen-Rauschparameter für v5-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "Höhen-Rauschparameter für v5-Kartengenerator" +msgid "Mapgen v5 specific flags" +msgstr "Flags spezifich für Kartengenerator v5" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "v6-Kartengenerator" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "Apfelbaum-Rauschparameter für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "Strandhäufigkeit für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "Strand-Rauschparameter für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "Biom-Rauschparameter für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "Höhlen-Rauschparameter für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "Wüsten-Rauschparameter für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "v6-Kartengenerator-Flags" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "Höhenauswahl-Rauschparameter für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "Luftfeuchtigkeits-Rauschparameter für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "Schlamm-Rauschparameter für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "Steilheits-Rauschparameter für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "Geländehöhen-Rauschparameter für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "Basisgelände-Rauschparameter für v6-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "Baum-Rauschparameter für v6-Kartengenerator" +msgid "Mapgen v6 specific flags" +msgstr "Flags spezifich für Kartengenerator v6" #: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "v7-Kartengenerator" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "Höhlenbreite für v7-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "cave1-Höhlen-Rauschparameter für v7-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "cave2-Höhlen-Rauschparameter für v7-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "Fülltiefen-Rauschparameter für v7-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "v7-Kartengenerator-Flags" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "Höhenauswahl-Rauschparameter für v7-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "Berghöhen-Rauschparameter für v7-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "Berg-Rauschparameter für v7-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "Fluss-Rauschparameter für v7-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "Flusswasser-Rauschparameter für v7-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "Geländehöhen-Rauschparameter für v7-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "Basisgelände-Rauschparameter für v7-Kartengenerator" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "Geländepersistenz-Rauschparameter für v7-Kartengenerator" +msgid "Mapgen v7 specific flags" +msgstr "Flags spezifich für Kartengenerator v7" #: src/settings_translation_file.cpp msgid "Massive cave depth" @@ -3557,7 +3924,7 @@ msgstr "Maximale Bildwiederholrate" #: src/settings_translation_file.cpp msgid "Maximum FPS when game is paused." -msgstr "Maximale Bildwiederholrate, wenn das Spiel pausiert ist." +msgstr "Maximale Bildwiederholrate während das Spiel pausiert ist." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -3565,7 +3932,7 @@ msgstr "Maximal zwangsgeladene Kartenblöcke" #: src/settings_translation_file.cpp msgid "Maximum hotbar width" -msgstr "Max. Breite der Schnellzugriffsleiste" +msgstr "Maximale Breite der Schnellleiste" #: src/settings_translation_file.cpp msgid "Maximum number of blocks that are simultaneously sent in total." @@ -3643,7 +4010,7 @@ msgid "" "Useful if there's something to be displayed right or left of hotbar." msgstr "" "Maximales Verhältnis zum aktuellen Fenster, das für die\n" -"Schnellzugriffsleiste verwendet werden soll. Nützlich, wenn es\n" +"Schnellleiste verwendet werden soll. Nützlich, wenn es\n" "etwas gibt, was links oder rechts von ihr angezeigt werden soll." #: src/settings_translation_file.cpp @@ -3670,7 +4037,7 @@ msgstr "Menüs" #: src/settings_translation_file.cpp msgid "Mesh cache" -msgstr "3D-Modell-Zwischenspeicher" +msgstr "3-D-Modell-Zwischenspeicher" #: src/settings_translation_file.cpp msgid "Message of the day" @@ -3708,6 +4075,10 @@ msgid "Mipmapping" msgstr "Mip-Mapping" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "Modifiziert die Größe der HUD-Leistenelemente." + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "Modspeicher: Details-URL" @@ -3728,6 +4099,14 @@ msgid "Monospace font size" msgstr "Größe der Festbreitenschrift" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "Berghöhenrauschen" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "Bergrauschen" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "Mausempfindlichkeit" @@ -3736,22 +4115,21 @@ msgid "Mouse sensitivity multiplier." msgstr "Faktor für die Mausempfindlichkeit." #: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "Schlammrauschen" + +#: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" "Faktor für Kameraschütteln beim Sturz.\n" -"Zum Beispiel: 0 für kein Schütteln, 1.0 für den Standardwert, 2.0 für " -"doppelte Geschwindigkeit." +"Zum Beispiel: 0 für kein Schütteln, 1.0 für den Standardwert,\n" +"2.0 für doppelte Geschwindigkeit." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" -"Faktor für Auf- und Abbewegung (grafischer Effekt).\n" -"Zum Beispiel: 0 für keine Auf- und Abbewegung, 1.0 für den Standardwert, 2.0 " -"für doppelte Geschwindigkeit." +msgid "Mute key" +msgstr "Stummtaste" #: src/settings_translation_file.cpp msgid "" @@ -3815,12 +4193,6 @@ msgid "NodeTimer interval" msgstr "NodeTimer-Intervall" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" -"Rauschparameter für Temperatur-, Luftfeuchtigkeits- und Biomübergänge\n" -"in der Biom-API." - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "Rauschen" @@ -3867,8 +4239,18 @@ msgid "Number of parallax occlusion iterations." msgstr "Anzahl der Parallax-Occlusion-Iterationen." #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "Versatz" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "Undurchsichtige Flüssigkeiten" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Startwert des Parallax-Occlusion-Effektes, üblicherweise Skalierung/2." +msgstr "" +"Startwert des Parallax-Occlusion-Effektes, üblicherweise Skalierung geteilt " +"durch 2." #: src/settings_translation_file.cpp msgid "Overall scale of parallax occlusion effect." @@ -3907,6 +4289,15 @@ msgid "Path to save screenshots at." msgstr "Pfad, in dem Bildschirmfotos abgespeichert werden." #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" +"Pfad zum Shader-Verzeichnis. Falls kein Pfad definiert ist, wird der " +"Standard-\n" +"pfad benutzt." + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" "Pfad der Texturenverzeichnisse. Alle Texturen werden von dort zuerst gesucht." @@ -4014,6 +4405,14 @@ msgid "Report path" msgstr "Berichtspfad" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "Flusskanalrauschen" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "Flusskanal-Unterwasserrauschen" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Rechtstaste" @@ -4046,6 +4445,10 @@ msgid "Round minimap" msgstr "Runde Übersichtskarte" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "Sandstrände treten auf, wenn np_beach diesen Wert überschreitet." + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "Speichert die vom Client empfangene Karte auf dem Datenträger." @@ -4054,6 +4457,10 @@ msgid "Saving map received from server" msgstr "Karte vom Server speichern" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "Skalierung" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -4103,6 +4510,14 @@ msgstr "" "Benutzen Sie 0 für die Standardqualität." #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "Meeresgrundrauschen" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "Das zweite von zwei 3-D-Rauschen, welche gemeinsam Tunnel definieren." + +#: src/settings_translation_file.cpp msgid "Security" msgstr "Sicherheit" @@ -4147,6 +4562,10 @@ msgid "Server port" msgstr "Serverport" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "Serverseitiges Occlusion Culling" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "Serverlisten-URL" @@ -4187,14 +4606,23 @@ msgstr "" "Dafür müssen Shader aktiviert sein." #: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "Shader-Pfad" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" -"Shader werden für fortgeschrittene visuelle Effekte benötigt und können die " -"Performanz auf einigen Grafikkarten erhöhen.\n" -"Sie funktionieren nur mit dem OpenGL-Grafik-Backend." +"Shader ermöglichen fortgeschrittene visuelle Effekte und können die " +"Performanz auf\n" +"einigen Grafikkarten erhöhen. Das funktioniert nur mit dem OpenGL-Grafik-" +"Backend." + +#: src/settings_translation_file.cpp +msgid "Shadow limit" +msgstr "Schattenbegrenzung" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -4217,14 +4645,37 @@ msgid "" "Size of chunks to be generated at once by mapgen, stated in mapblocks (16 " "nodes)." msgstr "" -"Größe der Stücke, die gleichzeitig vom Kartengenerator erzeugt werden,\n" +"Größe der Chunks, die gleichzeitig vom Kartengenerator erzeugt werden,\n" "in Kartenblöcken (16×16×16 Blöcke)." #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" +"Größe vom Kartenblock-Cache des Meshgenerators. Wird sie\n" +"erhöht, wird die Cache-Trefferrate erhöht, was die Anzahl der Daten,\n" +"die vom Hauptthread kopiert werden, reduziert und somit das Stottern\n" +"reduziert." + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "w-Ausschnitt" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "Hänge und Füllungen arbeiten zusammen, um die Höhen zu verändern" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "Kleinräumige Luftfeuchtigkeitsvarriierung für Biomübergänge an Grenzen." + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "Kleinräumige Temperaturvariierung für Biomübergänge an Grenzen." + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "Geglättetes Licht" @@ -4233,8 +4684,8 @@ msgid "" "Smooths camera when looking around. Also called look or mouse smoothing.\n" "Useful for recording videos." msgstr "" -"Glättet Kamerabewegungen bei der Fortbewegung und beim Umsehen. Auch bekannt " -"als „Look Smoothing“ oder „Mouse Smoothing“.\n" +"Glättet Kamerabewegungen bei der Fortbewegung und beim Umsehen.\n" +"Auch bekannt als „Look Smoothing“ oder „Mouse Smoothing“.\n" "Nützlich zum Aufnehmen von Videos." #: src/settings_translation_file.cpp @@ -4273,6 +4724,14 @@ msgid "Static spawnpoint" msgstr "Statische Einstiegsposition" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "Statusmeldung beim Verbinden" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "Steilheitsrauschen" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "Stärke der generierten Normalmaps." @@ -4293,10 +4752,30 @@ msgid "Synchronous SQLite" msgstr "Synchrones SQLite" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "Temperaturvariierung für Biome." + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "Geländehöhe" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "Geländealternativrauschen" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "Geländebasisrauschen" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "Höheres-Gelände-Rauschen" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "Geländerauschen" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4317,6 +4796,10 @@ msgstr "" "Passen Sie diesen Wert in Richtung 0.0 für ein größeres Verhältnis an." #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "Geländepersistenzrauschen" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "Texturpfad" @@ -4334,15 +4817,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "The depth of dirt or other filler" -msgstr "Die Tiefe von Erde oder einem anderem Füller" +msgstr "Die Tiefe der Erde oder einem anderem Füller" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." msgstr "" -"Der Dateipfad relativ zu Ihrem Weltpfad, in dem Profile abgespeichert " -"werden.\n" +"Der Dateipfad relativ zu Ihrem Weltpfad, in dem Profile abgespeichert werden." + +#: 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 msgid "The network interface that the server listens on." @@ -4414,6 +4899,10 @@ msgstr "" "Maustaste gedrückt gehalten wird." #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "Der Typ des Joysticks" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "Diese Schrift wird von bestimmten Sprachen benutzt." @@ -4450,8 +4939,8 @@ msgid "" "This determines how long they are slowed down after placing or removing a " "node." msgstr "" -"Um Verzögerungen zu reduzieren, werden Kartenblockübertragungen verlangsamt," -"\n" +"Um Verzögerungen zu reduzieren, werden Kartenblockübertragungen " +"verlangsamt,\n" "wenn ein Spieler etwas baut. Diese Einstellung bestimmt, wie lange sie\n" "verlangsamt werden, nachdem ein Block platziert oder entfernt wurde." @@ -4464,6 +4953,10 @@ msgid "Tooltip delay" msgstr "Tooltip-Verzögerung" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "Bäumerauschen" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Trilinearer Filter" @@ -4483,11 +4976,36 @@ msgid "Trusted mods" msgstr "Vertrauenswürdige Mods" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" +"Typische Maximalhöhe, über und unter dem Mittelpunkt von Gebirgen in den\n" +"Schwebeländern." + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" "URL der Serverliste, die in der Mehrspieler-Registerkarte angezeigt wird." #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "Unterabtastung" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" +"Unterabtastung ist ähnlich der Verwendung einer niedrigeren Bildschirm-\n" +"auflösung, aber sie wird nur auf die Spielwelt angewandt, während die GUI\n" +"intakt bleibt.\n" +"Dies sollte einen beträchtlichen Performanzschub auf Kosten einer weniger\n" +"detaillierten Grafik geben." + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "Unbegrenzte Spielerübertragungsdistanz" @@ -4556,6 +5074,50 @@ msgid "Valleys C Flags" msgstr "C-Täler-Flags" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "Variierung der Biomfülltiefe." + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" +"Variierung der Hügelhöhe und Seetiefe in den ruhig verlaufenden\n" +"Regionen der Schwebeländer." + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "Varriierung der maximalen Berghöhe (in Blöcken)." + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "Variierung der Anzahl von Höhlen." + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" +"Variierung der vertikalen Skalierung des Geländes.\n" +"Falls das Rauschen < -0.55 ist, ist das Gelände nahezu flach.\n" +"(Beachten Sie die englische Notation mit Punkt als Dezimaltrennzeichen.)" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "Variiert die Tiefe der Blöcke an der Oberfläche von Biomen." + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" +"Variiert die Rauheit des Geländes.\n" +"Definiert den „persistence“-Wert für\n" +"„terrain_base“- und „terrain_alt“-Rauschen." + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "Varriiert die Steilheit von Klippen." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "Vertikale Bildschirmsynchronisation." @@ -4564,16 +5126,12 @@ msgid "Video driver" msgstr "Grafiktreiber" #: src/settings_translation_file.cpp -msgid "View bobbing" -msgstr "Auf- und Abbewegung der Ansicht" +msgid "View bobbing factor" +msgstr "Faktor für Wackeln der Ansicht" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" -msgstr "" -"Sichtweite in Blöcken.\n" -"Minimum = 20" +msgid "View distance in nodes." +msgstr "Sichtweite in Blöcken." #: src/settings_translation_file.cpp msgid "View range decrease key" @@ -4584,6 +5142,10 @@ msgid "View range increase key" msgstr "Taste „Sichtweite erhöhen“" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "Zoomansichtstaste" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "Sichtweite" @@ -4598,9 +5160,9 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" -"W-Koordinate des generierten 3D-Ausschnitts eines 4D-Fraktals.\n" -"Bestimmt, welcher 3D-Ausschnitt der 4D-Form generiert wird.\n" -"Hat keine Auswirkung auf 3D-Fraktale.\n" +"W-Koordinate des generierten 3-D-Ausschnitts eines 4-D-Fraktals.\n" +"Bestimmt, welcher 3-D-Ausschnitt der 4-D-Form generiert wird.\n" +"Hat keine Auswirkung auf 3-D-Fraktale.\n" "Die Weite liegt grob zwischen -2 und 2." #: src/settings_translation_file.cpp @@ -4695,25 +5257,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" -"Wo der Kartengenerator aufhört.\n" -"Bitte beachten Sie:\n" -"- Begrenzt auf 31000 (größere Werte sind wirkungslos).\n" -"- Der Kartengenerator arbeitet in Gruppen von 80×80×80 Blöcken\n" -" (5×5×5 Kartenblöcke).\n" -"- Diese Gruppen haben einen Abstand von [-32, -32] Blöcken vom Ursprung.\n" -"- Nur Gruppen, welche innerhalb der von map_generation_limit definierten " -"Grenze\n" -" liegen, werden erzeugt." - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" "Ob FreeType-Schriften benutzt werden.\n" @@ -4743,8 +5286,8 @@ msgid "" "Set this to true if your server is set up to restart automatically." msgstr "" "Ob Clients gefragt werden sollen, sich nach einem (Lua-)Absturz\n" -"neu zu verbinden. Auf „wahr“ setzen, falls Ihr Server für auto-\n" -"matische Neustarts eingerichtet ist." +"neu zu verbinden. Auf „wahr“ setzen, falls Ihr Server für automatische\n" +"Neustarts eingerichtet ist." #: src/settings_translation_file.cpp msgid "Whether to fog out the end of the visible area." @@ -4776,7 +5319,17 @@ msgstr "Breiten-Komponente der anfänglichen Fenstergröße." #: src/settings_translation_file.cpp msgid "Width of the selectionbox's lines around nodes." -msgstr "Breite der Linien der Auswahlbox um Blöcken." +msgstr "Breite der Auswahlboxlinien um Blöcke." + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" +"Nur für Windows-Systeme: Startet Minetest mit dem Kommandozeilenfenster im\n" +"Hintergrund. Enthält die selbe Information wie die Datei debug.txt " +"(Standardname)." #: src/settings_translation_file.cpp msgid "" @@ -4795,6 +5348,44 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "Y-Wert der Obergrenze von großen pseudozufälligen Höhlen." #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "Y-Entfernung, über welche Hohlräume zu voller Größe expandieren." + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "Y-Höhe der durchschnittlichen Geländeoberfläche." + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "Y-Höhe der Obergrenze von Hohlräumen." + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" +"Y-Höhe vom Mittelpunkt der Schwebeländer sowie\n" +"des Wasserspiegels von Seen." + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "Y-Höhe von erhöhtem Gelände (Oberseite von Klippen)." + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "Y-Höhe von niedrigerem Gelände und Seebetten." + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "Y-Höhe vom Seebett." + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "Y-Höhe, bis zu der sich die Schatten der Schwebeländer ausbreiten." + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "Distanz für Sendeoptimierungen von Kartenblöcken" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "cURL-Dateidownload-Zeitüberschreitung" @@ -4806,6 +5397,247 @@ msgstr "cURL-Parallel-Begrenzung" msgid "cURL timeout" msgstr "cURL-Zeitüberschreitung" +#~ msgid "Hide mp content" +#~ msgstr "Modpacks verstecken" + +#~ msgid "Start Game" +#~ msgstr "Spiel starten" + +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "Feststellen" + +#~ msgid "Comma" +#~ msgstr "Komma" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Final" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Minus" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Punkt" + +#~ msgid "Plus" +#~ msgstr "Plus" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Verändert die Größe der Wüsten und Strände im\n" +#~ "Kartengenerator v6. Falls Schneebiome aktiviert sind, wird\n" +#~ "„mgv6_freq_desert“ ignoriert." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Legt die Geländeform fest.\n" +#~ "Die 3 Zahlen in Klammern steuern die Skalierung des\n" +#~ "Geländes, die 3 Zahlen sollten gleich sein." + +#~ msgid "Mapgen biome heat noise parameters" +#~ msgstr "Biomhitzen-Rauschparameter" + +#~ msgid "Mapgen biome humidity blend noise parameters" +#~ msgstr "Biomluftfeuchtigkeitsübergangs-Rauschparameter" + +#~ msgid "Mapgen biome humidity noise parameters" +#~ msgstr "Biomluftfeuchtigkeits-Rauschparameter" + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Höhlenbreite für den flachen Kartengenerator" + +#~ msgid "Mapgen flat cave1 noise parameters" +#~ msgstr "cave1-Rauschparameter für flachen Kartengenerator" + +#~ msgid "Mapgen flat cave2 noise parameters" +#~ msgstr "cave2-Rauschparameter für flachen Kartengenerator" + +#~ msgid "Mapgen flat filler depth noise parameters" +#~ msgstr "Fülltiefenrauschparameter für flachen Kartengenerator" + +#~ msgid "Mapgen flat large cave depth" +#~ msgstr "Tiefe für große Höhlen für den flachen Kartengenerator" + +#~ msgid "Mapgen flat terrain noise parameters" +#~ msgstr "Gelände-Rauschparameter für flachen Kartengenerator" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Höhlenbreite für den Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal cave1 noise parameters" +#~ msgstr "cave1-Rauschparameter für Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal cave2 noise parameters" +#~ msgstr "cave2-Rauschparameter für Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal filler depth noise parameters" +#~ msgstr "Fülltiefenrauschparameter für Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Fraktale-Kartengenerator-Fraktal" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Iterationen für Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "w-Parameter für Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "x-Parameter für Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "y-Parameter für Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "z-Parameter für Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "Versatz für Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Skalierung für Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal seabed noise parameters" +#~ msgstr "Meeresgrundrauschparameter für Fraktale-Kartengenerator" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "w-Ausschnitt für Fraktale-Kartengenerator" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Höhlenbreite für v5-Kartengenerator" + +#~ msgid "Mapgen v5 cave1 noise parameters" +#~ msgstr "cave1-Höhlen-Rauschparameter für v5-Kartengenerator" + +#~ msgid "Mapgen v5 cave2 noise parameters" +#~ msgstr "cave2-Höhlen-Rauschparameter für v5-Kartengenerator" + +#~ msgid "Mapgen v5 factor noise parameters" +#~ msgstr "Faktor-Rauschparameter für v5-Kartengenerator" + +#~ msgid "Mapgen v5 filler depth noise parameters" +#~ msgstr "Fülltiefen-Rauschparameter für v5-Kartengenerator" + +#~ msgid "Mapgen v5 height noise parameters" +#~ msgstr "Höhen-Rauschparameter für v5-Kartengenerator" + +#~ msgid "Mapgen v6 apple trees noise parameters" +#~ msgstr "Apfelbaum-Rauschparameter für v6-Kartengenerator" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "Strandhäufigkeit für v6-Kartengenerator" + +#~ msgid "Mapgen v6 beach noise parameters" +#~ msgstr "Strand-Rauschparameter für v6-Kartengenerator" + +#~ msgid "Mapgen v6 biome noise parameters" +#~ msgstr "Biom-Rauschparameter für v6-Kartengenerator" + +#~ msgid "Mapgen v6 cave noise parameters" +#~ msgstr "Höhlen-Rauschparameter für v6-Kartengenerator" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "Wüsten-Rauschparameter für v6-Kartengenerator" + +#~ msgid "Mapgen v6 mud noise parameters" +#~ msgstr "Schlamm-Rauschparameter für v6-Kartengenerator" + +#~ msgid "Mapgen v6 steepness noise parameters" +#~ msgstr "Steilheits-Rauschparameter für v6-Kartengenerator" + +#~ msgid "Mapgen v6 terrain altitude noise parameters" +#~ msgstr "Geländehöhen-Rauschparameter für v6-Kartengenerator" + +#~ msgid "Mapgen v6 terrain base noise parameters" +#~ msgstr "Basisgelände-Rauschparameter für v6-Kartengenerator" + +#~ msgid "Mapgen v6 trees noise parameters" +#~ msgstr "Baum-Rauschparameter für v6-Kartengenerator" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Höhlenbreite für v7-Kartengenerator" + +#~ msgid "Mapgen v7 cave1 noise parameters" +#~ msgstr "cave1-Höhlen-Rauschparameter für v7-Kartengenerator" + +#~ msgid "Mapgen v7 cave2 noise parameters" +#~ msgstr "cave2-Höhlen-Rauschparameter für v7-Kartengenerator" + +#~ msgid "Mapgen v7 filler depth noise parameters" +#~ msgstr "Fülltiefen-Rauschparameter für v7-Kartengenerator" + +#~ msgid "Mapgen v7 height select noise parameters" +#~ msgstr "Höhenauswahl-Rauschparameter für v7-Kartengenerator" + +#~ msgid "Mapgen v7 mountain noise parameters" +#~ msgstr "Berg-Rauschparameter für v7-Kartengenerator" + +#~ msgid "Mapgen v7 ridge noise parameters" +#~ msgstr "Fluss-Rauschparameter für v7-Kartengenerator" + +#~ msgid "Mapgen v7 ridge water noise parameters" +#~ msgstr "Flusswasser-Rauschparameter für v7-Kartengenerator" + +#~ msgid "Mapgen v7 terrain altitude noise parameters" +#~ msgstr "Geländehöhen-Rauschparameter für v7-Kartengenerator" + +#~ msgid "Mapgen v7 terrain base noise parameters" +#~ msgstr "Basisgelände-Rauschparameter für v7-Kartengenerator" + +#~ msgid "Mapgen v7 terrain persistation noise parameters" +#~ msgstr "Geländepersistenz-Rauschparameter für v7-Kartengenerator" + +#~ msgid "" +#~ "Noise parameters for biome API temperature, humidity and biome blend." +#~ msgstr "" +#~ "Rauschparameter für Temperatur-, Luftfeuchtigkeits- und Biomübergänge\n" +#~ "in der Biom-API." + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "Wo der Kartengenerator aufhört.\n" +#~ "Bitte beachten Sie:\n" +#~ "- Begrenzt auf 31000 (größere Werte sind wirkungslos).\n" +#~ "- Der Kartengenerator arbeitet in Gruppen von 80×80×80 Blöcken\n" +#~ " (5×5×5 Kartenblöcke).\n" +#~ "- Diese Gruppen haben einen Abstand von [-32, -32] Blöcken vom " +#~ "Ursprung.\n" +#~ "- Nur Gruppen, welche innerhalb der von map_generation_limit " +#~ "definierten Grenze\n" +#~ " liegen, werden erzeugt." + #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "Detaillierte Mod-Profildaten. Nützlich für Mod-Entwickler." @@ -4874,9 +5706,6 @@ msgstr "cURL-Zeitüberschreitung" #~ msgid "If enabled, " #~ msgstr "Wenn aktiviert, " -#~ msgid "Rendering:" -#~ msgstr "Rendering:" - #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "Neustart nach Ändern des Treibers erforderlich" @@ -4973,9 +5802,6 @@ msgstr "cURL-Zeitüberschreitung" #~ "Warnung: Einige Mods sind noch nicht konfiguriert.\n" #~ "Sie werden aktiviert wenn die Konfiguration gespeichert wird. " -#~ msgid "Local install" -#~ msgstr "Lokale Install." - #~ msgid "Add mod:" #~ msgstr "Modifikation hinzufügen:" @@ -5030,9 +5856,6 @@ msgstr "cURL-Zeitüberschreitung" #~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\"" #~ msgstr "Gamemgr: Kann mod \"$1\" nicht in Spiel \"$2\" kopieren" -#~ msgid "Game Name" -#~ msgstr "Spielname" - #~ msgid " MB/s" #~ msgstr " MB/s" diff --git a/po/dv/minetest.po b/po/dv/minetest.po new file mode 100644 index 000000000..65a4f2fb6 --- /dev/null +++ b/po/dv/minetest.po @@ -0,0 +1,4688 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: minetest\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-21 17:39+0200\n" +"PO-Revision-Date: 2017-05-10 03:36+0000\n" +"Last-Translator: Unknown <abjinah@gmail.com>\n" +"Language-Team: Dhivehi <https://hosted.weblate.org/projects/minetest/" +"minetest/dv/>\n" +"Language: dv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.14-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "" + +#: builtin/client/init.lua +msgid "You died." +msgstr "" + +#: builtin/fstk/ui.lua +msgid "An error occured in a Lua script, such as a mod:" +msgstr "mod eh fadha Lua script eh gai massala eh dhimaa vejje" + +#: builtin/fstk/ui.lua +msgid "An error occured:" +msgstr "massala eh dhimaa vejje" + +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "maigandu menu" + +#: builtin/fstk/ui.lua builtin/mainmenu/store.lua +msgid "Ok" +msgstr "emme rangalhu" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "aa gulhumeh" + +#: builtin/fstk/ui.lua +msgid "The server has requested a reconnect:" +msgstr "server in aa gulhumakah edhijje" + +#: builtin/mainmenu/common.lua src/game.cpp +msgid "Loading..." +msgstr "loadvanee" + +#: builtin/mainmenu/common.lua +msgid "Protocol version mismatch. " +msgstr "Protocol vattharuge fushuerumeh. " + +#: builtin/mainmenu/common.lua +msgid "Server enforces protocol version $1. " +msgstr "Server in protocol $1 ah baarualhaa " + +#: builtin/mainmenu/common.lua +msgid "Server supports protocol versions between $1 and $2. " +msgstr "" +"$1 aai $2 ge dhemedhu gaivaa protocol ge vattharuthakah server ijaabadhey " + +#: builtin/mainmenu/common.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "aammu serverlist alun jessumah fahu masakkai kurey" + +#: builtin/mainmenu/common.lua +msgid "We only support protocol version $1." +msgstr "Aharemen hamaekani ijaabadheny protocol $1 ah." + +#: builtin/mainmenu/common.lua +msgid "We support protocol versions between version $1 and $2." +msgstr "" +"Aharamen protocol ge $1 aai $2 ge dhemedhu gaivaa vattharu thakah ijaabadhen." + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp +msgid "Cancel" +msgstr "baathilkurey" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +#, fuzzy +msgid "Dependencies:" +msgstr "Baroasavaa:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable MP" +msgstr "MP nivvaalaa" + +#: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "MP nivvaalaa" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable MP" +msgstr "MP jassaa" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable all" +msgstr "Hurihaa echcheh jassaa" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "" +"Failed to enable mod \"$1\" as it contains disallowed characters. Only " +"chararacters [a-z0-9_] are allowed." +msgstr "" +"Manaa akuru thah hurumuge sababun mod \"$1\" eh nujessunu. Hamaekani huddha " +"ee akuruthah[a in z ah adhi 0 in 9 kah]" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Mod:" +msgstr "Mod:" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + +#: builtin/mainmenu/dlg_config_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp +msgid "Save" +msgstr "Save kurey" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "World:" +msgstr "dhuniye:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "enabled" +msgstr "Þ–Þ¦Þ‡Þ°ÞÞ§ÞŠÞ¦" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "A world named \"$1\" already exists" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "Ufaddhaa" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Download a subgame, such as minetest_game, from minetest.net" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Download one from minetest.net" +msgstr "Ekathi minetest.net in download kurey" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Game" +msgstr "Game" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "Mapufaddhaa" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "No worldname given or no game selected" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Seed" +msgstr "o'" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Warning: The minimal development test is meant for developers." +msgstr "" +"Inzaaru: Minimal development test amaazukurevifai vanee hamaekani " +"developerunnah" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "World name" +msgstr "Dhuniyeygen nan" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "You have no subgames installed." +msgstr "Thibaa ge evvess subgame eh alhifaeh nei." + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Are you sure you want to delete \"$1\"?" +msgstr "" + +#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua +#: builtin/mainmenu/tab_local.lua src/keycode.cpp +msgid "Delete" +msgstr "" + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Modmgr: failed to delete \"$1\"" +msgstr "" + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Modmgr: invalid modpath \"$1\"" +msgstr "" + +#: builtin/mainmenu/dlg_delete_world.lua +msgid "Delete World \"$1\"?" +msgstr "" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Accept" +msgstr "" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "\"$1\" is not a valid flag." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "(No description of setting given)" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "< Back to Settings page" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Browse" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Disabled" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Format is 3 numbers separated by commas and inside brackets." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "" +"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " +"<octaves>, <persistence>" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Games" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua +msgid "Mods" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Optionally the lacunarity can be appended with a leading comma." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a comma seperated list of flags." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid integer." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Possible values are: " +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select path" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Show technical names" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "" + +#: builtin/mainmenu/modmgr.lua +msgid "" +"\n" +"Install Mod: unsupported filetype \"$1\" or broken archive" +msgstr "" + +#: builtin/mainmenu/modmgr.lua +msgid "Failed to install $1 to $2" +msgstr "" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: file: \"$1\"" +msgstr "" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: unable to find real modname for: $1" +msgstr "" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: unable to find suitable foldername for modpack $1" +msgstr "" + +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + +#: builtin/mainmenu/store.lua +msgid "Close store" +msgstr "" + +#: builtin/mainmenu/store.lua +msgid "Downloading $1, please wait..." +msgstr "" + +#: builtin/mainmenu/store.lua +msgid "Install" +msgstr "" + +#: builtin/mainmenu/store.lua +msgid "Page $1 of $2" +msgstr "" + +#: builtin/mainmenu/store.lua +msgid "Rating" +msgstr "" + +#: builtin/mainmenu/store.lua +msgid "Shortname:" +msgstr "" + +#: builtin/mainmenu/store.lua +msgid "Successfully installed:" +msgstr "" + +#: builtin/mainmenu/store.lua +msgid "Unsorted" +msgstr "" + +#: builtin/mainmenu/store.lua +msgid "re-Install" +msgstr "" + +#: builtin/mainmenu/tab_credits.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_credits.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_credits.lua +msgid "Credits" +msgstr "" + +#: builtin/mainmenu/tab_credits.lua +msgid "Previous Contributors" +msgstr "" + +#: builtin/mainmenu/tab_credits.lua +msgid "Previous Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Game foruvaa" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Game" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "" + +#: builtin/mainmenu/tab_mods.lua +msgid "Installed Mods:" +msgstr "" + +#: builtin/mainmenu/tab_mods.lua +msgid "Mod information:" +msgstr "" + +#: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua +msgid "No mod description available" +msgstr "" + +#: builtin/mainmenu/tab_mods.lua +msgid "Rename" +msgstr "" + +#: builtin/mainmenu/tab_mods.lua +msgid "Select Mod File:" +msgstr "" + +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected mod" +msgstr "" + +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected modpack" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Address / Port" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Connect" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative mode" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Damage enabled" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Del. Favorite" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Favorite" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Name / Password" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "2x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "3D Clouds" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "4x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "8x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Advanced Settings" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Antialiasing:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Are you sure to reset your singleplayer world?" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bump Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Change keys" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua +msgid "None" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Normal Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Parallax Occlusion" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Reset singleplayer world" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Settings" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "To enable shaders the OpenGL driver needs to be used." +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Touchthreshold (px)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Plants" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Water" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Yes" +msgstr "" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Config mods" +msgstr "" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Main" +msgstr "" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Start Singleplayer" +msgstr "" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "No information available" +msgstr "" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "Select texture pack:" +msgstr "" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "Texturepacks" +msgstr "" + +#: src/client.cpp +msgid "Connection timed out." +msgstr "" + +#: src/client.cpp +msgid "Done!" +msgstr "" + +#: src/client.cpp +msgid "Initializing nodes" +msgstr "" + +#: src/client.cpp +msgid "Initializing nodes..." +msgstr "" + +#: src/client.cpp +msgid "Loading textures..." +msgstr "" + +#: src/client.cpp +msgid "Rebuilding shaders..." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Connection error (timed out?)" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Could not find or load game \"" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Invalid gamespec." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Main Menu" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Provided world path doesn't exist: " +msgstr "" + +#: src/fontengine.cpp +msgid "needs_fallback_font" +msgstr "" + +#: src/game.cpp +msgid "" +"\n" +"Check debug.txt for details." +msgstr "" + +#: src/game.cpp +msgid "- Address: " +msgstr "" + +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "" + +#: src/game.cpp +msgid "- Damage: " +msgstr "" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +msgid "- Port: " +msgstr "" + +#: src/game.cpp +msgid "- Public: " +msgstr "" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +msgid "- Server Name: " +msgstr "" + +#: src/game.cpp +msgid "Change Keys" +msgstr "" + +#: src/game.cpp +msgid "Change Password" +msgstr "" + +#: src/game.cpp +msgid "Connecting to server..." +msgstr "" + +#: src/game.cpp +msgid "Continue" +msgstr "" + +#: src/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse left: dig/punch\n" +"- Mouse right: place/use\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" +msgstr "" + +#: src/game.cpp +msgid "Creating client..." +msgstr "" + +#: src/game.cpp +msgid "Creating server..." +msgstr "" + +#: src/game.cpp +msgid "" +"Default Controls:\n" +"No menu visible:\n" +"- single tap: button activate\n" +"- double tap: place/use\n" +"- slide finger: look around\n" +"Menu/Inventory visible:\n" +"- double tap (outside):\n" +" -->close\n" +"- touch stack, touch slot:\n" +" --> move stack\n" +"- touch&drag, tap 2nd finger\n" +" --> place single item to slot\n" +msgstr "" + +#: src/game.cpp +msgid "Exit to Menu" +msgstr "" + +#: src/game.cpp +msgid "Exit to OS" +msgstr "" + +#: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +msgid "Game paused" +msgstr "" + +#: src/game.cpp +msgid "Hosting server" +msgstr "" + +#: src/game.cpp +msgid "Item definitions..." +msgstr "" + +#: src/game.cpp +msgid "KiB/s" +msgstr "" + +#: src/game.cpp +msgid "Media..." +msgstr "" + +#: src/game.cpp +msgid "MiB/s" +msgstr "" + +#: src/game.cpp +msgid "Node definitions..." +msgstr "" + +#: src/game.cpp +msgid "Off" +msgstr "" + +#: src/game.cpp +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "" + +#: src/game.cpp +msgid "Shutting down..." +msgstr "" + +#: src/game.cpp +msgid "Singleplayer" +msgstr "" + +#: src/game.cpp +msgid "Sound Volume" +msgstr "" + +#: src/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" + +#: src/game.cpp src/guiFormSpecMenu.cpp +msgid "ok" +msgstr "" + +#: src/guiFormSpecMenu.cpp +msgid "Enter " +msgstr "" + +#: src/guiFormSpecMenu.cpp +msgid "Proceed" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "\"Use\" = climb down" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Backward" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Chat" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Command" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Left" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Print stacks" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Right" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle Cinematic" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Use" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Zoom" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Change" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "New Password" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Old Password" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + +#: src/guiVolumeChange.cpp +msgid "Exit" +msgstr "" + +#: src/guiVolumeChange.cpp +msgid "Sound Volume: " +msgstr "" + +#: src/keycode.cpp +msgid "Apps" +msgstr "" + +#: src/keycode.cpp +msgid "Back" +msgstr "" + +#: src/keycode.cpp +msgid "Caps Lock" +msgstr "" + +#: src/keycode.cpp +msgid "Clear" +msgstr "" + +#: src/keycode.cpp +msgid "Control" +msgstr "" + +#: src/keycode.cpp +msgid "Down" +msgstr "" + +#: src/keycode.cpp +msgid "End" +msgstr "" + +#: src/keycode.cpp +msgid "Erase EOF" +msgstr "" + +#: src/keycode.cpp +msgid "Execute" +msgstr "" + +#: src/keycode.cpp +msgid "Help" +msgstr "" + +#: src/keycode.cpp +msgid "Home" +msgstr "" + +#: src/keycode.cpp +msgid "IME Accept" +msgstr "" + +#: src/keycode.cpp +msgid "IME Convert" +msgstr "" + +#: src/keycode.cpp +msgid "IME Escape" +msgstr "" + +#: src/keycode.cpp +msgid "IME Mode Change" +msgstr "" + +#: src/keycode.cpp +msgid "IME Nonconvert" +msgstr "" + +#: src/keycode.cpp +msgid "Insert" +msgstr "" + +#: src/keycode.cpp +msgid "Left Button" +msgstr "" + +#: src/keycode.cpp +msgid "Left Control" +msgstr "" + +#: src/keycode.cpp +msgid "Left Menu" +msgstr "" + +#: src/keycode.cpp +msgid "Left Shift" +msgstr "" + +#: src/keycode.cpp +msgid "Left Windows" +msgstr "" + +#: src/keycode.cpp +msgid "Menu" +msgstr "" + +#: src/keycode.cpp +msgid "Middle Button" +msgstr "" + +#: src/keycode.cpp +msgid "Next" +msgstr "" + +#: src/keycode.cpp +msgid "Num Lock" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad *" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad +" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad -" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad ." +msgstr "" + +#: src/keycode.cpp +msgid "Numpad /" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 0" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 1" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 2" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 3" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 4" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 5" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 6" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 7" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 8" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 9" +msgstr "" + +#: src/keycode.cpp +msgid "OEM Clear" +msgstr "" + +#: src/keycode.cpp +msgid "Pause" +msgstr "" + +#: src/keycode.cpp +msgid "Play" +msgstr "" + +#: src/keycode.cpp +msgid "Print" +msgstr "" + +#: src/keycode.cpp +msgid "Prior" +msgstr "" + +#: src/keycode.cpp +msgid "Return" +msgstr "" + +#: src/keycode.cpp +msgid "Right Button" +msgstr "" + +#: src/keycode.cpp +msgid "Right Control" +msgstr "" + +#: src/keycode.cpp +msgid "Right Menu" +msgstr "" + +#: src/keycode.cpp +msgid "Right Shift" +msgstr "" + +#: src/keycode.cpp +msgid "Right Windows" +msgstr "" + +#: src/keycode.cpp +msgid "Scroll Lock" +msgstr "" + +#: src/keycode.cpp +msgid "Select" +msgstr "" + +#: src/keycode.cpp +msgid "Shift" +msgstr "" + +#: src/keycode.cpp +msgid "Sleep" +msgstr "" + +#: src/keycode.cpp +msgid "Snapshot" +msgstr "" + +#: src/keycode.cpp +msgid "Space" +msgstr "" + +#: src/keycode.cpp +msgid "Tab" +msgstr "" + +#: src/keycode.cpp +msgid "Up" +msgstr "" + +#: src/keycode.cpp +msgid "X Button 1" +msgstr "" + +#: src/keycode.cpp +msgid "X Button 2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n" +"Used to move a suitable spawn area of low land close to (0, 0).\n" +"The default is suitable for mandelbrot sets, it needs to be edited for julia " +"sets.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"0 = parallax occlusion with slope information (faster).\n" +"1 = relief mapping (slower, more accurate)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D support.\n" +"Currently supported:\n" +"- none: no 3d output.\n" +"- anaglyph: cyan/magenta color 3d.\n" +"- interlaced: odd/even line based polarisation screen support.\n" +"- topbottom: split screen top/bottom.\n" +"- sidebyside: split screen side by side.\n" +"- pageflip: quadbuffer based 3d." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"A chosen map seed for a new map, leave empty for random.\n" +"Will be overridden when creating a new world in the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server crashes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Absolute limit of emerge queues" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration in air" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Management interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifier interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" +"This setting is for the client only and is ignored by the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Altitude Chill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Always fly and fast" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amplifies the valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Anisotropic filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Announce to this serverlist.\n" +"If you want to announce your ipv6 address, use serverlist_url = v6.servers." +"minetest.net." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Approximate (X,Y,Z) scale of fractal in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ask to reconnect after crash" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automaticaly report to the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autorun key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base terrain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic Privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Builtin" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bumpmapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Caves and tunnels form at the intersection of the two noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chatcommands" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Choice of 18 fractals from 9 formulas.\n" +"1 = 4D \"Roundy\" mandelbrot set.\n" +"2 = 4D \"Roundy\" julia set.\n" +"3 = 4D \"Squarry\" mandelbrot set.\n" +"4 = 4D \"Squarry\" julia set.\n" +"5 = 4D \"Mandy Cousin\" mandelbrot set.\n" +"6 = 4D \"Mandy Cousin\" julia set.\n" +"7 = 4D \"Variation\" mandelbrot set.\n" +"8 = 4D \"Variation\" julia set.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot set.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" julia set.\n" +"11 = 3D \"Christmas Tree\" mandelbrot set.\n" +"12 = 3D \"Christmas Tree\" julia set.\n" +"13 = 3D \"Mandelbulb\" mandelbrot set.\n" +"14 = 3D \"Mandelbulb\" julia set.\n" +"15 = 3D \"Cosine Mandelbulb\" mandelbrot set.\n" +"16 = 3D \"Cosine Mandelbulb\" julia set.\n" +"17 = 4D \"Mandelbulb\" mandelbrot set.\n" +"18 = 4D \"Mandelbulb\" julia set." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Climbing speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cloud height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of mods that are allowed to access HTTP APIs, which\n" +"allow them to upload and download data to/from the internet." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of trusted mods that are allowed to access insecure\n" +"functions even when mod security is on (via request_insecure_environment())." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward movement (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays " +"unchanged." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/depth of lake depressions." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls width of tunnels, a smaller value creates wider tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Creates unpredictable lava features in caves.\n" +"These can make mining difficult. Zero disables them. (0-10)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Creates unpredictable water features in caves.\n" +"These can make mining difficult. Zero disables them. (0-10)" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Ufaddhaa" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crouch speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Default game when creating a new world.\n" +"This will be overridden when creating a world from the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Default timeout for cURL, stated in milliseconds.\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines sampling step of texture.\n" +"A higher value results in smoother normal maps." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find massive caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Descending speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Description of server, to be displayed when players join and in the " +"serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disable escape sequences" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Disable escape sequences, e.g. chat coloring.\n" +"Use this if you want to run a server with pre-0.4.14 clients and you want to " +"disable\n" +"the escape sequences generated by mods." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Domain name of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug infos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable Joysticks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable VBO" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable to disallow old clients from connecting.\n" +"Older clients are compatible in the sense that they will not crash when " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" +"to IPv6 clients, depending on system configuration.\n" +"Ignored if bind_address is set." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables bumpmapping for textures. Normalmaps need to be supplied by the " +"texture pack\n" +"or need to be auto-generated.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables filmic tone mapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables on the fly normalmap generation (Emboss effect).\n" +"Requires bumpmapping to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables parallax occlusion mapping.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Experimental option, might cause visible spaces between blocks\n" +"when set to higher number than 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS in pause menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Fast movement (via use key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view for zoom" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Field of view while zooming in degrees.\n" +"This requires the \"zoom\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler Depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Filtered textures can blend RGB values with fully-transparent neighbors,\n" +"which PNG optimizers usually discard, sometimes resulting in a dark or\n" +"light edge to transparent textures. Apply this filter to clean that up\n" +"at texture load time." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow offset, if 0 then shadow will not be drawn." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Freetype fonts" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Full screen BPP" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter txr2img" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Generate normalmaps" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Global callbacks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Global map generation attributes.\n" +"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" +"and junglegrass, in all other mapgens this flag controls all decorations.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Graphics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gravity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HTTP Mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated lua api calls:\n" +"- legacy: (try to) mimic old behaviour (default for release).\n" +"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height component of the initial window size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height on which clouds are appearing." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "High-precision FPU" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How large area of blocks are subject to the active block stuff, stated in " +"mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How much the server will wait before unloading unused mapblocks.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "How wide to make rivers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 support." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If FPS would go higher than this, limit it by sleeping\n" +"to not waste CPU power for no benefit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If disabled \"use\" key is used to fly fast if both fly and fast mode are " +"enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, \"use\" key instead of \"sneak\" key is used for climbing down " +"and descending." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, actions are recorded for rollback.\n" +"This option is only read when server starts." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, invalid world data won't cause the server to shut down.\n" +"Only enable this if you know what you are doing." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If enabled, new players cannot join with an empty password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-Game" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument chatcommands on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrumentation" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Interval of saving important changes in the world, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Interval of sending time of day to clients." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Controls the amount of fine detail." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: W component of hypercomplex constant determining julia " +"shape.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: X component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: Y component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: Z component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for printing debug stacks. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autorun.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Key use for climbing/descending" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lava Features" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over network." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Length of time between ABM execution cycles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Length of time between NodeTimer execution cycles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Limit of emerge queues on disk" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Limit of emerge queues to generate" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid sink" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu game manager" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu mod manager" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill' makes higher elevations colder, which may cause biome " +"issues.\n" +"'humid_rivers' modifies the humidity around rivers and in areas where water " +"would tend to pool,\n" +"it may interfere with delicately adjusted biomes.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen flat.\n" +"Occasional lakes and hills can be added to the flat world.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen flat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen flat specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen fractal" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v5" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v5 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v6 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v7" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v7 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Massive cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Massive cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Massive caves form here." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that are simultaneously sent in total." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that are simultaneously sent per client." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks to be queued that are to be generated.\n" +"Set to blank for an appropriate amount to be chosen automatically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks to be queued that are to be loaded from file.\n" +"Set to blank for an appropriate amount to be chosen automatically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of mapblocks for client to be kept in memory.\n" +"Set to -1 for unlimited amount." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can connect simultaneously." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum proportion of current window to be used for hotbar.\n" +"Useful if there's something to be displayed right or left of hotbar." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends total" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Menus" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum texture size for filters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mipmapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modstore details URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modstore download URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modstore mods list URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Multiplier for fall bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Network" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Network port to listen (UDP).\n" +"This value will be overridden when starting from the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "New users need to input this password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Normalmaps sampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Normalmaps strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use. Make this field blank, or increase this " +"number\n" +"to use multiple threads. On multiprocessor systems, this will improve mapgen " +"speed greatly\n" +"at the cost of slightly buggy caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of extra blocks that can be loaded by /clearobjects at once.\n" +"This is a trade-off between sqlite transaction overhead and\n" +"memory consumption (4096=100MB, as a rule of thumb)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of parallax occlusion iterations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Overall scale of parallax occlusion effect." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion Scale" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion bias" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to TrueTypeFont or bitmap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to save screenshots at." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Player is able to fly without being affected by gravity.\n" +"This requires the \"fly\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player versus Player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Port to connect to (UDP).\n" +"Note that the port field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds). 0 = " +"disable. Useful for developers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Right key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rightclick repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River Depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River Noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River Size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River noise -- rivers occur close to zero" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rollback recording" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Scale gui by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box border color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server / Singleplayer" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Serverlist URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Serverlist file" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the language. Leave empty to use the system language.\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving plants.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving water.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shaders allow advanced visual effects and may increase performance on some " +"video cards.\n" +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of chunks to be generated at once by mapgen, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of generated normalmaps." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of parallax." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Support older servers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain Height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The altitude at which temperature drops by 20C" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The depth of dirt or other filler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The privileges that new users automatically get.\n" +"See /privs in game for a full list on your server and mod configuration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The rendering back-end for Irrlicht." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"ingame view frustum around." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n" +"set to the nearest valid value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated right clicks when holding the " +"right mouse button." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "This font will be used for certain languages." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time in between active block management cycles" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Useable to make minimap smoother on slower machines." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use mip mapping to scale textures. May slightly increase performance." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use trilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "V-Sync" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "VBO" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Fill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Profile" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Slope" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valleys C Flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"W co-ordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water Features" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water length" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" +"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" +"enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether freetype fonts are used, requires freetype support to be compiled in." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether players are shown to clients without any range limit.\n" +"Deprecated, use the setting player_transfer_distance instead." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to ask clients to reconnect after a (Lua) crash.\n" +"Set this to true if your server is set up to restart automatically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to show the client debug info (has the same effect as hitting F5)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to support older servers before protocol version 25.\n" +"Enable if you want to connect to 0.4.12 servers and before.\n" +"Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n" +"Disabling this option will protect your password better." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width of the selectionbox's lines around nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"World directory (everything in the world is stored here).\n" +"Not needed if starting from the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large pseudorandom caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL file download timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL timeout" +msgstr "" + +#~ msgid "Hide mp content" +#~ msgstr "mp ge thakethi foruvaa" diff --git a/po/eo/minetest.po b/po/eo/minetest.po index adf29a0b6..4222d9a8d 100644 --- a/po/eo/minetest.po +++ b/po/eo/minetest.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-06-04 13:18+0000\n" -"Last-Translator: Tim <t4im@openmailbox.org>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-05-10 02:53+0000\n" +"Last-Translator: yellowcrash10 <corini98@gmail.com>\n" "Language-Team: Esperanto <https://hosted.weblate.org/projects/minetest/" "minetest/eo/>\n" "Language: eo\n" @@ -17,7 +17,15 @@ 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 2.7-dev\n" +"X-Generator: Weblate 2.14-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "RenaskiÄi" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Vi mortis." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -40,47 +48,54 @@ msgid "Reconnect" msgstr "Rekonekti" #: builtin/fstk/ui.lua +#, fuzzy msgid "The server has requested a reconnect:" -msgstr "Servilo petis rekonekton:" +msgstr "La servilo petis rekonekton:" #: builtin/mainmenu/common.lua src/game.cpp msgid "Loading..." msgstr "Åœargas…" #: builtin/mainmenu/common.lua +#, fuzzy msgid "Protocol version mismatch. " -msgstr "" +msgstr "Protokola versia miskongruo. " #: builtin/mainmenu/common.lua +#, fuzzy msgid "Server enforces protocol version $1. " -msgstr "" +msgstr "La servilo efikigas protokolan version $1. " #: builtin/mainmenu/common.lua +#, fuzzy msgid "Server supports protocol versions between $1 and $2. " -msgstr "" +msgstr "La servilo subtenas protokolajn versiojn inter $1 kaj $2. " #: builtin/mainmenu/common.lua msgid "Try reenabling public serverlist and check your internet connection." msgstr "Provu reÅalti la publikan serviloliston kaj kontrolu vian retkonekton." #: builtin/mainmenu/common.lua +#, fuzzy msgid "We only support protocol version $1." -msgstr "" +msgstr "Ni nur subtenas protokolan version $1." #: builtin/mainmenu/common.lua +#, fuzzy msgid "We support protocol versions between version $1 and $2." -msgstr "" +msgstr "Ni subtenas protokolajn versiojn inter versia $1 kaj $2." #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Nuligi" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Dependas:" #: builtin/mainmenu/dlg_config_world.lua @@ -88,6 +103,11 @@ msgid "Disable MP" msgstr "MalÅaltu modifaron" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "MalÅaltu modifaron" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Åœaltu modifaron" @@ -104,17 +124,13 @@ msgstr "" "literciferaj signoj [a-z0-9_] estas permesaj." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "KaÅu ludon" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "KaÅu modifarojn" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Modifo:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -178,8 +194,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Ĉu vi certas forigi \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Forigi" @@ -195,7 +210,7 @@ msgstr "Modmgr: malvalida modifo-dosierindiko \"$1\"" msgid "Delete World \"$1\"?" msgstr "Ĉu forigi mondon \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Akcepti" @@ -204,20 +219,23 @@ msgid "Rename Modpack:" msgstr "Alinomi modifaron:" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy msgid "\"$1\" is not a valid flag." -msgstr "" +msgstr "\"$1\" ne estas valida flago." #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy msgid "(No description of setting given)" -msgstr "" +msgstr "(Neniu priskribo de agordo donitis)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" -msgstr "" +msgstr "< Reiri al agorda paÄo" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy msgid "Browse" -msgstr "" +msgstr "Folii" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Disabled" @@ -232,8 +250,9 @@ msgid "Enabled" msgstr "Åœaltita" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy msgid "Format is 3 numbers separated by commas and inside brackets." -msgstr "" +msgstr "La aranÄo estas 3 diskomaj nombroj inter krampoj." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "" @@ -254,24 +273,32 @@ msgid "Optionally the lacunarity can be appended with a leading comma." msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy msgid "Please enter a comma seperated list of flags." -msgstr "" +msgstr "Bonvolu enigi diskomaj listo de parametroj." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." -msgstr "" +msgstr "Bonvolu enigi validan entjeron." #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy msgid "Please enter a valid number." -msgstr "" +msgstr "Bonvolu enigi validan nombron." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Possible values are: " -msgstr "" +msgstr "Eblaj valoroj estas: " #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy msgid "Restore Default" -msgstr "" +msgstr "Refari DefaÅlton" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Serĉi" #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy @@ -280,15 +307,17 @@ msgstr "Selekto" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Show technical names" -msgstr "" +msgstr "Demonstri teknikajn nomojn" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." -msgstr "" +#, fuzzy +msgid "The value must be at least $1." +msgstr "La valoro devas esti pli ol $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." -msgstr "" +#, fuzzy +msgid "The value must not be larger than $1." +msgstr "La valoro devas esti malpli ol $1." #: builtin/mainmenu/modmgr.lua msgid "" @@ -315,6 +344,10 @@ msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" "Instali modifon: Ne povis trovi Äustan dosierujan nomon por modifaro $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Fermi" @@ -336,10 +369,6 @@ msgid "Rating" msgstr "Takso" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Serĉi" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Konciza nomo:" @@ -375,6 +404,70 @@ msgstr "Eksaj kontribuistoj" msgid "Previous Core Developers" msgstr "Eksaj kernprogramistoj" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Asocianta adreso" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Agordi" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Kreiva reÄimo" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Åœalti damaÄon" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "KaÅu ludon" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Servilo" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Startigi ludon" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nomo/Pasvorto" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Nova" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Neniu mondo kreintas aÅ selektantas!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Ludanta nomo trolongas." + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Pordo" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Elektu mondon:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Servila pordo" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Instalantaj modifoj:" @@ -384,6 +477,10 @@ msgid "Mod information:" msgstr "Modifaj informoj:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Neniu modifa priskribo disponeblas" @@ -403,95 +500,48 @@ msgstr "Malinstali selektan modifo" msgid "Uninstall selected modpack" msgstr "Malinstali selektan modifaron" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Adreso / Pordo" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Kliento" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Konekti" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Kreiva reÄimo" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "DamaÄo Åaltitas" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#, fuzzy msgid "Del. Favorite" -msgstr "" +msgstr "Forigi Legosignon" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#, fuzzy msgid "Favorite" -msgstr "" +msgstr "Legosigni" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Nomo / Pasvorto" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Dueloj Åaltitas" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Asocianta adreso" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Agordi" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Kreiva reÄimo" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Åœalti damaÄon" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Nomo/Pasvorto" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Nova" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Neniu mondo kreintas aÅ selektantas!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Pordo" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Publika" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Elektu mondon:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Servilo" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Servila pordo" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Play Online" +msgstr "Ludanta nomo trolongas." -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Startigi ludon" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "Dueloj Åaltitas" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -522,6 +572,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Ĉu vi certas, ke vi volas nuligi vian solludantan mondon?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Bilineara filtrilo" @@ -599,6 +653,11 @@ msgid "Reset singleplayer world" msgstr "Nuligi solludantan mondon" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "Ekrankopio" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Agordoj" @@ -664,14 +723,6 @@ msgstr "Ĉefmenuo" msgid "Start Singleplayer" msgstr "Startigi solludanton" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Ludi" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Solludanto" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Neniu informoj disponeblas" @@ -733,12 +784,17 @@ msgid "Player name too long." msgstr "Ludanta nomo trolongas." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Donita monda dosierindiko ne ekzistas. " #: src/fontengine.cpp +#, fuzzy msgid "needs_fallback_font" -msgstr "no" +msgstr "bezonas_retrodefaÅltan_tiparon" #: src/game.cpp msgid "" @@ -749,6 +805,44 @@ msgstr "" "Reviziu debug.txt por detaloj." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Asocianta adreso" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Kreiva reÄimo" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "DamaÄon" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Pordo" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Publika" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Servilo" + +#: src/game.cpp msgid "Change Keys" msgstr "ÅœanÄi klavojn" @@ -765,26 +859,22 @@ msgid "Continue" msgstr "DaÅrigi" #: src/game.cpp -msgid "Creating client..." -msgstr "Krei klienton…" - -#: src/game.cpp -msgid "Creating server..." -msgstr "Krei servilon…" - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "DefaÅltaj Klavoj:\n" "- WASD: movi\n" @@ -799,6 +889,14 @@ msgstr "" "- T: babili\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Krei klienton…" + +#: src/game.cpp +msgid "Creating server..." +msgstr "Krei servilon…" + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -835,6 +933,20 @@ msgid "Exit to OS" msgstr "Foriri al operaciumo" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Ludoj" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Krei servilon…" + +#: src/game.cpp msgid "Item definitions..." msgstr "Aĵaj difinoj…" @@ -855,30 +967,52 @@ msgid "Node definitions..." msgstr "Nodaĵaj difinoj…" #: src/game.cpp -msgid "Resolving address..." -msgstr "Adrestrovili…" +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "RenaskiÄi" +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Adrestrovili…" #: src/game.cpp msgid "Shutting down..." msgstr "MalÅaltiÄi…" #: src/game.cpp +msgid "Singleplayer" +msgstr "Solludanto" + +#: src/game.cpp msgid "Sound Volume" msgstr "Sonintenso" #: src/game.cpp -msgid "You died." -msgstr "Vi mortis." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" msgstr "bone" #: src/guiFormSpecMenu.cpp +#, fuzzy msgid "Enter " msgstr "Enen " @@ -907,6 +1041,10 @@ msgid "Console" msgstr "Konzolo" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Dufoja tuÅeto \"salti\" por baskuli flugreÄimon" @@ -919,6 +1057,11 @@ msgid "Forward" msgstr "AntaÅen" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Sonintenso" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventaro" @@ -939,6 +1082,24 @@ msgstr "" msgid "Left" msgstr "Maldekstren" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Komando" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Sekvanto" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Presi stakojn" @@ -1016,38 +1177,22 @@ msgid "Apps" msgstr "Aplikaĵoj" #: src/keycode.cpp -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" msgstr "Retro" #: src/keycode.cpp -msgid "Capital" -msgstr "FiksiÄema klavo" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Vakigo" #: src/keycode.cpp -msgid "Comma" -msgstr "Komo" - -#: src/keycode.cpp msgid "Control" msgstr "Stiro" #: src/keycode.cpp -msgid "Convert" -msgstr "Konverto" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Malsupren" @@ -1056,26 +1201,15 @@ msgid "End" msgstr "Fino" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "ViÅi OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Eskapo" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Ruli" #: src/keycode.cpp -msgid "Final" -msgstr "Finalo" - -#: src/keycode.cpp msgid "Help" msgstr "Helpo" @@ -1084,20 +1218,33 @@ msgid "Home" msgstr "Hejmen" #: src/keycode.cpp -msgid "Insert" -msgstr "Enmeti" +#, fuzzy +msgid "IME Accept" +msgstr "Akcepti" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Convert" +msgstr "Konverto" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +#, fuzzy +msgid "IME Escape" +msgstr "Eskapo" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +#, fuzzy +msgid "IME Mode Change" +msgstr "ReÄima ÅanÄo" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "Nekonverto" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Enmeti" #: src/keycode.cpp msgid "Left Button" @@ -1117,7 +1264,7 @@ msgstr "Maldekstra Majuskligo" #: src/keycode.cpp msgid "Left Windows" -msgstr "Maldekstra fenestro" +msgstr "Maldekstra Vindozo" #: src/keycode.cpp msgid "Menu" @@ -1128,22 +1275,10 @@ msgid "Middle Button" msgstr "Meza butono" #: src/keycode.cpp -msgid "Minus" -msgstr "Minuso" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "ReÄima ÅanÄo" - -#: src/keycode.cpp msgid "Next" msgstr "Sekvanto" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nekonverto" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Nombra Baskulo" @@ -1160,6 +1295,11 @@ msgid "Numpad -" msgstr "Klavareto -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Klavareto *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Klavareto /" @@ -1208,20 +1348,12 @@ msgid "OEM Clear" msgstr "OEM Vakigi" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Haltigo" #: src/keycode.cpp -msgid "Period" -msgstr "Punkto" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Pluso" +msgid "Play" +msgstr "Ludi" #: src/keycode.cpp msgid "Print" @@ -1253,7 +1385,7 @@ msgstr "Dekstra Majuskligo" #: src/keycode.cpp msgid "Right Windows" -msgstr "Dekstra fenestro" +msgstr "Dekstra Vindozo" #: src/keycode.cpp msgid "Scroll Lock" @@ -1316,6 +1448,20 @@ msgstr "3D nuboj" #: src/settings_translation_file.cpp msgid "3D mode" +msgstr "3D reÄimo" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." msgstr "" #: src/settings_translation_file.cpp @@ -1349,8 +1495,9 @@ msgid "Absolute limit of emerge queues" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "Acceleration in air" -msgstr "" +msgstr "Rapidigo en aero" #: src/settings_translation_file.cpp msgid "Active Block Management interval" @@ -1380,6 +1527,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1387,7 +1538,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" @@ -1412,6 +1564,12 @@ msgid "Amplifies the valleys" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "" @@ -1427,6 +1585,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" @@ -1435,6 +1597,19 @@ msgid "Ask to reconnect after crash" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "" @@ -1461,6 +1636,14 @@ msgid "Basic Privileges" msgstr "" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Bilineara filtrilo" @@ -1470,6 +1653,14 @@ msgid "Bind address" msgstr "Asocianta adreso" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" @@ -1498,6 +1689,10 @@ msgid "Camera update toggle key" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "" @@ -1510,6 +1705,31 @@ msgid "Cave width" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Mondogenerilo" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1570,10 +1790,19 @@ msgid "Clean transparent textures" msgstr "" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Kliento" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Kliento" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "" @@ -1643,6 +1872,11 @@ msgid "Console color" msgstr "Konzola koloro" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Konzola klavo" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Konzola klavo" @@ -1666,17 +1900,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp @@ -1700,6 +1934,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Krei" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" @@ -1736,6 +1975,10 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "" @@ -1772,6 +2015,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1782,6 +2060,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1812,18 +2100,26 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Digging particles" +msgstr "Åœaltu ĉiujn" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Disable anticheat" msgstr "Åœalti partiklojn" @@ -1870,11 +2166,25 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Enable VBO" msgstr "Åœaltu modifaron" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Enable mod security" msgstr "Interreta modifo-deponejo" @@ -1911,6 +2221,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -1956,6 +2276,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -1978,7 +2302,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2049,6 +2377,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2066,10 +2398,34 @@ msgid "Filtering" msgstr "Neniu filtrilo" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "" @@ -2082,6 +2438,10 @@ msgid "Fog" msgstr "" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -2119,6 +2479,14 @@ msgid "Forward key" msgstr "AntaÅen" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2200,10 +2568,19 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Ground level" +msgstr "Mondogenerilo" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "HTTP Mods" msgstr "Modifoj" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2225,22 +2602,57 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Dekstra Vindozo" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Paralaksa Okludo" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Mondogenerilo" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2262,6 +2674,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2287,6 +2711,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2319,6 +2752,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2347,6 +2784,15 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Konzola klavo" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2389,6 +2835,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Inventaro" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2410,12 +2861,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2453,6 +2916,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Jump key" msgstr "Salti" @@ -2470,6 +2949,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2484,6 +2970,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2526,6 +3019,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2540,6 +3040,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2561,6 +3068,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2661,6 +3182,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2674,10 +3202,27 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Paralaksa Okludo" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Mondogenerilo" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2686,6 +3231,11 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Konzola klavo" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2742,6 +3292,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2816,6 +3373,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2843,9 +3404,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2854,7 +3424,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2873,25 +3444,21 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen Valleys" -msgstr "Mondogenerilo" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen Valleys" +msgstr "Mondogenerilo" #: src/settings_translation_file.cpp #, fuzzy @@ -2910,130 +3477,16 @@ msgstr "Mondogenerilo" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen flat cave width" -msgstr "Mondogenerilo" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat flags" -msgstr "Mondogenerilo" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat ground level" -msgstr "Mondogenerilo" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake steepness" -msgstr "Paralaksa Okludo" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake threshold" +msgid "Mapgen flat specific flags" msgstr "Mondogenerilo" #: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp #, fuzzy msgid "Mapgen fractal" msgstr "Mondogenerilo" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen fractal cave width" -msgstr "Mondogenerilo" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal fractal" -msgstr "Mondogenerilo" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal iterations" -msgstr "Paralaksa Okludo" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal offset" -msgstr "Mondogenerilo" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal scale" -msgstr "Mondogenerilo" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal slice w" -msgstr "Mondogenerilo" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen name" msgstr "Mondogenerilo" @@ -3044,89 +3497,18 @@ msgstr "Mondogenerilo" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v5 cave width" +msgid "Mapgen v5 specific flags" msgstr "Mondogenerilo" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp #, fuzzy msgid "Mapgen v6" msgstr "Mondogenerilo" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen v6 specific flags" +msgstr "Mondogenerilo" #: src/settings_translation_file.cpp #, fuzzy @@ -3135,58 +3517,10 @@ msgstr "Mondogenerilo" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v7 cave width" +msgid "Mapgen v7 specific flags" msgstr "Mondogenerilo" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Massive cave depth" msgstr "" @@ -3352,6 +3686,10 @@ msgid "Mipmapping" msgstr "Protuberancmapado" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3372,6 +3710,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3380,18 +3726,21 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "premi klavon" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3441,10 +3790,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3481,6 +3826,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3527,6 +3880,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3623,6 +3982,14 @@ msgid "Report path" msgstr "Selekto" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Right key" msgstr "Dekstra Menuo" @@ -3656,6 +4023,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3664,6 +4035,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3707,6 +4082,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3757,6 +4140,10 @@ msgid "Server port" msgstr "Servila pordo" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Serverlist URL" msgstr "Publika servilolisto" @@ -3791,10 +4178,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Ombrigiloj" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3820,10 +4216,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Smooth lighting" msgstr "Glatiga lumo" @@ -3864,6 +4279,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Strength of generated normalmaps." msgstr "Generi Normalmapojn" @@ -3885,10 +4308,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3903,6 +4346,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Texture path" msgstr "Teksturaroj" @@ -3923,8 +4370,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -3975,6 +4425,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -4017,6 +4471,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Trilinear filtering" msgstr "Triineara filtrilo" @@ -4033,10 +4491,29 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Undersampling" +msgstr "Bildigo:" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4102,6 +4579,42 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4110,13 +4623,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4128,6 +4639,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4221,16 +4736,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4281,6 +4786,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4290,7 +4802,44 @@ msgid "Y of flat ground." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "Y of upper limit of large pseudorandom caves." +msgstr "Y de limesosupremo de grandaj kvazaÅstokastaj kavernoj." + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" msgstr "" #: src/settings_translation_file.cpp @@ -4303,7 +4852,85 @@ msgstr "" #: src/settings_translation_file.cpp msgid "cURL timeout" -msgstr "" +msgstr "cURL tempolimo" + +#~ msgid "Hide mp content" +#~ msgstr "KaÅu modifarojn" + +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "FiksiÄema klavo" + +#~ msgid "Comma" +#~ msgstr "Komo" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Finalo" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Minuso" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Punkto" + +#~ msgid "Plus" +#~ msgstr "Pluso" + +#, fuzzy +#~ msgid "Mapgen flat cave width" +#~ msgstr "Mondogenerilo" + +#, fuzzy +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Mondogenerilo" + +#, fuzzy +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Mondogenerilo" + +#, fuzzy +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Paralaksa Okludo" + +#, fuzzy +#~ msgid "Mapgen fractal offset" +#~ msgstr "Mondogenerilo" + +#, fuzzy +#~ msgid "Mapgen fractal scale" +#~ msgstr "Mondogenerilo" + +#, fuzzy +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Mondogenerilo" + +#, fuzzy +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Mondogenerilo" + +#, fuzzy +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Mondogenerilo" #, fuzzy #~ msgid "Useful for mod developers." @@ -4330,9 +4957,6 @@ msgstr "" #~ msgid "If enabled, " #~ msgstr "Åaltita" -#~ msgid "Rendering:" -#~ msgstr "Bildigo:" - #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "Restartigu Minetest-on por efikigi pelilan ÅanÄon" diff --git a/po/es/minetest.po b/po/es/minetest.po index 72438dc26..a3318190c 100644 --- a/po/es/minetest.po +++ b/po/es/minetest.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-10-04 03:39+0000\n" -"Last-Translator: Alfonso R. Zepeda R. <ing.a.zepeda@gmx.com>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-05-16 15:43+0000\n" +"Last-Translator: Michael Higuera <mineyoshist@protonmail.ch>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/minetest/" "minetest/es/>\n" "Language: es\n" @@ -17,7 +17,15 @@ 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 2.9-dev\n" +"X-Generator: Weblate 2.14-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Revivir" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Has muerto." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -77,12 +85,13 @@ msgstr "Nosotros soportamos versiones de protocolo entre la versión $1 y $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Cancelar" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Dependencias:" #: builtin/mainmenu/dlg_config_world.lua @@ -90,6 +99,11 @@ msgid "Disable MP" msgstr "Desactivar paquete" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Desactivar paquete" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Activar paquete" @@ -106,17 +120,13 @@ msgstr "" "los caracteres [a-z0-9_] están permitidos." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Ocultar juego" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Ocultar contenido" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -181,8 +191,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "¿Realmente desea borrar \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Borrar" @@ -198,7 +207,7 @@ msgstr "Modmgr: Ruta del mod \"$1\" inválida" msgid "Delete World \"$1\"?" msgstr "¿Eliminar el mundo \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Aceptar" @@ -281,6 +290,11 @@ msgstr "Los valores posibles son: " msgid "Restore Default" msgstr "Restablecer por defecto" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Buscar" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Seleccionar ruta" @@ -290,11 +304,13 @@ msgid "Show technical names" msgstr "Mostrar los nombres técnicos" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "El valor debe ser mayor que $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "El valor debe ser menor que $1." #: builtin/mainmenu/modmgr.lua @@ -323,6 +339,10 @@ msgstr "" "Instalar mod: Imposible encontrar un nombre de archivo adecuado para el " "paquete de mod $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + # En el menú principal de mods pone repositorio no tienda. #: builtin/mainmenu/store.lua msgid "Close store" @@ -345,10 +365,6 @@ msgid "Rating" msgstr "Clasificación" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Buscar" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Nombre corto:" @@ -384,6 +400,72 @@ msgstr "Antiguos colaboradores" msgid "Previous Core Developers" msgstr "Antiguos desarrolladores principales" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "Anunciar servidor" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Asociar dirección" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Configurar" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Modo creativo" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Permitir daños" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Ocultar juego" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Servidor" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Iniciar juego" + +# Los dos puntos son intencionados. +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nombre / contraseña" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Nuevo" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "¡No se ha dado un nombre al mundo o no se ha seleccionado uno!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Nombre del jugador" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Puerto" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Selecciona un mundo:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Puerto del servidor" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Mods instalados:" @@ -393,6 +475,10 @@ msgid "Mod information:" msgstr "Información del mod:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "La descripción del mod no está disponible" @@ -413,96 +499,46 @@ msgstr "Desinstalar el mod seleccionado" msgid "Uninstall selected modpack" msgstr "Desinstalar el paquete seleccionado" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Dirección / puerto" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Cliente" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Conectar" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Modo creativo" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Daño activado" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Borrar Fav." -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Favorito" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Nombre / contraseña" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP activado" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Asociar dirección" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Configurar" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Modo creativo" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Permitir daños" - -# Los dos puntos son intencionados. -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Nombre / contraseña" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Nuevo" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "¡No se ha dado un nombre al mundo o no se ha seleccionado uno!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Puerto" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Público" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Selecciona un mundo:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Servidor" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Puerto del servidor" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Play Online" +msgstr "Nombre del jugador" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Iniciar juego" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP activado" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -533,6 +569,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "¿Estás seguro de querer reiniciar el mundo de un jugador?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Filtrado bilineal" @@ -609,6 +649,11 @@ msgid "Reset singleplayer world" msgstr "Reiniciar mundo de un jugador" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "Captura de pantalla" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Configuración" @@ -672,14 +717,6 @@ msgstr "Principal" msgid "Start Singleplayer" msgstr "Comenzar un jugador" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Jugar" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Un jugador" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Sin información disponible" @@ -744,6 +781,10 @@ msgid "Player name too long." msgstr "Nombre de jugador demasiado largo." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "La ruta del mundo especificada no existe: " @@ -760,6 +801,44 @@ msgstr "" "Revisa debug.txt para más detalles." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Asociar dirección" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Modo creativo" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Daño" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Puerto" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Público" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Nombre del servidor" + +#: src/game.cpp msgid "Change Keys" msgstr "Configurar teclas" @@ -776,26 +855,22 @@ msgid "Continue" msgstr "Continuar" #: src/game.cpp -msgid "Creating client..." -msgstr "Creando cliente..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Creando servidor..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Controles predeterminados:\n" "- WASD: moverse\n" @@ -810,6 +885,14 @@ msgstr "" "- T: chat\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Creando cliente..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Creando servidor..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -846,6 +929,20 @@ msgid "Exit to OS" msgstr "Salir al S.O." #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Juegos" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Creando servidor..." + +#: src/game.cpp msgid "Item definitions..." msgstr "Definiciones de objetos..." @@ -866,24 +963,46 @@ msgid "Node definitions..." msgstr "Definiciones de nodos..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Resolviendo dirección..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Revivir" +msgid "On" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "Anunciar servidor" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Resolviendo dirección..." #: src/game.cpp msgid "Shutting down..." msgstr "Cerrando..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Un jugador" + +#: src/game.cpp msgid "Sound Volume" msgstr "Volumen del sonido" #: src/game.cpp -msgid "You died." -msgstr "Has muerto." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -918,6 +1037,10 @@ msgid "Console" msgstr "Consola" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Pulsar dos veces \"saltar\" para volar" @@ -930,6 +1053,11 @@ msgid "Forward" msgstr "Adelante" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Volumen del sonido" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventario" @@ -951,6 +1079,24 @@ msgstr "" msgid "Left" msgstr "Izquierda" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Comandos de Chat" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Siguiente" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Imprimir pilas" @@ -1029,38 +1175,22 @@ msgid "Apps" msgstr "Aplicaciones" #: src/keycode.cpp -msgid "Attn" -msgstr "Atentamente" - -#: src/keycode.cpp msgid "Back" msgstr "Atrás" #: src/keycode.cpp -msgid "Capital" -msgstr "Bloq Mayús" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Limpiar" #: src/keycode.cpp -msgid "Comma" -msgstr "Coma" - -#: src/keycode.cpp msgid "Control" msgstr "Control" #: src/keycode.cpp -msgid "Convert" -msgstr "Convertir" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Abajo" @@ -1069,26 +1199,15 @@ msgid "End" msgstr "Fin" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Borrar OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Escape" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Ejecutar" #: src/keycode.cpp -msgid "Final" -msgstr "Final" - -#: src/keycode.cpp msgid "Help" msgstr "Ayuda" @@ -1097,20 +1216,33 @@ msgid "Home" msgstr "Inicio" #: src/keycode.cpp -msgid "Insert" -msgstr "Introducir" +#, fuzzy +msgid "IME Accept" +msgstr "Aceptar" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Convert" +msgstr "Convertir" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +#, fuzzy +msgid "IME Escape" +msgstr "Escape" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +#, fuzzy +msgid "IME Mode Change" +msgstr "Cambio de modo" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "No convertir" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Introducir" #: src/keycode.cpp msgid "Left Button" @@ -1141,22 +1273,10 @@ msgid "Middle Button" msgstr "Botón central" #: src/keycode.cpp -msgid "Minus" -msgstr "Menos" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Cambio de modo" - -#: src/keycode.cpp msgid "Next" msgstr "Siguiente" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "No convertir" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Bloq Núm" @@ -1173,6 +1293,11 @@ msgid "Numpad -" msgstr "Numpad -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Teclado Numérico *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Numpad /" @@ -1221,20 +1346,12 @@ msgid "OEM Clear" msgstr "Limpiar OEM" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pausa" #: src/keycode.cpp -msgid "Period" -msgstr "Punto" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Más" +msgid "Play" +msgstr "Jugar" #: src/keycode.cpp msgid "Print" @@ -1340,6 +1457,20 @@ msgid "3D mode" msgstr "Modo 3D" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1395,9 +1526,8 @@ msgid "Active Block Modifier interval" msgstr "Intervalo de modificador de bloques activos" #: src/settings_translation_file.cpp -#, fuzzy msgid "Active Block Modifiers" -msgstr "Intervalo de modificador de bloques activos" +msgstr "Modificadores de bloques activos" #: src/settings_translation_file.cpp msgid "Active block range" @@ -1418,6 +1548,10 @@ msgstr "" "Nótese que el campo de dirección en el menú principal anula este ajuste." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1426,8 +1560,10 @@ msgstr "" "Android) p.ej. para pantallas 4K." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "Ajustar la codificación gamma para las tablas de luz. Los números mas bajos " @@ -1455,6 +1591,12 @@ msgid "Amplifies the valleys" msgstr "Amplificar valles" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Filtrado anisotrópico" @@ -1473,6 +1615,10 @@ msgstr "" "minetest.net." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "Escala aproximada (X,Y,Z) del fractal en nodos." @@ -1481,6 +1627,19 @@ msgid "Ask to reconnect after crash" msgstr "Preguntar para volver a conectar despues de una caÃda" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Automáticamente informar a la lista del servidor." @@ -1505,6 +1664,14 @@ msgid "Basic Privileges" msgstr "Privilegios básicos" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Filtrado bilineal" @@ -1513,6 +1680,14 @@ msgid "Bind address" msgstr "Dirección BIND" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" "Bits por pÃxel (también conocido como profundidad de color) en modo de " @@ -1523,8 +1698,9 @@ msgid "Build inside player" msgstr "Construir dentro de jugador" #: src/settings_translation_file.cpp +#, fuzzy msgid "Builtin" -msgstr "" +msgstr "Incorporado" #: src/settings_translation_file.cpp msgid "Bumpmapping" @@ -1543,6 +1719,11 @@ msgid "Camera update toggle key" msgstr "Tecla alternativa para la actualización de la cámara" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "Ruido de cueva Nº1" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "Ruido de cueva Nº1" @@ -1552,7 +1733,36 @@ msgstr "Ruido de cueva Nº2" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "Anchura de cueva" +msgstr "Ancho de cueva" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "Ruido de cueva Nº1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "Ruido de cueva Nº1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "Ancho de cueva" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "Ruido de cueva Nº1" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Generador de mapas" #: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" @@ -1629,10 +1839,19 @@ msgid "Clean transparent textures" msgstr "Limpiar texturas transparentes" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Cliente" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Cliente y servidor" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Cliente" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Velocidad de escalada" @@ -1661,15 +1880,12 @@ msgid "Colored fog" msgstr "Niebla colorida" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Comma-separated list of mods that are allowed to access HTTP APIs, which\n" "allow them to upload and download data to/from the internet." msgstr "" -"Lista separada por comas de los mods a los que se les permite usar las\n" -"interfaces de HTTP, las cuales permiten cargar y descargar datos desde/" -"hacia\n" -"la Internet." +"Lista separada por comas de mods que son permitidos de acceder a APIs de " +"HTTP, las cuales les permiten subir y descargar archivos al/desde internet." #: src/settings_translation_file.cpp msgid "" @@ -1705,6 +1921,11 @@ msgid "Console color" msgstr "Color de la consola" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Tecla de la consola" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Tecla de la consola" @@ -1731,14 +1952,6 @@ msgstr "" "queda inalterado." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Controla el tamaño de desiertos y playas en Mapgen v6.\n" -"Cuando snowbiomes están activados 'mgv6_freq_desert' se ignora." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Controla lo escarpado/profundo de las depresiones." @@ -1747,6 +1960,12 @@ msgid "Controls steepness/height of hills." msgstr "Controla lo escarpado/alto de las colinas." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "" "Controla el ancho de los túneles, un valor menor crea túneles más anchos." @@ -1772,6 +1991,11 @@ msgstr "" "Pueden hacer la minerÃa más difÃcil. Cero lo deshabilita. (0-10)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Crear" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Opacidad de punto de mira" @@ -1808,6 +2032,11 @@ msgid "Debug log level" msgstr "Nivel de registro de depuración" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "Tecla de cambio del HUD" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Intervalo de servidor dedicado" @@ -1848,6 +2077,41 @@ msgstr "" "Sólo tiene efecto si está compilado con cURL." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1862,7 +2126,16 @@ msgstr "" "lÃmite)." #: src/settings_translation_file.cpp -#, fuzzy +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "Retraso en enviar bloques después de construir" @@ -1895,18 +2168,23 @@ msgstr "" "la lista de servidores." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "Desincronizar animación de bloques" +msgid "Desert noise threshold" +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"Determina la forma del terreno.\n" -"Los tres números entre paréntesis controlan la escala\n" -"del terreno, y deben ser iguales." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Desincronizar animación de bloques" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "PartÃculas" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1955,15 +2233,28 @@ msgid "Dump the mapgen debug infos." msgstr "Imprimir información de depuración del generador de mapas." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Joysticks" -msgstr "Activar Control" +msgstr "Activar Controles" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" #: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "Activar VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Activar seguridad de mods" @@ -2008,6 +2299,17 @@ msgstr "" "descargar medios (por ej. texturas) cuando se conecta a un servidor." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Enable view bobbing" +msgstr "Movimiento de cámara al caer" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2063,6 +2365,10 @@ msgstr "" "Requiere habilitar sombreadores." #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2087,7 +2393,12 @@ msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Fall bobbing factor" msgstr "Movimiento de cámara al caer" #: src/settings_translation_file.cpp @@ -2143,13 +2454,12 @@ msgid "Field of view in degrees." msgstr "Campo visual en grados." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Field of view while zooming in degrees.\n" "This requires the \"zoom\" privilege on the server." msgstr "" -"Movimiento rápido (por medio de tecla de \"Uso\").\n" -"Requiere privilegio \"fast\" (rápido) en el servidor." +"Campo de vision mientras se usa el Zoom en grados.\n" +"Esto requiere el privilegio \"zoom\" en el servidor." #: src/settings_translation_file.cpp msgid "" @@ -2164,6 +2474,11 @@ msgid "Filler Depth" msgstr "Profundidad del relleno" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Filler depth noise" +msgstr "Profundidad del relleno" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "Mapa de tonos fÃlmico" @@ -2185,10 +2500,34 @@ msgid "Filtering" msgstr "Filtrado" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "Semilla de mapa fija" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Tecla vuelo" @@ -2201,6 +2540,10 @@ msgid "Fog" msgstr "Niebla" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Tecla para alternar niebla" @@ -2237,6 +2580,14 @@ msgid "Forward key" msgstr "Tecla Avanzar" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "Fuentes Freetype" @@ -2321,10 +2672,19 @@ msgid "Gravity" msgstr "Gravedad" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "Generador de mapas" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "HTTP Mods" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Tecla de cambio del HUD" @@ -2353,23 +2713,59 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "Ruido de cueva Nº1" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "Componente de altura del tamaño inicial de la ventana." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Win der." + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "Altura sobre la cual están apareciendo las nubes." #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "Alta-precisión FPU" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Oclusión de paralaje" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Generador de mapas" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" "Página de inicio del servidor, que se mostrará en la lista de servidores." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Profundidad para los rÃos" @@ -2394,6 +2790,18 @@ msgid "How wide to make rivers" msgstr "Ancho de los rÃos" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2406,13 +2814,12 @@ msgid "IPv6 support." msgstr "soporte IPv6." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If FPS would go higher than this, limit it by sleeping\n" "to not waste CPU power for no benefit." msgstr "" -"Si los FPS llegan a ser mas altos que esto, limÃtelos con interrupciones\n" -"no gaste recursos del CPU en algo que no tiene beneficio." +"Si las FPS no van mas alto que esto, limitelas\n" +"para no gastar poder del CPU para ningun beneficio." #: src/settings_translation_file.cpp msgid "" @@ -2422,6 +2829,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2434,18 +2850,18 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If enabled, actions are recorded for rollback.\n" "This option is only read when server starts." msgstr "" "Si esta activiado, las accione son guardadas para un rollback.\n" -"Esta opciones es de solo lectura cuando el servidor inicia." +"Esta opcion es de solo lectura cuando el servidor inicia." #: src/settings_translation_file.cpp -#, fuzzy msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "Si esta habilitado, desactiva la prevención de trampas en multijugador" +msgstr "" +"Si esta habilitado, desahabilita la prevencion de trampas y trucos en " +"multijugador." #: src/settings_translation_file.cpp msgid "" @@ -2454,13 +2870,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "If enabled, new players cannot join with an empty password." msgstr "" "Si esta activado, los nuevos jugadores no pueden unirse con contraseñas " "vacÃas." #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2468,7 +2887,6 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "If this is set, players will always (re)spawn at the given position." msgstr "Si se activa, los jugadores siempre reaparecerán en la posición dada." @@ -2491,6 +2909,18 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Color del fondo de la consola de chat durante el juego (R, G, B)." #: src/settings_translation_file.cpp +#, fuzzy +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" +"Valor alfa del fondo de la consola de chat durante el juego (opacidad, entre " +"0 y 255)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Tecla de la consola" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2533,6 +2963,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Tecla Inventario" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2553,12 +2988,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2596,6 +3043,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Tecla Saltar" @@ -2612,6 +3075,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2626,6 +3096,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2668,6 +3145,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2682,6 +3166,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2703,6 +3194,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2803,6 +3308,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2816,10 +3328,27 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Oclusión de paralaje" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Generador de mapas" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2828,6 +3357,11 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Tecla de la consola" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2883,6 +3417,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2956,6 +3497,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2983,9 +3528,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2994,7 +3548,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3013,92 +3568,37 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen Valleys" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +msgid "Mapgen Valleys" +msgstr "Valles de Mapgen" #: src/settings_translation_file.cpp msgid "Mapgen debug" msgstr "Depuración del generador de mapas" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen flags" -msgstr "Generador de mapas" +msgstr "Banderas de Mapgen" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen flat" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat cave width" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat flags" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat ground level" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake steepness" -msgstr "Oclusión de paralaje" +msgstr "Mapgen plano" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen flat lake threshold" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" +msgid "Mapgen flat specific flags" +msgstr "Banderas planas de Mapgen" #: src/settings_translation_file.cpp #, fuzzy @@ -3107,72 +3607,6 @@ msgstr "Generador de mapas" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen fractal cave width" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal fractal" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal iterations" -msgstr "Oclusión de paralaje" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal offset" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal scale" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal slice w" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen name" msgstr "Generador de mapas" @@ -3183,28 +3617,8 @@ msgstr "Generador de mapas" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v5 cave width" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" +msgid "Mapgen v5 specific flags" +msgstr "Banderas planas de Mapgen" #: src/settings_translation_file.cpp #, fuzzy @@ -3212,60 +3626,9 @@ msgid "Mapgen v6" msgstr "Generador de mapas" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen v6 specific flags" +msgstr "Banderas planas de Mapgen" #: src/settings_translation_file.cpp #, fuzzy @@ -3274,56 +3637,8 @@ msgstr "Generador de mapas" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v7 cave width" -msgstr "Generador de mapas" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" +msgid "Mapgen v7 specific flags" +msgstr "Banderas planas de Mapgen" #: src/settings_translation_file.cpp msgid "Massive cave depth" @@ -3491,6 +3806,10 @@ msgid "Mipmapping" msgstr "Mapeado de relieve" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3511,6 +3830,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3519,18 +3846,21 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "Usa la tecla" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3579,10 +3909,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3619,6 +3945,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3665,6 +3999,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3759,6 +4099,14 @@ msgid "Report path" msgstr "Ruta de fuentes" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Tecla derecha" @@ -3791,6 +4139,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3799,6 +4151,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3841,6 +4197,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "Ruido de cueva Nº1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3885,6 +4250,10 @@ msgid "Server port" msgstr "Puerto del servidor" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "Lista de las URLs de servidores" @@ -3917,10 +4286,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Sombreadores" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3946,10 +4324,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "Iluminación suave" @@ -3988,6 +4385,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Strength of generated normalmaps." msgstr "Generar mapas normales" @@ -4009,10 +4414,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4026,6 +4451,10 @@ msgid "" "Adjust towards 0.0 for a larger proportion." msgstr "" +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + # No cabe "Paquetes de texturas". #: src/settings_translation_file.cpp msgid "Texture path" @@ -4047,8 +4476,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -4099,6 +4531,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -4141,6 +4577,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Filtrado trilineal" @@ -4156,10 +4596,29 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Undersampling" +msgstr "Renderizado:" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4224,6 +4683,43 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "Controla lo escarpado/alto de las colinas." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4232,13 +4728,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4250,6 +4744,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4340,16 +4838,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4400,6 +4888,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4413,6 +4908,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4424,6 +4955,99 @@ msgstr "" msgid "cURL timeout" msgstr "Tiempo de espera de cURL" +#~ msgid "Hide mp content" +#~ msgstr "Ocultar contenido" + +#~ msgid "Attn" +#~ msgstr "Atentamente" + +#~ msgid "Capital" +#~ msgstr "Bloq Mayús" + +#~ msgid "Comma" +#~ msgstr "Coma" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Final" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Menos" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Punto" + +#~ msgid "Plus" +#~ msgstr "Más" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Controla el tamaño de desiertos y playas en Mapgen v6.\n" +#~ "Cuando snowbiomes están activados 'mgv6_freq_desert' se ignora." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Determina la forma del terreno.\n" +#~ "Los tres números entre paréntesis controlan la escala\n" +#~ "del terreno, y deben ser iguales." + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Anchura de cuevas planas de Mapgen" + +#, fuzzy +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Generador de mapas" + +#, fuzzy +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Generador de mapas" + +#, fuzzy +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Oclusión de paralaje" + +#, fuzzy +#~ msgid "Mapgen fractal offset" +#~ msgstr "Generador de mapas" + +#, fuzzy +#~ msgid "Mapgen fractal scale" +#~ msgstr "Generador de mapas" + +#, fuzzy +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Generador de mapas" + +#, fuzzy +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Generador de mapas" + +#, fuzzy +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Generador de mapas" + #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "" #~ "Datos detallados de perfilación de mod. Útil para desarrolladores de mods." @@ -4459,9 +5083,6 @@ msgstr "Tiempo de espera de cURL" #~ msgid "If enabled, " #~ msgstr "Activado" -#~ msgid "Rendering:" -#~ msgstr "Renderizado:" - #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "" #~ "Reinicia minetest para que los cambios en el controlador tengan efecto" diff --git a/po/et/minetest.po b/po/et/minetest.po index 94c9c7207..78ef7aa14 100644 --- a/po/et/minetest.po +++ b/po/et/minetest.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: 2016-04-09 13:53+0000\n" "Last-Translator: Jan Harald <kuus29@gmail.com>\n" "Language-Team: Estonian <https://hosted.weblate.org/projects/minetest/" @@ -19,6 +19,14 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 2.6-dev\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Ärka ellu" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Sa surid." + #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" msgstr "Lue skriptis ilmnes viga; nagu näiteks mod:" @@ -77,12 +85,13 @@ msgstr "Meie toetame protokolli versioone $1 kuni $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Tühista" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Sõltub:" #: builtin/mainmenu/dlg_config_world.lua @@ -90,6 +99,11 @@ msgid "Disable MP" msgstr "Keela MP" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Keela MP" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Luba MP" @@ -106,17 +120,13 @@ msgstr "" "on ainult märgid [a-z0-9_]." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Peida mäng" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Peida mod. pakkide sisu" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -179,8 +189,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Kustuta" @@ -196,7 +205,7 @@ msgstr "" msgid "Delete World \"$1\"?" msgstr "Kas kustutada maailm \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Nõustu" @@ -276,6 +285,11 @@ msgstr "" msgid "Restore Default" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy msgid "Select path" @@ -286,11 +300,11 @@ msgid "Show technical names" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +msgid "The value must be at least $1." msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +msgid "The value must not be larger than $1." msgstr "" #: builtin/mainmenu/modmgr.lua @@ -315,6 +329,10 @@ msgstr "" msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "" @@ -336,10 +354,6 @@ msgid "Rating" msgstr "" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Lühike nimi:" @@ -375,6 +389,70 @@ msgstr "Early arendajad" msgid "Previous Core Developers" msgstr "Eelmised põhilised arendajad" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Konfigureeri" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Kujunduslik mängumood" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Lülita valu sisse" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Peida mäng" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Alusta mängu" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nimi/Parool" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Uus" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "No world created or selected!" +msgstr "No nimi või no mäng valitud" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Alusta mängu" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Vali maailm:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "" @@ -384,6 +462,10 @@ msgid "Mod information:" msgstr "" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "" @@ -403,101 +485,50 @@ msgstr "" msgid "Uninstall selected modpack" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Address / Port" msgstr "Aadress / Port:" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Liitu" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Loov režiim" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Kahjustamine lubatud" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Del. Favorite" msgstr "Lemmikud:" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Favorite" msgstr "Lemmikud:" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Name / Password" msgstr "Nimi / Parool:" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "PvP enabled" -msgstr "Sisse lülitatud" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Konfigureeri" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Kujunduslik mängumood" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Lülita valu sisse" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Nimi/Parool" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Uus" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#, fuzzy -msgid "No world created or selected!" -msgstr "No nimi või no mäng valitud" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Avalik" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Vali maailm:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Alusta mängu" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#, fuzzy +msgid "PvP enabled" +msgstr "Sisse lülitatud" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -531,6 +562,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Üksikmäng" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Bilinear Filter" msgstr "Bi-lineaarsed Filtreerimine" @@ -621,6 +656,11 @@ msgid "Reset singleplayer world" msgstr "Üksikmäng" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "Mängupilt" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Sätted" @@ -694,14 +734,6 @@ msgstr "Menüü" msgid "Start Singleplayer" msgstr "Üksikmäng" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Mängi" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Üksikmäng" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Informatsioon ei ole kättesaadav" @@ -765,6 +797,10 @@ msgid "Player name too long." msgstr "" #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "" @@ -782,6 +818,42 @@ msgstr "" #: src/game.cpp #, fuzzy +msgid "- Address: " +msgstr "Aadress / Port:" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Kujunduslik mängumood" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Lülita valu sisse" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +msgid "- Port: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Avalik" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +msgid "- Server Name: " +msgstr "" + +#: src/game.cpp +#, fuzzy msgid "Change Keys" msgstr "Vaheta nuppe" @@ -798,26 +870,30 @@ msgid "Continue" msgstr "Jätka" #: src/game.cpp -msgid "Creating client..." +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse left: dig/punch\n" +"- Mouse right: place/use\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" msgstr "" #: src/game.cpp -msgid "Creating server..." +msgid "Creating client..." msgstr "" #: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" -"- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" -"- Mouse wheel: select item\n" -"- T: chat\n" +msgid "Creating server..." msgstr "" #: src/game.cpp @@ -845,6 +921,19 @@ msgid "Exit to OS" msgstr "Välju mängust" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Mäng" + +#: src/game.cpp +msgid "Hosting server" +msgstr "" + +#: src/game.cpp msgid "Item definitions..." msgstr "" @@ -865,24 +954,45 @@ msgid "Node definitions..." msgstr "" #: src/game.cpp -msgid "Resolving address..." +msgid "Off" msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Ärka ellu" +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "" #: src/game.cpp msgid "Shutting down..." msgstr "" #: src/game.cpp +msgid "Singleplayer" +msgstr "Üksikmäng" + +#: src/game.cpp msgid "Sound Volume" msgstr "Hääle volüüm" #: src/game.cpp -msgid "You died." -msgstr "Sa surid." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -917,6 +1027,10 @@ msgid "Console" msgstr "Konsool" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Topeltklõpsa \"Hüppamist\" et sisse lülitada lendamine" @@ -929,6 +1043,11 @@ msgid "Forward" msgstr "Edasi" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Hääle volüüm" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Seljakott" @@ -950,6 +1069,24 @@ msgstr "" msgid "Left" msgstr "Vasakule" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Käsklus" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Järgmine" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Prindi kogused" @@ -1028,38 +1165,22 @@ msgid "Apps" msgstr "Aplikatsioonid" #: src/keycode.cpp -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" msgstr "Tagasi" #: src/keycode.cpp -msgid "Capital" -msgstr "Caps Lock" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Tühjenda" #: src/keycode.cpp -msgid "Comma" -msgstr "Koma" - -#: src/keycode.cpp msgid "Control" msgstr "CTRL" #: src/keycode.cpp -msgid "Convert" -msgstr "Konverteeri" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Alla" @@ -1068,26 +1189,15 @@ msgid "End" msgstr "Lõpeta" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Kustuta OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Põgene" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Soorita" #: src/keycode.cpp -msgid "Final" -msgstr "Viimane" - -#: src/keycode.cpp msgid "Help" msgstr "Abi" @@ -1096,20 +1206,33 @@ msgid "Home" msgstr "Kodu" #: src/keycode.cpp -msgid "Insert" -msgstr "Sisesta" +#, fuzzy +msgid "IME Accept" +msgstr "Nõustu" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Convert" +msgstr "Konverteeri" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Escape" +msgstr "Põgene" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +#, fuzzy +msgid "IME Mode Change" +msgstr "Moodi vahetamine" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +#, fuzzy +msgid "IME Nonconvert" +msgstr "Konverteerimatta" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Sisesta" #: src/keycode.cpp msgid "Left Button" @@ -1140,22 +1263,10 @@ msgid "Middle Button" msgstr "Keskmine nupp" #: src/keycode.cpp -msgid "Minus" -msgstr "Miinus" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Moodi vahetamine" - -#: src/keycode.cpp msgid "Next" msgstr "Järgmine" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Konverteerimatta" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Numbrilaual Num Lock" @@ -1172,6 +1283,11 @@ msgid "Numpad -" msgstr "Numbrilaual -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Numbrilaual *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Numbrilaual /" @@ -1220,20 +1336,12 @@ msgid "OEM Clear" msgstr "OEM Tühi" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Paus" #: src/keycode.cpp -msgid "Period" -msgstr "Punkt" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Pluss" +msgid "Play" +msgstr "Mängi" #: src/keycode.cpp msgid "Print" @@ -1332,6 +1440,20 @@ msgid "3D mode" msgstr "" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1393,6 +1515,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1400,7 +1526,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" @@ -1425,6 +1552,12 @@ msgid "Amplifies the valleys" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Anisotropic filtering" msgstr "Anisotroopne Filtreerimine" @@ -1441,6 +1574,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" @@ -1449,6 +1586,19 @@ msgid "Ask to reconnect after crash" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "" @@ -1474,6 +1624,14 @@ msgid "Basic Privileges" msgstr "" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Bilinear filtering" msgstr "Bi-lineaarsed Filtreerimine" @@ -1483,6 +1641,14 @@ msgid "Bind address" msgstr "" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" @@ -1513,6 +1679,10 @@ msgid "Camera update toggle key" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "" @@ -1525,6 +1695,31 @@ msgid "Cave width" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Põlvkonna kaardid" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1585,10 +1780,18 @@ msgid "Clean transparent textures" msgstr "" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "" #: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "" @@ -1660,6 +1863,11 @@ msgstr "Konsool" #: src/settings_translation_file.cpp #, fuzzy +msgid "Console height" +msgstr "Konsool" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Console key" msgstr "Konsool" @@ -1684,17 +1892,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp @@ -1718,6 +1926,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Loo" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" @@ -1755,6 +1968,10 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "" @@ -1793,6 +2010,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1803,6 +2055,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1833,18 +2095,26 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Digging particles" +msgstr "Luba kõik" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Disable anticheat" msgstr "Lülita osakesed sisse" @@ -1891,11 +2161,25 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Enable VBO" msgstr "Luba MP" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "" @@ -1931,6 +2215,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -1976,6 +2270,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -1998,7 +2296,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2068,6 +2370,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2085,10 +2391,34 @@ msgid "Filtering" msgstr "Anisotroopne Filtreerimine" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "" @@ -2101,6 +2431,10 @@ msgid "Fog" msgstr "" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -2138,6 +2472,14 @@ msgid "Forward key" msgstr "Edasi" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2216,10 +2558,19 @@ msgid "Gravity" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "Põlvkonna kaardid" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2241,22 +2592,57 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Parem Windowsi nupp" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Põlvkonna kaardid" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Põlvkonna kaardid" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2278,6 +2664,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2303,6 +2701,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2335,6 +2742,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2363,6 +2774,15 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Konsool" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2405,6 +2825,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Seljakott" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2426,12 +2851,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2469,6 +2906,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Jump key" msgstr "Hüppamine" @@ -2486,6 +2939,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2500,6 +2960,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2542,6 +3009,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2556,6 +3030,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2577,6 +3058,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2677,6 +3172,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2690,10 +3192,27 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Põlvkonna kaardid" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Põlvkonna kaardid" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2702,6 +3221,11 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Konsool" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2758,6 +3282,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2832,6 +3363,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2859,9 +3394,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2870,7 +3414,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2889,25 +3434,21 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen Valleys" -msgstr "Põlvkonna kaardid" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen Valleys" +msgstr "Põlvkonna kaardid" #: src/settings_translation_file.cpp #, fuzzy @@ -2926,130 +3467,16 @@ msgstr "Põlvkonna kaardid" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen flat cave width" +msgid "Mapgen flat specific flags" msgstr "Põlvkonna kaardid" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat flags" -msgstr "Põlvkonna kaardid" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat ground level" -msgstr "Põlvkonna kaardid" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake steepness" -msgstr "Põlvkonna kaardid" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake threshold" -msgstr "Põlvkonna kaardid" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp #, fuzzy msgid "Mapgen fractal" msgstr "Põlvkonna kaardid" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen fractal cave width" -msgstr "Põlvkonna kaardid" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal fractal" -msgstr "Põlvkonna kaardid" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal iterations" -msgstr "Põlvkonna kaardid" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal offset" -msgstr "Põlvkonna kaardid" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal scale" -msgstr "Põlvkonna kaardid" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal slice w" -msgstr "Põlvkonna kaardid" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen name" msgstr "Põlvkonna kaardid" @@ -3060,89 +3487,18 @@ msgstr "Põlvkonna kaardid" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v5 cave width" +msgid "Mapgen v5 specific flags" msgstr "Põlvkonna kaardid" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp #, fuzzy msgid "Mapgen v6" msgstr "Põlvkonna kaardid" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen v6 specific flags" +msgstr "Põlvkonna kaardid" #: src/settings_translation_file.cpp #, fuzzy @@ -3151,58 +3507,10 @@ msgstr "Põlvkonna kaardid" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v7 cave width" +msgid "Mapgen v7 specific flags" msgstr "Põlvkonna kaardid" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Massive cave depth" msgstr "" @@ -3368,6 +3676,10 @@ msgid "Mipmapping" msgstr "Väga hea kvaliteet" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3388,6 +3700,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3396,18 +3716,21 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "Vajuta nuppu" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3456,10 +3779,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3496,6 +3815,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3536,6 +3863,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3631,6 +3964,14 @@ msgid "Report path" msgstr "Vali" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Right key" msgstr "Parem Menüü" @@ -3664,6 +4005,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3672,6 +4017,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3715,6 +4064,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3760,6 +4117,10 @@ msgid "Server port" msgstr "" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Serverlist URL" msgstr "Avatud serverite nimekiri:" @@ -3794,10 +4155,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Varjutajad" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3823,10 +4193,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Smooth lighting" msgstr "Ilus valgustus" @@ -3867,6 +4256,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -3887,10 +4284,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3905,6 +4322,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Texture path" msgstr "Vali graafika:" @@ -3925,8 +4346,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -3977,6 +4401,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -4019,6 +4447,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Trilinear filtering" msgstr "Tri-Linear Filtreerimine" @@ -4035,10 +4467,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4104,6 +4554,42 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4112,13 +4598,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4130,6 +4614,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4219,16 +4707,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4279,6 +4757,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4292,6 +4777,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "cURL faili allalaadimine aegus" @@ -4303,6 +4824,84 @@ msgstr "" msgid "cURL timeout" msgstr "" +#~ msgid "Hide mp content" +#~ msgstr "Peida mod. pakkide sisu" + +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "Caps Lock" + +#~ msgid "Comma" +#~ msgstr "Koma" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Viimane" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Miinus" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Punkt" + +#~ msgid "Plus" +#~ msgstr "Pluss" + +#, fuzzy +#~ msgid "Mapgen flat cave width" +#~ msgstr "Põlvkonna kaardid" + +#, fuzzy +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Põlvkonna kaardid" + +#, fuzzy +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Põlvkonna kaardid" + +#, fuzzy +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Põlvkonna kaardid" + +#, fuzzy +#~ msgid "Mapgen fractal offset" +#~ msgstr "Põlvkonna kaardid" + +#, fuzzy +#~ msgid "Mapgen fractal scale" +#~ msgstr "Põlvkonna kaardid" + +#, fuzzy +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Põlvkonna kaardid" + +#, fuzzy +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Põlvkonna kaardid" + +#, fuzzy +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Põlvkonna kaardid" + #, fuzzy #~ msgid "Useful for mod developers." #~ msgstr "Põhiline arendaja" @@ -4318,10 +4917,6 @@ msgstr "" #~ msgid "If enabled, " #~ msgstr "Sisse lülitatud" -#, fuzzy -#~ msgid "Game Name" -#~ msgstr "Mäng" - #~ msgid "GAMES" #~ msgstr "MÄNGUD" diff --git a/po/fr/minetest.po b/po/fr/minetest.po index f3aec72a6..7a4a9f831 100644 --- a/po/fr/minetest.po +++ b/po/fr/minetest.po @@ -7,17 +7,25 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-11-27 10:39+0000\n" -"Last-Translator: Onyx Steinheim <thevoxelmanonyx@gmail.com>\n" -"Language-Team: French <https://hosted.weblate.org/projects/minetest/minetest/" -"fr/>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-06-03 08:11+0000\n" +"Last-Translator: Loïc Blot <loic.blot@unix-experience.fr>\n" +"Language-Team: French " +"<https://hosted.weblate.org/projects/minetest/minetest/fr/>\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 2.10-dev\n" +"X-Generator: Weblate 2.15-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Réapparaître" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Vous êtes mort." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -76,12 +84,12 @@ msgstr "Nous supportons seulement les versions du protocole entre $1 et $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Annuler" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +msgid "Dependencies:" msgstr "Dépend de :" #: builtin/mainmenu/dlg_config_world.lua @@ -89,6 +97,10 @@ msgid "Disable MP" msgstr "Désactiver les packs de mods" #: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Tout désactiver" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Activer le pack de mods" @@ -106,17 +118,13 @@ msgstr "" "Seuls les caractères alphanumériques [a-z0-9_] sont autorisés." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Cacher le jeu" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Cacher le contenu du mod" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod :" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "Dépendances optionnelles :" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -179,8 +187,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Êtes-vous sûr de vouloir supprimer \"$1\" ?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Supprimer" @@ -196,7 +203,7 @@ msgstr "Gestionnaire de mods : chemin de mod invalide \"$1\"" msgid "Delete World \"$1\"?" msgstr "Supprimer le monde \"$1\" ?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Accepter" @@ -280,6 +287,11 @@ msgstr "Les valeurs possibles sont : " msgid "Restore Default" msgstr "Réinitialiser" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Rechercher" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Sélectionner un chemin" @@ -289,11 +301,11 @@ msgid "Show technical names" msgstr "Montrer les noms techniques" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +msgid "The value must be at least $1." msgstr "La valeur doit être supérieure à $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +msgid "The value must not be larger than $1." msgstr "La valeur doit être inférieure à $1." #: builtin/mainmenu/modmgr.lua @@ -324,6 +336,10 @@ msgstr "" "Installation un mod : impossible de trouver un nom de dossier valide pour le " "pack de mods $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "Mods de sous-jeu" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Fermer le magasin" @@ -345,10 +361,6 @@ msgid "Rating" msgstr "Évaluation" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Rechercher" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Nom court :" @@ -384,6 +396,66 @@ msgstr "Anciens contributeurs" msgid "Previous Core Developers" msgstr "Anciens développeurs" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "Annoncer le serveur" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Adresse à assigner" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Configurer" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Mode créatif" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Activer les dégâts" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "Héberger une partie" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "Héberger un serveur" + +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" +msgstr "Jeu local" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nom / Mot de passe" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Nouveau" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Aucun monde créé ou sélectionné !" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Jouer" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Port" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Sélectionner un monde :" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Port du serveur" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Mods installés :" @@ -393,6 +465,10 @@ msgid "Mod information:" msgstr "Informations du mod :" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "Pas de dépendances." + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Pas de description du mod disponible" @@ -412,95 +488,45 @@ msgstr "Désinstaller le mod sélectionné" msgid "Uninstall selected modpack" msgstr "Désinstaller le pack de mods sélectionné" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Adresse / Port :" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Client" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Rejoindre" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Mode créatif" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Dégâts activés" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Supprimer favori :" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Favori" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Nom / Mot de passe" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Combat activé" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "Ping" -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Adresse à assigner" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "Jouer en ligne" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Configurer" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Mode créatif" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Activer les dégâts" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Nom / Mot de passe" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Nouveau" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Aucun monde créé ou sélectionné !" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Port" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Public" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Sélectionner un monde :" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Serveur" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Port du serveur" - -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Démarrer" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "Combat activé" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -531,6 +557,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Êtes-vous sûr de vouloir réinitialiser votre monde ?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "Sauver auto. la taile d'écran" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Filtrage bilinéaire" @@ -607,6 +637,10 @@ msgid "Reset singleplayer world" msgstr "Réinitialiser le monde" #: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Ecran :" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Réglages" @@ -671,14 +705,6 @@ msgstr "Principal" msgid "Start Singleplayer" msgstr "Démarrer une partie solo" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Jouer" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Solo" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Pas d'information disponible" @@ -740,6 +766,10 @@ msgid "Player name too long." msgstr "Nom du joueur trop long." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Veuillez choisir un nom !" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Le chemin du monde spécifié n'existe pas : " @@ -757,6 +787,38 @@ msgstr "" "Voir debug.txt pour plus d'informations." #: src/game.cpp +msgid "- Address: " +msgstr "- Adresse : " + +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "- Mode créatif : " + +#: src/game.cpp +msgid "- Damage: " +msgstr "- Dégâts : " + +#: src/game.cpp +msgid "- Mode: " +msgstr "- Mode : " + +#: src/game.cpp +msgid "- Port: " +msgstr "- Port : " + +#: src/game.cpp +msgid "- Public: " +msgstr "- Public : " + +#: src/game.cpp +msgid "- PvP: " +msgstr "- JcJ : " + +#: src/game.cpp +msgid "- Server Name: " +msgstr "- Nom du serveur : " + +#: src/game.cpp msgid "Change Keys" msgstr "Changer les touches" @@ -773,38 +835,45 @@ msgid "Continue" msgstr "Continuer" #: src/game.cpp -msgid "Creating client..." -msgstr "Création du client..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Création du serveur..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Contrôles:\n" -"- ZQSD : se déplacer\n" -"- Espace : sauter/grimper\n" -"- Maj. : marcher lentement/descendre\n" -"- A : lâcher l'objet en main\n" -"- I : inventaire\n" +"- %s1 : avancer\n" +"- %s2 : reculer\n" +"- %s3 : à gauche\n" +"- %s4 : à droite\n" +"- %s5 : sauter/grimper\n" +"- %s6 : marcher lentement/descendre\n" +"- %s7 : lâcher l'objet en main\n" +"- %s8 : inventaire\n" "- Souris : tourner/regarder\n" "- Souris gauche : creuser/attaquer\n" "- Souris droite : placer/utiliser\n" "- Molette souris : sélectionner objet\n" -"- T : discuter\n" +"- %s9 : discuter\n" + +#: src/game.cpp +msgid "Creating client..." +msgstr "Création du client..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Création du serveur..." #: src/game.cpp msgid "" @@ -840,6 +909,18 @@ msgid "Exit to OS" msgstr "Quitter le jeu" #: src/game.cpp +msgid "Game info:" +msgstr "Infos de jeu :" + +#: src/game.cpp +msgid "Game paused" +msgstr "Jeu en pause" + +#: src/game.cpp +msgid "Hosting server" +msgstr "Héberger un serveur" + +#: src/game.cpp msgid "Item definitions..." msgstr "Définitions des items..." @@ -860,24 +941,45 @@ msgid "Node definitions..." msgstr "Définitions des blocs..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Résolution de l'adresse..." +msgid "Off" +msgstr "Désactivé" #: src/game.cpp -msgid "Respawn" -msgstr "Réapparaître" +msgid "On" +msgstr "Activé" + +#: src/game.cpp +msgid "Remote server" +msgstr "Serveur distant" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Résolution de l'adresse..." #: src/game.cpp msgid "Shutting down..." msgstr "Fermeture du jeu..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Solo" + +#: src/game.cpp msgid "Sound Volume" msgstr "Volume du son" #: src/game.cpp -msgid "You died." -msgstr "Vous êtes mort." +#, c-format +msgid "Volume changed to %d%%" +msgstr "Volume réglé sur %d%%" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "Volume mis à 0%" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "Volume mis à 100%" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -912,6 +1014,10 @@ msgid "Console" msgstr "Console" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Réduire le volume" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Double-appui sur \"saut\" pour voler" @@ -924,6 +1030,10 @@ msgid "Forward" msgstr "Avancer" #: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "Augmenter le volume" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventaire" @@ -943,6 +1053,22 @@ msgstr "Raccourcis" msgid "Left" msgstr "Gauche" +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "Commande locale" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Muet" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "Objet suivant" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "Objet précédent" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Afficher les stacks" @@ -1020,38 +1146,22 @@ msgid "Apps" msgstr "Applications" #: src/keycode.cpp -msgid "Attn" -msgstr "Attente" - -#: src/keycode.cpp msgid "Back" msgstr "Retour" #: src/keycode.cpp -msgid "Capital" -msgstr "Verr Maj" +msgid "Caps Lock" +msgstr "Verr. Maj" #: src/keycode.cpp msgid "Clear" msgstr "Vider" #: src/keycode.cpp -msgid "Comma" -msgstr "Virgule" - -#: src/keycode.cpp msgid "Control" msgstr "Contrôle" #: src/keycode.cpp -msgid "Convert" -msgstr "Convertir" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "Vider sélection" - -#: src/keycode.cpp msgid "Down" msgstr "Bas" @@ -1060,26 +1170,14 @@ msgid "End" msgstr "Fin" #: src/keycode.cpp -msgid "Erase OEF" -msgstr "Écraser l'OEF" - -#: src/keycode.cpp -msgid "Escape" -msgstr "Échap" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" +msgid "Erase EOF" +msgstr "Écraser l'EOF" #: src/keycode.cpp msgid "Execute" msgstr "Exécuter" #: src/keycode.cpp -msgid "Final" -msgstr "Final" - -#: src/keycode.cpp msgid "Help" msgstr "Aide" @@ -1088,20 +1186,28 @@ msgid "Home" msgstr "Origine" #: src/keycode.cpp -msgid "Insert" -msgstr "Insérer" +msgid "IME Accept" +msgstr "Accepter IME" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +msgid "IME Convert" +msgstr "Convertir IME" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +msgid "IME Escape" +msgstr "Échap. IME" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +msgid "IME Mode Change" +msgstr "Changer de mode IME" + +#: src/keycode.cpp +msgid "IME Nonconvert" +msgstr "Non converti IME" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insérer" #: src/keycode.cpp msgid "Left Button" @@ -1132,22 +1238,10 @@ msgid "Middle Button" msgstr "Bouton du milieu" #: src/keycode.cpp -msgid "Minus" -msgstr "Moins" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Changer de mode" - -#: src/keycode.cpp msgid "Next" msgstr "Suivant" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Non converti" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Verr Num" @@ -1164,6 +1258,10 @@ msgid "Numpad -" msgstr "Pavé num. -" #: src/keycode.cpp +msgid "Numpad ." +msgstr "Pavé num. ." + +#: src/keycode.cpp msgid "Numpad /" msgstr "Pavé num. /" @@ -1212,20 +1310,12 @@ msgid "OEM Clear" msgstr "OEM Clear" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pause" #: src/keycode.cpp -msgid "Period" -msgstr "Point" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Plus" +msgid "Play" +msgstr "Jouer" #: src/keycode.cpp msgid "Print" @@ -1333,6 +1423,22 @@ msgid "3D mode" msgstr "Mode écran 3D" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "Bruit 3D définissant les cavernes géantes." + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" +"Bruit 3D définissant la structure et la hauteur des montagnes.\n" +"Définit également la structure des montagnes flottantes." + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "Bruit 3D définissant la structure des gorges." + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1411,6 +1517,10 @@ msgstr "" "réglage." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "Ajoute des particules lorsqu'un bloc est creusé." + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1420,7 +1530,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "Ajuster la correction gamma. Les valeurs plus basses sont plus claires.\n" @@ -1447,6 +1558,15 @@ msgid "Amplifies the valleys" msgstr "Amplifier les vallées" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" +"Android uniquement: Essaye de créer des textures d'inventaire à partir des " +"meshes\n" +"quand aucun gestionnaire de rendu n'est trouvé." + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Filtrage anisotrope" @@ -1465,6 +1585,10 @@ msgstr "" "servers.minetest.net." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "Bruit appliqué aux pommiers" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "Série Julia: échelles (X,Y,Z) en blocs." @@ -1473,6 +1597,29 @@ msgid "Ask to reconnect after crash" msgstr "Demander de se reconnecter après une coupure de connexion" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" +"À cette distance, le serveur va optimiser quels blocs seront envoyés aux " +"clients.\n" +"Des petites valeurs peuvent augmenter fortement la performance du serveur, " +"mais peut\n" +"provoquer l'apparition de problèmes de rendu visibles. (Certains blocs ne " +"seront pas affichés\n" +"sous l'eau ou dans les cavernes, ou parfois sur terre.)\n" +"Rendre cette valeur supérieure à max_block_send_distance désactive cette " +"optimisation.\n" +"Définie en mapblocks (16 nodes)" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "" "Déclarer automatiquement votre serveur à la liste des serveurs publics." @@ -1498,6 +1645,14 @@ msgid "Basic Privileges" msgstr "Privilèges par défaut" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "Bruit pour les plages" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "Seuil de bruit pour les plages" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Filtrage bilinéaire" @@ -1506,6 +1661,14 @@ msgid "Bind address" msgstr "Adresse à assigner" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "Paramètres de bruit de température et d'humidité de l'API des biomes" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "Bruit des biomes" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "Bits par pixel (profondeur de couleur) en mode plein-écran." @@ -1534,6 +1697,10 @@ msgid "Camera update toggle key" msgstr "Touche de mise à jour de la caméra" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "Bruit des caves" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "Bruit de cave #1" @@ -1546,6 +1713,30 @@ msgid "Cave width" msgstr "Largeur de la grotte" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "Bruit des cave #1" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "Bruit des caves #2" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "Limites des cavernes" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "Bruit des caves" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "Caillou de caverne" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "Limite des cavernes" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "Les grottes et tunnels se forment à l'intersection de deux bruits" @@ -1620,10 +1811,18 @@ msgid "Clean transparent textures" msgstr "Textures transparentes filtrées" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Client" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Client et Serveur" #: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "Personnalisation client" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Vitesse d'escalade du joueur" @@ -1696,6 +1895,10 @@ msgid "Console color" msgstr "Couleur de la console de jeu" #: src/settings_translation_file.cpp +msgid "Console height" +msgstr "Hauteur de la console" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Console de jeu" @@ -1722,15 +1925,6 @@ msgstr "" "reste figé(e)." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Taille des déserts et plages dans Mapgen V6.\n" -"Quand les environnements neigeux sont activés, le paramètre de fréquence des " -"déserts dans Mapgen V6 est ignoré." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Contrôle l'élévation/profondeur des dépressions lacustres." @@ -1739,6 +1933,14 @@ msgid "Controls steepness/height of hills." msgstr "Contrôle l'élévation/hauteur des collines." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" +"Contrôle la densité des terrains montagneux sur les terres flottantes.\n" +"C'est un décalage ajouté à la valeur de bruit 'np_mountain'." + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "" "Contrôle la largeur des tunnels, une valeur plus petite crée des tunnels " @@ -1765,6 +1967,10 @@ msgstr "" "Elles rendent le minage plus difficile. 0 les désactivent. (0-10)" #: src/settings_translation_file.cpp +msgid "Creative" +msgstr "Créatif" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Opacité du réticule" @@ -1801,6 +2007,10 @@ msgid "Debug log level" msgstr "Niveau de détails des infos de débogage" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "Touche pour diminuer le volume" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Intervalle de mise à jour des objets sur le serveur" @@ -1841,6 +2051,42 @@ msgstr "" "Seulement appliqué si Minetest est compilé avec cURL." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "Définit des zones de 'terrain_higher' (terrains de falaises)." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "Définit des zones où les arbres ont des pommes." + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "Définit des zones où on trouve des plages de sable." + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "Définit la structure des canaux fluviaux à grande échelle." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" +"Définit l'emplacement et le terrain des collines facultatives et des lacs." + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1855,6 +2101,16 @@ msgstr "" "illimité)." #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "Définit des zones avec arbres et leur densité." + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "Retard dans les blocs envoyés après la construction" @@ -1885,18 +2141,22 @@ msgid "" msgstr "Description du serveur affichée sur la liste des serveurs." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "Désynchroniser les textures animées par mapblock" +msgid "Desert noise threshold" +msgstr "Limite de bruit pour le désert" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"Détermine la forme du terrain.\n" -"Les 3 nombres entre parenthèses contrôlent l'échelle du terrain,\n" -"ces nombres doivent être identiques." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Désynchroniser les textures animées par mapblock" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "Particules au minage" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1947,10 +2207,26 @@ msgid "Enable Joysticks" msgstr "Activer souris" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" +"Active le support des mods Lua sur le client.\n" +"Ce support est expérimental et l'API peut changer." + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "Activer Vertex Buffer Object: objet tampon de vertex" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Activer la console" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "Activer le mode créatif pour les cartes nouvellement créées." + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Activer la sécurisation des mods" @@ -1998,6 +2274,18 @@ msgstr "" "des données média (ex.: textures) lors de la connexion au serveur." #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "Mouvement de tête" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Facteur de mouvement de bras.\n" +"Par exemple : 0 = pas de mouvement, 1 = normal, 2 = double." + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2054,6 +2342,10 @@ msgstr "" "Nécessite les shaders pour être activé." #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "Active les mouvements de tête lors d'un déplacement." + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Intervalle d'impression des données du moteur de profil" @@ -2078,8 +2370,12 @@ msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" -msgstr "Fréquence de mouvement du bras en tombant" +msgid "Factor noise" +msgstr "Facteur de bruit" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "Intensité du mouvement de tête en tombant" #: src/settings_translation_file.cpp msgid "Fallback font" @@ -2154,6 +2450,10 @@ msgid "Filler Depth" msgstr "Profondeur du remplissage" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "Bruit de profondeur de remplissage" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "Mappage tonal cinématographique" @@ -2175,10 +2475,34 @@ msgid "Filtering" msgstr "Filtrage" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "Le premier des deux bruits 3D qui définissent ensemble les tunnels." + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "Graine de génération de terrain déterminée" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "Le bruit de hauteur de base des terres flottantes" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "Le bruit de base des terres flottantes" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "Hauteur des terrains flottants" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "Densité des montagnes flottantes" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "Hauteur des montagnes flottantes" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Voler" @@ -2191,6 +2515,10 @@ msgid "Fog" msgstr "Brume" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "Début du brouillard" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Brume" @@ -2229,6 +2557,15 @@ msgid "Forward key" msgstr "Avancer" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "Type fractal" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" +"Fraction de la distance de vue à partir de laquelle le brouillard est affiché" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "Polices Freetype" @@ -2322,10 +2659,18 @@ msgid "Gravity" msgstr "Gravité" #: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "Niveau du sol" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "Mods utilisant le protocole de transfert hypertexte" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "Facteur mise à l'échelle du HUD" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "HUD" @@ -2359,22 +2704,54 @@ msgstr "" "statistiques." #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "Bruit de mélange de chaleur" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "Bruit de chaleur" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "Résolution verticale de la fenêtre de jeu." #: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "Bruit de hauteur" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "Hauteur des nuages dans le jeu." #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "Bruit de sélection de hauteur" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "FPU de haute précision" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "Pente des collines" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "Seuil des collines" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Adresse web du serveur affichée sur la liste des serveurs." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "Touche suivant sur la barre d'actions" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "Touche précédent sur la barre d'actions" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Profondeur des rivières" @@ -2403,6 +2780,18 @@ msgid "How wide to make rivers" msgstr "Largeur des rivières" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "Bruit de fusion d'humidité" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "Bruit d'humidité" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "Variation d'humidité pour les biomes." + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2433,6 +2822,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" +"Si activé, le serveur n'enverra pas les blocs qui ne sont pas visibles par\n" +"le client en fonction de sa position. Cela peut réduire de 50% à 80%\n" +"le nombre de blocs envoyés. Le client ne pourra plus voir ces blocs à moins\n" +"de se déplacer, ce qui réduit l'efficacité des tricheries du style \"noclip\"" +"." + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2476,6 +2879,12 @@ msgstr "" "passe vide." #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" +"Si activé, afficher le message de statut du serveur lorsqu'un joueur se " +"connecte." + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2506,6 +2915,14 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Couleur de fond de la console du jeu (R,G,B)." #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "Hauteur de la console de tchat du jeu, entre 0.1 (10%) et 1.0 (100%)." + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "Touche d'augmentation de volume" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2559,6 +2976,10 @@ msgid "Interval of sending time of day to clients." msgstr "Intervalle d'envoi de l'heure aux clients." #: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "Hack d'image d'inventaire" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "Animation des items d'inventaire" @@ -2579,6 +3000,10 @@ msgid "Item entity TTL" msgstr "Durée de vie des items abandonnés" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "Itérations" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." @@ -2587,6 +3012,14 @@ msgstr "" "Contrôle la quantité de détails fins." #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "ID de manette" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "Type de manette" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "Intervalle de répétition du bouton du Joystick" @@ -2637,6 +3070,22 @@ msgstr "" "La portée est d'environ -2 à 2." #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Sauter" @@ -2656,6 +3105,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Touche pour diminuer le volume.\n" +"Voir http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e23190173" +"5e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2676,6 +3135,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Touche pour augmenter le volume.\n" +"Voir http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e23190173" +"5e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2736,6 +3205,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Touche pour rendre le jeu muet.\n" +"Voir http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e23190173" +"5e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2756,6 +3235,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Touche pour ouvrir la fenêtre du tchat pour entrer des commandes locales.\n" +"Voir http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e23190173" +"5e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2786,6 +3275,26 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Touche pour sélectionner le prochain item dans la barre d'action.\n" +"Voir http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e23190173" +"5e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Touche pour sélectionner l'item précédent dans la barre d'action.\n" +"Voir http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e23190173" +"5e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2931,6 +3440,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Touche pour afficher/cacher la grande console de tchat.\n" +"Voir http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e23190173" +"5e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2951,10 +3470,28 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Touche pour zoomer (lorsque c'est possible).\n" +"Voir http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e23190173" +"5e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "Touche utilisée pour monter/descendre" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "Pic du lac" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "Seuil de lacs" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "Langue" @@ -2963,6 +3500,10 @@ msgid "Large cave depth" msgstr "Profondeur des grandes caves" #: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "Touche de grande console de tchat" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "Fonctionnalités de la lave" @@ -3030,6 +3571,13 @@ msgstr "Limite des files émergentes à générer" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -3114,6 +3662,10 @@ msgstr "" "problèmes." #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "Rendre toutes les liquides opaques" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "Répertoire de la carte du monde" @@ -3157,30 +3709,47 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Attributs de génération du monde spécifiques au Mapgen V5.\n" +"Les drapeaux qui ne sont pas spécifiés dans la chaîne de drapeau ne sont pas " +"modifiés par rapport à la valeur par défaut.\n" +"Les drapeaux commençant par \"no\" sont désactivés explicitement." + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" -"Attributs spécifiques à Mapgen V6.\n" -"Quand les terrains neigeux sont activés, les jungles sont activées " -"automatiquement, les drapeaux \"jungles\" sont ignorés.\n" +"Attributs de génération du monde spécifiques à Mapgen v6.\n" +"Quand les terrains neigeux sont activés avec le drapeau \"snowbiomes\",\n" +"les jungles sont activées automatiquement, les drapeaux \"jungles\" sont " +"ignorés.\n" "Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs par " "défaut.\n" -"Les drapeaux commençant par \"non\" sont désactivés explicitement." +"Les drapeaux commençant par \"no\" sont désactivés explicitement." #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" "Attributs de terrain spécifiques au Mapgen V7.\n" "Le drapeau 'des crêtes' contrôle les rivières.\n" +"Les terrains flottants sont actuellement experimentaux et sujets à des " +"changements.\n" "Les drapeaux qui ne sont pas spécifiés dans la chaîne de drapeau ne sont pas " "modifiés par rapport à la valeur par défaut.\n" "Les drapeaux commençant par \"non\" sont désactivés explicitement." @@ -3198,24 +3767,20 @@ msgid "Mapblock limit" msgstr "Limite des mapblocks" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "Délais d'interruption du déchargement des mapblocks" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Générateur de carte avec des vallées" +msgid "Mapblock mesh generation delay" +msgstr "Délai de génération des maillages de MapBlocks" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "Mapgen : paramètres de bruit de la température" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "Taille du cache du générateur de meshes pour les mapblocks" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "Mapgen : paramètres de mélange de l'humidité" +msgid "Mapblock unload timeout" +msgstr "Délais d'interruption du déchargement des mapblocks" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "Mapgen : paramètres de bruit de l'humidité" +msgid "Mapgen Valleys" +msgstr "Générateur de carte avec des vallées" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3230,119 +3795,14 @@ msgid "Mapgen flat" msgstr "Générateur de terrain plat" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Ampleur de grotte du générateur de terrain plat" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "Générateur de terrain plat: paramètres de bruit grotte1" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "Générateur de terrain plat: paramètres de bruit grotte2" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "Générateur de terrain plat: paramètres de bruit sur la profondeur" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "Drapeaux du générateur de terrain plat" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "Niveau du sol du générateur de terrain plat" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "Élévation des collines dans le générateur de terrain plat" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "Seuil du générateur de cartes avec de faibles collines" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "Escarpement des lacs du générateur de terrain plat" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "Seuil des lacs du générateur de terrain plat" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "Profondeur des grandes grottes du générateur de terrain plat" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "Paramètres de bruit du générateur de terrain plat" +msgid "Mapgen flat specific flags" +msgstr "Drapeaux spécifiques du générateur de terrain plat" #: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "Fractales du générateur de terrain" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "Ampleur des grottes du générateur de terrain Julia" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "Mapgen V5 : paramètres de bruit cave1" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "Mapgen V5 : paramètre de bruit cave2" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "Mapgen V5 : paramètres de bruit sur la profondeur" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "Drapeaux des fractales du générateur de terrain" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "Itérations du générateur de terrain julia" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "Mapgen Julia : fractale W" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "Mapgen Julia : fractale X" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "Mapgen Julia : fractale Y" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "Mapgen Julia : fractale Z" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "Générateur de terrain Julia: décalages fractals" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "Générateur de terrain Julia: échelles fractales" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "Paramètres de bruit du fond marin pour le générateur de terrain julia" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "Générateur de terrain Julia: couche fractale W" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" -"Paramètres de bruit du mélange de température pour le générateur de terrain" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Nom du générateur de carte" @@ -3351,146 +3811,24 @@ msgid "Mapgen v5" msgstr "Générateur de terrain V5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "Ampleur des grottes du générateur de terrain V5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "Paramètres du bruit cave1 du générateur de terrain v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "Paramètres du bruit cave2 du générateur de terrain v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "Paramètres du facteur de dispersion du générateur de terrain v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" -"Paramètres du bruit de la profondeur de remplissage du générateur de terrain " -"v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "Paramètres du bruit en altitude du générateur de terrain v5" +msgid "Mapgen v5 specific flags" +msgstr "Drapeaux spécifiques au Mapgen v5" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "Générateur de terrain V6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "Paramètres du bruit des pommiers du générateur de terrain v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "Mapgen V6 : fréquence des plages" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "Mapgen V6 : paramètres de bruit des plages" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "Mapgen V6 : paramètres de bruit des biomes" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "Mapgen V6 : paramètres de bruit des caves" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "Mapgen V6 : fréquence des déserts" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "Mapgen V6 : drapeaux" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "Mapgen V6 : paramètres de sélection de la hauteur de bruit" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "Mapgen V6 : paramètres de bruit de l'humidité" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "Mapgen V6 : paramètres de bruit de la vase" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "Mapgen V6 : paramètres de bruit des pentes" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "Mapgen V6 : paramètres de bruit de l'altitude du terrain" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "Mapgen V6 : paramètres de bruit du terrain de base" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "Mapgen V6 : paramètres de bruit des arbres" +msgid "Mapgen v6 specific flags" +msgstr "Drapeaux spécifiques au Mapgen v6" #: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "Mapgen V7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "Ampleur des grottes du générateur de terrain: Mapgen V7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "Mapgen V7 : paramètres de bruit cave1" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "Mapgen V7 : paramètres de bruit cave2" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "Mapgen V7 : paramètres de bruit sur la profondeur" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "Mapgen V7 : drapeaux" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "Mapgen V7 : paramètres de sélection de la hauteur du bruit" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "Mapgen V7 : paramètres de hauteur du bruit des montagnes" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "Mapgen V7 : paramètres de bruit des montagnes" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "Mapgen V7 : paramètres de bruit des rivières" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "Mapgen V7 : paramètres de bruit de l'eau des rivières" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "Mapgen V7 : paramètres de bruit de l'altitude du terrain" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "Mapgen V7 : paramètres du bruit du terrain de base" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "Mapgen V7 : paramètres du bruit de la persistance du terrain" +msgid "Mapgen v7 specific flags" +msgstr "Drapeaux spécifiques au Mapgen v7" #: src/settings_translation_file.cpp msgid "Massive cave depth" @@ -3672,6 +4010,10 @@ msgid "Mipmapping" msgstr "Mip-mapping" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "Modifie la taille des éléments de la barre d'action principale." + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "URL des détails du magasin de mods" @@ -3692,6 +4034,14 @@ msgid "Monospace font size" msgstr "Taille de la police Monospace" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "Bruit de hauteur des montagnes" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "Bruit pour les montagnes" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "Sensibilité de la souris" @@ -3700,6 +4050,10 @@ msgid "Mouse sensitivity multiplier." msgstr "Facteur de sensibilité de la souris." #: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "Bruit pour la boue" + +#: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." @@ -3708,12 +4062,8 @@ msgstr "" "Exemples : 0 = aucun mouvement, 1 = normal, 2 = double." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" -"Facteur de mouvement de bras.\n" -"Par exemple : 0 = pas de mouvement, 1 = normal, 2 = double." +msgid "Mute key" +msgstr "Touche pour rendre le jeu muet" #: src/settings_translation_file.cpp msgid "" @@ -3774,11 +4124,6 @@ msgid "NodeTimer interval" msgstr "Intervalle de temps d'un nÅ“ud" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" -"Paramètres de bruit pour la température, l'humidité et le mélange de biomes." - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "Bruits" @@ -3825,6 +4170,14 @@ msgid "Number of parallax occlusion iterations." msgstr "Nombre d'itérations sur l'occlusion parallaxe." #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "Décallage" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "Liquides opaques" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "Bias général de l'occlusion parallaxe, habituellement échelle/2." @@ -3865,6 +4218,14 @@ msgid "Path to save screenshots at." msgstr "Chemin où les captures d'écran sont sauvegardées." #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" +"Répertoire des shaders. Si le chemin n'est pas défini, le chemin par défaut " +"est utilisé." + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" "Chemin vers le dossier des textures. Toutes les textures sont d'abord " @@ -3974,6 +4335,14 @@ msgid "Report path" msgstr "Chemin du rapport" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "Bruit pour les crêtes" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "Bruit pour les crêtes sous l'eau" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Droite" @@ -4006,6 +4375,10 @@ msgid "Round minimap" msgstr "Mini-carte circulaire" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "Sauvegarde le monde du serveur sur le disque-dur du client." @@ -4014,6 +4387,10 @@ msgid "Saving map received from server" msgstr "Sauvegarder le monde du serveur" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "Echelle" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -4063,6 +4440,14 @@ msgstr "" "Utilisez 0 pour la qualité par défaut." #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "Bruit pour les fonds marins" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "Deuxième de 2 bruits 3D qui définissent ensemble des tunnels." + +#: src/settings_translation_file.cpp msgid "Security" msgstr "Sécurité" @@ -4107,6 +4492,10 @@ msgid "Server port" msgstr "Port du serveur" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "Tests d'occultation côté serveur" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL de la liste des serveurs publics" @@ -4147,16 +4536,24 @@ msgstr "" "Nécessite les shaders pour être activé." #: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "Chemin des shaders" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" "Les shaders permettent des effets visuels avancés et peuvent améliorer les " "performances sur certaines cartes graphiques.\n" "Fonctionne seulement avec OpenGL." #: src/settings_translation_file.cpp +msgid "Shadow limit" +msgstr "Limite des ombres" + +#: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." msgstr "Forme de la mini-carte. Activé = ronde, désactivé = carrée." @@ -4179,11 +4576,30 @@ msgid "" msgstr "Taille des chunks à générer, établie en mapblocks (16^3 blocs)." #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "Largeur de part" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" "La pente et le remplissage fonctionnent ensemble pour modifier les hauteurs" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "Lumière douce" @@ -4231,6 +4647,14 @@ msgid "Static spawnpoint" msgstr "Emplacement du spawn statique" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "Message de statut à la connexion" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "Bruit pour les pentes" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "Force des normalmaps autogénérés." @@ -4251,10 +4675,30 @@ msgid "Synchronous SQLite" msgstr "SQLite synchronisé" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "Variation de température pour les biomes." + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "Hauteur du terrain" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "Bruit pour le terrain de base" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "Bruit pour la hauteur du terrain" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "Bruit pour le terrain" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4275,6 +4719,10 @@ msgstr "" "Ajuster vers 0. 0 pour une plus grande proportion." #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "Bruit du terrain persistant" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "Chemin des textures" @@ -4296,11 +4744,14 @@ msgstr "La profondeur de la terre ou autre matériau" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." msgstr "" "Le chemin d'accès au fichier relatif au monde dans lequel les profils seront " -"sauvegardés.\n" +"sauvegardés." + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "L'identifiant de la manette à utiliser" #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -4369,6 +4820,10 @@ msgstr "" "le bouton droit de la souris." #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "Le type de manette" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "Cette police sera utilisée pour certaines langues." @@ -4420,6 +4875,10 @@ msgid "Tooltip delay" msgstr "Délais d'apparition des infobulles" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "Bruit pour les arbres" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Filtrage trilinéaire" @@ -4439,10 +4898,35 @@ msgid "Trusted mods" msgstr "Mods sécurisés" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" +"Hauteur maximum typique, au-dessus et au-dessous du point médian, du terrain " +"de montagne du flotteur." + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "URL de la liste des serveurs affichée dans l'onglet multijoueur." #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "Sous-échantillonage" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" +"Le sous-échantillonage ressemble à l'utilisation d'une définition d'écran\n" +"plus faible, mais il ne s'applique qu'au rendu 3D, gardant l'interface " +"intacte.\n" +"Cela peut donner lieu à un bonus de performance conséquent, au détriment de " +"la qualité d'image." + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "Distance de transfert du joueur illimitée" @@ -4511,6 +4995,42 @@ msgid "Valleys C Flags" msgstr "Drapeaux de Valleys C" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "Variation du nombre de cavernes." + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "Variation de la profondeur des blocs en surface pour les biomes." + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "Contrôle l'élévation/hauteur des falaises." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "Synchronisation verticale de la fenêtre de jeu." @@ -4519,16 +5039,12 @@ msgid "Video driver" msgstr "Pilote vidéo" #: src/settings_translation_file.cpp -msgid "View bobbing" -msgstr "Mouvement du bras" +msgid "View bobbing factor" +msgstr "Facteur du mouvement de tête" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" -msgstr "" -"Distance d'affichage en blocs.\n" -"Minimum à 20" +msgid "View distance in nodes." +msgstr "Distance d'affichage en blocs." #: src/settings_translation_file.cpp msgid "View range decrease key" @@ -4539,6 +5055,10 @@ msgid "View range increase key" msgstr "Augmenter la distance d'affichage" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "Touche de vue du zoom" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "Plage de visualisation" @@ -4651,24 +5171,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" -"Limite de la génération de terrain.\n" -"Notes :\n" -"- Limite absolue à 31000 (une valeur supérieure n'a aucun effet).\n" -"- La génération de terrain fonctionne par groupes de 80^3 blocs (= 5^3 " -"mapblocks).\n" -"- Ces groupes ont un décalage de -32, -32 blocs depuis leur origine.\n" -"- Seuls les groupes intégrant les limites définies par map_generation_limit " -"sont générées" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" "Détermine l'utilisation des polices Freetype. Nécessite une compilation avec " @@ -4734,6 +5236,16 @@ msgstr "Épaisseur des bordures de sélection autour des blocs." #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" +"Systèmes Windows seulement : démarrer Minetest avec la fenêtre de commandes\n" +"en arrière-plan. Contient les mêmes informations que dans debug.txt (nom par " +"défaut)." + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4750,6 +5262,42 @@ msgstr "" "Coordonnée Y de la limite supérieure des grandes grottes pseudo-aléatoires." #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "La distance Y jusqu'à laquelle la caverne peut s'étendre." + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "Limite haute de génération des cavernes." + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "Distance d'optimisation d'envoi des blocs" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "Délais d'interruption de cURL lors d'un téléchargement de fichier" @@ -4761,6 +5309,248 @@ msgstr "Limite parallèle de cURL" msgid "cURL timeout" msgstr "Délais d'interruption de cURL" +#~ msgid "Hide mp content" +#~ msgstr "Cacher le contenu du mod" + +#~ msgid "Start Game" +#~ msgstr "Démarrer" + +#~ msgid "Attn" +#~ msgstr "Attente" + +#~ msgid "Capital" +#~ msgstr "Verr Maj" + +#~ msgid "Comma" +#~ msgstr "Virgule" + +#~ msgid "CrSel" +#~ msgstr "Vider sélection" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Final" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Moins" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Point" + +#~ msgid "Plus" +#~ msgstr "Plus" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Taille des déserts et plages dans Mapgen V6.\n" +#~ "Quand les environnements neigeux sont activés, le paramètre de fréquence " +#~ "des déserts dans Mapgen V6 est ignoré." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Détermine la forme du terrain.\n" +#~ "Les 3 nombres entre parenthèses contrôlent l'échelle du terrain,\n" +#~ "ces nombres doivent être identiques." + +#~ msgid "Mapgen biome heat noise parameters" +#~ msgstr "Mapgen : paramètres de bruit de la température" + +#~ msgid "Mapgen biome humidity blend noise parameters" +#~ msgstr "Mapgen : paramètres de mélange de l'humidité" + +#~ msgid "Mapgen biome humidity noise parameters" +#~ msgstr "Mapgen : paramètres de bruit de l'humidité" + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Ampleur de grotte du générateur de terrain plat" + +#~ msgid "Mapgen flat cave1 noise parameters" +#~ msgstr "Générateur de terrain plat: paramètres de bruit grotte1" + +#~ msgid "Mapgen flat cave2 noise parameters" +#~ msgstr "Générateur de terrain plat: paramètres de bruit grotte2" + +#~ msgid "Mapgen flat filler depth noise parameters" +#~ msgstr "Générateur de terrain plat: paramètres de bruit sur la profondeur" + +#~ msgid "Mapgen flat large cave depth" +#~ msgstr "Profondeur des grandes grottes du générateur de terrain plat" + +#~ msgid "Mapgen flat terrain noise parameters" +#~ msgstr "Paramètres de bruit du générateur de terrain plat" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Ampleur des grottes du générateur de terrain Julia" + +#~ msgid "Mapgen fractal cave1 noise parameters" +#~ msgstr "Mapgen V5 : paramètres de bruit cave1" + +#~ msgid "Mapgen fractal cave2 noise parameters" +#~ msgstr "Mapgen V5 : paramètre de bruit cave2" + +#~ msgid "Mapgen fractal filler depth noise parameters" +#~ msgstr "Mapgen V5 : paramètres de bruit sur la profondeur" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Drapeaux des fractales du générateur de terrain" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Itérations du générateur de terrain julia" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "Mapgen Julia : fractale W" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "Mapgen Julia : fractale X" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "Mapgen Julia : fractale Y" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "Mapgen Julia : fractale Z" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "Générateur de terrain Julia: décalages fractals" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Générateur de terrain Julia: échelles fractales" + +#~ msgid "Mapgen fractal seabed noise parameters" +#~ msgstr "" +#~ "Paramètres de bruit du fond marin pour le générateur de terrain julia" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Générateur de terrain Julia: couche fractale W" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Ampleur des grottes du générateur de terrain V5" + +#~ msgid "Mapgen v5 cave1 noise parameters" +#~ msgstr "Paramètres du bruit cave1 du générateur de terrain v5" + +#~ msgid "Mapgen v5 cave2 noise parameters" +#~ msgstr "Paramètres du bruit cave2 du générateur de terrain v5" + +#~ msgid "Mapgen v5 factor noise parameters" +#~ msgstr "Paramètres du facteur de dispersion du générateur de terrain v5" + +#~ msgid "Mapgen v5 filler depth noise parameters" +#~ msgstr "" +#~ "Paramètres du bruit de la profondeur de remplissage du générateur de " +#~ "terrain v5" + +#~ msgid "Mapgen v5 height noise parameters" +#~ msgstr "Paramètres du bruit en altitude du générateur de terrain v5" + +#~ msgid "Mapgen v6 apple trees noise parameters" +#~ msgstr "Paramètres du bruit des pommiers du générateur de terrain v6" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "Mapgen V6 : fréquence des plages" + +#~ msgid "Mapgen v6 beach noise parameters" +#~ msgstr "Mapgen V6 : paramètres de bruit des plages" + +#~ msgid "Mapgen v6 biome noise parameters" +#~ msgstr "Mapgen V6 : paramètres de bruit des biomes" + +#~ msgid "Mapgen v6 cave noise parameters" +#~ msgstr "Mapgen V6 : paramètres de bruit des caves" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "Mapgen V6 : fréquence des déserts" + +#~ msgid "Mapgen v6 mud noise parameters" +#~ msgstr "Mapgen V6 : paramètres de bruit de la vase" + +#~ msgid "Mapgen v6 steepness noise parameters" +#~ msgstr "Mapgen V6 : paramètres de bruit des pentes" + +#~ msgid "Mapgen v6 terrain altitude noise parameters" +#~ msgstr "Mapgen V6 : paramètres de bruit de l'altitude du terrain" + +#~ msgid "Mapgen v6 terrain base noise parameters" +#~ msgstr "Mapgen V6 : paramètres de bruit du terrain de base" + +#~ msgid "Mapgen v6 trees noise parameters" +#~ msgstr "Mapgen V6 : paramètres de bruit des arbres" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Ampleur des grottes du générateur de terrain: Mapgen V7" + +#~ msgid "Mapgen v7 cave1 noise parameters" +#~ msgstr "Mapgen V7 : paramètres de bruit cave1" + +#~ msgid "Mapgen v7 cave2 noise parameters" +#~ msgstr "Mapgen V7 : paramètres de bruit cave2" + +#~ msgid "Mapgen v7 filler depth noise parameters" +#~ msgstr "Mapgen V7 : paramètres de bruit sur la profondeur" + +#~ msgid "Mapgen v7 height select noise parameters" +#~ msgstr "Mapgen V7 : paramètres de sélection de la hauteur du bruit" + +#~ msgid "Mapgen v7 mountain noise parameters" +#~ msgstr "Mapgen V7 : paramètres de bruit des montagnes" + +#~ msgid "Mapgen v7 ridge noise parameters" +#~ msgstr "Mapgen V7 : paramètres de bruit des rivières" + +#~ msgid "Mapgen v7 ridge water noise parameters" +#~ msgstr "Mapgen V7 : paramètres de bruit de l'eau des rivières" + +#~ msgid "Mapgen v7 terrain altitude noise parameters" +#~ msgstr "Mapgen V7 : paramètres de bruit de l'altitude du terrain" + +#~ msgid "Mapgen v7 terrain base noise parameters" +#~ msgstr "Mapgen V7 : paramètres du bruit du terrain de base" + +#~ msgid "Mapgen v7 terrain persistation noise parameters" +#~ msgstr "Mapgen V7 : paramètres du bruit de la persistance du terrain" + +#~ msgid "" +#~ "Noise parameters for biome API temperature, humidity and biome blend." +#~ msgstr "" +#~ "Paramètres de bruit pour la température, l'humidité et le mélange de " +#~ "biomes." + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "Limite de la génération de terrain.\n" +#~ "Notes :\n" +#~ "- Limite absolue à 31000 (une valeur supérieure n'a aucun effet).\n" +#~ "- La génération de terrain fonctionne par groupes de 80^3 blocs (= 5^3 " +#~ "mapblocks).\n" +#~ "- Ces groupes ont un décalage de -32, -32 blocs depuis leur origine.\n" +#~ "- Seuls les groupes intégrant les limites définies par " +#~ "map_generation_limit sont générées" + #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "" #~ "Profil détaillé des données du mod. Utile pour les développeurs de mods." @@ -4823,15 +5613,9 @@ msgstr "Délais d'interruption de cURL" #~ msgid "If enabled, " #~ msgstr "Si activé, " -#~ msgid "Rendering:" -#~ msgstr "Affichage :" - #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "Redémarrez Minetest pour que le changement du pilote prenne effet" -#~ msgid "Game Name" -#~ msgstr "Nom du jeu" - #~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\"" #~ msgstr "Gamemgr : Impossible de copier le mod \"$1\" dans le jeu \"$2\"" @@ -4886,9 +5670,6 @@ msgstr "Délais d'interruption de cURL" #~ msgid "Add mod:" #~ msgstr "Ajouter un mod :" -#~ msgid "Local install" -#~ msgstr "Installation locale" - #~ msgid "" #~ "Warning: Some mods are not configured yet.\n" #~ "They will be enabled by default when you save the configuration. " diff --git a/po/he/minetest.po b/po/he/minetest.po index 2e5367a9d..a1e7cf6aa 100644 --- a/po/he/minetest.po +++ b/po/he/minetest.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: 2016-05-26 21:01+0000\n" "Last-Translator: yuval hreman <huckvrni@gmail.com>\n" "Language-Team: Hebrew <https://hosted.weblate.org/projects/minetest/minetest/" @@ -19,6 +19,14 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 2.7-dev\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "" + +#: builtin/client/init.lua +msgid "You died." +msgstr "" + #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" msgstr "×ירעה שגי××” בקוד לו××” (Lua), ×›× ×¨××” ב×חד המודי×:" @@ -75,12 +83,13 @@ msgstr "×× ×• ×ª×•×ž×›×™× ×‘×’×¨×¡×ות בין 1$ ל-2$ של הפרוטוקו #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "ביטול" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "תלוי ב:" #: builtin/mainmenu/dlg_config_world.lua @@ -88,6 +97,11 @@ msgid "Disable MP" msgstr "" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "×פשר הכל" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "" @@ -104,17 +118,13 @@ msgstr "" "z0-9_] מותרי×." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "הסתר משחק" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "מוד:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -177,8 +187,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "×”×× ×‘×¨×¦×•× ×š למחוק ×ת \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "מחק" @@ -194,7 +203,7 @@ msgstr "" msgid "Delete World \"$1\"?" msgstr "למחוק ×¢×•×œ× \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "קבל" @@ -272,6 +281,11 @@ msgstr "" msgid "Restore Default" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "חפש" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "" @@ -281,11 +295,11 @@ msgid "Show technical names" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +msgid "The value must be at least $1." msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +msgid "The value must not be larger than $1." msgstr "" #: builtin/mainmenu/modmgr.lua @@ -310,6 +324,10 @@ msgstr "" msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "" @@ -331,10 +349,6 @@ msgid "Rating" msgstr "דירוג" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "חפש" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "×©× ×§×¦×¨:" @@ -370,6 +384,70 @@ msgstr "" msgid "Previous Core Developers" msgstr "" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "קביעת תצורה" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "משחק יצירתי" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "×פשר × ×–×§" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "הסתר משחק" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "שרת" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "התחל משחק" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "ש×/סיסמה" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "חדש" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "×ין ×¢×•×œ× × ×•×¦×¨ ×ו × ×‘×—×¨!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "התחל משחק" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "פורט" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "בחר עול×:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "" @@ -379,6 +457,10 @@ msgid "Mod information:" msgstr "" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "" @@ -398,95 +480,45 @@ msgstr "" msgid "Uninstall selected modpack" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "כתובת / פורט" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "×§×œ×™× ×˜" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "התחבר" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "ש×/סיסמה" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP ×פשר" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "קביעת תצורה" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "משחק יצירתי" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "×פשר × ×–×§" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "ש×/סיסמה" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "חדש" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "×ין ×¢×•×œ× × ×•×¦×¨ ×ו × ×‘×—×¨!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "פורט" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "ציבורי" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "בחר עול×:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "שרת" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "התחל משחק" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP ×פשר" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -517,6 +549,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "" @@ -595,6 +631,10 @@ msgid "Reset singleplayer world" msgstr "שרת" #: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "הגדרות" @@ -658,14 +698,6 @@ msgstr "" msgid "Start Singleplayer" msgstr "" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "שחק" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "שחקן יחיד" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "" @@ -727,6 +759,10 @@ msgid "Player name too long." msgstr "" #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "" @@ -741,42 +777,83 @@ msgid "" msgstr "" #: src/game.cpp -msgid "Change Keys" +#, fuzzy +msgid "- Address: " +msgstr "כתובת / פורט" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "משחק יצירתי" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "×פשר × ×–×§" + +#: src/game.cpp +msgid "- Mode: " msgstr "" #: src/game.cpp -msgid "Change Password" +#, fuzzy +msgid "- Port: " +msgstr "פורט" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "ציבורי" + +#: src/game.cpp +msgid "- PvP: " msgstr "" #: src/game.cpp -msgid "Connecting to server..." +msgid "- Server Name: " msgstr "" #: src/game.cpp -msgid "Continue" +msgid "Change Keys" msgstr "" #: src/game.cpp -msgid "Creating client..." +msgid "Change Password" msgstr "" #: src/game.cpp -msgid "Creating server..." +msgid "Connecting to server..." msgstr "" #: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +msgid "Continue" +msgstr "" + +#: src/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" +msgstr "" + +#: src/game.cpp +msgid "Creating client..." +msgstr "" + +#: src/game.cpp +msgid "Creating server..." msgstr "" #: src/game.cpp @@ -804,6 +881,19 @@ msgid "Exit to OS" msgstr "" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "משחקי×" + +#: src/game.cpp +msgid "Hosting server" +msgstr "" + +#: src/game.cpp msgid "Item definitions..." msgstr "" @@ -824,11 +914,19 @@ msgid "Node definitions..." msgstr "" #: src/game.cpp -msgid "Resolving address..." +msgid "Off" msgstr "" #: src/game.cpp -msgid "Respawn" +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." msgstr "" #: src/game.cpp @@ -836,11 +934,24 @@ msgid "Shutting down..." msgstr "" #: src/game.cpp +msgid "Singleplayer" +msgstr "שחקן יחיד" + +#: src/game.cpp msgid "Sound Volume" msgstr "" #: src/game.cpp -msgid "You died." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp @@ -876,6 +987,10 @@ msgid "Console" msgstr "" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "" @@ -888,6 +1003,10 @@ msgid "Forward" msgstr "" #: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "" @@ -907,6 +1026,22 @@ msgstr "" msgid "Left" msgstr "" +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "" @@ -984,15 +1119,11 @@ msgid "Apps" msgstr "" #: src/keycode.cpp -msgid "Attn" -msgstr "" - -#: src/keycode.cpp msgid "Back" msgstr "" #: src/keycode.cpp -msgid "Capital" +msgid "Caps Lock" msgstr "" #: src/keycode.cpp @@ -1000,22 +1131,10 @@ msgid "Clear" msgstr "" #: src/keycode.cpp -msgid "Comma" -msgstr "" - -#: src/keycode.cpp msgid "Control" msgstr "" #: src/keycode.cpp -msgid "Convert" -msgstr "" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "" - -#: src/keycode.cpp msgid "Down" msgstr "" @@ -1024,47 +1143,44 @@ msgid "End" msgstr "" #: src/keycode.cpp -msgid "Erase OEF" +msgid "Erase EOF" msgstr "" #: src/keycode.cpp -msgid "Escape" -msgstr "" - -#: src/keycode.cpp -msgid "ExSel" +msgid "Execute" msgstr "" #: src/keycode.cpp -msgid "Execute" +msgid "Help" msgstr "" #: src/keycode.cpp -msgid "Final" +msgid "Home" msgstr "" #: src/keycode.cpp -msgid "Help" -msgstr "" +#, fuzzy +msgid "IME Accept" +msgstr "קבל" #: src/keycode.cpp -msgid "Home" +msgid "IME Convert" msgstr "" #: src/keycode.cpp -msgid "Insert" +msgid "IME Escape" msgstr "" #: src/keycode.cpp -msgid "Junja" +msgid "IME Mode Change" msgstr "" #: src/keycode.cpp -msgid "Kana" +msgid "IME Nonconvert" msgstr "" #: src/keycode.cpp -msgid "Kanji" +msgid "Insert" msgstr "" #: src/keycode.cpp @@ -1096,22 +1212,10 @@ msgid "Middle Button" msgstr "" #: src/keycode.cpp -msgid "Minus" -msgstr "" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "" - -#: src/keycode.cpp msgid "Next" msgstr "" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "" - -#: src/keycode.cpp msgid "Num Lock" msgstr "" @@ -1128,6 +1232,10 @@ msgid "Numpad -" msgstr "" #: src/keycode.cpp +msgid "Numpad ." +msgstr "" + +#: src/keycode.cpp msgid "Numpad /" msgstr "" @@ -1176,20 +1284,12 @@ msgid "OEM Clear" msgstr "" #: src/keycode.cpp -msgid "PA1" -msgstr "" - -#: src/keycode.cpp msgid "Pause" msgstr "" #: src/keycode.cpp -msgid "Period" -msgstr "" - -#: src/keycode.cpp -msgid "Plus" -msgstr "" +msgid "Play" +msgstr "שחק" #: src/keycode.cpp msgid "Print" @@ -1287,6 +1387,20 @@ msgid "3D mode" msgstr "" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1348,6 +1462,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1355,7 +1473,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" @@ -1380,6 +1499,12 @@ msgid "Amplifies the valleys" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "" @@ -1395,6 +1520,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" @@ -1403,6 +1532,19 @@ msgid "Ask to reconnect after crash" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "" @@ -1427,6 +1569,14 @@ msgid "Basic Privileges" msgstr "" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "" @@ -1435,6 +1585,14 @@ msgid "Bind address" msgstr "" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" @@ -1463,6 +1621,10 @@ msgid "Camera update toggle key" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "" @@ -1475,6 +1637,30 @@ msgid "Cave width" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1530,10 +1716,19 @@ msgid "Clean transparent textures" msgstr "" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "×§×œ×™× ×˜" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "×§×œ×™× ×˜" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "" @@ -1598,6 +1793,10 @@ msgid "Console color" msgstr "" #: src/settings_translation_file.cpp +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "" @@ -1621,17 +1820,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp @@ -1655,6 +1854,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "ליצור" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" @@ -1691,6 +1895,10 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "" @@ -1727,6 +1935,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1737,6 +1980,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1767,17 +2020,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "חלקיקי×" + +#: src/settings_translation_file.cpp msgid "Disable anticheat" msgstr "" @@ -1822,11 +2083,25 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Enable VBO" msgstr "×פשר בכל" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "" @@ -1862,6 +2137,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -1905,6 +2190,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -1927,7 +2216,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -1997,6 +2290,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2013,10 +2310,34 @@ msgid "Filtering" msgstr "" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "" @@ -2029,6 +2350,10 @@ msgid "Fog" msgstr "" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -2065,6 +2390,14 @@ msgid "Forward key" msgstr "" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2143,11 +2476,19 @@ msgid "Gravity" msgstr "" #: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "HTTP Mods" msgstr "מודי×" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2169,22 +2510,54 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2206,6 +2579,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2231,6 +2616,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2263,6 +2657,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2290,6 +2688,14 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2332,6 +2738,10 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2352,12 +2762,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2395,6 +2817,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "" @@ -2411,6 +2849,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2425,6 +2870,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2467,6 +2919,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2481,6 +2940,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2502,6 +2968,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2602,6 +3082,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2615,10 +3102,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2627,6 +3129,10 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2682,6 +3188,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2754,6 +3267,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2781,9 +3298,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2792,7 +3318,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2811,23 +3338,19 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" +msgid "Mapgen Valleys" msgstr "" #: src/settings_translation_file.cpp @@ -2843,51 +3366,7 @@ msgid "Mapgen flat" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" +msgid "Mapgen flat specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -2895,66 +3374,6 @@ msgid "Mapgen fractal" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "" @@ -2963,27 +3382,7 @@ msgid "Mapgen v5" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Mapgen v5 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -2991,59 +3390,7 @@ msgid "Mapgen v6" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3051,55 +3398,7 @@ msgid "Mapgen v7" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3266,6 +3565,10 @@ msgid "Mipmapping" msgstr "" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3286,6 +3589,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3294,15 +3605,17 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mute key" msgstr "" #: src/settings_translation_file.cpp @@ -3354,10 +3667,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3394,6 +3703,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3434,6 +3751,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3527,6 +3850,14 @@ msgid "Report path" msgstr "" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "" @@ -3559,6 +3890,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3567,6 +3902,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3607,6 +3946,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3651,6 +3998,10 @@ msgid "Server port" msgstr "" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "" @@ -3683,10 +4034,18 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3712,10 +4071,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "" @@ -3754,6 +4132,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -3774,10 +4160,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3792,6 +4198,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "" @@ -3811,8 +4221,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -3863,6 +4276,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -3905,6 +4322,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "" @@ -3920,10 +4341,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -3988,6 +4427,42 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -3996,13 +4471,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4014,6 +4487,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4101,16 +4578,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4161,6 +4628,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4174,6 +4648,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" diff --git a/po/hu/minetest.po b/po/hu/minetest.po index a461b6a6b..96218a658 100644 --- a/po/hu/minetest.po +++ b/po/hu/minetest.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: 2016-05-07 03:17+0000\n" "Last-Translator: Kisbenedek Márton <martonkisbenedek@gmail.com>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/minetest/" @@ -19,6 +19,14 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 2.7-dev\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Újraéledés" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Meghaltál." + #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" msgstr "Hiba történt egy Lua scriptben (egy modban):" @@ -77,12 +85,13 @@ msgstr "$1 és $2 közötti protokoll verziókat támogatunk." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Mégse" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Függ:" #: builtin/mainmenu/dlg_config_world.lua @@ -90,6 +99,11 @@ msgid "Disable MP" msgstr "Modpakk letiltás" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Modpakk letiltás" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Modpakk engedélyez" @@ -106,17 +120,13 @@ msgstr "" "Csak az [0-z0-9_] karakterek engedélyezettek." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Játék elrejtés" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Modpakk tartalom elrejtés" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -180,8 +190,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Biztosan törölni akarod: \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Törlés" @@ -197,7 +206,7 @@ msgstr "Modmgr: érvénytelen mod útvonal: \"$1\"" msgid "Delete World \"$1\"?" msgstr "\"$1\" világ törlése?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Elfogad" @@ -275,6 +284,11 @@ msgstr "Lehetséges értékek: " msgid "Restore Default" msgstr "Alapértelmezett visszaállÃtás" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Keresés" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Útvonal kiválasztás" @@ -284,11 +298,13 @@ msgid "Show technical names" msgstr "Technikai nevek mutatása" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "Az értéknek nagyobbnak kell lennie ennél: $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "Az értéknek kisebbnek kell lennie ennél: $1." #: builtin/mainmenu/modmgr.lua @@ -316,6 +332,10 @@ msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" "Mod telepÃtése: nem található megfelelÅ‘ mappanév ehhez a modpakk-hoz: $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Ãruház bezárása" @@ -337,10 +357,6 @@ msgid "Rating" msgstr "Értékelés" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Keresés" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Rövid név:" @@ -376,6 +392,72 @@ msgstr "Korábbi hozzájárulók" msgid "Previous Core Developers" msgstr "Korábbi belsÅ‘ fejlesztÅ‘k" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "Szerver kihirdetése" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Bind Address" +msgstr "Bind Address" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "BeállÃt" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "KreatÃv mód" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Sérülés engedélyezése" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Játék elrejtés" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Szerver" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Játék indÃtása" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Név/jelszó" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Új" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Nincs létrehozva, vagy kiválasztva világ!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Játékos neve" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Port" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Világ kiválasztása:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Szerver port" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "TelepÃtett modok:" @@ -385,6 +467,10 @@ msgid "Mod information:" msgstr "Mod ismertetÅ‘:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Nincs elérhetÅ‘ mod leÃrás" @@ -404,96 +490,46 @@ msgstr "Kiválasztott mod törlése" msgid "Uninstall selected modpack" msgstr "Kiválasztott modpakk törlése" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "CÃm / Port" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Kliens" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Csatlakozás" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "KreatÃv mód" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Sérülés engedélyezve" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Kedvenc törlés" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Kedvenc" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Név / Jelszó" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP engedélyezve" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua +#: builtin/mainmenu/tab_online.lua #, fuzzy -msgid "Bind Address" -msgstr "Bind Address" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "BeállÃt" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "KreatÃv mód" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Sérülés engedélyezése" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Név/jelszó" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Új" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Nincs létrehozva, vagy kiválasztva világ!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Port" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Nyilvános" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Világ kiválasztása:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Szerver" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Szerver port" +msgid "Play Online" +msgstr "Játékos neve" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Játék indÃtása" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP engedélyezve" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -524,6 +560,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Biztosan visszaállÃtod az egyjátékos világod?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Bilineáris szűrés" @@ -604,6 +644,11 @@ msgid "Reset singleplayer world" msgstr "Egyjátékos világ visszaállÃtása" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "KépernyÅ‘kép" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "BeállÃtások" @@ -667,14 +712,6 @@ msgstr "FÅ‘" msgid "Start Singleplayer" msgstr "Egyjátékos mód indÃtása" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Játék" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Egyjátékos" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Nincs elérhetÅ‘ információ" @@ -736,6 +773,10 @@ msgid "Player name too long." msgstr "Túl hosszú játékosnév." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "A megadott világ útvonala nem létezik: " @@ -753,6 +794,44 @@ msgstr "" "Részletekért tekintsd meg a debug.txt fájlt." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Bind Address" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "KreatÃv mód" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Sérülés" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Port" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Nyilvános" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Szerver neve" + +#: src/game.cpp msgid "Change Keys" msgstr "Gombok változtatása" @@ -769,26 +848,22 @@ msgid "Continue" msgstr "Tovább" #: src/game.cpp -msgid "Creating client..." -msgstr "Kliens létrehozása..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Szerver létrehozása..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Alapértelmezett irányÃtás:\n" "- WASD: Mozgás\n" @@ -803,6 +878,14 @@ msgstr "" "- T: Csevegés\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Kliens létrehozása..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Szerver létrehozása..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -839,6 +922,20 @@ msgid "Exit to OS" msgstr "Bezárás" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Játék" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Szerver létrehozása..." + +#: src/game.cpp msgid "Item definitions..." msgstr "Elem definÃciók..." @@ -859,24 +956,46 @@ msgid "Node definitions..." msgstr "Csomópont definÃciók..." #: src/game.cpp -msgid "Resolving address..." -msgstr "CÃm feloldása..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Újraéledés" +msgid "On" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "Távoli port" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "CÃm feloldása..." #: src/game.cpp msgid "Shutting down..." msgstr "LeállÃtás..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Egyjátékos" + +#: src/game.cpp msgid "Sound Volume" msgstr "HangerÅ‘" #: src/game.cpp -msgid "You died." -msgstr "Meghaltál." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -911,6 +1030,10 @@ msgid "Console" msgstr "Konzol" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Az \"ugrás\" gomb duplán a repüléshez" @@ -923,6 +1046,11 @@ msgid "Forward" msgstr "ElÅ‘re" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "HangerÅ‘" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Eszköztár" @@ -944,6 +1072,24 @@ msgstr "" msgid "Left" msgstr "Bal" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Parancs" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "KövetkezÅ‘" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Halmok nyomtatása" @@ -1021,41 +1167,23 @@ msgid "Apps" msgstr "Alkalmazások" #: src/keycode.cpp -#, fuzzy -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" msgstr "Vissza" #: src/keycode.cpp -msgid "Capital" -msgstr "Nagybetű" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Törlés" #: src/keycode.cpp -msgid "Comma" -msgstr "VesszÅ‘" - -#: src/keycode.cpp #, fuzzy msgid "Control" msgstr "Control" #: src/keycode.cpp -msgid "Convert" -msgstr "Konvertálás" - -#: src/keycode.cpp -#, fuzzy -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Le" @@ -1065,27 +1193,14 @@ msgstr "Vége" #: src/keycode.cpp #, fuzzy -msgid "Erase OEF" +msgid "Erase EOF" msgstr "Erase OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Kilépés" - -#: src/keycode.cpp -#, fuzzy -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Végrehajt" #: src/keycode.cpp -msgid "Final" -msgstr "Befejezés" - -#: src/keycode.cpp msgid "Help" msgstr "SegÃtség" @@ -1094,23 +1209,33 @@ msgid "Home" msgstr "Otthon" #: src/keycode.cpp -msgid "Insert" -msgstr "Beilleszt" +#, fuzzy +msgid "IME Accept" +msgstr "Elfogad" #: src/keycode.cpp #, fuzzy -msgid "Junja" -msgstr "Junjaa" +msgid "IME Convert" +msgstr "Konvertálás" #: src/keycode.cpp #, fuzzy -msgid "Kana" -msgstr "Kana" +msgid "IME Escape" +msgstr "Kilépés" #: src/keycode.cpp #, fuzzy -msgid "Kanji" -msgstr "Kanjii" +msgid "IME Mode Change" +msgstr "Mód váltás" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "Nem konvertált" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Beilleszt" #: src/keycode.cpp msgid "Left Button" @@ -1141,22 +1266,10 @@ msgid "Middle Button" msgstr "KözépsÅ‘ gomb" #: src/keycode.cpp -msgid "Minus" -msgstr "MÃnusz" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Mód váltás" - -#: src/keycode.cpp msgid "Next" msgstr "KövetkezÅ‘" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nem konvertált" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Numlock" @@ -1173,6 +1286,11 @@ msgid "Numpad -" msgstr "Numerikus bill. -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Numerikus bill. *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Numerikus bill. /" @@ -1222,21 +1340,12 @@ msgid "OEM Clear" msgstr "OEM Clear" #: src/keycode.cpp -#, fuzzy -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Szünet" #: src/keycode.cpp -msgid "Period" -msgstr "Pont" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Plusz" +msgid "Play" +msgstr "Játék" #: src/keycode.cpp msgid "Print" @@ -1338,6 +1447,20 @@ msgid "3D mode" msgstr "3D mód" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1413,6 +1536,10 @@ msgstr "" "Megjegyzés: a cÃm mezÅ‘ a fÅ‘menüben felülÃrja ezt a beállÃtást." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1421,8 +1548,10 @@ msgstr "" "képernyÅ‘khöz." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "Gamma kódolás beállÃtása a fényhez. Alacsonyabb számok - nagyobb fényerÅ‘.\n" @@ -1449,6 +1578,12 @@ msgid "Amplifies the valleys" msgstr "FelerÅ‘sÃti a völgyeket" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Anizotrópikus szűrés" @@ -1467,6 +1602,10 @@ msgstr "" "servers.minetest.net." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" @@ -1475,6 +1614,19 @@ msgid "Ask to reconnect after crash" msgstr "Összeomlás után újracsatlakozás kérése" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Automatikus bejelentés a szerverlistára." @@ -1499,6 +1651,14 @@ msgid "Basic Privileges" msgstr "Alap jogosultságok" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Bilineáris szűrés" @@ -1508,6 +1668,14 @@ msgid "Bind address" msgstr "Bind Address" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "Bit/pixel (vagyis szÃnmélység) teljes képernyÅ‘s módban." @@ -1537,6 +1705,11 @@ msgid "Camera update toggle key" msgstr "Kamera frissÃtés váltás gomb" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "Barlang szélesség" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "" @@ -1549,6 +1722,32 @@ msgid "Cave width" msgstr "Barlang szélesség" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "Barlang szélesség" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Flat (lapos) térképgenerátor domb küszöb" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1605,10 +1804,19 @@ msgid "Clean transparent textures" msgstr "Tiszta átlátszó textúrák" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Kliens" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Kliens és szerver" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Kliens" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Mászás sebessége" @@ -1681,6 +1889,11 @@ msgid "Console color" msgstr "Konzol szÃn" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Konzol gomb" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Konzol gomb" @@ -1707,15 +1920,6 @@ msgstr "" "változatlan marad." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Sivatagok és tengerpartok mérete a v6 térképgenerátorban.\n" -"Amikor a havas területek engedélyezve vannak, 'mgv6_freq_desert' figyelmen " -"kÃvül hagyva." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "A tavak süllyedésének meredekségét/mélységét állÃtja." @@ -1724,6 +1928,12 @@ msgid "Controls steepness/height of hills." msgstr "A dombok meredekségét/magasságát állÃtja." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "" "A járatok szélességét határozza meg, alacsonyabb érték szélesebb járatokat " @@ -1750,6 +1960,11 @@ msgstr "" "Ez megnehezÃtheti a bányászatot. Nulla érték kikapcsolja. (0-10)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Létrehoz" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Célkereszt alfa" @@ -1786,6 +2001,11 @@ msgid "Debug log level" msgstr "HibakeresÅ‘ napló szint" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "HUD váltás gomb" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "" @@ -1824,6 +2044,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1834,6 +2089,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1866,18 +2131,23 @@ msgstr "" "csatlakoznak." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" msgstr "" -"A terep alakját határozza meg.\n" -"A 3 szám a zárójelben határozza meg a terep \n" -"méretarányát, a 3 számnak meg kell egyeznie." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Részecskék" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1924,10 +2194,24 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "VBO engedélyez" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Mod biztonság engedélyezése" @@ -1973,6 +2257,16 @@ msgstr "" "a szerverhez történÅ‘ csatlakozáskor." #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2020,6 +2314,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2044,7 +2342,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2122,6 +2424,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2138,10 +2444,35 @@ msgid "Filtering" msgstr "Szűrés" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Floatland level" +msgstr "VÃzszint" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Repülés gomb" @@ -2154,6 +2485,10 @@ msgid "Fog" msgstr "Köd" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Köd váltás gomb" @@ -2190,6 +2525,14 @@ msgid "Forward key" msgstr "ElÅ‘re gomb" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "Freetype betűtÃpusok" @@ -2282,10 +2625,19 @@ msgid "Gravity" msgstr "Gravitáció" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "Flat (lapos) térképgenerátor talaj szint" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "HTTP Modok" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "HUD váltás gomb" @@ -2307,22 +2659,57 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "A kezdeti ablak méret magasság összetevÅ‘je." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Jobb Windows" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "A felhÅ‘k megjelenésének magassága." #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "Nagy pontosságú FPU" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Flat (lapos) térképgenerátor domb meredekség" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Flat (lapos) térképgenerátor domb küszöb" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "A szerver honlapja, ami a szerverlistában megjelenik." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Milyen mélyek legyenek a folyók" @@ -2347,6 +2734,18 @@ msgid "How wide to make rivers" msgstr "Milyen szélesek legyenek a folyók" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2377,6 +2776,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2417,6 +2825,11 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "Ha engedélyezve van, új játékosok nem csatlakozhatnak jelszó nélkül." #: src/settings_translation_file.cpp +#, fuzzy +msgid "If enabled, show the server status message on player connection." +msgstr "Napi üzenet a csatlakozó játékosoknak." + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2451,6 +2864,18 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Játékon belüli csevegÅ‘ konzol hátterének szÃne (R,G,B)." #: src/settings_translation_file.cpp +#, fuzzy +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" +"Játékon belüli csevegÅ‘ konzol hátterének alfája (átlátszatlanság, 0 és 255 " +"között)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Konzol gomb" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2494,6 +2919,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Eszköztár gomb" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "Eszköztár elemek animációi" @@ -2514,12 +2944,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Joystick button repetition interval" msgstr "Jobb kattintás ismétlés idÅ‘köz" @@ -2559,6 +3001,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Ugrás gomb" @@ -2577,6 +3035,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Gomb a látóterület csökkentéséhez.\n" +"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2597,6 +3066,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Gomb a látóterület növeléséhez.\n" +"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2657,6 +3137,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Ugrás gombja.\n" +"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2677,6 +3168,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Gomb a csevegÅ‘ ablak megnyitásához, parancsok beÃrásához.\n" +"Lásd: //irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2704,6 +3206,28 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Gomb az Eszköztár megnyitásához.\n" +"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Gomb az Eszköztár megnyitásához.\n" +"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " @@ -2850,6 +3374,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Gomb a csevegÅ‘ megjelenÃtéséhez.\n" +"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2867,10 +3402,31 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Ugrás gombja.\n" +"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "Gomb használat a mászás/ereszkedéshez" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Flat (lapos) térképgenerátor tó meredekség" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Flat (lapos) térképgenerátor tó küszöb" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "Nyelv" @@ -2879,6 +3435,11 @@ msgid "Large cave depth" msgstr "Nagy barlang mélység" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Konzol gomb" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "Láva jellemzÅ‘k" @@ -2939,6 +3500,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -3015,6 +3583,10 @@ msgstr "" "problémákat okoz." #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "Térkép mappája" @@ -3063,9 +3635,26 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Térkép generálási jellemzÅ‘k csak a Flat (lapos) térképgenerátor esetében.\n" +"Esetenkénti tavak és dombok generálása a lapos világba.\n" +"The default flags set in the engine are: none\n" +"The flags string modifies the engine defaults.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with \"no\" are used to explicitly disable them." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3083,7 +3672,8 @@ msgstr "" #, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3109,24 +3699,21 @@ msgid "Mapblock limit" msgstr "Térképblokk korlát" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Valleys térképgenerátor" +#, fuzzy +msgid "Mapblock mesh generation delay" +msgstr "Térkép generálási korlát" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +msgid "Mapgen Valleys" +msgstr "Valleys térképgenerátor" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3141,118 +3728,15 @@ msgid "Mapgen flat" msgstr "Flat (lapos) térképgenerátor" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Flat (lapos) térképgenerátor barlang szélesség" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "Flat (lapos) térképgenerátor talaj szint" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" +#, fuzzy +msgid "Mapgen flat specific flags" msgstr "Flat (lapos) térképgenerátor domb meredekség" #: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "Flat (lapos) térképgenerátor domb küszöb" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "Flat (lapos) térképgenerátor tó meredekség" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "Flat (lapos) térképgenerátor tó küszöb" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "Flat (lapos) térképgenerátor nagy barlang mélység" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "Fractal térképgenerátor" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "Fractal térképgenerátor barlang szélesség" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Térkép generátor neve" @@ -3261,27 +3745,7 @@ msgid "Mapgen v5" msgstr "Térkép generátor v5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "v5 térképgenerátor barlang szélesség" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Mapgen v5 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3289,59 +3753,7 @@ msgid "Mapgen v6" msgstr "Térkép generátor v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "V6 térképgenerátor tengerpart gyakoriság" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "V6 térképgenerátor sivatag gyakoriság" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3349,55 +3761,7 @@ msgid "Mapgen v7" msgstr "Térkép generátor v7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "v7 térképgenerátor barlang szélesség" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3580,6 +3944,10 @@ msgid "Mipmapping" msgstr "Mip-mapping" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "Mod áruház részletek URL" @@ -3600,6 +3968,14 @@ msgid "Monospace font size" msgstr "Monospace betűtÃpus méret" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "Egér érzékenység" @@ -3608,18 +3984,21 @@ msgid "Mouse sensitivity multiplier." msgstr "Egér érzékenység szorzó." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "Használat gomb" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3675,10 +4054,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3715,6 +4090,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3759,6 +4142,12 @@ msgid "Path to save screenshots at." msgstr "KépernyÅ‘mentések mappája." #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "Textúra mappa útvonala. ElÅ‘ször minden textúrát itt keres a játék." @@ -3859,6 +4248,14 @@ msgid "Report path" msgstr "BetűtÃpus helye" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Jobb gomb" @@ -3891,6 +4288,10 @@ msgid "Round minimap" msgstr "Kör alakú minitérkép" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "A kliens által fogadott térkép mentése lemezre." @@ -3899,6 +4300,10 @@ msgid "Saving map received from server" msgstr "A szerverrÅ‘l fogadott térkép mentése" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3948,6 +4353,14 @@ msgstr "" "Használd a 0-t az alapértelmezett minÅ‘séghez." #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "Biztonság" @@ -3992,6 +4405,10 @@ msgid "Server port" msgstr "Szerver port" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "Szerverlista URL" @@ -4033,16 +4450,26 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Shader path" +msgstr "Shaderek" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" "A shaderek fejlett vizuális effekteket engedélyeznek és növelhetik a " "teljesÃtményt néhány videókártya esetében.\n" "Csak OpenGL-el működnek." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow limit" +msgstr "Térképblokk korlát" + +#: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." msgstr "" "A minitérkép alakja. Engedélyezve (enabled) = kerek, letiltva (disabled) = " @@ -4069,10 +4496,29 @@ msgstr "" "blokk)." #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "SimÃtott megvilágÃtás" @@ -4115,6 +4561,14 @@ msgid "Static spawnpoint" msgstr "Statikus feléledési (spawn) pont" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "Generált normálfelületek erÅ‘ssége." @@ -4135,10 +4589,33 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "Terep magasság" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain base noise" +msgstr "Terep magasság" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain higher noise" +msgstr "Terep magasság" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain noise" +msgstr "Terep magasság" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4153,6 +4630,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "Textúrák útvonala" @@ -4172,8 +4653,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -4232,6 +4716,10 @@ msgstr "" "nyomva tartásakor." #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "Ezt a betűtÃpust bizonyos nyelvek használják." @@ -4280,6 +4768,10 @@ msgid "Tooltip delay" msgstr "Eszköztipp késleltetés" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Tri-lineáris szűrés" @@ -4298,10 +4790,29 @@ msgid "Trusted mods" msgstr "MegbÃzható modok" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "A Többjátékos fül alatt megjelenÃtett szerverlista URL-je." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Undersampling" +msgstr "Renderelés:" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4368,6 +4879,43 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "A dombok meredekségét/magasságát állÃtja." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "FüggÅ‘leges képernyÅ‘ szinkronizálás." @@ -4376,13 +4924,12 @@ msgid "Video driver" msgstr "Videó driver" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +#, fuzzy +msgid "View distance in nodes." msgstr "" "Látótávolság blokkokban megadva.\n" "Min = 20" @@ -4396,6 +4943,10 @@ msgid "View range increase key" msgstr "Látóterület növelés gomb" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "Látóterület" @@ -4483,23 +5034,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" -"Hol áll meg a térkép generálás.\n" -"Fontos:\n" -"- 31000 -re van korlátozva (ha magasabbra állÃtjuk, nem lesz eredménye).\n" -"- A térképgenerátor 80x80x80-as csoportokban dolgozik (5x5x5-ös térkép " -"blokkok).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" "Használatban vannak-e freetype betűtÃpusok. Szükséges a beépÃtett freetype " @@ -4554,6 +5088,13 @@ msgstr "A kijelölÅ‘doboz vonalainak szélessége a blokkok körül." #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4569,6 +5110,43 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "block send optimize distance" +msgstr "Max blokk generálási távolság" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4580,6 +5158,111 @@ msgstr "" msgid "cURL timeout" msgstr "" +#~ msgid "Hide mp content" +#~ msgstr "Modpakk tartalom elrejtés" + +#, fuzzy +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "Nagybetű" + +#~ msgid "Comma" +#~ msgstr "VesszÅ‘" + +#, fuzzy +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#, fuzzy +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Befejezés" + +#, fuzzy +#~ msgid "Junja" +#~ msgstr "Junjaa" + +#, fuzzy +#~ msgid "Kana" +#~ msgstr "Kana" + +#, fuzzy +#~ msgid "Kanji" +#~ msgstr "Kanjii" + +#~ msgid "Minus" +#~ msgstr "MÃnusz" + +#, fuzzy +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Pont" + +#~ msgid "Plus" +#~ msgstr "Plusz" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Sivatagok és tengerpartok mérete a v6 térképgenerátorban.\n" +#~ "Amikor a havas területek engedélyezve vannak, 'mgv6_freq_desert' " +#~ "figyelmen kÃvül hagyva." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "A terep alakját határozza meg.\n" +#~ "A 3 szám a zárójelben határozza meg a terep \n" +#~ "méretarányát, a 3 számnak meg kell egyeznie." + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Flat (lapos) térképgenerátor barlang szélesség" + +#~ msgid "Mapgen flat large cave depth" +#~ msgstr "Flat (lapos) térképgenerátor nagy barlang mélység" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Fractal térképgenerátor barlang szélesség" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "v5 térképgenerátor barlang szélesség" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "V6 térképgenerátor tengerpart gyakoriság" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "V6 térképgenerátor sivatag gyakoriság" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "v7 térképgenerátor barlang szélesség" + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "Hol áll meg a térkép generálás.\n" +#~ "Fontos:\n" +#~ "- 31000 -re van korlátozva (ha magasabbra állÃtjuk, nem lesz " +#~ "eredménye).\n" +#~ "- A térképgenerátor 80x80x80-as csoportokban dolgozik (5x5x5-ös térkép " +#~ "blokkok).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" + #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "Részletes mod profil adat. Mod fejlesztÅ‘knek hasznos." @@ -4628,17 +5311,10 @@ msgstr "" #~ msgid "If enabled, " #~ msgstr "Engedélyez" -#~ msgid "Rendering:" -#~ msgstr "Renderelés:" - #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "A driver változások életbe lépéséhez indÃtsd újra a Minetestet" #, fuzzy -#~ msgid "Game Name" -#~ msgstr "Játék" - -#, fuzzy #~ msgid "Password" #~ msgstr "Régi jelszó" diff --git a/po/id/minetest.po b/po/id/minetest.po index 137caaff8..e6a72bec9 100644 --- a/po/id/minetest.po +++ b/po/id/minetest.po @@ -6,21 +6,30 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-12-10 10:03+0000\n" -"Last-Translator: Alvin Hikmawan <alvin.hikmawan@gmail.com>\n" -"Language-Team: Indonesian <https://hosted.weblate.org/projects/minetest/" -"minetest/id/>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-05-31 23:45+0700\n" +"Last-Translator: Muhammad Rifqi Priyo Susanto " +"<muhammadrifqipriyosusanto@gmail.com>\n" +"Language-Team: Indonesian " +"<https://hosted.weblate.org/projects/minetest/minetest/id/>\n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.10-dev\n" +"X-Generator: Poedit 2.0.2\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Bangkit kembali" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Anda mati." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" -msgstr "Sebuah kesalahan terjadi di salah satu skrip Lua, misalnya sebuah mod:" +msgstr "Sebuah kesalahan terjadi di salah satu script Lua, misalnya satu mod:" #: builtin/fstk/ui.lua msgid "An error occured:" @@ -36,11 +45,11 @@ msgstr "Oke" #: builtin/fstk/ui.lua msgid "Reconnect" -msgstr "Sambung ulang" +msgstr "Menyambung Ulang" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "Server ini meminta penyambungan ulang:" +msgstr "Server ini meminta untuk menyambung ulang:" #: builtin/mainmenu/common.lua src/game.cpp msgid "Loading..." @@ -48,11 +57,11 @@ msgstr "Memuat..." #: builtin/mainmenu/common.lua msgid "Protocol version mismatch. " -msgstr "Versi protokol tidak cocok. " +msgstr "Versi protokol tidak sesuai. " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " -msgstr "Server menjalankan protokol versi $1. " +msgstr "Server mengharuskan protokol versi $1. " #: builtin/mainmenu/common.lua msgid "Server supports protocol versions between $1 and $2. " @@ -61,7 +70,8 @@ msgstr "Server mendukung protokol antara versi $1 dan versi $2. " #: builtin/mainmenu/common.lua msgid "Try reenabling public serverlist and check your internet connection." msgstr "" -"Cobalah mencentang ulang daftar server publik dan cek koneksi internet Anda." +"Cobalah untuk mengaktifkan ulang daftar server publik dan periksa sambungan " +"internet Anda." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -75,12 +85,12 @@ msgstr "Kami mendukung protokol antara versi $1 dan versi $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Batal" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +msgid "Dependencies:" msgstr "Bergantung pada:" #: builtin/mainmenu/dlg_config_world.lua @@ -88,6 +98,10 @@ msgid "Disable MP" msgstr "Nonaktifkan PM" #: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Nonaktifkan semua" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Aktifkan PM" @@ -104,21 +118,13 @@ msgstr "" "karakter [a-z0-9_] yang dibolehkan." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "" -"Sembunyikan\n" -"permainan" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "" -"Sembunyikan\n" -"konten pm" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "Tidak harus bergantung pada:" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -142,7 +148,7 @@ msgstr "Buat" #: builtin/mainmenu/dlg_create_world.lua msgid "Download a subgame, such as minetest_game, from minetest.net" -msgstr "Unduh sebuah sub-permainan, misalnya minetest_game, dari minetest.net" +msgstr "Unduh sebuah subpermainan, misalnya minetest_game, dari minetest.net" #: builtin/mainmenu/dlg_create_world.lua msgid "Download one from minetest.net" @@ -154,7 +160,7 @@ msgstr "Permainan" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" -msgstr "Generator peta" +msgstr "Pembuat peta" #: builtin/mainmenu/dlg_create_world.lua msgid "No worldname given or no game selected" @@ -174,15 +180,14 @@ msgstr "Nama dunia" #: builtin/mainmenu/dlg_create_world.lua msgid "You have no subgames installed." -msgstr "Anda tidak punya sub-permainan terpasang." +msgstr "Anda tidak punya subpermainan terpasang." #: builtin/mainmenu/dlg_delete_mod.lua msgid "Are you sure you want to delete \"$1\"?" msgstr "Anda yakin ingin menghapus \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Hapus" @@ -198,7 +203,7 @@ msgstr "Pengelola mod: jalur mod tidak sah \"$1\"" msgid "Delete World \"$1\"?" msgstr "Hapus Dunia \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Setuju" @@ -212,7 +217,7 @@ msgstr "\"$1\" bukan sebuah flag yang sah." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" -msgstr "(Tidak ada keterangan dari pengaturan yang diberikan)" +msgstr "(Tidak ada keterangan pengaturan yang diberikan)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" @@ -236,15 +241,14 @@ msgstr "Diaktifkan" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Format is 3 numbers separated by commas and inside brackets." -msgstr "" -"Format adalah 3 angka yang dipisahkan oleh koma dan di dalam tanda kurung." +msgstr "Ditulis dalam 3 angka yang dipisahkan koma dan diberi tanda kurung." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "" "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " "<octaves>, <persistence>" msgstr "" -"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " +"Penulisan: <pergeseran>, <skala>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " "<octaves>, <persistence>" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -256,10 +260,9 @@ msgid "Mods" msgstr "Mod" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Optionally the lacunarity can be appended with a leading comma." msgstr "" -"Lacunarity (celah, opsional) dapat ditambahkan dengan awalan tanda koma." +"Lacunarity (celah, tidak harus) dapat ditambahkan dengan diawali tanda koma." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a comma seperated list of flags." @@ -281,6 +284,11 @@ msgstr "Nilai yang mungkin adalah: " msgid "Restore Default" msgstr "Atur ke Bawaan" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Cari" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Pilih jalur" @@ -290,12 +298,12 @@ msgid "Show technical names" msgstr "Tampilkan nama teknis" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." -msgstr "Nilai harus lebih besar dari $1." +msgid "The value must be at least $1." +msgstr "Nilai tidak boleh lebih kecil dari $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." -msgstr "Nilai harus lebih kecil dari $1." +msgid "The value must not be larger than $1." +msgstr "Nilai tidak boleh lebih besar dari $1." #: builtin/mainmenu/modmgr.lua msgid "" @@ -323,6 +331,10 @@ msgstr "" "Pemasangan Mod: tidak dapat mencari nama folder yang sesuai untuk paket mod " "$1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "Mod Subpermainan" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Tutup toko" @@ -344,10 +356,6 @@ msgid "Rating" msgstr "Peringkat" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Cari" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Nama pendek:" @@ -365,7 +373,7 @@ msgstr "Pasang ulang" #: builtin/mainmenu/tab_credits.lua msgid "Active Contributors" -msgstr "Kontributor Aktif" +msgstr "Penyumbang Aktif" #: builtin/mainmenu/tab_credits.lua msgid "Core Developers" @@ -377,12 +385,72 @@ msgstr "Penghargaan" #: builtin/mainmenu/tab_credits.lua msgid "Previous Contributors" -msgstr "Kontributor Sebelumnya" +msgstr "Penyumbang Sebelumnya" #: builtin/mainmenu/tab_credits.lua msgid "Previous Core Developers" msgstr "Pengembang Inti Sebelumnya" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "Umumkan Server" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Alamat Sambungan" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Konfigurasi" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Mode Kreatif" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Aktifkan Kerusakan" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "Host Permainan" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "Host Server" + +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" +msgstr "Permainan Lokal" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nama/Kata sandi" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Baru" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Tidak ada dunia yang dibuat atau dipilih!" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Mainkan" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Port" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Pilih Dunia:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Port Server" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Mod Terpasang:" @@ -392,8 +460,12 @@ msgid "Mod information:" msgstr "Informasi mod:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "Tidak bergantung pada mod lain." + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" -msgstr "Tidak ada deskripsi mod tersedia" +msgstr "Tidak ada penjelasan mod tersedia" #: builtin/mainmenu/tab_mods.lua msgid "Rename" @@ -411,95 +483,45 @@ msgstr "Copot pemasangan mod terpilih" msgid "Uninstall selected modpack" msgstr "Copot pemasangan paket mod terpilih" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Alamat / Port" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Klien" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Sambung" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Mode kreatif" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Kerusakan diaktifkan" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Hapus Favorit" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Favorit" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Nama / Kata sandi" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP diaktifkan" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "Ping" -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Alamat Sambungan" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "Main Daring" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Konfigurasi" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Mode Kreatif" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Aktifkan Kerusakan" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Nama/Kata sandi" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Baru" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Tidak ada dunia yang dibuat atau dipilih!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Port" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Publik" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Pilih Dunia:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Server" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Port Server" - -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Mulai Permainan" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP diaktifkan" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -530,6 +552,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Apakah Anda yakin ingin mengatur ulang dunia Anda?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "Simpan ukuran layar" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Bilinear Filter" @@ -570,27 +596,24 @@ msgid "No Mipmap" msgstr "Tanpa Mipmap" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Node Highlighting" -msgstr "Node Highlighting" +msgstr "Sorot Node" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Node Outlining" -msgstr "Node Outlining" +msgstr "Garis Bentuk Node" #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua msgid "None" msgstr "Tidak ada" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Normal Mapping" msgstr "Normal Mapping" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" -msgstr "Daun Opak" +msgstr "Daun Kusam" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Water" @@ -609,6 +632,10 @@ msgid "Reset singleplayer world" msgstr "Atur ulang dunia pemain tunggal" #: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Layar:" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Pengaturan" @@ -672,14 +699,6 @@ msgstr "Beranda" msgid "Start Singleplayer" msgstr "Mulai Pemain Tunggal" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Mainkan" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Pemain Tunggal" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Tidak ada informasi tersedia" @@ -694,7 +713,7 @@ msgstr "Paket Tekstur" #: src/client.cpp msgid "Connection timed out." -msgstr "Koneksi kehabisan waktu." +msgstr "Sambungan kehabisan waktu." #: src/client.cpp msgid "Done!" @@ -718,7 +737,7 @@ msgstr "Membangun ulang shader..." #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" -msgstr "Koneksi rusak (terlalu lama?)" +msgstr "Sambungan rusak (terlalu lama?)" #: src/client/clientlauncher.cpp msgid "Could not find or load game \"" @@ -741,6 +760,10 @@ msgid "Player name too long." msgstr "Nama pemain terlalu panjang." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Tolong pilih sebuah nama!" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Jalur dunia yang diberikan tidak ada: " @@ -754,7 +777,39 @@ msgid "" "Check debug.txt for details." msgstr "" "\n" -"Cek debug.txt untuk detail." +"Periksa debug.txt untuk detail." + +#: src/game.cpp +msgid "- Address: " +msgstr "- Alamat: " + +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "- Mode Kreatif: " + +#: src/game.cpp +msgid "- Damage: " +msgstr "- Kerusakan: " + +#: src/game.cpp +msgid "- Mode: " +msgstr "- Mode: " + +#: src/game.cpp +msgid "- Port: " +msgstr "- Port: " + +#: src/game.cpp +msgid "- Public: " +msgstr "- Publik: " + +#: src/game.cpp +msgid "- PvP: " +msgstr "- PvP: " + +#: src/game.cpp +msgid "- Server Name: " +msgstr "- Nama Server: " #: src/game.cpp msgid "Change Keys" @@ -766,45 +821,52 @@ msgstr "Ganti Kata Sandi" #: src/game.cpp msgid "Connecting to server..." -msgstr "Menghubungkan ke server..." +msgstr "Menyambung ke server..." #: src/game.cpp msgid "Continue" msgstr "Lanjutkan" #: src/game.cpp -msgid "Creating client..." -msgstr "Membuat klien..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Membuat server..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" -msgstr "" -"Kontrol Bawaan:\n" -"- WASD: bergerak\n" -"- Space: lompat/panjat\n" -"- Shift: menyelinap/turun\n" -"- Q: jatuhkan barang\n" -"- I: inventaris\n" -"- Mouse: belok/melihat\n" +"- %s: chat\n" +msgstr "" +"Kontrol:\n" +"- %s: maju\n" +"- %s: mundur\n" +"- %s: geser kiri\n" +"- %s: geser kanan\n" +"- %s: lompat/panjat\n" +"- %s: menyelinap/turun\n" +"- %s: jatuhkan barang\n" +"- %s: inventaris\n" +"- Mouse: belok/lihat\n" "- Mouse kiri: gali/pukul\n" "- Mouse kanan: taruh/pakai\n" "- Roda mouse: pilih barang\n" -"- T: obrolan\n" +"- %s: obrolan\n" + +#: src/game.cpp +msgid "Creating client..." +msgstr "Membuat klien..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Membuat server..." #: src/game.cpp msgid "" @@ -843,6 +905,18 @@ msgid "Exit to OS" msgstr "Tutup Aplikasi" #: src/game.cpp +msgid "Game info:" +msgstr "Informasi permainan:" + +#: src/game.cpp +msgid "Game paused" +msgstr "Permainan dijeda" + +#: src/game.cpp +msgid "Hosting server" +msgstr "Membuat server" + +#: src/game.cpp msgid "Item definitions..." msgstr "Definisi barang..." @@ -863,24 +937,45 @@ msgid "Node definitions..." msgstr "Definisi node..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Mencari alamat..." +msgid "Off" +msgstr "Mati" #: src/game.cpp -msgid "Respawn" -msgstr "Bangkit" +msgid "On" +msgstr "Nyala" + +#: src/game.cpp +msgid "Remote server" +msgstr "Server jarak jauh" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Mencari alamat..." #: src/game.cpp msgid "Shutting down..." msgstr "Mematikan..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Pemain Tunggal" + +#: src/game.cpp msgid "Sound Volume" msgstr "Volume Suara" #: src/game.cpp -msgid "You died." -msgstr "Anda mati." +#, c-format +msgid "Volume changed to %d%%" +msgstr "Volume diubah ke %d%%" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "Volume diubah ke 0%" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "Volume diubah ke 100%" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -915,6 +1010,10 @@ msgid "Console" msgstr "Konsol" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Turunkan volume" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Tekan ganda \"lompat\" untuk terbang" @@ -927,6 +1026,10 @@ msgid "Forward" msgstr "Maju" #: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "Naikkan volume" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventaris" @@ -948,6 +1051,22 @@ msgstr "" msgid "Left" msgstr "Kiri" +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "Perintah lokal" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Bisukan" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "Barang selanjutnya" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "Barang sebelumnya" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Cetak tumpukan" @@ -966,7 +1085,7 @@ msgstr "Menyelinap" #: src/guiKeyChangeMenu.cpp msgid "Toggle Cinematic" -msgstr "Mode sinema" +msgstr "Mode Sinema" #: src/guiKeyChangeMenu.cpp msgid "Toggle fast" @@ -978,7 +1097,7 @@ msgstr "Terbang" #: src/guiKeyChangeMenu.cpp msgid "Toggle noclip" -msgstr "Tembus blok" +msgstr "Tembus node" #: src/guiKeyChangeMenu.cpp msgid "Use" @@ -1025,36 +1144,20 @@ msgid "Apps" msgstr "Tombol Menu" #: src/keycode.cpp -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" -msgstr "Backspace" +msgstr "Back" #: src/keycode.cpp -msgid "Capital" +msgid "Caps Lock" msgstr "Caps Lock" #: src/keycode.cpp msgid "Clear" -msgstr "Bersihkan" - -#: src/keycode.cpp -msgid "Comma" -msgstr "Koma" +msgstr "Clear" #: src/keycode.cpp msgid "Control" -msgstr "Ctrl" - -#: src/keycode.cpp -msgid "Convert" -msgstr "Convert" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" +msgstr "Control" #: src/keycode.cpp msgid "Down" @@ -1065,26 +1168,14 @@ msgid "End" msgstr "End" #: src/keycode.cpp -msgid "Erase OEF" +msgid "Erase EOF" msgstr "Erase OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Esc" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Execute" #: src/keycode.cpp -msgid "Final" -msgstr "Final" - -#: src/keycode.cpp msgid "Help" msgstr "Help" @@ -1093,20 +1184,28 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +msgid "IME Accept" +msgstr "IME Accept" + +#: src/keycode.cpp +msgid "IME Convert" +msgstr "IME Convert" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +msgid "IME Escape" +msgstr "IME Escape" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +msgid "IME Mode Change" +msgstr "IME Mode Change" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +msgid "IME Nonconvert" +msgstr "IME Nonconvert" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1126,31 +1225,19 @@ msgstr "Shift Kiri" #: src/keycode.cpp msgid "Left Windows" -msgstr "Start Kiri" +msgstr "Windows Kiri" #: src/keycode.cpp msgid "Menu" -msgstr "Alt" +msgstr "Menu" #: src/keycode.cpp msgid "Middle Button" msgstr "Klik Tengah" #: src/keycode.cpp -msgid "Minus" -msgstr "Kurang" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Pergantian Mode" - -#: src/keycode.cpp msgid "Next" -msgstr "Page Up" - -#: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nonconvert" +msgstr "Next" #: src/keycode.cpp msgid "Num Lock" @@ -1169,6 +1256,10 @@ msgid "Numpad -" msgstr "Numpad -" #: src/keycode.cpp +msgid "Numpad ." +msgstr "Numpad ." + +#: src/keycode.cpp msgid "Numpad /" msgstr "Numpad /" @@ -1217,20 +1308,12 @@ msgid "OEM Clear" msgstr "OEM Clear" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pause" #: src/keycode.cpp -msgid "Period" -msgstr "Titik" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Tambah" +msgid "Play" +msgstr "Play" #: src/keycode.cpp msgid "Print" @@ -1238,11 +1321,11 @@ msgstr "Print" #: src/keycode.cpp msgid "Prior" -msgstr "Page Down" +msgstr "Prior" #: src/keycode.cpp msgid "Return" -msgstr "Enter" +msgstr "Return" #: src/keycode.cpp msgid "Right Button" @@ -1262,7 +1345,7 @@ msgstr "Shift Kanan" #: src/keycode.cpp msgid "Right Windows" -msgstr "Start Kanan" +msgstr "Windows Kanan" #: src/keycode.cpp msgid "Scroll Lock" @@ -1315,7 +1398,7 @@ msgstr "" "Pergeseran (X,Y,Z) fraktal dari tengah dunia dalam satuan 'scale'.\n" "Digunakan untuk memindahkan daerah bangkit dataran rendah mendekati (0, 0).\n" "Nilai bawaan cocok untuk mandelbrot sets, butuh diganti untuk julia sets.\n" -"Berjangkauan sekitar -2 ke 2. Kalikan dengan 'scale' untuk pergeseran dalam " +"Jangkauan sekitar -2 ke 2. Kalikan dengan 'scale' untuk pergeseran dalam\n" "node." #: src/settings_translation_file.cpp @@ -1323,7 +1406,7 @@ msgid "" "0 = parallax occlusion with slope information (faster).\n" "1 = relief mapping (slower, more accurate)." msgstr "" -"0 = parallax occlusion with slope information (cepat).\n" +"0 = parallax occlusion dengan informasi kemiringan (cepat).\n" "1 = relief mapping (pelan, lebih akurat)." #: src/settings_translation_file.cpp @@ -1335,6 +1418,22 @@ msgid "3D mode" msgstr "Mode 3D" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "Noise 3D yang mengatur gua besar." + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" +"Noise 3D yang mengatur struktur dan ketinggian gunung.\n" +"Juga mengatur struktur dari medan gunung floatland." + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "Noise 3D yang mengatur struktur dari dinding ngarai sungai." + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1371,9 +1470,8 @@ msgstr "" "Sebuah pesan yang akan ditampilkan ke semua klien ketika server dimatikan." #: src/settings_translation_file.cpp -#, fuzzy msgid "Absolute limit of emerge queues" -msgstr "Batas absolut dari antrian muncul" +msgstr "Batas mutlak dari antrian kemunculan (emerge queues)" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -1410,20 +1508,25 @@ msgstr "" "Perhatikan bahwa bidang alamat dalam menu utama menimpa pengaturan ini." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "Tambahkan partikel saat menggali node." + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "" -"Atur konfigurasi dpi ke layar Anda (non X11/Android saja) misalkan untuk " +"Atur konfigurasi dpi ke layar Anda (selain X11/Android saja) misalkan untuk " "layar 4K." #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" -"Sesuaikan encoding gamma untuk tabel cahaya. Angka yang lebih rendah lebih " -"terang.\n" +"Sesuaikan gamma encoding untuk tabel cahaya.\n" +"Angka yang lebih rendah lebih terang.\n" "Pengaturan ini untuk klien saja dan diabaikan oleh server." #: src/settings_translation_file.cpp @@ -1439,7 +1542,6 @@ msgid "Always fly and fast" msgstr "Selalu terbang dan bergerak cepat" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ambient occlusion gamma" msgstr "Ambient occlusion gamma" @@ -1448,7 +1550,14 @@ msgid "Amplifies the valleys" msgstr "Memperbesar lembah" #: src/settings_translation_file.cpp -#, fuzzy +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" +"Sistem Android saja: Mencoba membuat tekstur inventaris dari mesh\n" +"saat tidak ditemukan render yang didukung." + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Anisotropic filtering" @@ -1463,8 +1572,12 @@ msgid "" "minetest.net." msgstr "" "Mengumumkan kepada daftar server ini.\n" -"Jika Anda ingin mengumumkan alamat IPv6 Anda, gunakan serverlist_url = v6." -"servers.minetest.net." +"Jika Anda ingin mengumumkan alamat IPv6 Anda,\n" +"gunakan serverlist_url = v6.servers.minetest.net." + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "Noise pohon apel" #: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." @@ -1475,12 +1588,33 @@ msgid "Ask to reconnect after crash" msgstr "Minta untuk menyambung ulang setelah crash" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" +"Pada jarak ini server akan melakukan optimasi dengan agresif blok mana yang " +"dikirim ke klien.\n" +"Nilai yang kecil dapat meningkatkan banyak performa, dengan harga glitch " +"pada tampilan.\n" +"(beberapa blok tidak akan digambar bawah air dan dalam gua, terkadang juga " +"di darat)\n" +"Atur ke nilai lebih besar dari max_block_send_distance menonaktifkan ini.\n" +"Dalam satuan blok peta (16 node)" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Secara otomatis melaporkan ke daftar server." #: src/settings_translation_file.cpp msgid "Autorun key" -msgstr "" +msgstr "Tombol lari otomatis" #: src/settings_translation_file.cpp msgid "Backward key" @@ -1499,6 +1633,14 @@ msgid "Basic Privileges" msgstr "Izin Dasar" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "Noise pantai" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "Batas noise pantai" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Bilinear filtering" @@ -1507,6 +1649,14 @@ msgid "Bind address" msgstr "Alamat sambungan" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "Parameter noise suhu dan kelembapan Biome API" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "Noise bioma" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "Bit per piksel (alias kedalaman warna) dalam mode layar penuh." @@ -1535,6 +1685,10 @@ msgid "Camera update toggle key" msgstr "Tombol beralih pembaruan kamera" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "Noise gua" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "Noise #1 gua" @@ -1547,6 +1701,30 @@ msgid "Cave width" msgstr "Lebar gua" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "Noise gua1" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "Noise gua2" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "Batas gua besar" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "Noise #1 gua besar" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "Gua lancip" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "Batas gua besar" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "Gua dan terowongan terbentuk di persimpangan antara dua noise" @@ -1585,24 +1763,24 @@ msgid "" "18 = 4D \"Mandelbulb\" julia set." msgstr "" "18 pilihan fraktal dari 9 rumus.\n" -"1 = 4D \"Roundy\" mandelbrot set.\n" -"2 = 4D \"Roundy\" julia set.\n" -"3 = 4D \"Squarry\" mandelbrot set.\n" -"4 = 4D \"Squarry\" julia set.\n" -"5 = 4D \"Mandy Cousin\" mandelbrot set.\n" -"6 = 4D \"Mandy Cousin\" julia set.\n" -"7 = 4D \"Variation\" mandelbrot set.\n" -"8 = 4D \"Variation\" julia set.\n" -"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot set.\n" -"10 = 3D \"Mandelbrot/Mandelbar\" julia set.\n" -"11 = 3D \"Christmas Tree\" mandelbrot set.\n" -"12 = 3D \"Christmas Tree\" julia set.\n" -"13 = 3D \"Mandelbulb\" mandelbrot set.\n" -"14 = 3D \"Mandelbulb\" julia set.\n" -"15 = 3D \"Cosine Mandelbulb\" mandelbrot set.\n" -"16 = 3D \"Cosine Mandelbulb\" julia set.\n" -"17 = 4D \"Mandelbulb\" mandelbrot set.\n" -"18 = 4D \"Mandelbulb\" julia set." +"1 = Mandelbrot set 4D \"Bulat\".\n" +"2 = Julia set 4D \"Bulat\".\n" +"3 = Mandelbrot set 4D \"Kotak\".\n" +"4 = Julia set 4D \"Kotak\".\n" +"5 = Mandelbrot set 4D \"Mandy Cousin\".\n" +"6 = Julia set 4D \"Mandy Cousin\".\n" +"7 = Mandelbrot set 4D \"Variasi\".\n" +"8 = Julia set 4D \"Variasi\".\n" +"9 = Mandelbrot set 3D \"Mandelbrot/Mandelbar\".\n" +"10 = Julia set 3D \"Mandelbrot/Mandelbar\".\n" +"11 = Mandelbrot set 3D \"Pohon Natal\".\n" +"12 = Julia set 3D \"Pohon Natal\".\n" +"13 = Mandelbrot set 3D \"Mandelbulb\".\n" +"14 = Julia set 3D \"Mandelbulb\".\n" +"15 = Mandelbrot set 3D \"Cosine Mandelbulb\".\n" +"16 = Julia set 3D \"Cosine Mandelbulb\".\n" +"17 = Mandelbrot set 4D \"Mandelbulb\".\n" +"18 = Julia set 4D \"Mandelbulb\"." #: src/settings_translation_file.cpp msgid "Chunk size" @@ -1621,10 +1799,18 @@ msgid "Clean transparent textures" msgstr "Bersihkan tekstur transparan" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Klien" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Klien dan Server" #: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "Mod klien" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Kecepatan memanjat" @@ -1695,6 +1881,10 @@ msgid "Console color" msgstr "Warna konsol" #: src/settings_translation_file.cpp +msgid "Console height" +msgstr "Tombol konsol" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Tombol konsol" @@ -1721,14 +1911,6 @@ msgstr "" "tidak berubah." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Mengatur ukuran padang gurun dan pantai dalam Mapgen v6.\n" -"Jika snowbiomes di aktifkan 'mgv6_freq_desert' akan diabaikan." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Mengatur kecuraman/kedalaman lekukan danau." @@ -1737,6 +1919,14 @@ msgid "Controls steepness/height of hills." msgstr "Mengatur kecuraman/ketinggian bukit." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" +"Atur kepadatan dari medan gunung floatland.\n" +"Merupakan pergeseran yang ditambahkan ke nilai noise 'np_mountain'." + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "Mengatur lebar terowongan, nilai lebih kecil terowongan semakin lebar." @@ -1761,6 +1951,10 @@ msgstr "" "Ini dapat menyebabkan penambangan menjadi sulit. Nol menonaktifkannya. (0-10)" #: src/settings_translation_file.cpp +msgid "Creative" +msgstr "Kreatif" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Keburaman crosshair" @@ -1797,8 +1991,12 @@ msgid "Debug log level" msgstr "Tingkat catatan debug" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "Tombol turunkan volume" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" -msgstr "" +msgstr "Langkah server khusus" #: src/settings_translation_file.cpp msgid "Default acceleration" @@ -1837,18 +2035,71 @@ msgstr "" "Hanya berefek jika di-compile dengan cURL." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "Menetapkan daerah dari 'terrain_higher' (medan puncak tebing)." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" +"Mengatur daerah dari medan halus floatland.\n" +"Floatland halus muncul saat noise > 0." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" +"Mengatur daerah medan yang lebih tinggi (puncak tebing) dan mengatur " +"kecuraman tebing." + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "Menetapkan daerah dimana pohon punya apel." + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "Menetapkan daerah dengan pantai berpasir." + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" +"Mengatur ukuran penuh dari gua besar, nilai yang lebih kecil membuat gua " +"yang lebih besar." + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "Menetapkan struktur saluran sungai skala besar." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "Menetapkan lokasi dan medan dari danau dan bukit pilihan." + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." msgstr "" -"Menentukan tahap sampling atas tekstur\n" -"Nilai yg lebih tinggi menghasilkan peta yg lebih halus" +"Menentukan tahap sampling tekstur.\n" +"Nilai lebih tinggi menghasilkan peta lebih halus." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" -"Menentukan jarak maksimal perpindahan pemain dalam blok (0 = tak terhingga)" +"Menentukan jarak maksimal perpindahan pemain dalam blok (0 = tak terbatas)." + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "Menetapkan daerah pohon dan kepadatan pohon." + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" +"Jeda antara pembaruan mesh di klien dalam milidetik. Menaikkan nilai ini " +"akan\n" +"memperlambat pembaruan mesh, sehingga mengurangi jitter pada klien lambat." #: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" @@ -1872,7 +2123,7 @@ msgstr "Kedalaman minimal di mana Anda akan menemukan gua raksasa." #: src/settings_translation_file.cpp msgid "Descending speed" -msgstr "" +msgstr "Pengurangan kecepatan" #: src/settings_translation_file.cpp msgid "" @@ -1883,18 +2134,24 @@ msgstr "" "server." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "Putuskan sinkronasi animasi blok" +msgid "Desert noise threshold" +msgstr "Batasan noise gurun" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"Menentukan bentuk tanah.\n" -"3 angka dalam kurung mengatur skala dari bentuk\n" -"tanah, ketiganya harus sama." +"Gurun muncul saat np_biome melebihi nilai ini.\n" +"Saat sistem bioma baru diaktifkan, ini diabaikan." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Putuskan sinkronasi animasi blok" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "Partikel menggali" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1937,17 +2194,33 @@ msgstr "Tombol menjatuhkan barang" #: src/settings_translation_file.cpp msgid "Dump the mapgen debug infos." -msgstr "" +msgstr "Keluarkan informasi debug pembuat peta." #: src/settings_translation_file.cpp msgid "Enable Joysticks" msgstr "Aktifkan Joystick" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" +"Aktifkan dukungan Lua modding pada klien.\n" +"Dukungan ini masih tahap percobaan dan API dapat berubah." + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "Aktifkan VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Aktifkan jendela konsol" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "Aktifkan mode kreatif pada peta baru." + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Aktifkan mod keamanan" @@ -1975,9 +2248,9 @@ msgid "" "to new servers, but they may not support all new features that you are " "expecting." msgstr "" -"Aktifkan untuk melarang klien lawas untuk terhubung.\n" +"Aktifkan untuk melarang klien lawas untuk tersambung.\n" "Klien-klien lawas dianggap sesuai jika mereka tidak rusak saat " -"menghubungkan\n" +"menyambungkan\n" "ke server-server baru, tetapi mereka mungkin tidak mendukung semua fitur " "baru\n" "yang Anda harapkan." @@ -1989,11 +2262,23 @@ msgid "" "textures)\n" "when connecting to the server." msgstr "" -"Membolehkan penggunaan server media jarak jauh (jika diberikan oleh " -"server).\n" +"Membolehkan penggunaan server media jarak jauh (jika diberikan oleh server)." +"\n" "Server jarak jauh menawarkan cara lebih cepat untuk mengunduh media (misal: " "tekstur)\n" -"saat terhubung ke server." +"saat tersambung ke server." + +#: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "Aktifkan view bobbing" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Mengaktifkan view bobbing dan nilai dari view bobbing\n" +"Misalkan: 0 untuk tanpa view bobbing; 1.0 untuk normal; 2.0 untuk 2x lipat." #: src/settings_translation_file.cpp msgid "" @@ -2022,7 +2307,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." -msgstr "" +msgstr "Mengaktifkan cache untuk facedir mesh yang diputar." #: src/settings_translation_file.cpp msgid "Enables filmic tone mapping" @@ -2037,6 +2322,8 @@ msgid "" "Enables on the fly normalmap generation (Emboss effect).\n" "Requires bumpmapping to be enabled." msgstr "" +"Mengaktifkan pembuatan normalmap secara langsung (efek Emboss).\n" +"Membutuhkan bumpmapping untuk diaktifkan." #: src/settings_translation_file.cpp msgid "" @@ -2047,19 +2334,23 @@ msgstr "" "Membutuhkan shader diaktifkan." #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "Aktifkan view bobbing saat berjalan." + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" -msgstr "" +msgstr "Jarak pencetakan data profiling mesin" #: src/settings_translation_file.cpp msgid "Entity methods" -msgstr "" +msgstr "Metode benda (entity)" #: src/settings_translation_file.cpp msgid "" "Experimental option, might cause visible spaces between blocks\n" "when set to higher number than 0." msgstr "" -"Eksperimental, dapat menyebabkan terlihatnya spasi antara blok\n" +"Masih tahap percobaan, dapat menyebabkan terlihatnya spasi antara blok\n" "saat diatur dengan angka yang lebih besar dari 0." #: src/settings_translation_file.cpp @@ -2068,28 +2359,31 @@ msgstr "FPS (bingkai per detik) pada menu jeda" #: src/settings_translation_file.cpp msgid "FSAA" -msgstr "" +msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" -msgstr "" +msgid "Factor noise" +msgstr "Noise faktor" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "Faktor fall bobbing" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font" msgstr "needs_fallback_font" #: src/settings_translation_file.cpp msgid "Fallback font shadow" -msgstr "" +msgstr "Bayangan font cadangan" #: src/settings_translation_file.cpp msgid "Fallback font shadow alpha" -msgstr "" +msgstr "Keburaman bayangan font cadangan" #: src/settings_translation_file.cpp msgid "Fallback font size" -msgstr "" +msgstr "Ukuran font cadangan" #: src/settings_translation_file.cpp msgid "Fast key" @@ -2117,35 +2411,43 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Field of view" -msgstr "" +msgstr "Bidang pandang" #: src/settings_translation_file.cpp msgid "Field of view for zoom" -msgstr "" +msgstr "Bidang pandang untuk zoom" #: src/settings_translation_file.cpp msgid "Field of view in degrees." -msgstr "" +msgstr "Bidang pandang dalam derajat." #: src/settings_translation_file.cpp msgid "" "Field of view while zooming in degrees.\n" "This requires the \"zoom\" privilege on the server." msgstr "" +"Bidang pandang saat zoom dalam derajat.\n" +"Membutuhkan izin \"zoom\" pada server." #: src/settings_translation_file.cpp msgid "" "File in client/serverlist/ that contains your favorite servers displayed in " "the Multiplayer Tab." msgstr "" +"Berkas dalam client/serverlist/ yang mengandung server favorit Anda yang " +"tampil dalam Tab Multi-pemain." #: src/settings_translation_file.cpp msgid "Filler Depth" -msgstr "" +msgstr "Kedalaman Isian" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "Noise kedalaman isian" #: src/settings_translation_file.cpp msgid "Filmic tone mapping" -msgstr "" +msgstr "Pemetaan suasana filmic" #: src/settings_translation_file.cpp msgid "" @@ -2156,13 +2458,36 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Filtering" msgstr "Filtering" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "Noise 3D pertama dari dua yang bersama-sama mengatur terowongan." + +#: src/settings_translation_file.cpp msgid "Fixed map seed" -msgstr "Seed peta yang diatur" +msgstr "Seed peta tetap" + +#: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "Noise ketinggian dasar floatland" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "Noise dasar floatland" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "Ketinggian floatland" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "Kepadatan gunung floatland" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "Ketinggian gunung floatland" #: src/settings_translation_file.cpp msgid "Fly key" @@ -2177,6 +2502,10 @@ msgid "Fog" msgstr "Kabut" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "Mulai Kabut" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Tombol beralih kabut" @@ -2198,7 +2527,7 @@ msgstr "Keburaman bayangan font (keopakan, antara 0 sampai 255)." #: src/settings_translation_file.cpp msgid "Font shadow offset, if 0 then shadow will not be drawn." -msgstr "" +msgstr "Pergeseran bayangan font, jika 0 maka bayangan tidak akan digambar." #: src/settings_translation_file.cpp msgid "Font size" @@ -2213,24 +2542,36 @@ msgid "Forward key" msgstr "Tombol maju" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "Jenis fraktal" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "Bagian dari jarak pandang dimana kabut mulai tampak" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" -msgstr "" +msgstr "Font Freetype" #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " "nodes)." msgstr "" +"Dari seberapa jauh blok dibuat untuk klien, dalam satuan blok peta (16 node)." #: src/settings_translation_file.cpp msgid "" "From how far blocks are sent to clients, stated in mapblocks (16 nodes)." msgstr "" +"Dari seberapa jauh blok dikirim ke klien, dalam satuan blok peta (16 node)." #: src/settings_translation_file.cpp msgid "" "From how far clients know about objects, stated in mapblocks (16 nodes)." msgstr "" +"Dari seberapa jauh klien tahu tentang objek, dalam satuan blok peta (16 " +"node)." #: src/settings_translation_file.cpp msgid "Full screen" @@ -2238,7 +2579,7 @@ msgstr "Layar penuh" #: src/settings_translation_file.cpp msgid "Full screen BPP" -msgstr "" +msgstr "BPP layar penuh" #: src/settings_translation_file.cpp msgid "Fullscreen mode." @@ -2254,11 +2595,11 @@ msgstr "Filter skala GUI" #: src/settings_translation_file.cpp msgid "GUI scaling filter txr2img" -msgstr "" +msgstr "Filter txr2img skala GUI" #: src/settings_translation_file.cpp msgid "Gamma" -msgstr "" +msgstr "Gamma" #: src/settings_translation_file.cpp msgid "General" @@ -2270,7 +2611,7 @@ msgstr "Hasilkan normalmaps" #: src/settings_translation_file.cpp msgid "Global callbacks" -msgstr "" +msgstr "Callback global" #: src/settings_translation_file.cpp msgid "" @@ -2281,6 +2622,12 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Atribut pembuatan peta global.\n" +"Dalam pembuat peta v6 flag 'decorations' mengatur semua hiasan kecuali " +"pohon\n" +"dan rumput rimba, dalam pembuat peta lain flag ini mengatur semua dekorasi.\n" +"Flag yang tidak ditulis dalam teks flag tidak akan berubah dari bawaan.\n" +"Flag dimulai dengan 'no' digunakan untuk mempertegas penonaktifannya." #: src/settings_translation_file.cpp msgid "Graphics" @@ -2291,10 +2638,18 @@ msgid "Gravity" msgstr "Gravitasi" #: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "Ketinggian tanah" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "Mod HTTP" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "Faktor skala HUD" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Tombol beralih HUD" @@ -2322,22 +2677,54 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "Noise paduan panas" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "Noise panas" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." -msgstr "" +msgstr "Tinggi ukuran jendela mula-mula." + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "Noise ketinggian" #: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." -msgstr "" +msgstr "Ketinggian dimana awan muncul." + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "Noise pemilihan ketinggian" #: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "FPU (satuan titik mengambang) berketelitian tinggi" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "Kecuraman bukit" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "Batasan bukit" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Halaman awal server, ditampilkan di daftar server." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "Tombol hotbar selanjutnya" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "Tombol hotbar sebelumnya" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Seberapa dalam sungai yang dibuat" @@ -2347,18 +2734,36 @@ msgid "" "mapblocks (16 nodes).\n" "In active blocks objects are loaded and ABMs run." msgstr "" +"Seberapa besar daerah blok yang menjadi blok aktif, dalam satuan blok peta (" +"16 node).\n" +"Dalam blok aktif objek dimuat dan ABM berjalan." #: src/settings_translation_file.cpp msgid "" "How much the server will wait before unloading unused mapblocks.\n" "Higher value is smoother, but will use more RAM." msgstr "" +"Seberapa lama server akan menunggu sebelum membongkar blok peta yang tidak " +"dipakai.\n" +"Semakin tinggi semakin halus, tetapi menggunakan lebih banyak RAM." #: src/settings_translation_file.cpp msgid "How wide to make rivers" msgstr "Seberapa lebar sungai yang dibuat" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "Noise paduan kelembapan" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "Noise kelembapan" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "Variasi kelembapan untuk bioma." + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2389,6 +2794,19 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" +"Jika diaktifkan server akan melakukan occlusion culling blok peta menurut\n" +"posisi mata pemain. Ini dapat mengurangi jumlah blok yang dikirim ke\n" +"klien sebesar 50-80%. Klien tidak dapat menerima yang tidak terlihat\n" +"sehingga kemampuan mode tembus blok berkurang." + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2410,20 +2828,30 @@ msgid "" "If enabled, actions are recorded for rollback.\n" "This option is only read when server starts." msgstr "" +"Jika diaktifkan, perilaku akan direkam untuk cadangan.\n" +"Pilihan ini hanya dibaca saat server dimulai." #: src/settings_translation_file.cpp msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "" +msgstr "Jika diaktifkan, menonaktifkan pencegahan curang di multi-pemain." #: src/settings_translation_file.cpp msgid "" "If enabled, invalid world data won't cause the server to shut down.\n" "Only enable this if you know what you are doing." msgstr "" +"Jika diaktifkan, data dunia yang tidak sah tidak akan menyebabkan server " +"mati.\n" +"Hanya aktifkan ini jika Anda tahu yang Anda lakukan." #: src/settings_translation_file.cpp msgid "If enabled, new players cannot join with an empty password." msgstr "" +"Jika diaktifkan, pemain baru tidak dapat bergabung dengan kata sandi kosong." + +#: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "Pesan hari ini yang ditampilkan ke pemain yang tersambung." #: src/settings_translation_file.cpp msgid "" @@ -2431,6 +2859,10 @@ msgid "" "you stand.\n" "This is helpful when working with nodeboxes in small areas." msgstr "" +"Jika diaktifkan, Anda dapat menaruh blok pada posisi (kaki + ketinggian mata)" +"\n" +"dimana Anda berdiri.\n" +"Ini berguna saat bekerja dengan nodebox dalam daerah sempit." #: src/settings_translation_file.cpp msgid "If this is set, players will always (re)spawn at the given position." @@ -2451,7 +2883,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "In-game chat console background color (R,G,B)." -msgstr "Warna latar belakang konsol obrolan dalam permainan (R,G,B)" +msgstr "Warna latar belakang konsol obrolan dalam permainan (R,G,B)." + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" +"Keburaman konsol obrolan dalam permainan (keopakan, antara 0 sampai 255)." + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "Tombol konsol" #: src/settings_translation_file.cpp msgid "" @@ -2489,13 +2930,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." -msgstr "" +msgstr "Jarak waktu penyimpanan perubahan penting dari dunia, dalam detik." #: src/settings_translation_file.cpp msgid "Interval of sending time of day to clients." msgstr "Jarak pengiriman waktu ke klien." #: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "Tombol inventaris" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "Animasi barang inventaris" @@ -2505,29 +2950,43 @@ msgstr "Tombol inventaris" #: src/settings_translation_file.cpp msgid "Invert mouse" -msgstr "" +msgstr "Balik mouse" #: src/settings_translation_file.cpp msgid "Invert vertical mouse movement." -msgstr "" +msgstr "Balik pergerakan vertikal mouse." #: src/settings_translation_file.cpp msgid "Item entity TTL" -msgstr "" +msgstr "Umur hidup wujud barang" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "Perulangan" #: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" +"Perulangan dari fungsi rekursif.\n" +"Mengatur jumlah kehalusan detail." + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "ID Joystick" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "Jenis Joystick" #: src/settings_translation_file.cpp msgid "Joystick button repetition interval" -msgstr "" +msgstr "Jarak penekanan tombol joystick terus menerus" #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" -msgstr "" +msgstr "Kepekaan ruang gerak joystick" #: src/settings_translation_file.cpp msgid "" @@ -2536,6 +2995,10 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" +"Hanya julia set: Komponen W dari tetapan hiperkompleks yang mengatur bentuk " +"julia.\n" +"Tidak berefek pada fraktal 3D.\n" +"Jangkauan sekitar -2 ke 2." #: src/settings_translation_file.cpp msgid "" @@ -2543,6 +3006,9 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Hanya julia set: Komponen X dari tetapan hiperkompleks yang mengatur bentuk " +"julia.\n" +"Jangkauan sekitar -2 ke 2." #: src/settings_translation_file.cpp msgid "" @@ -2550,6 +3016,9 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Hanya julia set: Komponen Y dari tetapan hiperkompleks yang mengatur bentuk " +"julia.\n" +"Jangkauan sekitar -2 ke 2." #: src/settings_translation_file.cpp msgid "" @@ -2557,6 +3026,25 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Hanya julia set: Komponen Z dari tetapan hiperkompleks yang mengatur bentuk " +"julia.\n" +"Jangkauan sekitar -2 ke 2." + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "W Julia" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "X Julia" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "Y Julia" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "Z Julia" #: src/settings_translation_file.cpp msgid "Jump key" @@ -2578,6 +3066,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tombol untuk mengurangi volume.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2598,6 +3096,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tombol untuk menambah volume.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2658,6 +3166,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tombol untuk bisukan permainan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2678,6 +3196,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tombol untuk membuka jendela obrolan untuk mengetik perintah lokal.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2702,6 +3230,29 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Tombol untuk mencetak tumpukan debug. Digunakan untuk pengembangan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tombol untuk memilih barang selanjutnya di hotbar.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tombol untuk memilih barang sebelumnya di hotbar.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2793,9 +3344,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tombol untuk beralih mode tembus blok.\n" -"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" +"Tombol untuk beralih mode tembus node.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2849,10 +3400,23 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tombol untuk beralih tampilan konsol obrolan besar.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Tombol untuk menampilkan profiler. Digunakan untuk pengembangan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2865,10 +3429,28 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tombol untuk gunakan zoom jika bisa.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "Tombol untuk memanjat/turun" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "Kecuraman danau" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "Batasan danau" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "Bahasa" @@ -2877,8 +3459,12 @@ msgid "Large cave depth" msgstr "Kedalaman gua besar" #: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "Tombol konsol obrolan besar" + +#: src/settings_translation_file.cpp msgid "Lava Features" -msgstr "" +msgstr "Fitur Lava" #: src/settings_translation_file.cpp msgid "Leaves style" @@ -2906,14 +3492,16 @@ msgid "" "Length of a server tick and the interval at which objects are generally " "updated over network." msgstr "" +"Lama detikan server dan jarak dimana objek secara umum diperbarui ke " +"jaringan." #: src/settings_translation_file.cpp msgid "Length of time between ABM execution cycles" -msgstr "" +msgstr "Jarak waktu antara siklus pelaksanaan ABM" #: src/settings_translation_file.cpp msgid "Length of time between NodeTimer execution cycles" -msgstr "" +msgstr "Jarak waktu antara siklus pelaksanaan NodeTimer" #: src/settings_translation_file.cpp msgid "" @@ -2937,11 +3525,22 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Limit of emerge queues on disk" -msgstr "" +msgstr "Batas antrian kemunculan (emerge queue) pada cakram" #: src/settings_translation_file.cpp msgid "Limit of emerge queues to generate" +msgstr "Batas antrian kemunculan (emerge queue) untuk dibuat" + +#: src/settings_translation_file.cpp +msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." msgstr "" +"Batas dari pembuatan peta, dalam node, di semua 6 arah mulai dari (0, 0, 0)." +"\n" +"Hanya mapchunk yang seluruhnya berada dalam batasan yang akan dibuat.\n" +"Nilai disimpan tiap dunia." #: src/settings_translation_file.cpp msgid "" @@ -2951,38 +3550,43 @@ msgid "" "- Downloads performed by main menu (e.g. mod manager).\n" "Only has an effect if compiled with cURL." msgstr "" +"Membatasi jumlah permintaan HTTP paralel. Memengaruhi:\n" +"- Pengambilan media jika server menggunakan pengaturan remote_media.\n" +"- Unduhan daftar server dan mengumumkan server.\n" +"- Unduhan oleh menu utama (misal. pengelola mod).\n" +"Hanya berlaku jika dicompile dengan cURL." #: src/settings_translation_file.cpp msgid "Liquid fluidity" -msgstr "" +msgstr "Keenceran cairan" #: src/settings_translation_file.cpp msgid "Liquid fluidity smoothing" -msgstr "" +msgstr "Penghalusan keenceran cairan" #: src/settings_translation_file.cpp msgid "Liquid loop max" -msgstr "" +msgstr "Loop cairan paling banyak" #: src/settings_translation_file.cpp msgid "Liquid queue purge time" -msgstr "" +msgstr "Waktu pembersihan antrian cairan" #: src/settings_translation_file.cpp msgid "Liquid sink" -msgstr "" +msgstr "Cairan tenggelam" #: src/settings_translation_file.cpp msgid "Liquid update interval in seconds." -msgstr "" +msgstr "Jarak pembaruan cairan dalam detik." #: src/settings_translation_file.cpp msgid "Liquid update tick" -msgstr "" +msgstr "Detikan pembaruan cairan" #: src/settings_translation_file.cpp msgid "Load the game profiler" -msgstr "" +msgstr "Muat profiler permainan" #: src/settings_translation_file.cpp msgid "" @@ -2990,10 +3594,13 @@ msgid "" "Provides a /profiler command to access the compiled profile.\n" "Useful for mod developers and server operators." msgstr "" +"Muat game profiler untuk mengumpulkan data game profiling.\n" +"Menyediakan perintah /profiler untuk akses ke rangkuman profile.\n" +"Berguna untuk pengembang mod dan operator server." #: src/settings_translation_file.cpp msgid "Loading Block Modifiers" -msgstr "" +msgstr "Memuat Pengubah Blok" #: src/settings_translation_file.cpp msgid "Main menu game manager" @@ -3011,15 +3618,18 @@ msgstr "Skrip menu utama" msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" -"Buat warna kabut dan langit tergantung pada waktu (fajar/matahari " -"tenggelam)\n" -"dan arah melihat." +"Buat warna kabut dan langit tergantung pada waktu (fajar/maghrib) dan arah " +"pandangan." #: src/settings_translation_file.cpp msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "Buat DirectX bekerja dengan LuaJIT. Nonaktifkan jika bermasalah." #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "Buat semua cairan buram" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "Direktori peta" @@ -3035,6 +3645,14 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Atribut pembuatan peta khusus untuk pembuat peta Valleys.\n" +"'altitude_chill' menyebabkan semakin tinggi semakin dingin, yang dapat " +"menyebabkan masalah bioma.\n" +"'humid_rivers' mengubah kelembapan sekitar sungai dan dalam daerah dimana " +"air cenderung berkumpul,\n" +"dapat menabrak dengan bioma yang sudah sesuai.\n" +"Flag yang tidak ditulis dalam teks flag tidak akan berubah dari bawaan.\n" +"Flag dimulai dengan 'no' digunakan untuk mempertegas penonaktifannya." #: src/settings_translation_file.cpp msgid "" @@ -3044,329 +3662,130 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Atribut pembuatan peta khusus untuk pembuat peta flat.\n" +"Beberapa danau dan bukit dapat ditambahkan ke dunia datar.\n" +"Flag yang tidak ditulis dalam teks flag tidak akan berubah dari bawaan.\n" +"Flag dimulai dengan 'no' digunakan untuk mempertegas penonaktifannya." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Atribut pembuatan peta khusus untuk pembuat peta v5.\n" +"Flag yang tidak ditulis dalam teks flag tidak akan berubah dari bawaan.\n" +"Flag dimulai dengan 'no' digunakan untuk mempertegas penonaktifannya." #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Atribut pembuatan peta khusus untuk pembuat peta v6.\n" +"Flag 'snowbiomes' mengaktifkan sistem 5 bioma baru.\n" +"Saat sistem bioma baru diaktifkan hutan rimba secara otomatis akan " +"diaktifkan dan\n" +"flag 'jungle' diabaikan.\n" +"Flag yang tidak ditulis dalam teks flag tidak akan berubah dari bawaan.\n" +"Flag dimulai dengan 'no' digunakan untuk mempertegas penonaktifannya." #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Atribut pembuatan peta khusus untuk pembuat peta v7.\n" +"Flag 'ridges' mengaktifkan sungai.\n" +"Floatland masih tahap percobaan dan masih dapat berubah.\n" +"Flag yang tidak ditulis dalam teks flag tidak akan berubah dari bawaan.\n" +"Flag dimulai dengan 'no' digunakan untuk mempertegas penonaktifannya." #: src/settings_translation_file.cpp msgid "Map generation limit" -msgstr "Batas generasi peta" +msgstr "Batas pembuatan peta" #: src/settings_translation_file.cpp msgid "Map save interval" -msgstr "Jarak menyimpan peta" +msgstr "Selang waktu menyimpan peta" #: src/settings_translation_file.cpp msgid "Mapblock limit" -msgstr "Batas mapblock" +msgstr "Batas blok peta" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Generator peta Valleys" +msgid "Mapblock mesh generation delay" +msgstr "Jarak waktu pembuatan mesh blok peta" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "Ukuran cache blok peta dari pembuat mesh blok peta dalam MB" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "" +msgid "Mapblock unload timeout" +msgstr "Batas waktu pembongkaran blok peta" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +msgid "Mapgen Valleys" +msgstr "Pembuat peta Valleys" #: src/settings_translation_file.cpp msgid "Mapgen debug" -msgstr "Debug generator peta" +msgstr "Debug pembuat peta" #: src/settings_translation_file.cpp msgid "Mapgen flags" -msgstr "Flag generator peta" +msgstr "Flag pembuat peta" #: src/settings_translation_file.cpp msgid "Mapgen flat" -msgstr "Generator peta flat" +msgstr "Pembuat peta flat" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" +msgid "Mapgen flat specific flags" +msgstr "Flag khusus pembuat peta flat" #: src/settings_translation_file.cpp msgid "Mapgen fractal" -msgstr "Generator peta fraktal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" +msgstr "Pembuat peta fraktal" #: src/settings_translation_file.cpp msgid "Mapgen name" -msgstr "Nama generator peta" +msgstr "Nama pembuat peta" #: src/settings_translation_file.cpp msgid "Mapgen v5" -msgstr "Generator peta v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" +msgstr "Pembuat peta v5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" +msgid "Mapgen v5 specific flags" +msgstr "Flag khusus pembuat peta v5" #: src/settings_translation_file.cpp msgid "Mapgen v6" -msgstr "Generator peta v6" +msgstr "Pembuat peta v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "Frekuensi pantai pada generator peta v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "Frekuensi padang gurun pada generator peta v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "Flag pada generator peta v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" +msgid "Mapgen v6 specific flags" +msgstr "Flag khusus pembuat peta v6" #: src/settings_translation_file.cpp msgid "Mapgen v7" -msgstr "Generator peta v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" +msgstr "Pembuat peta v7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" +msgid "Mapgen v7 specific flags" +msgstr "Flag khusus pembuat peta v7" #: src/settings_translation_file.cpp msgid "Massive cave depth" @@ -3374,31 +3793,31 @@ msgstr "Kedalaman gua raksasa" #: src/settings_translation_file.cpp msgid "Massive cave noise" -msgstr "" +msgstr "Noise gua raksasa" #: src/settings_translation_file.cpp msgid "Massive caves form here." -msgstr "" +msgstr "Gua raksasa dibentuk di sini." #: src/settings_translation_file.cpp msgid "Max block generate distance" -msgstr "" +msgstr "Jarak terjauh pembuatan blok" #: src/settings_translation_file.cpp msgid "Max block send distance" -msgstr "" +msgstr "Jarak terjauh pengiriman blok" #: src/settings_translation_file.cpp msgid "Max liquids processed per step." -msgstr "" +msgstr "Cairan paling banyak terproses tiap langkah." #: src/settings_translation_file.cpp msgid "Max. clearobjects extra blocks" -msgstr "" +msgstr "Blok tambahan paling banyak untuk clearobject" #: src/settings_translation_file.cpp msgid "Max. packets per iteration" -msgstr "" +msgstr "Paket paling banyak tiap perulangan" #: src/settings_translation_file.cpp msgid "Maximum FPS" @@ -3418,11 +3837,11 @@ msgstr "Lebar maksimal hotbar" #: src/settings_translation_file.cpp msgid "Maximum number of blocks that are simultaneously sent in total." -msgstr "" +msgstr "Jumlah blok paling banyak yang dikirim bersamaan seluruhnya." #: src/settings_translation_file.cpp msgid "Maximum number of blocks that are simultaneously sent per client." -msgstr "" +msgstr "Jumlah blok paling banyak yang dikirim bersamaan tiap klien." #: src/settings_translation_file.cpp msgid "Maximum number of blocks that can be queued for loading." @@ -3446,15 +3865,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." -msgstr "Jumlah maksimal blok peta (mapblock) yang dipaksa muat (forceloaded)." +msgstr "Jumlah maksimal blok peta yang dipaksa muat." #: src/settings_translation_file.cpp msgid "" "Maximum number of mapblocks for client to be kept in memory.\n" "Set to -1 for unlimited amount." msgstr "" -"Jumlah maksimal blok peta (mapblock) yang disimpan di memori klien.\n" -"Atur ke -1 untuk tak terhingga." +"Jumlah maksimal blok peta yang disimpan di memori klien.\n" +"Atur ke -1 untuk tak terbatas." #: src/settings_translation_file.cpp msgid "" @@ -3463,13 +3882,13 @@ msgid "" "client number." msgstr "" "Jumlah maksimal paket dikirim tiap langkah mengirim (send step), jika Anda\n" -"memiliki koneksi lambat, cobalah untuk menguranginya, tetapi jangan " +"memiliki sambungan lambat, cobalah untuk menguranginya, tetapi jangan " "mengurangi\n" "di bawah dua kalinya jumlah klien yang ditargetkan." #: src/settings_translation_file.cpp msgid "Maximum number of players that can connect simultaneously." -msgstr "Jumlah maksimal pemain yang dapat terhubung serentak." +msgstr "Jumlah maksimal pemain yang dapat tersambung serentak." #: src/settings_translation_file.cpp msgid "Maximum number of statically stored objects in a block." @@ -3505,13 +3924,12 @@ msgid "Maximum users" msgstr "Jumlah pengguna maksimal" #: src/settings_translation_file.cpp -#, fuzzy msgid "Menus" -msgstr "Alt" +msgstr "Menus" #: src/settings_translation_file.cpp msgid "Mesh cache" -msgstr "" +msgstr "Cache mesh" #: src/settings_translation_file.cpp msgid "Message of the day" @@ -3519,7 +3937,7 @@ msgstr "Pesan hari ini" #: src/settings_translation_file.cpp msgid "Message of the day displayed to players connecting." -msgstr "Pesan hari ini yang ditampilkan ke pemain yang terhubung." +msgstr "Pesan hari ini yang ditampilkan ke pemain yang tersambung." #: src/settings_translation_file.cpp msgid "Method used to highlight selected object." @@ -3535,27 +3953,31 @@ msgstr "Tombol peta mini" #: src/settings_translation_file.cpp msgid "Minimap scan height" -msgstr "" +msgstr "Ketinggian pemindaian peta mini" #: src/settings_translation_file.cpp msgid "Minimum texture size for filters" -msgstr "" +msgstr "Ukuran tekstur paling kecil untuk filter" #: src/settings_translation_file.cpp msgid "Mipmapping" msgstr "Mipmapping" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "Mengubah ukuran dari elemen hudbar." + +#: src/settings_translation_file.cpp msgid "Modstore details URL" -msgstr "" +msgstr "Toko Mod: URL detail" #: src/settings_translation_file.cpp msgid "Modstore download URL" -msgstr "" +msgstr "Toko Mod: URL unduh" #: src/settings_translation_file.cpp msgid "Modstore mods list URL" -msgstr "" +msgstr "Toko Mod: URL daftar mod" #: src/settings_translation_file.cpp msgid "Monospace font path" @@ -3566,30 +3988,44 @@ msgid "Monospace font size" msgstr "Ukuran font monospace" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "Noise ketinggian gunung" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "Noise gunung" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" -msgstr "Sensitivitas mouse" +msgstr "Kepekaan mouse" #: src/settings_translation_file.cpp msgid "Mouse sensitivity multiplier." -msgstr "Pengali sensitivitas mouse" +msgstr "Pengali kepekaan mouse." + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "Noise lumpur" #: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" +"Pengali untuk fall bobbing.\n" +"Misalkan: 0 untuk tanpa view bobbing; 1.0 untuk normal; 2.0 untuk 2x lipat." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" +msgid "Mute key" +msgstr "Tombol bisu" #: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." msgstr "" +"Nama dari pembuat peta yang digunakan saat membuat dunia baru.\n" +"Membuat dunia dari menu utama akan merubah ini." #: src/settings_translation_file.cpp msgid "" @@ -3598,7 +4034,8 @@ msgid "" "When starting from the main menu, this is overridden." msgstr "" "Nama pemain.\n" -"Saat menjalankan server, klien yang terhubung dengan nama ini adalah admin.\n" +"Saat menjalankan server, klien yang tersambung dengan nama ini adalah admin." +"\n" "Saat menjalankan dari menu utama, nilai ini ditimpa." #: src/settings_translation_file.cpp @@ -3615,6 +4052,8 @@ msgid "" "Network port to listen (UDP).\n" "This value will be overridden when starting from the main menu." msgstr "" +"Port jaringan untuk didengar (UDP).\n" +"Nilai ini akan dirubah saat memulai dari menu utama." #: src/settings_translation_file.cpp msgid "New users need to input this password." @@ -3622,11 +4061,11 @@ msgstr "Pengguna baru butuh memasukkan kata sandi." #: src/settings_translation_file.cpp msgid "Noclip" -msgstr "Tembus blok" +msgstr "Tembus node" #: src/settings_translation_file.cpp msgid "Noclip key" -msgstr "Tombol tembus blok" +msgstr "Tombol tembus node" #: src/settings_translation_file.cpp msgid "Node highlighting" @@ -3634,27 +4073,23 @@ msgstr "" #: src/settings_translation_file.cpp msgid "NodeTimer interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" +msgstr "Jarak NodeTimer" #: src/settings_translation_file.cpp msgid "Noises" -msgstr "" +msgstr "Noise" #: src/settings_translation_file.cpp msgid "Normalmaps sampling" -msgstr "" +msgstr "Sampling normalmap" #: src/settings_translation_file.cpp msgid "Normalmaps strength" -msgstr "" +msgstr "Kekuatan normalmap" #: src/settings_translation_file.cpp msgid "Number of emerge threads" -msgstr "" +msgstr "Jumlah utas kemunculan" #: src/settings_translation_file.cpp msgid "" @@ -3664,6 +4099,11 @@ msgid "" "speed greatly\n" "at the cost of slightly buggy caves." msgstr "" +"Jumlah utas kemunculan untuk dipakai. Kosongkan nilai, atau naikkan angka " +"ini untuk\n" +"menggunakan beberapa thread. Pada sistem banyak prosesor, ini akan banyak " +"menaikkan\n" +"kecepatan pembuat peta seharga gua yang sedikit salah." #: src/settings_translation_file.cpp msgid "" @@ -3671,18 +4111,30 @@ msgid "" "This is a trade-off between sqlite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" +"Jumlah dari blok tambahan yang dapat dimuat oleh /clearobjects dalam satu " +"waktu.\n" +"Ini adalah pemilihan antara transaksi sqlite dan\n" +"penggunaan memori (4096=100MB, kasarannya)." #: src/settings_translation_file.cpp msgid "Number of parallax occlusion iterations." -msgstr "" +msgstr "Jumlah pengulangan parallax occlusion." + +#: src/settings_translation_file.cpp +msgid "Offset" +msgstr "Pergeseran" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "Cairan buram" #: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" +msgstr "Bias keseluruhan dari efek parallax occlusion, biasanya skala/2." #: src/settings_translation_file.cpp msgid "Overall scale of parallax occlusion effect." -msgstr "" +msgstr "Skala keseluruhan dari efek parallax occlusion." #: src/settings_translation_file.cpp msgid "Parallax occlusion" @@ -3694,11 +4146,11 @@ msgstr "Skala parallax occlusion" #: src/settings_translation_file.cpp msgid "Parallax occlusion bias" -msgstr "" +msgstr "Pergeseran parallax occlusion" #: src/settings_translation_file.cpp msgid "Parallax occlusion iterations" -msgstr "" +msgstr "Pengulangan parallax occlusion" #: src/settings_translation_file.cpp msgid "Parallax occlusion mode" @@ -3706,29 +4158,38 @@ msgstr "Mode parallax occlusion" #: src/settings_translation_file.cpp msgid "Parallax occlusion strength" -msgstr "" +msgstr "Kekuatan parallax occlusion" #: src/settings_translation_file.cpp msgid "Path to TrueTypeFont or bitmap." -msgstr "" +msgstr "Jalur ke TrueTypeFont atau bitmap." #: src/settings_translation_file.cpp msgid "Path to save screenshots at." msgstr "Jalur untuk menyimpan tangkapan layar." #: src/settings_translation_file.cpp -msgid "Path to texture directory. All textures are first searched from here." +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." msgstr "" +"Jalur ke direktori shader. Jika tidak diatur, lokasi bawaan akan digunakan." + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "Jalur ke direktori tekstur. Semua tekstur akan dicari mulai dari sini." #: src/settings_translation_file.cpp msgid "Physics" -msgstr "" +msgstr "Fisika" #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" "This requires the \"fly\" privilege on the server." msgstr "" +"Pemain dapat terbang tanpa terpengaruh gravitasi.\n" +"Ini membutuhkan izin \"fly\" pada server." #: src/settings_translation_file.cpp msgid "Player name" @@ -3736,43 +4197,50 @@ msgstr "Nama pemain" #: src/settings_translation_file.cpp msgid "Player transfer distance" -msgstr "" +msgstr "Jarak pemindahan pemain" #: src/settings_translation_file.cpp msgid "Player versus Player" -msgstr "" +msgstr "Pemain lawan Pemain" #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" "Note that the port field in the main menu overrides this setting." msgstr "" +"Port untuk disambungkan (UDP).\n" +"Catat bahwa kolom port di menu utama mengubah pengaturan ini." #: src/settings_translation_file.cpp msgid "Prevent mods from doing insecure things like running shell commands." msgstr "" +"Mencegah mod untuk melakukan hal yang tidak aman misalnya menjalankan " +"perintah shell." #: src/settings_translation_file.cpp msgid "" "Print the engine's profiling data in regular intervals (in seconds). 0 = " "disable. Useful for developers." msgstr "" +"Cetak data profiling mesin dalam selang waktu tetap (dalam detik). 0 = " +"menonaktifkan.\n" +"Berguna untuk pengembang." #: src/settings_translation_file.cpp msgid "Privileges that players with basic_privs can grant" -msgstr "" +msgstr "Izin dimana pemain dengan basic_privs dapat miliki" #: src/settings_translation_file.cpp msgid "Profiler" -msgstr "" +msgstr "Profiler" #: src/settings_translation_file.cpp msgid "Profiler toggle key" -msgstr "" +msgstr "Tombol profiler" #: src/settings_translation_file.cpp msgid "Profiling" -msgstr "" +msgstr "Profiling" #: src/settings_translation_file.cpp msgid "" @@ -3780,10 +4248,12 @@ msgid "" "Values larger than 26 will start to produce sharp cutoffs at cloud area " "corners." msgstr "" +"Jari-jari daerah awan dalam jumlah dari 64 node awan kotak.\n" +"Nilai lebih dari 26 akan mulai menghasilkan tepian tajam pada sudut awan." #: src/settings_translation_file.cpp msgid "Raises terrain to make valleys around the rivers" -msgstr "" +msgstr "Menaikkan medan untuk membuat lembah di sekitar sungai" #: src/settings_translation_file.cpp msgid "Random input" @@ -3803,11 +4273,19 @@ msgstr "Port server jarak jauh" #: src/settings_translation_file.cpp msgid "Replaces the default main menu with a custom one." -msgstr "" +msgstr "Mengganti menu utama bawaan dengan buatan lain." #: src/settings_translation_file.cpp msgid "Report path" -msgstr "Jalur laporan" +msgstr "Jalur pelaporan" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "Noise punggung bukit" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "Noide punggung bukit bawah air" #: src/settings_translation_file.cpp msgid "Right key" @@ -3815,7 +4293,7 @@ msgstr "Tombol kanan" #: src/settings_translation_file.cpp msgid "Rightclick repetition interval" -msgstr "" +msgstr "Jarak klik kanan terus menerus" #: src/settings_translation_file.cpp msgid "River Depth" @@ -3823,7 +4301,7 @@ msgstr "Kedalaman Sungai" #: src/settings_translation_file.cpp msgid "River Noise" -msgstr "" +msgstr "Noise Sungai" #: src/settings_translation_file.cpp msgid "River Size" @@ -3831,23 +4309,31 @@ msgstr "Ukuran sungai" #: src/settings_translation_file.cpp msgid "River noise -- rivers occur close to zero" -msgstr "" +msgstr "Noise sungai -- sungai muncul dekat nol" #: src/settings_translation_file.cpp msgid "Rollback recording" -msgstr "" +msgstr "Perekaman cadangan" #: src/settings_translation_file.cpp msgid "Round minimap" msgstr "Peta mini bundar" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "Pantai berpasir muncul saat np_beach melebihi nilai ini." + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." -msgstr "" +msgstr "Simpan peta yang diterima klien pada cakram." #: src/settings_translation_file.cpp msgid "Saving map received from server" -msgstr "" +msgstr "Simpan peta yang diterima dari server" + +#: src/settings_translation_file.cpp +msgid "Scale" +msgstr "Skala" #: src/settings_translation_file.cpp msgid "" @@ -3893,6 +4379,14 @@ msgstr "" "Gunakan 0 untuk kualitas bawaan." #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "Noise dasar laut" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "Noise 3D kedua dari dua yang bersama-sama mengatur terowongan." + +#: src/settings_translation_file.cpp msgid "Security" msgstr "Keamanan" @@ -3902,15 +4396,15 @@ msgstr "Lihat http://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp msgid "Selection box border color (R,G,B)." -msgstr "" +msgstr "Warna pinggiran kotak pilihan (merah,hijau,biru) atau (R,G,B)." #: src/settings_translation_file.cpp msgid "Selection box color" -msgstr "" +msgstr "Warna kotak pilihan" #: src/settings_translation_file.cpp msgid "Selection box width" -msgstr "" +msgstr "Lebar kotak pilihan" #: src/settings_translation_file.cpp msgid "Server / Singleplayer" @@ -3937,6 +4431,10 @@ msgid "Server port" msgstr "Port server" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "Occlusion culling sisi server" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL Daftar server" @@ -3977,11 +4475,22 @@ msgstr "" "Membutuhkan shader diaktifkan." #: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "Jalur shader" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" +"Shader membolehkan efek visual lanjut dan dapat meningkatkan performa pada " +"beberapa kartu video.\n" +"Ini hanya bekerja dengan video OpenGL." + +#: src/settings_translation_file.cpp +msgid "Shadow limit" +msgstr "Batas bayangan" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -3993,7 +4502,7 @@ msgstr "Tampilkan info debug" #: src/settings_translation_file.cpp msgid "Show entity selection boxes" -msgstr "" +msgstr "Tampilkan kotak pilihan benda" #: src/settings_translation_file.cpp msgid "Shutdown message" @@ -4004,10 +4513,34 @@ msgid "" "Size of chunks to be generated at once by mapgen, stated in mapblocks (16 " "nodes)." msgstr "" +"Ukuran chunk yang dibuat dalam satu waktu oleh pembuat peta, dalam satuan " +"blok peta (16 node)." #: src/settings_translation_file.cpp -msgid "Slope and fill work together to modify the heights" +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." msgstr "" +"Ukuran dari cache blok peta dari pembuat mesh. Menaikkan ini akan\n" +"menambah persentase cache hit, mengurangi data yang disalin dari\n" +"thread utama, sehingga mengurangi jitter." + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "Irisan w" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights" +msgstr "Kemiringan dan isian bekerja sama mengatur ketinggian" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "Variasi kelembapan skala kecil untuk paduan di tepi bioma." + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "Variasi suhu skala kecil untuk paduan di tepi bioma." #: src/settings_translation_file.cpp msgid "Smooth lighting" @@ -4047,7 +4580,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Static spawnpoint" -msgstr "" +msgstr "Titk bangkit tetap" + +#: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "Pesan status saat tersambung" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "Noise kecuraman" #: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." @@ -4055,7 +4596,7 @@ msgstr "Gunakan Normalmaps." #: src/settings_translation_file.cpp msgid "Strength of parallax." -msgstr "" +msgstr "Kekuatan dari parallax." #: src/settings_translation_file.cpp msgid "Strict protocol checking" @@ -4067,11 +4608,31 @@ msgstr "Dukung server lawas" #: src/settings_translation_file.cpp msgid "Synchronous SQLite" -msgstr "" +msgstr "SQLite tersinkronasi" + +#: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "Variasi suhu pada bioma." #: src/settings_translation_file.cpp msgid "Terrain Height" -msgstr "" +msgstr "Ketinggian Medan" + +#: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "Noise medan alt" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "Noise dasar medan" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "Noise medan (lebih tinggi)" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "Noise medan" #: src/settings_translation_file.cpp msgid "" @@ -4079,6 +4640,9 @@ msgid "" "Controls proportion of world area covered by hills.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"Batas noise medan untuk bukit.\n" +"Atur perbandingan dari daerah dunia yang diselimuti bukit.\n" +"Atur menuju 0.0 untuk perbandingan yang lebih besar." #: src/settings_translation_file.cpp msgid "" @@ -4086,6 +4650,13 @@ msgid "" "Controls proportion of world area covered by lakes.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"Batas noise medan untuk danau.\n" +"Atur perbandingan dari daerah dunia yang diselimuti danau.\n" +"Atur menuju 0.0 untuk perbandingan yang lebih besar." + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "Persistence noise medan" #: src/settings_translation_file.cpp msgid "Texture path" @@ -4100,6 +4671,8 @@ msgid "" "The default format in which profiles are being saved,\n" "when calling `/profiler save [format]` without format." msgstr "" +"Format bawaan pada berkas untuk menyimpan profile,\n" +"saat memanggil `/profiler save [format]` tanpa format." #: src/settings_translation_file.cpp msgid "The depth of dirt or other filler" @@ -4107,29 +4680,39 @@ msgstr "Kedalaman dari tanah atau pengisi lainnya" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." msgstr "" +"Jalur berkas relatif terhadap jalur dunia Anda dimana akan disimpan profile " +"di dalamnya." + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "Identitas dari joystick yang digunakan" #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." -msgstr "" +msgstr "Antarmuka jaringan yang server dengarkan." #: src/settings_translation_file.cpp msgid "" "The privileges that new users automatically get.\n" "See /privs in game for a full list on your server and mod configuration." msgstr "" +"Izin yang didapatkan pengguna baru otomatis.\n" +"Lihat /privs dalam permainan untuk daftar lengkap pada server Anda dan " +"konfigurasi mod." #: src/settings_translation_file.cpp msgid "The rendering back-end for Irrlicht." -msgstr "" +msgstr "Backend rendering untuk Irrlicht." #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" "ingame view frustum around." msgstr "" +"Kepekaan dari sumbu joystick untuk menggerakkan batas\n" +"tampilan dalam permainan." #: src/settings_translation_file.cpp msgid "" @@ -4138,6 +4721,10 @@ msgid "" "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n" "set to the nearest valid value." msgstr "" +"Kekuatan (kegelapan) dari shade ambient occlusion pada node.\n" +"Semakin kecil semakin gelap, juga sebaliknya. Jangkauan yang sah\n" +"berkisar antara 0.25 sampai 4.0 inklusif. Jika nilai di luar jangkauan\n" +"maka akan diatur ke nilai yang sah terdekat." #: src/settings_translation_file.cpp msgid "" @@ -4145,32 +4732,45 @@ msgid "" "capacity until an attempt is made to decrease its size by dumping old queue\n" "items. A value of 0 disables the functionality." msgstr "" +"Waktu (dalam detik) sehingga antrian cairan dapat bertambah di luar " +"kapasitas\n" +"pemrosesan sampai usaha dilakukan untuk mengurangi ukurannya dengan\n" +"membuang antrian lama. Nilai 0 menonaktifkan ini." #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" "when holding down a joystick button combination." msgstr "" +"Waktu dalam detik antara kejadian saat menekan\n" +"terus menerus kombinasi tombol joystick." #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated right clicks when holding the " "right mouse button." msgstr "" +"Waktu dalam detik antara kejadian saat menekan tombol kanan terus menerus." + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "Jenis joystick" #: src/settings_translation_file.cpp msgid "This font will be used for certain languages." -msgstr "" +msgstr "Font ini akan digunakan pada bahasa tertentu." #: src/settings_translation_file.cpp msgid "Time in between active block management cycles" -msgstr "" +msgstr "Jarak waktu antara siklus Pengelola Blok Aktif" #: 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 "" +"Waktu dalam detik bagi benda (yang dijatuhkan) untuk hidup.\n" +"Atur ke -1 untuk menonaktifkan fitur ini." #: src/settings_translation_file.cpp msgid "Time send interval" @@ -4183,6 +4783,8 @@ msgstr "Kecepatan waktu" #: src/settings_translation_file.cpp msgid "Timeout for client to remove unused map data from memory." msgstr "" +"Batas waktu bagi klien untuk menghapus data peta yang tidak digunakan dari " +"memori." #: src/settings_translation_file.cpp msgid "" @@ -4191,6 +4793,10 @@ msgid "" "This determines how long they are slowed down after placing or removing a " "node." msgstr "" +"Untuk mengurangi lag, pengiriman blok diperlambat saat pemain sedang " +"membangun.\n" +"Ini menentukan seberapa lama mereka diperlambat setelah menaruh atau " +"mencopot node." #: src/settings_translation_file.cpp msgid "Toggle camera mode key" @@ -4201,6 +4807,10 @@ msgid "Tooltip delay" msgstr "Jeda tooltip" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "Noise pepohonan" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Trilinear filtering" @@ -4210,38 +4820,61 @@ msgid "" "False = 128\n" "Useable to make minimap smoother on slower machines." msgstr "" +"True = 256\n" +"False = 128\n" +"Berguna untuk membuat peta mini lebih halus pada mesin yang lebih lambat." #: src/settings_translation_file.cpp msgid "Trusted mods" -msgstr "Mod terpercaya" +msgstr "Mod yang dipercaya" + +#: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" +"Ketinggian paling tinggi umumnya, di atas dan di bawah titik tengah, dari " +"medan gunung floatland." #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "URL ke daftar server yang tampil di Tab Multi-pemain." + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "Undersampling" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." msgstr "" #: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" -msgstr "" +msgstr "Jarak pemindahan pemain tak terbatas" #: src/settings_translation_file.cpp msgid "Unload unused server data" -msgstr "" +msgstr "Membongkar data server yang tak terpakai" #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." -msgstr "" +msgstr "Gunakan tampilan awan 3D daripada datar." #: src/settings_translation_file.cpp msgid "Use a cloud animation for the main menu background." -msgstr "" +msgstr "Gunakan animasi awan untuk latar belakang menu utama." #: src/settings_translation_file.cpp msgid "Use anisotropic filtering when viewing at textures from an angle." -msgstr "" +msgstr "Gunakan anisotropic filtering saat melihat tekstur pada sudut tertentu." #: src/settings_translation_file.cpp msgid "Use bilinear filtering when scaling textures." -msgstr "" +msgstr "Gunakan bilinear filtering saat mengubah ukuran tekstur." #: src/settings_translation_file.cpp msgid "Use key" @@ -4250,56 +4883,97 @@ msgstr "Tombol gunakan" #: src/settings_translation_file.cpp msgid "Use mip mapping to scale textures. May slightly increase performance." msgstr "" +"Gunakan mip mapping untuk mengubah ukuran tekstur. Dapat sedikit mengurangi " +"performa." #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." -msgstr "" +msgstr "Gunakan bilinear filtering saat mengubah ukuran tekstur." #: src/settings_translation_file.cpp msgid "V-Sync" -msgstr "" +msgstr "V-Sync" #: src/settings_translation_file.cpp msgid "VBO" -msgstr "" +msgstr "VBO" #: src/settings_translation_file.cpp msgid "Valley Depth" -msgstr "" +msgstr "Kedalaman Lembah" #: src/settings_translation_file.cpp msgid "Valley Fill" -msgstr "" +msgstr "Isian Lembah" #: src/settings_translation_file.cpp msgid "Valley Profile" -msgstr "" +msgstr "Profil Lembah" #: src/settings_translation_file.cpp msgid "Valley Slope" -msgstr "" +msgstr "Kemiringan Lembah" #: src/settings_translation_file.cpp msgid "Valleys C Flags" -msgstr "" +msgstr "Flag Valleys C" #: src/settings_translation_file.cpp -msgid "Vertical screen synchronization." -msgstr "" +msgid "Variation of biome filler depth." +msgstr "Variasi dari kedalaman isian bioma." #: src/settings_translation_file.cpp -msgid "Video driver" +msgid "Variation of hill height and lake depth on floatland smooth terrain." msgstr "" +"Variasi dari ketinggian bukit dan kedalaman danau pada medan halus floatland." + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "Variasi dari ketinggian gunung paling tinggi (dalam node)." + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "Variasi dari jumlah gua." #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." msgstr "" +"Variasi dari skala vertikal medan.\n" +"Saat noise < -0,55 medan mendekati datar." + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "Merubah kedalaman dari node permukaan bioma." #: src/settings_translation_file.cpp msgid "" -"View distance in nodes.\n" -"Min = 20" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." msgstr "" +"Merubah kekasaran dari medan.\n" +"Mengatur nilai 'persistence' dari noise terrain_base dan terrain_alt." + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "Merubah kecuraman tebing." + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "Sinkronisasi layar vertikal." + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "Driver video" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "Faktor view bobbing" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "Jarak pandang dalam node." #: src/settings_translation_file.cpp msgid "View range decrease key" @@ -4310,6 +4984,10 @@ msgid "View range increase key" msgstr "Tombol menambah jarak pandang" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "Tombol zoom" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "Jarak pandang" @@ -4324,6 +5002,10 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" +"Koordinat W dari irisan 3D dari fraktal 4D.\n" +"Menentukan irisan 3D yang mana dari bangun 4D yang dibuat.\n" +"Tidak berefek pada fraktal 3D.\n" +"Jangkauan sekitar -2 ke 2." #: src/settings_translation_file.cpp msgid "Walking speed" @@ -4339,7 +5021,7 @@ msgstr "Ketinggian air" #: src/settings_translation_file.cpp msgid "Water surface level of the world." -msgstr "" +msgstr "Ketinggian permukaan air dunia." #: src/settings_translation_file.cpp msgid "Waving Nodes" @@ -4375,6 +5057,10 @@ msgid "" "filtered in software, but some images are generated directly\n" "to hardware (e.g. render-to-texture for nodes in inventory)." msgstr "" +"Saat gui_scaling_filter diatur ke true, semua gambar GUI harus\n" +"difilter dalam perangkat lunak, tetapi beberapa gambar dibuat\n" +"langsung ke perangkat keras (misal. render ke tekstur untuk node\n" +"dalam inventaris)." #: src/settings_translation_file.cpp msgid "" @@ -4397,47 +5083,43 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" +"Apakah font freetype yang digunakan, membutuhkan dukungan freetype saat " +"dicompile." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." -msgstr "" +msgstr "Apakah animasi tekstur node harus ditidaksinkronasikan tiap blok peta." #: src/settings_translation_file.cpp msgid "" "Whether players are shown to clients without any range limit.\n" "Deprecated, use the setting player_transfer_distance instead." msgstr "" +"Apakah para pemain ditampilkan ke klien tanpa batas jangkauan.\n" +"Usang, gunakan pengaturan player_transfer_distance." #: src/settings_translation_file.cpp msgid "Whether to allow players to damage and kill each other." -msgstr "" +msgstr "Apakah pemain boleh melukai atau membunuh satu sama lain." #: src/settings_translation_file.cpp msgid "" "Whether to ask clients to reconnect after a (Lua) crash.\n" "Set this to true if your server is set up to restart automatically." msgstr "" +"Apakah meminta klien untuk menyambung ulang setelah kerusakan (Lua).\n" +"Atur ke true jika server Anda diatur untuk mulai ulang otomatis." #: src/settings_translation_file.cpp msgid "Whether to fog out the end of the visible area." -msgstr "" +msgstr "Apakah harus memberi kabut pada akhir daerah yang terlihat." #: src/settings_translation_file.cpp msgid "" "Whether to show the client debug info (has the same effect as hitting F5)." -msgstr "" +msgstr "Apakah menampilkan informasi debug klien (sama dengan menekan F5)." #: src/settings_translation_file.cpp msgid "" @@ -4446,27 +5128,79 @@ msgid "" "Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n" "Disabling this option will protect your password better." msgstr "" +"Apakah mendukung server lawas sebelum protokol versi 25.\n" +"Aktifkan jika Anda ingin menyambung ke server 0.4.12 atau sebelumnya.\n" +"Server versi 0.4.13 ke atas akan bekerja, versi 0.4.12-dev mungkin bekerja.\n" +"Menonaktifkan pilihan ini akan melindungi kata sandi Anda lebih baik." #: src/settings_translation_file.cpp msgid "Width component of the initial window size." -msgstr "" +msgstr "Lebar ukuran jendela mula-mula." #: src/settings_translation_file.cpp msgid "Width of the selectionbox's lines around nodes." +msgstr "Lebar garis kotak pilihan disekeliling node." + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." msgstr "" +"Sistem Windows saja: Mulai Minetest dengan jendela command line di latar " +"belakang.\n" +"Memiliki informasi yang sama dengan berkas debug.txt (nama bawaan)." #: src/settings_translation_file.cpp msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" +"Direktori dunia (semua yang ada di dunia disimpan di sini).\n" +"Tidak perlu jika dimulai dari menu utama." #: src/settings_translation_file.cpp msgid "Y of flat ground." -msgstr "" +msgstr "Y dari tanah flat." #: src/settings_translation_file.cpp msgid "Y of upper limit of large pseudorandom caves." +msgstr "Y dari batas atas dari gua besar semu acak." + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "Jarak Y dimana gua besar meluas ke ukuran penuh." + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "Ketinggian Y dari permukaan medan rata-rata." + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "Ketinggian Y dari batas atas gua." + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "Ketinggian Y dari titik tengah floatland dan permukaan danau." + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "Ketinggian Y dari medan yang lebih tinggi (puncak tebing)." + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "Ketinggian Y dari medan yang lebih rendah dan dasar danau." + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "Ketinggian Y dari dasar laut." + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "Ketinggian Y dimana bayangan floatland diperpanjang." + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" msgstr "" #: src/settings_translation_file.cpp @@ -4479,7 +5213,73 @@ msgstr "Batas cURL paralel" #: src/settings_translation_file.cpp msgid "cURL timeout" -msgstr "Batas waktu cURL" +msgstr "waktu habis cURL" + +#~ msgid "Hide mp content" +#~ msgstr "" +#~ "Sembunyikan\n" +#~ "konten pm" + +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "Caps Lock" + +#~ msgid "Comma" +#~ msgstr "Koma" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Final" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Kurang" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Titik" + +#~ msgid "Plus" +#~ msgstr "Tambah" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Mengatur ukuran padang gurun dan pantai dalam Mapgen v6.\n" +#~ "Jika snowbiomes di aktifkan 'mgv6_freq_desert' akan diabaikan." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Menentukan bentuk tanah.\n" +#~ "3 angka dalam kurung mengatur skala dari bentuk\n" +#~ "tanah, ketiganya harus sama." + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "Frekuensi pantai pada generator peta v6" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "Frekuensi padang gurun pada generator peta v6" #~ msgid "Useful for mod developers." #~ msgstr "Berguna untuk pengembang mod." @@ -4507,9 +5307,6 @@ msgstr "Batas waktu cURL" #~ msgid "If enabled, " #~ msgstr "diaktifkan" -#~ msgid "Rendering:" -#~ msgstr "Rendering:" - #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "Mulai ulang minetest untuk beralih ke driver yang dipilih" diff --git a/po/it/minetest.po b/po/it/minetest.po index a6f49efb0..73b75ad56 100644 --- a/po/it/minetest.po +++ b/po/it/minetest.po @@ -6,25 +6,33 @@ msgid "" msgstr "" "Project-Id-Version: Minetest 0.4.9\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-05-14 13:34+0000\n" -"Last-Translator: Emon Omen <emon@openmailbox.org>\n" -"Language-Team: Italian <https://hosted.weblate.org/projects/minetest/" -"minetest/it/>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-06-03 10:10+0000\n" +"Last-Translator: pandaro <padarogames@gmail.com>\n" +"Language-Team: Italian " +"<https://hosted.weblate.org/projects/minetest/minetest/it/>\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.7-dev\n" +"X-Generator: Weblate 2.15-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Ricomparire" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Siete morti." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" -msgstr "E' avvenuto un errore in uno script Lua, come un mod.:" +msgstr "Si è verificato un errore in uno script Lua (come una mod):" #: builtin/fstk/ui.lua msgid "An error occured:" -msgstr "E' avvenuto un errore:" +msgstr "Si è verificato un errore:" #: builtin/fstk/ui.lua msgid "Main menu" @@ -32,11 +40,11 @@ msgstr "Menu principale" #: builtin/fstk/ui.lua builtin/mainmenu/store.lua msgid "Ok" -msgstr "Va bene" +msgstr "OK" #: builtin/fstk/ui.lua msgid "Reconnect" -msgstr "Riconnettere" +msgstr "Riconnettiti" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" @@ -61,12 +69,12 @@ msgstr "Il server supporta versioni di protocollo comprese tra $1 e $2. " #: builtin/mainmenu/common.lua msgid "Try reenabling public serverlist and check your internet connection." msgstr "" -"Provate a riabilitare l'elenco dei server pubblici e controllate la vostra " -"connessione internet." +"Prova a riabilitare l'elenco dei server pubblici e a controllare la " +"connessione a Internet." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." -msgstr "Supportiamo solo il protocollo versione $1." +msgstr "Supportiamo solo la versione di protocollo $1." #: builtin/mainmenu/common.lua msgid "We support protocol versions between version $1 and $2." @@ -76,50 +84,52 @@ msgstr "Supportiamo versioni di protocollo comprese tra $1 e $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" -msgstr "Annullare" +msgstr "Annulla" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Dipendenze:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable MP" -msgstr "Disabilitare p.m." +msgstr "Disabilita p.m." + +#: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Disabilita p.m." #: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" -msgstr "Abilitare p.m." +msgstr "Abilita p.m." #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" -msgstr "Abilitarli tutti" +msgstr "Abilita tutti" #: builtin/mainmenu/dlg_config_world.lua msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "chararacters [a-z0-9_] are allowed." msgstr "" -"Abilitazione del mod. \"$1\" fallita perché contiene caratteri non ammessi. " -"Sono ammessi solo i caratteri [a-z0-9_]." - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Nasc. del gioco" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Nasc. il cont. dei pacchetti" +"Errore nell'abilitazione della mod \"$1\" perché contiene caratteri non " +"ammessi. Sono ammessi solo i caratteri [a-z0-9_]." #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" -msgstr "Mod.:" +msgstr "Mod:" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "Dipendenze opzionali:" #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" -msgstr "Salvare" +msgstr "Salva" #: builtin/mainmenu/dlg_config_world.lua msgid "World:" @@ -135,15 +145,15 @@ msgstr "Esiste già un mondo chiamato \"$1\"" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" -msgstr "Creare" +msgstr "Crea" #: builtin/mainmenu/dlg_create_world.lua msgid "Download a subgame, such as minetest_game, from minetest.net" -msgstr "Scaricare un sottogioco, come minetest_game, da minetest.net" +msgstr "Scarica un sottogioco, come minetest_game, da minetest.net" #: builtin/mainmenu/dlg_create_world.lua msgid "Download one from minetest.net" -msgstr "Scaricarne uno da minetest.net" +msgstr "Scaricane uno da minetest.net" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Game" @@ -151,16 +161,15 @@ msgstr "Gioco" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" -msgstr "Generatore mappa" +msgstr "Generatore della mappa" #: builtin/mainmenu/dlg_create_world.lua msgid "No worldname given or no game selected" -msgstr "" -"Non è stato dato nessun nome di mondo o non è stato scelto nessun gioco" +msgstr "Nessun nome per il mondo o nessuna partita selezionata" #: builtin/mainmenu/dlg_create_world.lua msgid "Seed" -msgstr "Seme casuale" +msgstr "Seme per il generatore" #: builtin/mainmenu/dlg_create_world.lua msgid "Warning: The minimal development test is meant for developers." @@ -172,37 +181,36 @@ msgstr "Nome del mondo" #: builtin/mainmenu/dlg_create_world.lua msgid "You have no subgames installed." -msgstr "Non avete sottogiochi installati." +msgstr "Non hai sottogiochi installati." #: builtin/mainmenu/dlg_delete_mod.lua msgid "Are you sure you want to delete \"$1\"?" -msgstr "Siete certi di volere cancellare \"$1\"?" +msgstr "Vuoi davvero eliminare \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" -msgstr "Cancellare" +msgstr "Elimina" #: builtin/mainmenu/dlg_delete_mod.lua msgid "Modmgr: failed to delete \"$1\"" -msgstr "Modmgr: cancellazione di \"$1\" fallita" +msgstr "Modmgr: eliminazione di \"$1\" fallita" #: builtin/mainmenu/dlg_delete_mod.lua msgid "Modmgr: invalid modpath \"$1\"" -msgstr "Modmgr: percorso mod. non valido \"$1\"" +msgstr "Modmgr: percorso mod \"$1\" non valido" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" -msgstr "Cancellare il mondo \"$1\"?" +msgstr "Eliminare il mondo \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" -msgstr "Accettare" +msgstr "Accetta" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "Rinominare il pacchetto mod.:" +msgstr "Rinomina il pacchetto di mod:" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "\"$1\" is not a valid flag." @@ -210,15 +218,15 @@ msgstr "\"$1\" non è un marcatore valido." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" -msgstr "(Non è stata fornita nessuna descrizione dell'impostazione)" +msgstr "(Non è stata fornita alcuna descrizione dell'impostazione)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" -msgstr "< Pag. delle impostazioni" +msgstr "< Torna alle impostazioni" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Browse" -msgstr "Mostrare" +msgstr "Sfoglia" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Disabled" @@ -226,7 +234,7 @@ msgstr "Disabilitato" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Edit" -msgstr "Modificare" +msgstr "Modifica" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Enabled" @@ -234,7 +242,8 @@ msgstr "Abilitato" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Format is 3 numbers separated by commas and inside brackets." -msgstr "Il formato è tre numeri separati da virgole e dentro parentesi." +msgstr "" +"Il formato è composto da tre numeri separati da virgole e dentro parentesi." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "" @@ -250,7 +259,7 @@ msgstr "Giochi" #: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua msgid "Mods" -msgstr "Mod." +msgstr "Mod" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Optionally the lacunarity can be appended with a leading comma." @@ -259,15 +268,15 @@ msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a comma seperated list of flags." -msgstr "Inserite un elenco di valori separati da virgole, prego." +msgstr "Inserisci un elenco di valori separati da virgole." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." -msgstr "Inserite un numero intero valido, prego." +msgstr "Inserisci un numero intero valido." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid number." -msgstr "Inserite un numero valido, prego." +msgstr "Inserisci un numero valido." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Possible values are: " @@ -275,22 +284,29 @@ msgstr "I valori possibili sono: " #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Restore Default" -msgstr "Ripristino predefinite" +msgstr "Ripristina predefinite" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Cerca" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" -msgstr "Scegliere il percorso" +msgstr "Scegli il percorso" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Show technical names" -msgstr "Mostrare i nomi tecnici" +msgstr "Mostra i nomi tecnici" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "Il valore deve essere maggiore di $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "Il valore deve essere minore di $1." #: builtin/mainmenu/modmgr.lua @@ -299,7 +315,8 @@ msgid "" "Install Mod: unsupported filetype \"$1\" or broken archive" msgstr "" "\n" -"Insallatore mod.: tipo di file non supportato \"$1\" o archivio danneggiato" +"Installazione di una mod: tipo di file \"$1\" non supportato o archivio " +"danneggiato" #: builtin/mainmenu/modmgr.lua msgid "Failed to install $1 to $2" @@ -307,29 +324,34 @@ msgstr "Installazione di $1 in $2 fallita" #: builtin/mainmenu/modmgr.lua msgid "Install Mod: file: \"$1\"" -msgstr "Installatore mod.: file: \"$1\"" +msgstr "Installazione di una mod: file: \"$1\"" #: builtin/mainmenu/modmgr.lua msgid "Install Mod: unable to find real modname for: $1" -msgstr "Installatore mod.: impossibile trovare il vero nome mod per: $1" +msgstr "" +"Installazione di una mod: impossibile trovare il vero nome della mod per: $1" #: builtin/mainmenu/modmgr.lua msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" -"Installatore mod.: impossibile trovare un nome cartella adatto per il " -"pacchetto mod $1" +"Installazione di una mod: impossibile trovare un nome di cartella adatto per " +"il pacchetto mod $1" + +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "Mods del gioco" #: builtin/mainmenu/store.lua msgid "Close store" -msgstr "Chiudere il negozio" +msgstr "Chiudi il negozio" #: builtin/mainmenu/store.lua msgid "Downloading $1, please wait..." -msgstr "Scaricamento di $1, attendere prego..." +msgstr "Download di $1. Attendi..." #: builtin/mainmenu/store.lua msgid "Install" -msgstr "Installare" +msgstr "Installa" #: builtin/mainmenu/store.lua msgid "Page $1 of $2" @@ -340,16 +362,12 @@ msgid "Rating" msgstr "Valutazione" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Cercare" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Nome abbreviato:" #: builtin/mainmenu/store.lua msgid "Successfully installed:" -msgstr "Installato con successo:" +msgstr "Installato correttamente:" #: builtin/mainmenu/store.lua msgid "Unsorted" @@ -379,123 +397,143 @@ msgstr "Contributori precedenti" msgid "Previous Core Developers" msgstr "Sviluppatori principali precedenti" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "Rendere noto il server" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Legare indirizzo" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Configura" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Modalità creativa" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Abilita i danni" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Nascondi gioco" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Server" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Installazione locale" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nome/Password" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Nuovo" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Nessun mondo creato o scelto!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Nome del giocatore" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Porta" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Scegliere il mondo:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Porta del server" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" -msgstr "Moduli installati:" +msgstr "Mod installate:" #: builtin/mainmenu/tab_mods.lua msgid "Mod information:" -msgstr "Informazioni sul modulo:" +msgstr "Informazioni sulla mod:" + +#: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "Nessuna dipendenza." #: builtin/mainmenu/tab_mods.lua msgid "No mod description available" -msgstr "Nessuna descrizione disponibile per il modulo" +msgstr "Nessuna descrizione disponibile per la mod" #: builtin/mainmenu/tab_mods.lua msgid "Rename" -msgstr "Rinominare" +msgstr "Rinomina" #: builtin/mainmenu/tab_mods.lua msgid "Select Mod File:" -msgstr "Scegliere il file mod.:" +msgstr "Scegli il file della mod:" #: builtin/mainmenu/tab_mods.lua msgid "Uninstall selected mod" -msgstr "Disinstallare il modulo scelto" +msgstr "Disinstalla la mod scelta" #: builtin/mainmenu/tab_mods.lua msgid "Uninstall selected modpack" -msgstr "Disinstallare il pacchetto mod. scelto" +msgstr "Disinstalla il pacchetto mod scelto" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Indirizzo / Porta" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Client" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" -msgstr "Connettersi" +msgstr "Connettiti" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Modalità creativa" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Danno abilitato" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" -msgstr "Canc. prefer." +msgstr "Elimina prefer." -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Preferiti:" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Nome / Password" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "GcG abilitato" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Legare indirizzo" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Configurare" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Modalità creativa" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Abilitare il danno" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Nome/Password" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Nuovo" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Nessun mondo creato o scelto!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Porta" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Pubblico" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Scegliere il mondo:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Server" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Porta del server" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Play Online" +msgstr "Nome del giocatore" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Avviare il gioco" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP abilitato" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -526,6 +564,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Siete certi di volere azzerare il vostro mondo di giocatore singolo?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "Salva automaticamente la dimensione dello schermo" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Filtro bilineare" @@ -598,9 +640,13 @@ msgid "Particles" msgstr "Particelle" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Reset singleplayer world" -msgstr "Siete certi di volere azzerare il vostro mondo di giocatore singolo?" +msgstr "Azzerare il mondo a giocatore singolo" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "Istantanea" #: builtin/mainmenu/tab_settings.lua msgid "Settings" @@ -666,14 +712,6 @@ msgstr "Principale" msgid "Start Singleplayer" msgstr "Avviare il giocatore singolo" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Giocare" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Giocatore singolo" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Nessuna informazione disponibile" @@ -735,6 +773,10 @@ msgid "Player name too long." msgstr "Nome del giocatore troppo lungo." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Prego, scegli un nome!" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Il percorso del mondo fornito non esiste: " @@ -751,6 +793,44 @@ msgstr "" "Controllate debug.txt per i dettagli." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Legare indirizzo" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Modalità creativa" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Danno" + +#: src/game.cpp +msgid "- Mode: " +msgstr "- Modalità : " + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Porta" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Pubblico" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Nome del server" + +#: src/game.cpp msgid "Change Keys" msgstr "Modificare i tasti" @@ -767,26 +847,22 @@ msgid "Continue" msgstr "Proseguire" #: src/game.cpp -msgid "Creating client..." -msgstr "Creazione del client..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Creazione del server..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Controlli predefiniti:\n" "- WASD: muoversi\n" @@ -801,6 +877,14 @@ msgstr "" "- T: messaggistica\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Creazione del client..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Creazione del server..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -837,6 +921,20 @@ msgid "Exit to OS" msgstr "Tornare al s.o." #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Nome del gioco" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Creazione del server..." + +#: src/game.cpp msgid "Item definitions..." msgstr "Definizioni dell'oggetto..." @@ -857,24 +955,46 @@ msgid "Node definitions..." msgstr "Definizioni del nodo..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Risoluzione dell'indirizzo..." +msgid "Off" +msgstr "spento" #: src/game.cpp -msgid "Respawn" -msgstr "Ricomparire" +msgid "On" +msgstr "Acceso" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "Porta remota" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Risoluzione dell'indirizzo..." #: src/game.cpp msgid "Shutting down..." msgstr "Spegnimento..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Giocatore singolo" + +#: src/game.cpp msgid "Sound Volume" msgstr "Volume dell'audio" #: src/game.cpp -msgid "You died." -msgstr "Siete morti." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "Volume impostato allo 0%" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "Volume impostato al 100%" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -909,6 +1029,10 @@ msgid "Console" msgstr "Console" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Doppio \"saltare\" per il volo" @@ -921,6 +1045,11 @@ msgid "Forward" msgstr "Avanti" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Volume dell'audio" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventario" @@ -942,6 +1071,24 @@ msgstr "" msgid "Left" msgstr "Sinistra" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Comandi di messaggistica" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Muto" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Pag giù" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Stampare stack" @@ -1019,38 +1166,22 @@ msgid "Apps" msgstr "Applicazioni" #: src/keycode.cpp -msgid "Attn" -msgstr "Attenzione" - -#: src/keycode.cpp msgid "Back" msgstr "Indietro" #: src/keycode.cpp -msgid "Capital" -msgstr "Bloc maiusc" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Pulire" #: src/keycode.cpp -msgid "Comma" -msgstr "Virgola" - -#: src/keycode.cpp msgid "Control" msgstr "Control" #: src/keycode.cpp -msgid "Convert" -msgstr "Convertire" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Giù" @@ -1059,26 +1190,15 @@ msgid "End" msgstr "Fine" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Cancellare l'OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Esc" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Eseguire" #: src/keycode.cpp -msgid "Final" -msgstr "Finale" - -#: src/keycode.cpp msgid "Help" msgstr "Help" @@ -1087,20 +1207,33 @@ msgid "Home" msgstr "Inizio" #: src/keycode.cpp -msgid "Insert" -msgstr "Ins" +#, fuzzy +msgid "IME Accept" +msgstr "Accetta" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Convert" +msgstr "Convertire" #: src/keycode.cpp -msgid "Kana" -msgstr "ì" +#, fuzzy +msgid "IME Escape" +msgstr "Esc" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +#, fuzzy +msgid "IME Mode Change" +msgstr "Cambiare modalità " + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "Nonconvert" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Ins" #: src/keycode.cpp msgid "Left Button" @@ -1131,22 +1264,10 @@ msgid "Middle Button" msgstr "Pulsante centrale" #: src/keycode.cpp -msgid "Minus" -msgstr "Meno" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Cambiare modalità " - -#: src/keycode.cpp msgid "Next" msgstr "Pag giù" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nonconvert" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Bloc Num" @@ -1163,6 +1284,11 @@ msgid "Numpad -" msgstr "Tast. num. -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Tast. num. *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Tast. num. /" @@ -1211,20 +1337,12 @@ msgid "OEM Clear" msgstr "Pulire l'OEM" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pausa" #: src/keycode.cpp -msgid "Period" -msgstr "Punto" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Più" +msgid "Play" +msgstr "Giocare" #: src/keycode.cpp msgid "Print" @@ -1332,6 +1450,20 @@ msgid "3D mode" msgstr "Modalità 3D" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1385,9 +1517,8 @@ msgid "Active Block Modifier interval" msgstr "Intervallo del modificatore di blocco attivo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Active Block Modifiers" -msgstr "Intervallo del modificatore di blocco attivo" +msgstr "Modificatore del blocco attivo" #: src/settings_translation_file.cpp msgid "Active block range" @@ -1409,6 +1540,10 @@ msgstr "" "impostazione." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1417,8 +1552,10 @@ msgstr "" "es. per schermi 4k." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "Adattate la codifica di gamma per le tavole di illuminazione. I numeri più " @@ -1446,6 +1583,12 @@ msgid "Amplifies the valleys" msgstr "Ingrandisce le vallate" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Filtro anisotropico" @@ -1464,6 +1607,10 @@ msgstr "" "servers.minetest.net." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "Scala (X, Y, Z) approssimativa del frattale in nodi." @@ -1472,12 +1619,25 @@ msgid "Ask to reconnect after crash" msgstr "Chiedere di riconnettersi dopo un crollo" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Rapporto automatico all'elenco dei server." #: src/settings_translation_file.cpp msgid "Autorun key" -msgstr "" +msgstr "Tasto per la corsa automatica" #: src/settings_translation_file.cpp msgid "Backward key" @@ -1496,6 +1656,14 @@ msgid "Basic Privileges" msgstr "Privilegi di base" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Filtro bilineare" @@ -1504,6 +1672,16 @@ msgid "Bind address" msgstr "Lega indirizzo" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome API temperature and humidity noise parameters" +msgstr "Gen. mappa v. 6, parametri del 'rumore' dell'umidità " + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome noise" +msgstr "'Rumore' dei fiumi" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "Bit per pixel (cioè profondità di colore) in modalità schermo intero." @@ -1513,7 +1691,7 @@ msgstr "Costruisci nel giocatore" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "Integrato" #: src/settings_translation_file.cpp msgid "Bumpmapping" @@ -1532,6 +1710,11 @@ msgid "Camera update toggle key" msgstr "Tasto di scelta di aggiornamento della camera" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "'Rumore' n°1 della caverna" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "'Rumore' n°1 della caverna" @@ -1544,6 +1727,35 @@ msgid "Cave width" msgstr "Larghezza delle caverne" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "'Rumore' n°1 della caverna" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "'Rumore' n°1 della caverna" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "Larghezza delle caverne" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "'Rumore' n°1 della caverna" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Limite delle colline del Generatore mappa piatto" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "Caverne e gallerie si formano all'intersezione dei due 'rumori'" @@ -1556,9 +1768,8 @@ msgid "Chat toggle key" msgstr "Tasto di scelta della messaggistica" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chatcommands" -msgstr "Comando" +msgstr "Comandi di messaggistica" #: src/settings_translation_file.cpp msgid "" @@ -1619,10 +1830,19 @@ msgid "Clean transparent textures" msgstr "Immagini trasparenti pulite" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Client" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Client e server" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Client" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Velocità di arrampicata" @@ -1651,7 +1871,6 @@ msgid "Colored fog" msgstr "Nebbia colorata" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Comma-separated list of mods that are allowed to access HTTP APIs, which\n" "allow them to upload and download data to/from the internet." @@ -1694,6 +1913,11 @@ msgid "Console color" msgstr "Colore della console" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Tasto della console" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Tasto della console" @@ -1720,14 +1944,6 @@ msgstr "" "invariati." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Controlla la dimensione di spiagge e deserti nel Generatore mappa v.6.\n" -"Quando sono attivati i biomi di neve 'mgv6_freq_desert' viene ignorato." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Controlla la ripidità /profondità delle depressioni lacustri." @@ -1736,6 +1952,12 @@ msgid "Controls steepness/height of hills." msgstr "Controlla la ripidità /altezza delle colline." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "" "Controlla la larghezza delle gallerie, un valore più piccolo crea gallerie " @@ -1762,6 +1984,11 @@ msgstr "" "Queste possono rendere difficile minare. Zero le disabilita. (0-10)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Crea" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Trasparenza del mirino" @@ -1798,6 +2025,11 @@ msgid "Debug log level" msgstr "Livello del registro di debug" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "Tasto di attivazione dello HUD" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Passo del server dedicato" @@ -1827,7 +2059,7 @@ msgstr "Privilegi predefiniti" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "Formato predefinito di rapporto" #: src/settings_translation_file.cpp msgid "" @@ -1838,6 +2070,41 @@ msgstr "" "Ha effetto solo se Minetest è stato compilato con cURL." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1852,10 +2119,20 @@ msgstr "" "blocchi (0 = illimitata)." #: src/settings_translation_file.cpp -msgid "Delay in sending blocks after building" +msgid "Defines tree areas and tree density." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "Ritardo dell'invio dei blocchi dopo la costruzione" + +#: src/settings_translation_file.cpp msgid "Delay showing tooltips, stated in milliseconds." msgstr "Ritardo nella comparsa dei suggerimenti, espresso in millisecondi." @@ -1884,18 +2161,23 @@ msgstr "" "giocatori accedono." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "De-sincronizza l'animazione del blocco" +msgid "Desert noise threshold" +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"Stabilisce la forma del terreno.\n" -"I tre numeri tra parentesi controllano la scala del\n" -"terreno, i tre numeri dovrebbero essere identici." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "De-sincronizza l'animazione del blocco" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Particelle" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1903,7 +2185,7 @@ msgstr "Disabilita anti-trucchi" #: src/settings_translation_file.cpp msgid "Disable escape sequences" -msgstr "" +msgstr "Disabilitare le sequenze di escape" #: src/settings_translation_file.cpp msgid "" @@ -1912,6 +2194,10 @@ msgid "" "disable\n" "the escape sequences generated by mods." msgstr "" +"Disabilita le sequenze di escape, es. testo colorato.\n" +"Usatela se volete eseguire un server con client anteriori alla v. 0.4.14 e " +"volete\n" +"disabilitare le sequenze di escape generate dai mod." #: src/settings_translation_file.cpp msgid "Disallow empty passwords" @@ -1940,6 +2226,12 @@ msgstr "Pubblica le informazioni di debug del generatore della mappa." #: src/settings_translation_file.cpp msgid "Enable Joysticks" +msgstr "Abilitare i joystic" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." msgstr "" #: src/settings_translation_file.cpp @@ -1947,6 +2239,14 @@ msgid "Enable VBO" msgstr "Abilitare VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Abilita la protezione mod." @@ -1996,6 +2296,19 @@ msgstr "" "del materiale (ad es. le immagini) quando ci si collega al server." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Enable view bobbing" +msgstr "Ondeggiamento visuale" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Moltiplicatore per l'ondeggiamento visivo.\n" +"Per esempio: 0 per nessun ondeggiamento visivo; 1.0 normale; 2.0 doppio." + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2051,13 +2364,16 @@ msgstr "" "Richiede l'attivazione degli shader." #: src/settings_translation_file.cpp -#, fuzzy +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" -msgstr "Intervallo di stampa del profilamento" +msgstr "Intervallo di stampa dei dati del motore di profilazione" #: src/settings_translation_file.cpp msgid "Entity methods" -msgstr "" +msgstr "Sistemi di entità " #: src/settings_translation_file.cpp msgid "" @@ -2076,7 +2392,12 @@ msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Fall bobbing factor" msgstr "Ondeggiamento in caduta" #: src/settings_translation_file.cpp @@ -2124,22 +2445,20 @@ msgid "Field of view" msgstr "Campo visivo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Field of view for zoom" -msgstr "Campo visivo" +msgstr "Campo visivo per lo zoom" #: src/settings_translation_file.cpp msgid "Field of view in degrees." msgstr "Campo visivo in gradi." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Field of view while zooming in degrees.\n" "This requires the \"zoom\" privilege on the server." msgstr "" -"Movimento veloce (tramite il tasto usare).\n" -"Ciò richiede il privilegio \"fast\" sul server." +"Campo visivo in gradi durante lo zoom.\n" +"Ciò richiede il privilegio \"zoom\" sul server." #: src/settings_translation_file.cpp msgid "" @@ -2154,6 +2473,11 @@ msgid "Filler Depth" msgstr "Profondità dello riempitore" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Filler depth noise" +msgstr "Profondità dello riempitore" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "Mappatura del tono filmico" @@ -2177,10 +2501,35 @@ msgid "Filtering" msgstr "Filtraggio" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "Seme fisso della mappa" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Floatland level" +msgstr "Livello dell'acqua" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Tasto di volo" @@ -2193,6 +2542,10 @@ msgid "Fog" msgstr "Nebbia" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Tasto di attivazione della nebbia" @@ -2230,6 +2583,14 @@ msgid "Forward key" msgstr "Tasto avanti" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "Font freetype" @@ -2293,7 +2654,7 @@ msgstr "Generare le normalmap" #: src/settings_translation_file.cpp msgid "Global callbacks" -msgstr "" +msgstr "Callback globali" #: src/settings_translation_file.cpp #, fuzzy @@ -2326,10 +2687,19 @@ msgid "Gravity" msgstr "Gravità " #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "Livello del terreno del Generatore mappa piatto" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "Mod. HTTP" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Tasto di attivazione dello HUD" @@ -2358,22 +2728,60 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat blend noise" +msgstr "Param. del gen. mappa di miscelazione del 'rumore' del calore" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "'Rumore' n°1 della caverna" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "Componente dell'altezza della dimensione della finestra iniziale." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Super destro" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "Altezza alla quale appaiono le nuvole." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height select noise" +msgstr "Gen. mappa v. 6, parametri del 'rumore' della selezione di altezza" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "FPU ad alta precisione" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Ripidità delle colline del Generatore mappa piatto" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Limite delle colline del Generatore mappa piatto" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Sito del server, da mostrare nell'elenco dei server." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Quale profondità di creazione dei fiumi" @@ -2400,6 +2808,18 @@ msgid "How wide to make rivers" msgstr "Larghezza di creazione dei fiumi" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2430,6 +2850,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2473,6 +2902,11 @@ msgstr "" "Se abilitata, i nuovi giocatori non possono unirsi con una password vuota." #: src/settings_translation_file.cpp +#, fuzzy +msgid "If enabled, show the server status message on player connection." +msgstr "Messaggio del giorno mostrato ai giocatori che si connettono." + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2506,6 +2940,18 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Colore in gioco dello sfondo della console dei messaggi (R,G,B)." #: src/settings_translation_file.cpp +#, fuzzy +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" +"Trasparenza in gioco dello sfondo della console dei messaggi (opacità , tra 0 " +"e 255)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Tasto della console" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2550,6 +2996,11 @@ msgid "Interval of sending time of day to clients." msgstr "Intervallo di invio ai client dell'ora del giorno." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Tasto dell'inventario" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "Animazioni degli oggetti dell'inventario" @@ -2570,6 +3021,10 @@ msgid "Item entity TTL" msgstr "Entità TTL (tempo di vita) oggetto" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." @@ -2578,6 +3033,14 @@ msgstr "" "Controlla l'ammontare del dettaglio fine." #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Joystick button repetition interval" msgstr "Intervallo di ripetizione del click destro" @@ -2630,6 +3093,22 @@ msgstr "" "Spazia pressapoco tra -2 e 2." #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Tasto di salto" @@ -2648,6 +3127,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tasto per ridurre il raggio visivo.\n" +"Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2668,6 +3158,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tasto per aumentare il raggio visivo.\n" +"Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2728,6 +3229,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tasto per saltare.\n" +"Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2748,6 +3260,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tasto per aprire la finestra dei messaggi per scrivere comandi.\n" +"Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2778,6 +3301,28 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tasto per aprire l'inventario.\n" +"Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tasto per aprire l'inventario.\n" +"Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " @@ -2926,6 +3471,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tasto per attivare la visualizzazione della messaggistica.\n" +"Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2947,10 +3503,31 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tasto per saltare.\n" +"Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "Tasto \"Usare\" per arrampicarsi/scendere" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Ripidità dei laghi del Generatore mappa piatto" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Limite dei laghi del Generatore mappa piatto" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "Lingua" @@ -2959,6 +3536,11 @@ msgid "Large cave depth" msgstr "Profondità delle caverne grandi" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Tasto della console" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "Caratteristiche della lava" @@ -3028,6 +3610,13 @@ msgstr "Limite di code 'emerge' da generare" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -3108,6 +3697,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "Fa lavorare DirectX con LuaJIT. Disabilitare se causa problemi." #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "Cartella della mappa" @@ -3158,9 +3751,25 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Attributi di generazione della mappa specifici per Generatore mappa v. 7.\n" +"'ridges' sono i fiumi.\n" +"Le impostazioni che non sono specificate nella stringa mantengono i valori " +"predefiniti.\n" +"Le impostazioni che iniziano con \"no\" sono usate per disabilitarle " +"esplicitamente." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3180,7 +3789,8 @@ msgstr "" #, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3205,24 +3815,21 @@ msgid "Mapblock limit" msgstr "Limite del blocco mappa" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "Tempo di scad. dello scaric. del blocco mappa" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Generatore mappa valli" +#, fuzzy +msgid "Mapblock mesh generation delay" +msgstr "Limite di generazione della mappa" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "Param. del gen. mappa del 'rumore' del calore del bioma" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "Param. del gen. mappa di misc. del 'rumore' dell'umidità del bioma" +msgid "Mapblock unload timeout" +msgstr "Tempo di scad. dello scaric. del blocco mappa" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "Param. del gen. mappa del 'rumore' dell'umidità del bioma" +msgid "Mapgen Valleys" +msgstr "Generatore mappa valli" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3237,120 +3844,15 @@ msgid "Mapgen flat" msgstr "Generatore mappa piatto" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Larghezza delle caverne del Generatore mappa piatto" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "Gen. mappa piatto, parametri del 1° 'rumore' delle caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "Gen. mappa piatto, parametri del 2° 'rumore' delle caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" -"Gen. mappa piatto, parametri del 'rumore' dello riempitore di profondità " - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" +#, fuzzy +msgid "Mapgen flat specific flags" msgstr "Impostazioni del Generatore mappa piatto" #: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "Livello del terreno del Generatore mappa piatto" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "Ripidità delle colline del Generatore mappa piatto" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "Limite delle colline del Generatore mappa piatto" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "Ripidità dei laghi del Generatore mappa piatto" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "Limite dei laghi del Generatore mappa piatto" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "Profondità delle caverne grandi del Generatore mappa piatto" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "Parametri del 'rumore' del terreno del Generatore mappa piatto" - -#: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "Generatore mappa frattale" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "Gen. mappa frattale, larghezza caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "Gen. mappa frattale, parametri del 1° 'rumore' delle caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "Gen. mappa frattale, parametri del 2° 'rumore' delle caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" -"Gen. mappa frattale, parametri del 'rumore' dello riempitore di profondità " - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "Frattale del Generatore mappa frattale" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "Iterazioni del Generatore mappa frattale" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "Gen. mappa frattale, julia w" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "Gen. mappa frattale, julia x" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "Gen. mappa frattale, julia y" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "Gen. mappa frattale, julia z" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "Compensazione del Generatore mappa frattale" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "Scala del Generatore mappa frattale" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "Param. del 'rumore' del fondale marino del Gen. mappa frattale" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "Gen. mappa frattale, fetta w" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "Param. del gen. mappa di miscelazione del 'rumore' del calore" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Nome del gen. mappa" @@ -3359,146 +3861,29 @@ msgid "Mapgen v5" msgstr "Generatore mappa v. 5." #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "Gen. mappa v. 5, larghezza caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "Gen. mappa v. 5, parametri del 1° 'rumore' delle caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "Gen. mappa v. 5, parametri del 2° 'rumore' delle caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "Gen. mappa v. 5, parametri del 'rumore' di fabbrica" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "Gen. mappa v. 5, parametri del 'rumore' dello riempitore di profondità " - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "Gen. mappa v. 5, parametri 'rumore' dell'altezza" +#, fuzzy +msgid "Mapgen v5 specific flags" +msgstr "Impostazioni del Generatore mappa v. 6" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "Generatore mappa v. 6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "Gen. mappa v. 6, parametri del 'rumore' degli alberi" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "Gen. mappa v. 6, frequenza della spiaggia" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "Gen. mappa v. 6, parametri del 'rumore' della spiaggia" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "Gen. mappa v. 6, parametri del 'rumore' del bioma" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "Gen. mappa v. 6, parametri del 'rumore' delle caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "Gen. mappa v. 6, frequenza del deserto" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" +#, fuzzy +msgid "Mapgen v6 specific flags" msgstr "Impostazioni del Generatore mappa v. 6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "Gen. mappa v. 6, parametri del 'rumore' della selezione di altezza" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "Gen. mappa v. 6, parametri del 'rumore' dell'umidità " - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "Gen. mappa v. 6, parametri del 'rumore' del fango" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "Gen. mappa v. 6, parametri del 'rumore' della ripidità " - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "Gen. mappa v. 6, parametri del 'rumore' di altitudine del terreno" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "Gen. mappa v. 6, parametri del 'rumore' di base del terreno" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "Gen. mappa v. 6, parametri del 'rumore' degli alberi" - -#: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "Gen. mappa v. 7, parametri del 'rumore'" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "Gen. mappa v. 7, larghezza delle caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "Gen. mappa v. 7, parametri del 1° 'rumore' delle caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "Gen. mappa v. 7, parametri del 2° 'rumore' delle caverne" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "Gen. mappa v. 7, param. del 'rumore' dello riempitore di profondità " - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" +#, fuzzy +msgid "Mapgen v7 specific flags" msgstr "Impostazioni del Generatore mappa v. 7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "Gen. mappa v. 7, param. del 'rumore' della selezione di altezza" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "Gen. mappa v. 7, param. del 'rumore' di altezza delle montagne" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "Gen. mappa v. 7, param. del 'rumore' delle montagne" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "Gen. mappa v. 7, param. del 'rumore' dei fiumi" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "Gen. mappa v. 7, param. del 'rumore' dell'acqua dei fiumi" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "Gen. mappa v. 7, param. del 'rumore' di altitudine del terreno" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "Gen. mappa v. 7, param. del 'rumore' di base del terreno" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "Gen. mappa v. 7, param. del \"rumore\" di continuità del terreno" - -#: src/settings_translation_file.cpp msgid "Massive cave depth" msgstr "Profondità delle caverne imponenti" @@ -3686,6 +4071,10 @@ msgid "Mipmapping" msgstr "Mipmapping" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "URL dei dettagli del deposito mod." @@ -3706,6 +4095,15 @@ msgid "Monospace font size" msgstr "Dimensione del font a spaziatura fissa" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mountain height noise" +msgstr "Gen. mappa v. 7, param. del 'rumore' di altezza delle montagne" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "Sensibilità del mouse" @@ -3714,6 +4112,10 @@ msgid "Mouse sensitivity multiplier." msgstr "Moltiplicatore della sensibilità del mouse." #: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." @@ -3722,12 +4124,9 @@ msgstr "" "Per esempio: 0 per nessun ondeggiamento visivo; 1.0 normale; 2.0 doppio." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" -"Moltiplicatore per l'ondeggiamento visivo.\n" -"Per esempio: 0 per nessun ondeggiamento visivo; 1.0 normale; 2.0 doppio." +#, fuzzy +msgid "Mute key" +msgstr "Tasto 'usare'" #: src/settings_translation_file.cpp msgid "" @@ -3788,12 +4187,6 @@ msgid "NodeTimer interval" msgstr "Intervallo del Temporizzatore nodo" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" -"Parametri di 'rumore' per l'API di temperatura del bioma, umidità e fusione " -"di bioma." - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "Rumori" @@ -3839,6 +4232,14 @@ msgid "Number of parallax occlusion iterations." msgstr "Numero di iterazioni di occlusione di parallasse." #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" "Deviazione complessiva dell'effetto di occlusione di parallasse, solitamente " @@ -3881,6 +4282,12 @@ msgid "Path to save screenshots at." msgstr "Percorso dove salvare le istantanee." #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" "Percorso della cartella immagini. Tutte le immagini vengono cercate a " @@ -3992,6 +4399,15 @@ msgid "Report path" msgstr "Percorso del font" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ridge noise" +msgstr "'Rumore' dei fiumi" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Tasto destro" @@ -4024,6 +4440,10 @@ msgid "Round minimap" msgstr "Minimappa rotonda" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "Salvare su disco la mappa ricevuta dal client." @@ -4032,6 +4452,10 @@ msgid "Saving map received from server" msgstr "Salvataggio della mappa ricevuta dal server" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -4081,6 +4505,15 @@ msgstr "" "Usate 0 per la qualità predefinita." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "'Rumore' n°1 della caverna" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "Sicurezza" @@ -4125,6 +4558,10 @@ msgid "Server port" msgstr "Porta del server" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL dell'elenco dei server" @@ -4166,16 +4603,26 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Shader path" +msgstr "Shader" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" "Gli shader permettono effetti visivi avanzati e potrebbero aumentare il " "rendimento su certe\n" "schede video. Funzionano solo col supporto OpenGL." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow limit" +msgstr "Limite del blocco mappa" + +#: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." msgstr "Forma del minimap. Abilitata = rotonda, disabilitata = quadrata." @@ -4200,10 +4647,29 @@ msgstr "" "espressa in blocchi mappa (16 nodi)." #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "Pendenza e riempimento lavorano assieme per modificare le altezze" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "Illuminazione uniforme" @@ -4252,6 +4718,14 @@ msgid "Static spawnpoint" msgstr "Punto stabile di comparsa" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "Intensità delle normalmap generate." @@ -4272,10 +4746,33 @@ msgid "Synchronous SQLite" msgstr "SQLite simultaneo" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "Altezza terreno" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain base noise" +msgstr "Altezza terreno" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain higher noise" +msgstr "Altezza terreno" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain noise" +msgstr "Altezza terreno" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4296,6 +4793,10 @@ msgstr "" "Sistemare verso 0.0 per una porzione più ampia." #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "Percorso delle immagini" @@ -4315,8 +4816,11 @@ msgstr "La profondità della terra o altri riempitori" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -4387,6 +4891,10 @@ msgstr "" "pulsante mouse destro." #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "Questo font sarà usato per certe lingue." @@ -4438,6 +4946,10 @@ msgid "Tooltip delay" msgstr "Ritardo dei suggerimenti" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Filtro trilineare" @@ -4456,10 +4968,28 @@ msgid "Trusted mods" msgstr "Mod. fidati" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "URL dell'elenco server mostrato nella linguetta Giocatori multipli." #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "Distanza di trasferimento illimitata" @@ -4527,6 +5057,43 @@ msgid "Valleys C Flags" msgstr "Impostazioni C delle valli" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "Controlla la ripidità /altezza delle colline." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "Sincronizzazione verticale dello schermo." @@ -4535,13 +5102,13 @@ msgid "Video driver" msgstr "Driver video" #: src/settings_translation_file.cpp -msgid "View bobbing" +#, fuzzy +msgid "View bobbing factor" msgstr "Ondeggiamento visuale" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +#, fuzzy +msgid "View distance in nodes." msgstr "" "Distanza visiva in nodi.\n" "Min = 20" @@ -4555,6 +5122,10 @@ msgid "View range increase key" msgstr "Tasto di aumento del raggio visivo" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "Raggio visivo" @@ -4665,23 +5236,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" -"Dove si ferma il generatore mappa.\n" -"Si noti prego:\n" -"- Limitato a 31.000 (impostazioni superiori non hanno effetto)\n" -"- Il generatore mappa lavora in gruppi di 80x80x80 nodi (5x5x5 nodi " -"mappa).\n" -"- Quei gruppi hanno una compensazione di -32, -32 nodi dall'origine.\n" -"- Solo i gruppi che rientrano nel map_generation_limit vengono generati." - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" "Se si usano font freetype, richiede la compilazione col supporto freetype." @@ -4748,6 +5302,13 @@ msgstr "Larghezza delle linee del riquadro di selezione attorno ai nodi." #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4763,6 +5324,43 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "Y del limite superiore delle caverne pseudocasuali grandi." #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "block send optimize distance" +msgstr "Distanza massima di invio dei blocchi" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "Tempo di scadenza cURL dello scaricamento dei file" @@ -4774,6 +5372,246 @@ msgstr "Limite cURL parallelo" msgid "cURL timeout" msgstr "Tempo di scadenza cURL" +#~ msgid "Hide mp content" +#~ msgstr "Nascondi contenuto dei pacchetti" + +#~ msgid "Start Game" +#~ msgstr "Avviare il gioco" + +#~ msgid "Attn" +#~ msgstr "Attenzione" + +#~ msgid "Capital" +#~ msgstr "Bloc maiusc" + +#~ msgid "Comma" +#~ msgstr "Virgola" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Finale" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "ì" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Meno" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Punto" + +#~ msgid "Plus" +#~ msgstr "Più" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Controlla la dimensione di spiagge e deserti nel Generatore mappa v.6.\n" +#~ "Quando sono attivati i biomi di neve 'mgv6_freq_desert' viene ignorato." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Stabilisce la forma del terreno.\n" +#~ "I tre numeri tra parentesi controllano la scala del\n" +#~ "terreno, i tre numeri dovrebbero essere identici." + +#~ msgid "Mapgen biome heat noise parameters" +#~ msgstr "Param. del gen. mappa del 'rumore' del calore del bioma" + +#~ msgid "Mapgen biome humidity blend noise parameters" +#~ msgstr "Param. del gen. mappa di misc. del 'rumore' dell'umidità del bioma" + +#~ msgid "Mapgen biome humidity noise parameters" +#~ msgstr "Param. del gen. mappa del 'rumore' dell'umidità del bioma" + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Larghezza delle caverne del Generatore mappa piatto" + +#~ msgid "Mapgen flat cave1 noise parameters" +#~ msgstr "Gen. mappa piatto, parametri del 1° 'rumore' delle caverne" + +#~ msgid "Mapgen flat cave2 noise parameters" +#~ msgstr "Gen. mappa piatto, parametri del 2° 'rumore' delle caverne" + +#~ msgid "Mapgen flat filler depth noise parameters" +#~ msgstr "" +#~ "Gen. mappa piatto, parametri del 'rumore' dello riempitore di profondità " + +#~ msgid "Mapgen flat large cave depth" +#~ msgstr "Profondità delle caverne grandi del Generatore mappa piatto" + +#~ msgid "Mapgen flat terrain noise parameters" +#~ msgstr "Parametri del 'rumore' del terreno del Generatore mappa piatto" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Gen. mappa frattale, larghezza caverne" + +#~ msgid "Mapgen fractal cave1 noise parameters" +#~ msgstr "Gen. mappa frattale, parametri del 1° 'rumore' delle caverne" + +#~ msgid "Mapgen fractal cave2 noise parameters" +#~ msgstr "Gen. mappa frattale, parametri del 2° 'rumore' delle caverne" + +#~ msgid "Mapgen fractal filler depth noise parameters" +#~ msgstr "" +#~ "Gen. mappa frattale, parametri del 'rumore' dello riempitore di profondità " + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Frattale del Generatore mappa frattale" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Iterazioni del Generatore mappa frattale" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "Gen. mappa frattale, julia w" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "Gen. mappa frattale, julia x" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "Gen. mappa frattale, julia y" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "Gen. mappa frattale, julia z" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "Compensazione del Generatore mappa frattale" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Scala del Generatore mappa frattale" + +#~ msgid "Mapgen fractal seabed noise parameters" +#~ msgstr "Param. del 'rumore' del fondale marino del Gen. mappa frattale" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Gen. mappa frattale, fetta w" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Gen. mappa v. 5, larghezza caverne" + +#~ msgid "Mapgen v5 cave1 noise parameters" +#~ msgstr "Gen. mappa v. 5, parametri del 1° 'rumore' delle caverne" + +#~ msgid "Mapgen v5 cave2 noise parameters" +#~ msgstr "Gen. mappa v. 5, parametri del 2° 'rumore' delle caverne" + +#~ msgid "Mapgen v5 factor noise parameters" +#~ msgstr "Gen. mappa v. 5, parametri del 'rumore' di fabbrica" + +#~ msgid "Mapgen v5 filler depth noise parameters" +#~ msgstr "" +#~ "Gen. mappa v. 5, parametri del 'rumore' dello riempitore di profondità " + +#~ msgid "Mapgen v5 height noise parameters" +#~ msgstr "Gen. mappa v. 5, parametri 'rumore' dell'altezza" + +#~ msgid "Mapgen v6 apple trees noise parameters" +#~ msgstr "Gen. mappa v. 6, parametri del 'rumore' degli alberi" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "Gen. mappa v. 6, frequenza della spiaggia" + +#~ msgid "Mapgen v6 beach noise parameters" +#~ msgstr "Gen. mappa v. 6, parametri del 'rumore' della spiaggia" + +#~ msgid "Mapgen v6 biome noise parameters" +#~ msgstr "Gen. mappa v. 6, parametri del 'rumore' del bioma" + +#~ msgid "Mapgen v6 cave noise parameters" +#~ msgstr "Gen. mappa v. 6, parametri del 'rumore' delle caverne" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "Gen. mappa v. 6, frequenza del deserto" + +#~ msgid "Mapgen v6 mud noise parameters" +#~ msgstr "Gen. mappa v. 6, parametri del 'rumore' del fango" + +#~ msgid "Mapgen v6 steepness noise parameters" +#~ msgstr "Gen. mappa v. 6, parametri del 'rumore' della ripidità " + +#~ msgid "Mapgen v6 terrain altitude noise parameters" +#~ msgstr "Gen. mappa v. 6, parametri del 'rumore' di altitudine del terreno" + +#~ msgid "Mapgen v6 terrain base noise parameters" +#~ msgstr "Gen. mappa v. 6, parametri del 'rumore' di base del terreno" + +#~ msgid "Mapgen v6 trees noise parameters" +#~ msgstr "Gen. mappa v. 6, parametri del 'rumore' degli alberi" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Gen. mappa v. 7, larghezza delle caverne" + +#~ msgid "Mapgen v7 cave1 noise parameters" +#~ msgstr "Gen. mappa v. 7, parametri del 1° 'rumore' delle caverne" + +#~ msgid "Mapgen v7 cave2 noise parameters" +#~ msgstr "Gen. mappa v. 7, parametri del 2° 'rumore' delle caverne" + +#~ msgid "Mapgen v7 filler depth noise parameters" +#~ msgstr "Gen. mappa v. 7, param. del 'rumore' dello riempitore di profondità " + +#~ msgid "Mapgen v7 height select noise parameters" +#~ msgstr "Gen. mappa v. 7, param. del 'rumore' della selezione di altezza" + +#~ msgid "Mapgen v7 mountain noise parameters" +#~ msgstr "Gen. mappa v. 7, param. del 'rumore' delle montagne" + +#~ msgid "Mapgen v7 ridge noise parameters" +#~ msgstr "Gen. mappa v. 7, param. del 'rumore' dei fiumi" + +#~ msgid "Mapgen v7 ridge water noise parameters" +#~ msgstr "Gen. mappa v. 7, param. del 'rumore' dell'acqua dei fiumi" + +#~ msgid "Mapgen v7 terrain altitude noise parameters" +#~ msgstr "Gen. mappa v. 7, param. del 'rumore' di altitudine del terreno" + +#~ msgid "Mapgen v7 terrain base noise parameters" +#~ msgstr "Gen. mappa v. 7, param. del 'rumore' di base del terreno" + +#~ msgid "Mapgen v7 terrain persistation noise parameters" +#~ msgstr "Gen. mappa v. 7, param. del \"rumore\" di continuità del terreno" + +#~ msgid "" +#~ "Noise parameters for biome API temperature, humidity and biome blend." +#~ msgstr "" +#~ "Parametri di 'rumore' per l'API di temperatura del bioma, umidità e " +#~ "fusione di bioma." + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "Dove si ferma il generatore mappa.\n" +#~ "Si noti prego:\n" +#~ "- Limitato a 31.000 (impostazioni superiori non hanno effetto)\n" +#~ "- Il generatore mappa lavora in gruppi di 80x80x80 nodi (5x5x5 nodi " +#~ "mappa).\n" +#~ "- Quei gruppi hanno una compensazione di -32, -32 nodi dall'origine.\n" +#~ "- Solo i gruppi che rientrano nel map_generation_limit vengono generati." + #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "" #~ "Dati di profilo del mod. dettagliati. Utile per gli sviluppatori di mod." @@ -4835,9 +5673,6 @@ msgstr "Tempo di scadenza cURL" #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "Riavviare minetest per rendere effettive le modifiche" -#~ msgid "Game Name" -#~ msgstr "Nome del gioco" - #~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\"" #~ msgstr "Gestore del gioco: impossibile il modulo \"$1\" nel gioco \"$2\"" @@ -4892,9 +5727,6 @@ msgstr "Tempo di scadenza cURL" #~ msgid "Add mod:" #~ msgstr "Aggiungere un modulo:" -#~ msgid "Local install" -#~ msgstr "Installazione locale" - #~ msgid "Wanted FPS" #~ msgstr "FPS desiderati" diff --git a/po/ja/minetest.po b/po/ja/minetest.po index f26036749..fbb581cca 100644 --- a/po/ja/minetest.po +++ b/po/ja/minetest.po @@ -2,17 +2,25 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-11-16 13:08+0000\n" -"Last-Translator: Rui <rui.minetest@gmail.com>\n" -"Language-Team: Japanese <https://hosted.weblate.org/projects/minetest/" -"minetest/ja/>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-05-29 12:33+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" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.10-dev\n" +"X-Generator: Weblate 2.14.1\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "リスãƒãƒ¼ãƒ³" + +#: builtin/client/init.lua +msgid "You died." +msgstr "ã‚ãªãŸã¯æ»ã«ã¾ã—ãŸã€‚" #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -70,17 +78,21 @@ msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³$1ã‹ã‚‰$2ã¾ã§ã®ãƒ—ãƒãƒˆã‚³ãƒ«ã‚’サãƒãƒ¼ãƒˆã—ã¦ã #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "ã‚ャンセル" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" -msgstr "ä¾å˜Mod:" +msgid "Dependencies:" +msgstr "ä¾å˜:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable MP" -msgstr "Modパックを無効化" +msgstr "Modパック無効化" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "å…¨ã¦ç„¡åŠ¹åŒ–" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" @@ -99,16 +111,12 @@ msgstr "" "æ–‡å—ã¯[a-z0-9_]ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚" #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "ゲームをéžè¡¨ç¤º" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Modパックã®å†…容をéžè¡¨ç¤º" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" -msgstr "Modå:" +msgstr "Mod:" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "ä»»æ„:" #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp @@ -173,8 +181,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "本当ã«ã€Œ$1ã€ã‚’削除ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "削除" @@ -190,7 +197,7 @@ msgstr "Modマãƒãƒ¼ã‚¸ãƒ£: Mod「$1ã€ã®å ´æ‰€ãŒç„¡åйã§ã™" msgid "Delete World \"$1\"?" msgstr "ワールド「$1ã€ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "決定" @@ -273,6 +280,11 @@ msgstr "å¯èƒ½ãªå€¤: " msgid "Restore Default" msgstr "åˆæœŸè¨å®šã«æˆ»ã™" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "検索" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "å ´æ‰€ã‚’é¸æŠž" @@ -282,11 +294,11 @@ msgid "Show technical names" msgstr "パラメータåを表示" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +msgid "The value must be at least $1." msgstr "値ã¯$1より大ãããªã‘れã°ãªã‚Šã¾ã›ã‚“。" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +msgid "The value must not be larger than $1." msgstr "値ã¯$1よりå°ã•ããªã‘れã°ãªã‚Šã¾ã›ã‚“。" #: builtin/mainmenu/modmgr.lua @@ -313,6 +325,10 @@ msgstr "Modインストール: $1ã®æ£ã—ã„ModåãŒä¸æ˜Žã§ã™" msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "Modインストール: Modパック$1ã«é©ã—ãŸãƒ•ォルダåãŒä¸æ˜Žã§ã™" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "サブゲームã®Mod" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "ストアを閉ã˜ã‚‹" @@ -334,10 +350,6 @@ msgid "Rating" msgstr "評価" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "検索" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "çœç•¥å:" @@ -373,6 +385,66 @@ msgstr "以å‰ã®è²¢çŒ®è€…" msgid "Previous Core Developers" msgstr "以å‰ã®é–‹ç™ºè€…" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "公開サーãƒ" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "ãƒã‚¤ãƒ³ãƒ‰ã‚¢ãƒ‰ãƒ¬ã‚¹" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "è¨å®š" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "クリエイティブモード" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "ダメージ有効" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "ゲームホスト" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "ホストサーãƒ" + +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" +msgstr "ãƒãƒ¼ã‚«ãƒ«ã‚²ãƒ¼ãƒ " + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "åå‰ã¨ãƒ‘スワード" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "作æˆ" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "ワールドãŒä½œæˆã¾ãŸã¯é¸æŠžã•れã¦ã„ã¾ã›ã‚“ï¼" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "ゲームプレイ" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "ãƒãƒ¼ãƒˆ" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’é¸æŠž:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "サーãƒã®ãƒãƒ¼ãƒˆ" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "インストール済ã¿ã®Mod:" @@ -382,6 +454,10 @@ msgid "Mod information:" msgstr "Modã®æƒ…å ±:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "ä¾å˜ãªã—。" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Modã®èª¬æ˜ŽãŒã‚りã¾ã›ã‚“" @@ -401,95 +477,45 @@ msgstr "é¸æŠžã—ãŸModを削除" msgid "Uninstall selected modpack" msgstr "é¸æŠžã—ãŸModパックを削除" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "アドレスã¨ãƒãƒ¼ãƒˆ" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "クライアント" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "接続" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "クリエイティブモード" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "ダメージ有効" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "ãŠæ°—ã«å…¥ã‚Šã‚’削除" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "ãŠæ°—ã«å…¥ã‚Š" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "åå‰ã¨ãƒ‘スワード" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP有効" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "ãƒã‚¤ãƒ³ãƒ‰ã‚¢ãƒ‰ãƒ¬ã‚¹" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "è¨å®š" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "クリエイティブモード" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "ダメージ有効" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "åå‰ã¨ãƒ‘スワード" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "作æˆ" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "ワールドãŒä½œæˆã¾ãŸã¯é¸æŠžã•れã¦ã„ã¾ã›ã‚“ï¼" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "ãƒãƒ¼ãƒˆ" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "公開サーãƒ" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’é¸æŠž:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "サーãƒ" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "サーãƒã®ãƒãƒ¼ãƒˆ" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "オンラインプレイ" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "ゲームスタート" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP有効" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -520,6 +546,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "シングルプレイヤーã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’リセットã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "ç”»é¢ã®å¤§ãã•を自動ä¿å˜" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "ãƒã‚¤ãƒªãƒ‹ã‚¢ãƒ•ィルタ" @@ -596,6 +626,10 @@ msgid "Reset singleplayer world" msgstr "シングルプレイヤーã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’リセット" #: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "ç”»é¢:" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "è¨å®š" @@ -659,14 +693,6 @@ msgstr "メイン" msgid "Start Singleplayer" msgstr "シングルプレイ開始" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "プレイ" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "シングルプレイヤー" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "æƒ…å ±ãŒã‚りã¾ã›ã‚“" @@ -728,6 +754,10 @@ msgid "Player name too long." msgstr "プレイヤーåãŒé•·éŽãŽã¾ã™ã€‚" #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "ワールドãŒå˜åœ¨ã—ã¾ã›ã‚“: " @@ -744,6 +774,38 @@ msgstr "" "詳細ã¯debug.txtを確èªã—ã¦ãã ã•ã„。" #: src/game.cpp +msgid "- Address: " +msgstr "- アドレス: " + +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "- クリエイティブモード: " + +#: src/game.cpp +msgid "- Damage: " +msgstr "- ダメージ: " + +#: src/game.cpp +msgid "- Mode: " +msgstr "- モード: " + +#: src/game.cpp +msgid "- Port: " +msgstr "- ãƒãƒ¼ãƒˆ: " + +#: src/game.cpp +msgid "- Public: " +msgstr "- 公開サーãƒ: " + +#: src/game.cpp +msgid "- PvP: " +msgstr "- PvP: " + +#: src/game.cpp +msgid "- Server Name: " +msgstr "- サーãƒå: " + +#: src/game.cpp msgid "Change Keys" msgstr "ã‚ー変更" @@ -760,38 +822,45 @@ msgid "Continue" msgstr "å†é–‹" #: src/game.cpp -msgid "Creating client..." -msgstr "クライアントを作æˆä¸..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "サーãƒã‚’作æˆä¸..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" -msgstr "" -"ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ“作:\n" -"- WASD: 移動\n" -"- スペース: ジャンプ/登る\n" -"- Shift: スニーク/é™ã‚Šã‚‹\n" -"- Q: アイテムをè½ã¨ã™\n" -"- I: インベントリ\n" +"- %s: chat\n" +msgstr "" +"æ“作:\n" +"- %s: å‰é€²\n" +"- %s: 後退\n" +"- %s: å·¦\n" +"- %s: å³\n" +"- %s: ジャンプ/登る\n" +"- %s: スニーク/é™ã‚Šã‚‹\n" +"- %s: アイテムをè½ã¨ã™\n" +"- %s: インベントリ\n" "- マウス: 見回ã™\n" "- 左クリック: ç ´å£Š/パンãƒ\n" "- å³ã‚¯ãƒªãƒƒã‚¯: è¨ç½®/使用\n" -"- マウスホイール: ã‚¢ã‚¤ãƒ†ãƒ é¸æŠž\n" -"- T: ãƒãƒ£ãƒƒãƒˆ\n" +"- ホイール: ã‚¢ã‚¤ãƒ†ãƒ é¸æŠž\n" +"- %s: ãƒãƒ£ãƒƒãƒˆ\n" + +#: src/game.cpp +msgid "Creating client..." +msgstr "クライアントを作æˆä¸..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "サーãƒã‚’作æˆä¸..." #: src/game.cpp msgid "" @@ -830,6 +899,18 @@ msgid "Exit to OS" msgstr "終了" #: src/game.cpp +msgid "Game info:" +msgstr "ã‚²ãƒ¼ãƒ æƒ…å ±:" + +#: src/game.cpp +msgid "Game paused" +msgstr "ãƒãƒ¼ã‚ºãƒ¡ãƒ‹ãƒ¥ãƒ¼" + +#: src/game.cpp +msgid "Hosting server" +msgstr "ホスティングサーãƒ" + +#: src/game.cpp msgid "Item definitions..." msgstr "アイテムを定義ä¸..." @@ -850,24 +931,48 @@ msgid "Node definitions..." msgstr "ノードを定義ä¸..." #: src/game.cpp -msgid "Resolving address..." -msgstr "アドレスを解決ä¸..." +msgid "Off" +msgstr "オフ" #: src/game.cpp -msgid "Respawn" -msgstr "リスãƒãƒ¼ãƒ³" +msgid "On" +msgstr "オン" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "サーãƒã‚’公開" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "アドレスを解決ä¸..." #: src/game.cpp msgid "Shutting down..." msgstr "終了ä¸..." #: src/game.cpp +msgid "Singleplayer" +msgstr "シングルプレイヤー" + +#: src/game.cpp msgid "Sound Volume" msgstr "音é‡" #: src/game.cpp -msgid "You died." -msgstr "ã‚ãªãŸã¯æ»ã«ã¾ã—ãŸã€‚" +#, c-format, fuzzy +msgid "Volume changed to %d%%" +msgstr "音é‡ã‚’ %d%% ã«å¤‰æ›´" + +#: src/game.cpp +#, fuzzy +msgid "Volume changed to 0%" +msgstr "音é‡ã‚’ 0% ã«å¤‰æ›´" + +#: src/game.cpp +#, fuzzy +msgid "Volume changed to 100%" +msgstr "音é‡ã‚’ 100% ã«å¤‰æ›´" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -902,6 +1007,10 @@ msgid "Console" msgstr "コンソール" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "音é‡ã‚’下ã’ã‚‹" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "「ジャンプã€ã®äºŒåº¦æŠ¼ã—ã§é£›è¡Œãƒ¢ãƒ¼ãƒ‰ã‚’切り替ãˆ" @@ -914,6 +1023,10 @@ msgid "Forward" msgstr "å‰é€²" #: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "音é‡ã‚’上ã’ã‚‹" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "インベントリ" @@ -935,6 +1048,22 @@ msgstr "" msgid "Left" msgstr "å·¦" +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "ãƒãƒ¼ã‚«ãƒ«ã‚³ãƒžãƒ³ãƒ‰" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "消音" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "次ã®ã‚¢ã‚¤ãƒ†ãƒ " + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "å‰ã®ã‚¢ã‚¤ãƒ†ãƒ " + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "スタックã®å‡ºåŠ›" @@ -952,24 +1081,20 @@ msgid "Sneak" msgstr "スニーク" #: src/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle Cinematic" -msgstr "æ˜ ç”»é¢¨ã‚«ãƒ¡ãƒ©" +msgstr "æ˜ ç”»é¢¨ãƒ¢ãƒ¼ãƒ‰åˆ‡æ›¿" #: src/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle fast" -msgstr "高速移動モード" +msgstr "高速移動モード切替" #: src/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle fly" -msgstr "飛行モード" +msgstr "飛行モード切替" #: src/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle noclip" -msgstr "ã™ã‚ŠæŠœã‘モード" +msgstr "ã™ã‚ŠæŠœã‘モード切替" #: src/guiKeyChangeMenu.cpp msgid "Use" @@ -980,7 +1105,6 @@ msgid "Zoom" msgstr "ズーム" #: src/guiKeyChangeMenu.cpp -#, fuzzy msgid "press key" msgstr "ã‚ー入力待ã¡" @@ -1017,38 +1141,22 @@ msgid "Apps" msgstr "アプリケーション" #: src/keycode.cpp -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" msgstr "Back" #: src/keycode.cpp -msgid "Capital" -msgstr "Capital" +msgid "Caps Lock" +msgstr "Caps Lock" #: src/keycode.cpp msgid "Clear" msgstr "Clear" #: src/keycode.cpp -msgid "Comma" -msgstr "カンマ" - -#: src/keycode.cpp msgid "Control" msgstr "Ctrl" #: src/keycode.cpp -msgid "Convert" -msgstr "変æ›" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Down" @@ -1057,26 +1165,15 @@ msgid "End" msgstr "End" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Erase OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Escape" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Execute" #: src/keycode.cpp -msgid "Final" -msgstr "Final" - -#: src/keycode.cpp msgid "Help" msgstr "Help" @@ -1085,20 +1182,31 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +#, fuzzy +msgid "IME Accept" +msgstr "決定" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Convert" +msgstr "変æ›" + +#: src/keycode.cpp +msgid "IME Escape" +msgstr "Escape" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Mode Change" +msgstr "モード変更" #: src/keycode.cpp -msgid "Kana" -msgstr "ã‹ãª" +msgid "IME Nonconvert" +msgstr "無変æ›" #: src/keycode.cpp -msgid "Kanji" -msgstr "æ¼¢å—" +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1129,22 +1237,10 @@ msgid "Middle Button" msgstr "ä¸ãƒœã‚¿ãƒ³" #: src/keycode.cpp -msgid "Minus" -msgstr "マイナス" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "モード変更" - -#: src/keycode.cpp msgid "Next" msgstr "PageDown" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "無変æ›" - -#: src/keycode.cpp msgid "Num Lock" msgstr "NumLock" @@ -1161,6 +1257,11 @@ msgid "Numpad -" msgstr "数値ã‚ーパッド -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "数値ã‚ーパッド *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "数値ã‚ーパッド /" @@ -1209,20 +1310,12 @@ msgid "OEM Clear" msgstr "OEM Clear" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pause" #: src/keycode.cpp -msgid "Period" -msgstr "ピリオド" - -#: src/keycode.cpp -msgid "Plus" -msgstr "プラス" +msgid "Play" +msgstr "プレイ" #: src/keycode.cpp msgid "Print" @@ -1329,6 +1422,20 @@ msgid "3D mode" msgstr "3Dモード" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1407,6 +1514,10 @@ msgstr "" "メインメニューã®ã‚¢ãƒ‰ãƒ¬ã‚¹æ¬„ã¯ã€ã“ã®è¨å®šã‚’上書ãã™ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1416,7 +1527,8 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "å…‰ã®ãƒ†ãƒ¼ãƒ–ルã®ã‚¬ãƒ³ãƒžè£œæ£ã‚’調整ã—ã¾ã™ã€‚数値ãŒä½Žããªã‚‹ã»ã©æ˜Žã‚‹ããªã‚Šã¾ã™ã€‚\n" @@ -1446,6 +1558,12 @@ msgid "Amplifies the valleys" msgstr "è°·ã®é«˜ä½Žå·®" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "異方性フィルタリング" @@ -1465,6 +1583,10 @@ msgstr "" "用ã—ã¦ãã ã•ã„。" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "ノードã«ãŠã‘るフラクタルã®ãŠãŠã‚ˆãã®(X,Y,Z)ã®å¤§ãã•。" @@ -1474,6 +1596,19 @@ msgid "Ask to reconnect after crash" msgstr "クラッシュ後ã«å†æŽ¥ç¶šã‚’促ã™" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Automaticaly report to the serverlist." msgstr "自動的ã«ã‚µãƒ¼ãƒä¸€è¦§ã«å ±å‘Šã—ã¾ã™ã€‚" @@ -1500,6 +1635,14 @@ msgid "Basic Privileges" msgstr "標準権é™" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "ãƒã‚¤ãƒªãƒ‹ã‚¢ãƒ•ィルタリング" @@ -1508,12 +1651,19 @@ msgid "Bind address" msgstr "ãƒã‚¤ãƒ³ãƒ‰ã‚¢ãƒ‰ãƒ¬ã‚¹" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "フルスクリーンモードã§ã®1ピクセル(色深度)ã‚ãŸã‚Šã®ãƒ“ット数。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Build inside player" msgstr "プレイヤーã®ä½ç½®ã«è¨ç½®" @@ -1526,12 +1676,10 @@ msgid "Bumpmapping" msgstr "ãƒãƒ³ãƒ—マッピング" #: src/settings_translation_file.cpp -#, fuzzy msgid "Camera smoothing" -msgstr "滑らã‹ãªã‚«ãƒ¡ãƒ©" +msgstr "ã‚«ãƒ¡ãƒ©ã®æ»‘らã‹ã•" #: src/settings_translation_file.cpp -#, fuzzy msgid "Camera smoothing in cinematic mode" msgstr "æ˜ ç”»é¢¨ãƒ¢ãƒ¼ãƒ‰ã§ã®ã‚«ãƒ¡ãƒ©ã®æ»‘らã‹ã•" @@ -1542,6 +1690,11 @@ msgstr "カメラ更新切り替ãˆã‚ー" #: src/settings_translation_file.cpp #, fuzzy +msgid "Cave noise" +msgstr "洞窟ノイズ#1" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Cave noise #1" msgstr "洞窟ノイズ#1" @@ -1556,6 +1709,35 @@ msgstr "洞窟ã®å¹…" #: src/settings_translation_file.cpp #, fuzzy +msgid "Cave1 noise" +msgstr "洞窟ノイズ#1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "洞窟ノイズ#1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "洞窟ã®å¹…" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "洞窟ノイズ#1" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "マップ生æˆãƒ•ラグ" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Caves and tunnels form at the intersection of the two noises" msgstr "洞窟やトンãƒãƒ«ã¯2ã¤ã®ãƒŽã‚¤ã‚ºã®äº¤å·®éƒ¨åˆ†ã«å½¢æˆã•れã¾ã™" @@ -1632,10 +1814,19 @@ msgid "Clean transparent textures" msgstr "テクスãƒãƒ£ã®é€éŽã‚’削除" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "クライアント" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "クライアントã¨ã‚µãƒ¼ãƒ" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "クライアント" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "上る速度" @@ -1693,7 +1884,7 @@ msgstr "ガラスを繋ã’ã‚‹" #: src/settings_translation_file.cpp msgid "Connect to external media server" -msgstr "外部メディアサーãƒã«æŽ¥ç¶šä¸" +msgstr "外部メディアサーãƒã«æŽ¥ç¶š" #: src/settings_translation_file.cpp #, fuzzy @@ -1709,6 +1900,11 @@ msgid "Console color" msgstr "コンソール色" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "コンソールã‚ー" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "コンソールã‚ー" @@ -1738,15 +1934,6 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"ç ‚æ¼ ã®è¦åˆ¶ã‚µã‚¤ã‚ºã¨Mapgen v6ã®ãƒ“ーãƒã€‚\n" -"snowbiomesãŒè¨±å¯ã•れるã¨ãã€ã€Žmgv6_freq_desertã€ã¯ç„¡è¦–ã•れã¾ã™ã€‚" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Controls steepness/depth of lake depressions." msgstr "湖底ã®é™ºã—ã•/æ·±ã•ã®è¨å®šã€‚" @@ -1756,10 +1943,16 @@ msgid "Controls steepness/height of hills." msgstr "丘ã®é™ºã—ã•/高ã•ã®è¨å®šã€‚" #: src/settings_translation_file.cpp -msgid "Controls width of tunnels, a smaller value creates wider tunnels." +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp +msgid "Controls width of tunnels, a smaller value creates wider tunnels." +msgstr "トンãƒãƒ«ã®å¹…を制御ã€å°ã•ã„æ–¹ã®å€¤ã»ã©åºƒã„トンãƒãƒ«ã‚’生æˆã—ã¾ã™ã€‚" + +#: src/settings_translation_file.cpp msgid "Crash message" msgstr "クラッシュメッセージ" @@ -1782,6 +1975,11 @@ msgstr "" "ã“れã«ã‚ˆã£ã¦æŽ¡æŽ˜ã‚’難ã—ãã§ãã¾ã™ã€‚ゼãƒã‚’指定ã™ã‚‹ã¨ç„¡åйã«ãªã‚Šã¾ã™ã€‚(0-10)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "作æˆ" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "照準ã®é€éŽåº¦" @@ -1821,6 +2019,10 @@ msgid "Debug log level" msgstr "デãƒãƒƒã‚°ãƒã‚°ã®ãƒ¬ãƒ™ãƒ«" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "音é‡ã‚’下ã’ã‚‹ã‚ー" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Dedicated server step" msgstr "サーãƒã®ã‚¹ãƒ†ãƒƒãƒ—" @@ -1865,6 +2067,41 @@ msgstr "" "cURLã§ç·¨é›†ã•れるãªã‚‰ã°ã€å½±éŸ¿ã‚’æŒã£ã¦ã„ã‚‹ã ã‘ã§ã™ã€‚" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "" "Defines sampling step of texture.\n" @@ -1879,6 +2116,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "ブãƒãƒƒã‚¯ï¼ˆ0無制é™ã®=)ã§ã€æœ€å¤§é™ã®ãƒ—レーヤー移転è·é›¢ã‚’定ã‚ã¾ã™ã€‚" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1915,20 +2162,24 @@ msgid "" msgstr "サーãƒã®èª¬æ˜Žã§ã™ã€‚プレイヤーãŒã‚µãƒ¼ãƒä¸€è¦§ã‹ã‚‰æŽ¥ç¶šã™ã‚‹éš›ã«è¡¨ç¤ºã•れã¾ã™ã€‚" #: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Desynchronize block animation" msgstr "ブãƒãƒƒã‚¯ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®éžåŒæœŸåŒ–" #: src/settings_translation_file.cpp #, fuzzy -msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." -msgstr "" -"地形形を決定ã—ã¾ã™ã€‚\n" -"ブラケットã®3番å·ã¯åœ°å½¢ã®ç›®ç››ã‚Šã‚’制御ã—ã¾ã™ã€\n" -"3番å·ã¯åŒä¸€ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" +msgid "Digging particles" +msgstr "パーティクル" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1977,6 +2228,12 @@ msgstr "マップ生æˆã®ãƒ‡ãƒãƒƒã‚°æƒ…å ±ã‚’å‡ºåŠ›ã—ã¾ã™ã€‚" #: src/settings_translation_file.cpp msgid "Enable Joysticks" +msgstr "ジョイスティックを有効化" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." msgstr "" #: src/settings_translation_file.cpp @@ -1984,6 +2241,14 @@ msgid "Enable VBO" msgstr "有効化" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "コンソールウィンドウを有効化" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Modã®ã‚»ã‚ュリティを有効化" @@ -2037,6 +2302,17 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Enable view bobbing" +msgstr "è½ä¸‹ã«ã‚ˆã‚‹ä¸Šä¸‹ã®æºã‚Œ" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2070,7 +2346,7 @@ msgstr "facedir回転ã™ã‚‹ãƒ¡ãƒƒã‚·ãƒ¥ã®ã‚ャッシングをå¯èƒ½ã«ã—ã¾ã #: src/settings_translation_file.cpp msgid "Enables filmic tone mapping" -msgstr "ミニマップを有効ã«ã™ã‚‹ã€‚" +msgstr "ミニマップを有効ã«ã™ã‚‹" #: src/settings_translation_file.cpp msgid "Enables minimap." @@ -2095,6 +2371,10 @@ msgstr "" "ã‚·ã‚§ãƒ¼ãƒ€ãƒ¼ãŒæœ‰åйã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2112,9 +2392,8 @@ msgstr "" "ãèµ·ã“ã™ã‹ã‚‚ã—れã¾ã›ã‚“。" #: src/settings_translation_file.cpp -#, fuzzy msgid "FPS in pause menu" -msgstr "ãƒãƒ¼ã‚ºãƒ¡ãƒ‹ãƒ¥ãƒ¼ã®FPS" +msgstr "ãƒãƒ¼ã‚ºãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ã®FPS" #: src/settings_translation_file.cpp #, fuzzy @@ -2122,8 +2401,12 @@ msgid "FSAA" msgstr "アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚¹" #: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy -msgid "Fall bobbing" +msgid "Fall bobbing factor" msgstr "è½ä¸‹ã«ã‚ˆã‚‹ä¸Šä¸‹ã®æºã‚Œ" #: src/settings_translation_file.cpp @@ -2151,19 +2434,16 @@ msgid "Fast key" msgstr "高速移動ã‚ー" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fast mode acceleration" -msgstr "高速モードã®åŠ é€Ÿåº¦" +msgstr "高速移動モードã®åŠ é€Ÿåº¦" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fast mode speed" -msgstr "高速モードã®é€Ÿåº¦" +msgstr "高速移動モードã®é€Ÿåº¦" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fast movement" -msgstr "高速移動" +msgstr "高速移動モード" #: src/settings_translation_file.cpp #, fuzzy @@ -2214,6 +2494,11 @@ msgstr "è©°ã‚物深ã•" #: src/settings_translation_file.cpp #, fuzzy +msgid "Filler depth noise" +msgstr "è©°ã‚物深ã•" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Filmic tone mapping" msgstr "æ˜ ç”»ãƒˆãƒ¼ãƒ³ãƒ»ãƒžãƒƒãƒ”ãƒ³ã‚°" @@ -2235,18 +2520,42 @@ msgid "Filtering" msgstr "フィルタリング" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Fixed map seed" msgstr "固定マップシード値" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Floatland level" +msgstr "æ°´ä½" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "飛行ã‚ー" #: src/settings_translation_file.cpp -#, fuzzy msgid "Flying" -msgstr "飛行" +msgstr "飛行モード" #: src/settings_translation_file.cpp #, fuzzy @@ -2254,6 +2563,10 @@ msgid "Fog" msgstr "霧" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Fog toggle key" msgstr "霧切り替ãˆã‚ー" @@ -2264,12 +2577,10 @@ msgid "Font path" msgstr "フォントパス" #: src/settings_translation_file.cpp -#, fuzzy msgid "Font shadow" msgstr "フォントã®å½±" #: src/settings_translation_file.cpp -#, fuzzy msgid "Font shadow alpha" msgstr "フォントã®å½±ã®é€éŽ" @@ -2283,7 +2594,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Font size" -msgstr "" +msgstr "フォントã®å¤§ãã•" #: src/settings_translation_file.cpp msgid "Format of screenshots." @@ -2294,6 +2605,14 @@ msgid "Forward key" msgstr "å‰ã‚ー" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2369,17 +2688,26 @@ msgstr "グラフィック" #: src/settings_translation_file.cpp msgid "Gravity" -msgstr "" +msgstr "é‡åŠ›" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "マップ生æˆãƒ•ラグ" #: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "Mod" #: src/settings_translation_file.cpp -msgid "HUD toggle key" +msgid "HUD scale factor" msgstr "" #: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "HUD切り替ãˆã‚ー" + +#: src/settings_translation_file.cpp msgid "" "Handling for deprecated lua api calls:\n" "- legacy: (try to) mimic old behaviour (default for release).\n" @@ -2397,22 +2725,58 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "洞窟ノイズ#1" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "å³Windows" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "視差é®è”½ãƒžãƒƒãƒ”ング" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "マップ生æˆãƒ•ラグ" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2435,6 +2799,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2460,6 +2836,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2492,6 +2877,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2519,6 +2908,14 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "音é‡ã‚’上ã’ã‚‹ã‚ー" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2561,6 +2958,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "インベントリã‚ー" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2570,23 +2972,35 @@ msgstr "インベントリã‚ー" #: src/settings_translation_file.cpp msgid "Invert mouse" -msgstr "" +msgstr "マウスã®å転" #: src/settings_translation_file.cpp msgid "Invert vertical mouse movement." -msgstr "" +msgstr "マウスã®ä¸Šä¸‹ã®å‹•ãã‚’å転ã•ã›ã¾ã™ã€‚" #: src/settings_translation_file.cpp msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2624,6 +3038,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "ジャンプã‚ー" @@ -2640,6 +3070,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2654,6 +3091,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2696,6 +3140,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2710,6 +3161,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2731,6 +3189,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2831,6 +3303,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2844,18 +3323,40 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "視差é®è”½ãƒžãƒƒãƒ”ング" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "マップ生æˆãƒ•ラグ" + +#: src/settings_translation_file.cpp msgid "Language" -msgstr "" +msgstr "言語" #: src/settings_translation_file.cpp msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "コンソールã‚ー" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2911,6 +3412,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2984,6 +3492,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -3011,9 +3523,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3022,7 +3543,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3041,24 +3563,20 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "マップ生æˆå" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +msgid "Mapgen Valleys" +msgstr "マップ生æˆå" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3074,119 +3592,14 @@ msgstr "マップ生æˆãƒ•ラグ" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen flat cave width" -msgstr "マップ生æˆãƒ•ラグ" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "マップ生æˆãƒ•ラグ" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "マップ生æˆãƒ•ラグ" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "視差é®è”½ãƒžãƒƒãƒ”ング" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" +msgid "Mapgen flat specific flags" msgstr "マップ生æˆãƒ•ラグ" #: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "マップ生æˆãƒ•ラグ" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal cave width" -msgstr "マップ生æˆãƒ•ラグ" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "マップ生æˆãƒ•ラグ" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "視差é®è”½ãƒžãƒƒãƒ”ング" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "マップ生æˆãƒ•ラグ" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "マップ生æˆãƒ•ラグ" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "マップ生æˆãƒ•ラグ" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "マップ生æˆå" @@ -3196,88 +3609,17 @@ msgstr "ワールドタイプ" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v5 cave width" -msgstr "ワールドタイプ" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" +msgid "Mapgen v5 specific flags" +msgstr "マップ生æˆãƒ•ラグ" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "ワールドタイプ" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen v6 specific flags" +msgstr "マップ生æˆãƒ•ラグ" #: src/settings_translation_file.cpp msgid "Mapgen v7" @@ -3285,56 +3627,8 @@ msgstr "ワールドタイプ" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v7 cave width" -msgstr "ワールドタイプ" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" +msgid "Mapgen v7 specific flags" +msgstr "マップ生æˆãƒ•ラグ" #: src/settings_translation_file.cpp msgid "Massive cave depth" @@ -3370,11 +3664,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Maximum FPS" -msgstr "" +msgstr "最大FPS" #: src/settings_translation_file.cpp msgid "Maximum FPS when game is paused." -msgstr "" +msgstr "ãƒãƒ¼ã‚ºãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ã®æœ€å¤§FPS。" #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -3457,7 +3751,7 @@ msgstr "ファイルダウンãƒãƒ¼ãƒ‰ (例: Modã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰)ã®æœ€å¤§ç #: src/settings_translation_file.cpp msgid "Maximum users" -msgstr "" +msgstr "最大ユーザー数" #: src/settings_translation_file.cpp msgid "Menus" @@ -3500,6 +3794,10 @@ msgid "Mipmapping" msgstr "ミップマッピング" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3520,26 +3818,37 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Mouse sensitivity" +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" msgstr "" #: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "ãƒžã‚¦ã‚¹ã®æ„Ÿåº¦" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "使用ã‚ー" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3569,11 +3878,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "New users need to input this password." -msgstr "" +msgstr "æ–°ã—ã„ユーザーã¯ã“ã®ãƒ‘スワードを入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: src/settings_translation_file.cpp msgid "Noclip" -msgstr "" +msgstr "ã™ã‚ŠæŠœã‘モード" #: src/settings_translation_file.cpp msgid "Noclip key" @@ -3588,10 +3897,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3628,6 +3933,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "ä¸é€æ˜Žãªæ°´" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3668,6 +3981,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3762,6 +4081,14 @@ msgid "Report path" msgstr "フォントパス" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "å³ã‚ー" @@ -3794,6 +4121,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3802,6 +4133,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3824,17 +4159,15 @@ msgstr "スクリーンショット" #: src/settings_translation_file.cpp msgid "Screenshot folder" -msgstr "" +msgstr "スクリーンショットã®ãƒ•ォルダ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screenshot format" -msgstr "スクリーンショット" +msgstr "スクリーンショットã®ãƒ•ァイル形å¼" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screenshot quality" -msgstr "スクリーンショット" +msgstr "スクリーンショットã®å“質" #: src/settings_translation_file.cpp msgid "" @@ -3844,6 +4177,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "洞窟ノイズ#1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "ã‚»ã‚ュリティ" @@ -3888,6 +4230,10 @@ msgid "Server port" msgstr "サーãƒãƒãƒ¼ãƒˆ" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "サーãƒä¸€è¦§URL" @@ -3920,10 +4266,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "シェーダー" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3940,7 +4295,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Shutdown message" -msgstr "" +msgstr "サーãƒçµ‚了時ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸" #: src/settings_translation_file.cpp msgid "" @@ -3949,10 +4304,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "滑らã‹ãªç…§æ˜Ž" @@ -3991,8 +4365,16 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." -msgstr "ノーマルマップã®ç”Ÿæˆ" +msgstr "ノーマルマップã®ç”Ÿæˆã€‚" #: src/settings_translation_file.cpp msgid "Strength of parallax." @@ -4011,10 +4393,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4029,6 +4431,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "テクスãƒãƒ£ãƒ‘ス" @@ -4048,8 +4454,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -4100,6 +4509,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -4119,7 +4532,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Time speed" -msgstr "" +msgstr "時間ã®é€Ÿã•" #: src/settings_translation_file.cpp msgid "Timeout for client to remove unused map data from memory." @@ -4142,6 +4555,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "トリリニアフィルタリング" @@ -4154,6 +4571,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Trusted mods" +msgstr "ä¿¡é ¼ã™ã‚‹Mod" + +#: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." msgstr "" #: src/settings_translation_file.cpp @@ -4161,6 +4584,19 @@ msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Undersampling" +msgstr "レンダリング:" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4225,6 +4661,43 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "丘ã®é™ºã—ã•/高ã•ã®è¨å®šã€‚" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4233,13 +4706,11 @@ msgid "Video driver" msgstr "ビデオドライãƒ" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4251,6 +4722,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4272,7 +4747,7 @@ msgstr "æ©ã速度" #: src/settings_translation_file.cpp msgid "Water Features" -msgstr "テクスãƒãƒ£ã‚’è¨å®šä¸..." +msgstr "テクスãƒãƒ£ã‚’è¨å®šä¸" #: src/settings_translation_file.cpp msgid "Water level" @@ -4338,23 +4813,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" -"ã©ã“ã§ãƒžãƒƒãƒ—生æˆã‚’åœæ¢ã™ã‚‹ã‹ã®è¨å®šã§ã™ã€‚\n" -"注æ„:\n" -"- 最大ã§31000ã§ã™(ã“れ以上ã«è¨å®šã—ã¦ã‚‚効果ã¯ã‚りã¾ã›ã‚“)。\n" -"- マップ生æˆã¯80x80x80ノードã®ã‚°ãƒ«ãƒ¼ãƒ—ã§å‹•作ã—ã¾ã™ (5x5x5マップブãƒãƒƒ" -"ク)。\n" -"- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¯åŽŸç‚¹ã‹ã‚‰-32ã€-32ノードã®ã‚ªãƒ•セットãŒã‚りã¾ã™ã€‚\n" -"- グループã¯map_generation_limit内ã§ç”Ÿæˆã•れãŸã‚‚ã®ã«é™ã‚Šã¾ã™ã€‚" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" "Freetypeフォントを利用ã™ã‚‹ã‹ã©ã†ã‹ã®è¨å®šã§ã™ã€‚Freetypeをサãƒãƒ¼ãƒˆã™ã‚‹ãƒ“ルドã§" @@ -4415,6 +4873,13 @@ msgstr "ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠžã—ãŸéš›ã«è¡¨ç¤ºã•れる線ã®å¹…ã§ã™ã€‚" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4431,6 +4896,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "擬似乱数ã«ã‚ˆã‚‹å¤§ãã„æ´žçªŸã®é«˜ã•(Y)ã®ä¸Šé™ã€‚" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "cURLファイルダウンãƒãƒ¼ãƒ‰ã‚¿ã‚¤ãƒ アウト" @@ -4442,6 +4943,114 @@ msgstr "cURL並行処ç†åˆ¶é™" msgid "cURL timeout" msgstr "cURLタイムアウト" +#~ msgid "Hide mp content" +#~ msgstr "Modパックã®å†…容をéžè¡¨ç¤º" + +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "Capital" + +#~ msgid "Comma" +#~ msgstr "カンマ" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Final" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "ã‹ãª" + +#~ msgid "Kanji" +#~ msgstr "æ¼¢å—" + +#~ msgid "Minus" +#~ msgstr "マイナス" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "ピリオド" + +#~ msgid "Plus" +#~ msgstr "プラス" + +#, fuzzy +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "ç ‚æ¼ ã®è¦åˆ¶ã‚µã‚¤ã‚ºã¨Mapgen v6ã®ãƒ“ーãƒã€‚\n" +#~ "snowbiomesãŒè¨±å¯ã•れるã¨ãã€ã€Žmgv6_freq_desertã€ã¯ç„¡è¦–ã•れã¾ã™ã€‚" + +#, fuzzy +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "地形形を決定ã—ã¾ã™ã€‚\n" +#~ "ブラケットã®3番å·ã¯åœ°å½¢ã®ç›®ç››ã‚Šã‚’制御ã—ã¾ã™ã€\n" +#~ "3番å·ã¯åŒä¸€ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" + +#, fuzzy +#~ msgid "Mapgen flat cave width" +#~ msgstr "マップ生æˆãƒ•ラグ" + +#, fuzzy +#~ msgid "Mapgen fractal cave width" +#~ msgstr "マップ生æˆãƒ•ラグ" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "マップ生æˆãƒ•ラグ" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "視差é®è”½ãƒžãƒƒãƒ”ング" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "マップ生æˆãƒ•ラグ" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "マップ生æˆãƒ•ラグ" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "マップ生æˆãƒ•ラグ" + +#, fuzzy +#~ msgid "Mapgen v5 cave width" +#~ msgstr "ワールドタイプ" + +#, fuzzy +#~ msgid "Mapgen v7 cave width" +#~ msgstr "ワールドタイプ" + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "ã©ã“ã§ãƒžãƒƒãƒ—生æˆã‚’åœæ¢ã™ã‚‹ã‹ã®è¨å®šã§ã™ã€‚\n" +#~ "注æ„:\n" +#~ "- 最大ã§31000ã§ã™(ã“れ以上ã«è¨å®šã—ã¦ã‚‚効果ã¯ã‚りã¾ã›ã‚“)。\n" +#~ "- マップ生æˆã¯80x80x80ノードã®ã‚°ãƒ«ãƒ¼ãƒ—ã§å‹•作ã—ã¾ã™ (5x5x5マップブãƒãƒƒ" +#~ "ク)。\n" +#~ "- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¯åŽŸç‚¹ã‹ã‚‰-32ã€-32ノードã®ã‚ªãƒ•セットãŒã‚りã¾ã™ã€‚\n" +#~ "- グループã¯map_generation_limit内ã§ç”Ÿæˆã•れãŸã‚‚ã®ã«é™ã‚Šã¾ã™ã€‚" + #, fuzzy #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "詳細ãªModã®ãƒ—ãƒãƒ•ァイルデータã§ã™ã€‚Mod開発者ã«ä¾¿åˆ©ã§ã™ã€‚" @@ -4471,9 +5080,6 @@ msgstr "cURLタイムアウト" #~ msgid "If enabled, " #~ msgstr "有効化ã®å ´åˆ " -#~ msgid "Rendering:" -#~ msgstr "レンダリング:" - #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "ドライãƒãƒ¼ã‚’変更ã™ã‚‹ãŸã‚Minetestã‚’å†èµ·å‹•ã—ã¾ã™" diff --git a/po/jbo/minetest.po b/po/jbo/minetest.po index 12ac80a39..1960b2913 100644 --- a/po/jbo/minetest.po +++ b/po/jbo/minetest.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: 2016-05-08 17:39+0000\n" "Last-Translator: senpi <saikos@openmailbox.org>\n" "Language-Team: Lojban <https://hosted.weblate.org/projects/minetest/minetest/" @@ -19,6 +19,14 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 2.7-dev\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "gasnu lo nu mi tolcanci" + +#: builtin/client/init.lua +msgid "You died." +msgstr ".i do pu morsi" + #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" msgstr "" @@ -77,13 +85,13 @@ msgstr "" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "fitytoltu'i" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua #, fuzzy -msgid "Depends:" +msgid "Dependencies:" msgstr "nitcu" #: builtin/mainmenu/dlg_config_world.lua @@ -91,6 +99,11 @@ msgid "Disable MP" msgstr "" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "selpli" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "" @@ -105,15 +118,11 @@ msgid "" msgstr "" #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" +msgid "Mod:" msgstr "" -#: builtin/mainmenu/dlg_config_world.lua -msgid "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" msgstr "" #: builtin/mainmenu/dlg_config_world.lua @@ -178,8 +187,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr ".i xu do je'u djica lo nu vimcu la'o gy.$1.gy." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "vimcu" @@ -195,7 +203,7 @@ msgstr "" msgid "Delete World \"$1\"?" msgstr ".i xu do djica lo nu vimcu lo munje be me'e zoi gy.$1.gy." -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "fitytu'i" @@ -275,6 +283,11 @@ msgstr "" msgid "Restore Default" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "sisku" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "" @@ -284,11 +297,11 @@ msgid "Show technical names" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +msgid "The value must be at least $1." msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +msgid "The value must not be larger than $1." msgstr "" #: builtin/mainmenu/modmgr.lua @@ -313,6 +326,10 @@ msgstr "" msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "" @@ -334,10 +351,6 @@ msgid "Rating" msgstr "" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "sisku" - -#: builtin/mainmenu/store.lua #, fuzzy msgid "Shortname:" msgstr "tordu cmene" @@ -374,6 +387,71 @@ msgstr "" msgid "Previous Core Developers" msgstr "" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "le nu finti kelci" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "cfari fa lo nu kelci" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "lo samtcise'u" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "cfari fa lo nu kelci" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "lo cmene .e lo lerpoijaspu" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "cnino" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr ".i lo no munje cu puzi zbasu gi'a cuxna" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "cfari fa lo nu kelci" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "lo judrnporte" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select World:" +msgstr "cuxna lo munje" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "lo samtcise'u judrnporte" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "" @@ -383,6 +461,10 @@ msgid "Mod information:" msgstr "" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "" @@ -402,99 +484,48 @@ msgstr "" msgid "Uninstall selected modpack" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Address / Port" msgstr "lo samjudri jo'u judrnporte" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "lo samtciselse'u" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "samjongau" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "le nu finti kelci" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Name / Password" msgstr "lo cmene .e lo lerpoijaspu" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "le nu finti kelci" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "lo cmene .e lo lerpoijaspu" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "cnino" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr ".i lo no munje cu puzi zbasu gi'a cuxna" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "lo judrnporte" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "gubni" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#, fuzzy -msgid "Select World:" -msgstr "cuxna lo munje" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "lo samtcise'u" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "lo samtcise'u judrnporte" - -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "cfari fa lo nu kelci" - #: builtin/mainmenu/tab_settings.lua msgid "2x" msgstr "" @@ -525,6 +556,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr ".i xu do je'u djica lo nu kraga'igau le do za'e pavykelci munje" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Bilinear Filter" msgstr "lo puvyrelyli'iju'e" @@ -611,6 +646,10 @@ msgid "Reset singleplayer world" msgstr "kraga'igau le za'e pavykelci munje" #: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "" @@ -680,14 +719,6 @@ msgstr "lo ralju" msgid "Start Singleplayer" msgstr "" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "pa kelci" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "" @@ -749,6 +780,10 @@ msgid "Player name too long." msgstr "" #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "" @@ -763,6 +798,43 @@ msgid "" msgstr "" #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "lo samjudri jo'u judrnporte" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "le nu finti kelci" + +#: src/game.cpp +msgid "- Damage: " +msgstr "" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "lo judrnporte" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "gubni" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "lo samtcise'u" + +#: src/game.cpp msgid "Change Keys" msgstr "" @@ -779,6 +851,25 @@ msgid "Continue" msgstr "ranji" #: src/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse left: dig/punch\n" +"- Mouse right: place/use\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" +msgstr "" + +#: src/game.cpp msgid "Creating client..." msgstr ".i lo samtciselse'u cu se zbasu" @@ -789,21 +880,6 @@ msgstr ".i lo samtcise'u cu se zbasu" #: src/game.cpp msgid "" "Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" -"- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" -"- Mouse wheel: select item\n" -"- T: chat\n" -msgstr "" - -#: src/game.cpp -msgid "" -"Default Controls:\n" "No menu visible:\n" "- single tap: button activate\n" "- double tap: place/use\n" @@ -826,6 +902,19 @@ msgid "Exit to OS" msgstr "tolcfagau" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +msgid "Game paused" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr ".i lo samtcise'u cu se zbasu" + +#: src/game.cpp #, fuzzy msgid "Item definitions..." msgstr ".i ca'o samymo'i tu'a le dacti" @@ -848,24 +937,45 @@ msgid "Node definitions..." msgstr ".i ca'o samymo'i tu'a lo me la'o gy.node.gy." #: src/game.cpp -msgid "Resolving address..." -msgstr ".i ca'o troci lo nu facki lo samjudri" +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "gasnu lo nu mi tolcanci" +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." +msgstr ".i ca'o troci lo nu facki lo samjudri" #: src/game.cpp msgid "Shutting down..." msgstr "" #: src/game.cpp +msgid "Singleplayer" +msgstr "pa kelci" + +#: src/game.cpp msgid "Sound Volume" msgstr "" #: src/game.cpp -msgid "You died." -msgstr ".i do pu morsi" +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp #, fuzzy @@ -901,6 +1011,10 @@ msgid "Console" msgstr "" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "" @@ -913,6 +1027,10 @@ msgid "Forward" msgstr "za'i ca'u muvdu" #: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "lo dacti uidje" @@ -932,6 +1050,23 @@ msgstr "" msgid "Left" msgstr "za'i zu'e muvdu" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "minde" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "" @@ -1009,15 +1144,11 @@ msgid "Apps" msgstr "" #: src/keycode.cpp -msgid "Attn" -msgstr "la'o gy.Attn.gy." - -#: src/keycode.cpp msgid "Back" msgstr "" #: src/keycode.cpp -msgid "Capital" +msgid "Caps Lock" msgstr "" #: src/keycode.cpp @@ -1025,22 +1156,10 @@ msgid "Clear" msgstr "" #: src/keycode.cpp -msgid "Comma" -msgstr "slaka bu" - -#: src/keycode.cpp msgid "Control" msgstr "" #: src/keycode.cpp -msgid "Convert" -msgstr "" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "la'o gy.CrSel.gy." - -#: src/keycode.cpp msgid "Down" msgstr "" @@ -1049,47 +1168,46 @@ msgid "End" msgstr "" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "la'o gy.Erase OEF.gy." #: src/keycode.cpp -msgid "Escape" +msgid "Execute" msgstr "" #: src/keycode.cpp -msgid "ExSel" -msgstr "la'o gy.ExSel.gy." - -#: src/keycode.cpp -msgid "Execute" +msgid "Help" msgstr "" #: src/keycode.cpp -msgid "Final" +msgid "Home" msgstr "" #: src/keycode.cpp -msgid "Help" -msgstr "" +#, fuzzy +msgid "IME Accept" +msgstr "fitytu'i" #: src/keycode.cpp -msgid "Home" +msgid "IME Convert" msgstr "" #: src/keycode.cpp -msgid "Insert" +msgid "IME Escape" msgstr "" #: src/keycode.cpp -msgid "Junja" -msgstr "" +#, fuzzy +msgid "IME Mode Change" +msgstr "la'o gy.Mode Change.gy." #: src/keycode.cpp -msgid "Kana" +msgid "IME Nonconvert" msgstr "" #: src/keycode.cpp -msgid "Kanji" +msgid "Insert" msgstr "" #: src/keycode.cpp @@ -1121,22 +1239,10 @@ msgid "Middle Button" msgstr "lo mijyselpevysmacu" #: src/keycode.cpp -msgid "Minus" -msgstr "vu'u bu" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "la'o gy.Mode Change.gy." - -#: src/keycode.cpp msgid "Next" msgstr "" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "" - -#: src/keycode.cpp msgid "Num Lock" msgstr "" @@ -1153,6 +1259,10 @@ msgid "Numpad -" msgstr "" #: src/keycode.cpp +msgid "Numpad ." +msgstr "" + +#: src/keycode.cpp msgid "Numpad /" msgstr "" @@ -1201,20 +1311,12 @@ msgid "OEM Clear" msgstr "la'o gy.OEM Clear.gy." #: src/keycode.cpp -msgid "PA1" -msgstr "la'o gy.PA1.gy." - -#: src/keycode.cpp msgid "Pause" msgstr "" #: src/keycode.cpp -msgid "Period" -msgstr "denpa bu" - -#: src/keycode.cpp -msgid "Plus" -msgstr "su'i bu" +msgid "Play" +msgstr "" #: src/keycode.cpp msgid "Print" @@ -1313,6 +1415,20 @@ msgid "3D mode" msgstr "" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1374,6 +1490,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1381,7 +1501,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" @@ -1406,6 +1527,12 @@ msgid "Amplifies the valleys" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "" @@ -1421,6 +1548,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" @@ -1429,6 +1560,19 @@ msgid "Ask to reconnect after crash" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "" @@ -1454,6 +1598,14 @@ msgid "Basic Privileges" msgstr "" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Bilinear filtering" msgstr "lo puvyrelyli'iju'e" @@ -1464,6 +1616,14 @@ msgid "Bind address" msgstr ".i ca'o troci lo nu facki lo samjudri" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" @@ -1492,6 +1652,10 @@ msgid "Camera update toggle key" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "" @@ -1504,6 +1668,30 @@ msgid "Cave width" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1563,10 +1751,19 @@ msgid "Clean transparent textures" msgstr "" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "lo samtciselse'u" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "lo samtciselse'u" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "" @@ -1636,6 +1833,10 @@ msgid "Console color" msgstr "" #: src/settings_translation_file.cpp +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "" @@ -1659,17 +1860,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp @@ -1693,6 +1894,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "zbasu" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" @@ -1729,6 +1935,10 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "" @@ -1766,6 +1976,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1776,6 +2021,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1806,18 +2061,26 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Digging particles" +msgstr "lo kantu" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Disable anticheat" msgstr "lo kantu" @@ -1862,11 +2125,25 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Enable VBO" msgstr "selpli" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "" @@ -1902,6 +2179,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -1945,6 +2232,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -1967,7 +2258,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2038,6 +2333,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2054,10 +2353,34 @@ msgid "Filtering" msgstr "" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "" @@ -2070,6 +2393,10 @@ msgid "Fog" msgstr "" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -2107,6 +2434,14 @@ msgid "Forward key" msgstr "za'i ca'u muvdu" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2185,10 +2520,18 @@ msgid "Gravity" msgstr "" #: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2210,22 +2553,54 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2247,6 +2622,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2272,6 +2659,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2304,6 +2700,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2331,6 +2731,14 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2373,6 +2781,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "lo dacti uidje" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2394,12 +2807,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2437,6 +2862,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Jump key" msgstr "mu'e plipe" @@ -2454,6 +2895,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2468,6 +2916,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2510,6 +2965,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2524,6 +2986,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2545,6 +3014,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2645,6 +3128,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2658,10 +3148,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2670,6 +3175,10 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2726,6 +3235,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2800,6 +3316,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2827,9 +3347,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2838,7 +3367,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2857,23 +3387,19 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen Valleys" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" +msgid "Mapgen Valleys" msgstr "" #: src/settings_translation_file.cpp @@ -2889,51 +3415,7 @@ msgid "Mapgen flat" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" +msgid "Mapgen flat specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -2941,66 +3423,6 @@ msgid "Mapgen fractal" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "" @@ -3009,27 +3431,7 @@ msgid "Mapgen v5" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Mapgen v5 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3037,59 +3439,7 @@ msgid "Mapgen v6" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3097,55 +3447,7 @@ msgid "Mapgen v7" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3313,6 +3615,10 @@ msgid "Mipmapping" msgstr "lo puvrmipmepi" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3333,6 +3639,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3341,18 +3655,21 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "ko da'ergau le batke" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3401,10 +3718,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3441,6 +3754,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3481,6 +3802,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3575,6 +3902,14 @@ msgid "Report path" msgstr "" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Right key" msgstr "za'i ri'u muvdu" @@ -3608,6 +3943,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3616,6 +3955,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3656,6 +3999,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3706,6 +4057,10 @@ msgid "Server port" msgstr "lo samtcise'u judrnporte" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Serverlist URL" msgstr "lo samtcise'u" @@ -3739,10 +4094,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "lo ti'orkemsamtci" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3768,10 +4132,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Smooth lighting" msgstr "lo xutla se gusni" @@ -3812,6 +4195,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -3832,10 +4223,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3850,6 +4261,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "" @@ -3869,8 +4284,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -3921,6 +4339,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -3963,6 +4385,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Trilinear filtering" msgstr "lo puvycibli'iju'e" @@ -3979,10 +4405,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4048,6 +4492,42 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4056,13 +4536,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4074,6 +4552,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4165,16 +4647,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4225,6 +4697,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4238,6 +4717,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4249,6 +4764,30 @@ msgstr "" msgid "cURL timeout" msgstr "" +#~ msgid "Attn" +#~ msgstr "la'o gy.Attn.gy." + +#~ msgid "Comma" +#~ msgstr "slaka bu" + +#~ msgid "CrSel" +#~ msgstr "la'o gy.CrSel.gy." + +#~ msgid "ExSel" +#~ msgstr "la'o gy.ExSel.gy." + +#~ msgid "Minus" +#~ msgstr "vu'u bu" + +#~ msgid "PA1" +#~ msgstr "la'o gy.PA1.gy." + +#~ msgid "Period" +#~ msgstr "denpa bu" + +#~ msgid "Plus" +#~ msgstr "su'i bu" + #~ msgid "No of course not!" #~ msgstr "nasai go'i" diff --git a/po/ko/minetest.po b/po/ko/minetest.po index 9f1219d6e..aba7a0b68 100644 --- a/po/ko/minetest.po +++ b/po/ko/minetest.po @@ -6,17 +6,25 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-10-31 05:41+0000\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-03-05 03:12+0000\n" "Last-Translator: Han So Ri <2_0_2_0_@naver.com>\n" -"Language-Team: Korean " -"<https://hosted.weblate.org/projects/minetest/minetest/ko/>\n" +"Language-Team: Korean <https://hosted.weblate.org/projects/minetest/minetest/" +"ko/>\n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.9-dev\n" +"X-Generator: Weblate 2.12\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "리스í°" + +#: builtin/client/init.lua +msgid "You died." +msgstr "ë‹¹ì‹ ì€ ì£½ì—ˆìŠµë‹ˆë‹¤." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -74,12 +82,12 @@ msgstr "í”„ë¡œí† ì½œ ë²„ì „ $1ê³¼(와) $2 사ì´ë¥¼ ì œê³µí•©ë‹ˆë‹¤." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "취소" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +msgid "Dependencies:" msgstr "" #: builtin/mainmenu/dlg_config_world.lua @@ -87,6 +95,11 @@ msgid "Disable MP" msgstr "MP 미ì ìš©" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "MP 미ì ìš©" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "MP ì ìš©" @@ -98,20 +111,18 @@ msgstr "ëª¨ë‘ ì ìš©" msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "chararacters [a-z0-9_] are allowed." -msgstr "\"$1\"는(ì€) í—ˆë½ë˜ì§€ ì•Šì€ ìºë¦í„°ë¡œ ì‚¬ìš©í• ìˆ˜ 없습니다. [a-z0-9_]ë§Œ ì‚¬ìš©í• ìˆ˜ 있습니다." - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "숨겨진 게임" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "숨겨진 ë§µ 콘í…ì¸ " +msgstr "" +"\"$1\"는(ì€) í—ˆë½ë˜ì§€ ì•Šì€ ìºë¦í„°ë¡œ ì‚¬ìš©í• ìˆ˜ 없습니다. [a-z0-9_]ë§Œ ì‚¬ìš©í• " +"수 있습니다." #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "모드:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -174,8 +185,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "$1 를(ì„) ì‚ì œí•˜ê² ìŠµë‹ˆê¹Œ?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "ì‚ì œ" @@ -191,7 +201,7 @@ msgstr "Modmgr: \"$1\" 를(ì„) ì¸ì‹í• 수 없습니다" msgid "Delete World \"$1\"?" msgstr "\"$1\"를(ì„) ì‚ì œí•˜ê² ìŠµë‹ˆê¹Œ?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "확ì¸" @@ -236,8 +246,8 @@ msgid "" "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " "<octaves>, <persistence>" msgstr "" -"형ì‹: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, <octaves>, " -"<persistence>" +"형ì‹: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " +"<octaves>, <persistence>" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" @@ -271,6 +281,11 @@ msgstr "가능한 ê°’: " msgid "Restore Default" msgstr "기본값 ë³µì›" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "검색" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "경로 ì„ íƒ" @@ -280,11 +295,13 @@ msgid "Show technical names" msgstr "ê¸°ìˆ ì ì´ë¦„ 보기" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "ê°’ì€ $1 (ì´)보다 커야 합니다." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "ê°’ì€ $1 (ì´)보다 ë” ë‚®ì•„ì•¼í•©ë‹ˆë‹¤." #: builtin/mainmenu/modmgr.lua @@ -311,9 +328,13 @@ msgstr "설치 모드: $1를(ì„) ì°¾ì„ ìˆ˜ 없습니다" msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "설치 모드: 모드 팩 $1 (ì´)ì˜ ì˜¬ë°”ë¥¸ í´ë”를 ì°¾ì„ ìˆ˜ 없습니다" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" -msgstr "" +msgstr "ìŠ¤í† ì–´ 닫기" #: builtin/mainmenu/store.lua msgid "Downloading $1, please wait..." @@ -332,10 +353,6 @@ msgid "Rating" msgstr "순위" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "검색" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "ì§§ì€ ì´ë¦„:" @@ -371,6 +388,71 @@ msgstr "ì´ì „ 공헌ìžë“¤" msgid "Previous Core Developers" msgstr "ì´ì „ 코어 개발ìžë“¤" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "서버 발표" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "ë°”ì¸ë”© 주소" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "í™˜ê²½ì„¤ì •" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "í¬ë¦¬ì—ì´í‹°ë¸Œ 모드" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "ë°ë¯¸ì§€ 활성화" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "숨겨진 게임" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "서버" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "게임 시작" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "ì´ë¦„/비밀번호" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "새로 만들기" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "월드를 만들거나 ì„ íƒí•˜ì§€ 않았습니다!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "í”Œë ˆì´ì–´ ì´ë¦„" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "í¬íЏ" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "비밀 월드:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "서버 í¬íЏ" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "설치한 모드:" @@ -380,6 +462,10 @@ msgid "Mod information:" msgstr "모드 ì •ë³´:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "모드 ì„¤ëª…ì´ ì—†ìŠµë‹ˆë‹¤" @@ -399,95 +485,46 @@ msgstr "ì„ íƒí•œ 모드 ì‚ì œ" msgid "Uninstall selected modpack" msgstr "ì„ íƒí•œ 모드팩 ì‚ì œ" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "주소/í¬íЏ" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "í´ë¼ì´ì–¸íЏ" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "ì—°ê²°" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "í¬ë¦¬ì—ì´í‹°ë¸Œ 모드" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" -msgstr "ë°ë¯¸ì§€ë¥¼ ìž…ì„ ìˆ˜ 있습니다" +msgstr "ë°ë¯¸ì§€ 활성화" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "ì¦ê²¨ì°¾ê¸° ì‚ì œ" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "ì¦ê²¨ì°¾ê¸°" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "ì´ë¦„/비밀번호" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP 가능" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "í™˜ê²½ì„¤ì •" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "í¬ë¦¬ì—ì´í‹°ë¸Œ 모드" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "ë°ë¯¸ì§€ë¥¼ ë°›ì„ ìˆ˜ 있습니다" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "ì´ë¦„/비밀번호" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "새로 만들기" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "월드를 만들거나 ì„ íƒí•˜ì§€ 않았습니다!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "í¬íЏ" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "ì¼ë°˜" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "비밀 월드:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "서버" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "서버 í¬íЏ" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Play Online" +msgstr "í”Œë ˆì´ì–´ ì´ë¦„" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "게임 시작" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP 가능" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -518,6 +555,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "싱글 í”Œë ˆì´ì–´ 월드를 다시 ì‹œìž‘í•˜ê² ìŠµë‹ˆê¹Œ?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "ì´ì¤‘ ì„ í˜• í•„í„°" @@ -531,7 +572,7 @@ msgstr "키 변경" #: builtin/mainmenu/tab_settings.lua msgid "Connected Glass" -msgstr "" +msgstr "ì—°ê²°ëœ ìœ ë¦¬" #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" @@ -543,7 +584,7 @@ msgstr "ë°‰ ë§µ" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap + Aniso. Filter" -msgstr "" +msgstr "밉맵 + Aniso. í•„í„°" #: builtin/mainmenu/tab_settings.lua msgid "No" @@ -583,7 +624,7 @@ msgstr "불투명한 물 효과" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Parallax Occlusion" -msgstr "" +msgstr "시차 êµí•©" #: builtin/mainmenu/tab_settings.lua msgid "Particles" @@ -594,6 +635,11 @@ msgid "Reset singleplayer world" msgstr "싱글 í”Œë ˆì´ì–´ 월드 다시 시작" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "스í¬ë¦°ìƒ·" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "ì„¤ì •" @@ -657,14 +703,6 @@ msgstr "ë©”ì¸" msgid "Start Singleplayer" msgstr "싱글 í”Œë ˆì´ì–´ 시작" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "시작" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "싱글 í”Œë ˆì´ì–´" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "ì •ë³´ê°€ 없습니다" @@ -726,6 +764,10 @@ msgid "Player name too long." msgstr "ì´ë¦„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "월드가 존재하지 않습니다: " @@ -742,6 +784,44 @@ msgstr "" "ìžì„¸í•œ ë‚´ìš©ì€ debug.txtì„ í™•ì¸ í•©ë‹ˆë‹¤." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "ë°”ì¸ë”© 주소" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "í¬ë¦¬ì—ì´í‹°ë¸Œ 모드" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "ë°ë¯¸ì§€" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "í¬íЏ" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "ì¼ë°˜" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "서버 ì´ë¦„" + +#: src/game.cpp msgid "Change Keys" msgstr "키 변경" @@ -758,26 +838,22 @@ msgid "Continue" msgstr "계ì†" #: src/game.cpp -msgid "Creating client..." -msgstr "í´ë¼ì´ì–¸íЏ 만드는 중..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "서버 만드는 중..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "기본 컨트롤:-WASD: ì´ë™\n" "-스페ì´ìФ: ì 프/오르기\n" @@ -791,6 +867,14 @@ msgstr "" "-T: 채팅\n" #: src/game.cpp +msgid "Creating client..." +msgstr "í´ë¼ì´ì–¸íЏ 만드는 중..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "서버 만드는 중..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -827,6 +911,20 @@ msgid "Exit to OS" msgstr "게임 종료" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "게임" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "서버 만드는 중..." + +#: src/game.cpp msgid "Item definitions..." msgstr "ì•„ì´í…œ ì •ì˜ì¤‘..." @@ -847,24 +945,46 @@ msgid "Node definitions..." msgstr "Node ì •ì˜ì¤‘..." #: src/game.cpp -msgid "Resolving address..." -msgstr "주소 ë¶„ì„중..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "리스í°" +msgid "On" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "ì›ê²© í¬íЏ" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "주소 ë¶„ì„중..." #: src/game.cpp msgid "Shutting down..." msgstr "서버가 닫혔습니다..." #: src/game.cpp +msgid "Singleplayer" +msgstr "싱글 í”Œë ˆì´ì–´" + +#: src/game.cpp msgid "Sound Volume" msgstr "볼륨 ì¡°ì ˆ" #: src/game.cpp -msgid "You died." -msgstr "ë‹¹ì‹ ì€ ì£½ì—ˆìŠµë‹ˆë‹¤." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -899,10 +1019,14 @@ msgid "Console" msgstr "콘솔" #: src/guiKeyChangeMenu.cpp -msgid "Double tap \"jump\" to toggle fly" +msgid "Dec. volume" msgstr "" #: src/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "\"ì 프\"를 비행으로 ë°”ê¾¸ë ¤ë©´ ë‘번 íƒ" + +#: src/guiKeyChangeMenu.cpp msgid "Drop" msgstr "떨어뜨리기" @@ -911,6 +1035,11 @@ msgid "Forward" msgstr "앞으로" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "볼륨 ì¡°ì ˆ" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "ì¸ë²¤í† 리" @@ -924,15 +1053,34 @@ msgstr "ì´ë¯¸ ì‚¬ìš©í•˜ê³ ìžˆëŠ” 키입니다" #: src/guiKeyChangeMenu.cpp msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "Keybindings. (ì´ ë©”ë‰´ë¥¼ ê³ ì •í•˜ë ¤ë©´ minetest.cofì—서 stuff를 ì œê±°í•´ì•¼í•©ë‹ˆë‹¤.)" +msgstr "" +"Keybindings. (ì´ ë©”ë‰´ë¥¼ ê³ ì •í•˜ë ¤ë©´ minetest.cofì—서 stuff를 ì œê±°í•´ì•¼í•©ë‹ˆë‹¤.)" #: src/guiKeyChangeMenu.cpp src/keycode.cpp msgid "Left" msgstr "왼쪽" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "채팅 명ë ì–´" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "다ìŒ" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" -msgstr "" +msgstr "ìŠ¤íƒ ì¶œë ¥" #: src/guiKeyChangeMenu.cpp msgid "Range select" @@ -1007,66 +1155,39 @@ msgid "Apps" msgstr "ì• í”Œ 리 ì¼€ì´ ì…˜" #: src/keycode.cpp -msgid "Attn" -msgstr "담당ìž" - -#: src/keycode.cpp msgid "Back" msgstr "뒤로" #: src/keycode.cpp -msgid "Capital" -msgstr "ìžë³¸" - -#: src/keycode.cpp -msgid "Clear" +msgid "Caps Lock" msgstr "" #: src/keycode.cpp -msgid "Comma" -msgstr "쉼표" +msgid "Clear" +msgstr "지우기" #: src/keycode.cpp msgid "Control" -msgstr "" - -#: src/keycode.cpp -msgid "Convert" -msgstr "변환" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "" +msgstr "컨트롤" #: src/keycode.cpp msgid "Down" -msgstr "" +msgstr "아래" #: src/keycode.cpp msgid "End" msgstr "ë" #: src/keycode.cpp -msgid "Erase OEF" -msgstr "" - -#: src/keycode.cpp -msgid "Escape" -msgstr "" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "" +#, fuzzy +msgid "Erase EOF" +msgstr "OEF를 지우기" #: src/keycode.cpp msgid "Execute" msgstr "실행" #: src/keycode.cpp -msgid "Final" -msgstr "최종" - -#: src/keycode.cpp msgid "Help" msgstr "ë„움ë§" @@ -1075,20 +1196,32 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +#, fuzzy +msgid "IME Accept" +msgstr "확ì¸" #: src/keycode.cpp -msgid "Junja" -msgstr "" +#, fuzzy +msgid "IME Convert" +msgstr "변환" #: src/keycode.cpp -msgid "Kana" +msgid "IME Escape" msgstr "" #: src/keycode.cpp -msgid "Kanji" -msgstr "" +#, fuzzy +msgid "IME Mode Change" +msgstr "모드 변경" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "변환 안함" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1119,24 +1252,11 @@ msgid "Middle Button" msgstr "ê°€ìš´ë° ë²„íŠ¼" #: src/keycode.cpp -msgid "Minus" -msgstr "마ì´ë„ˆìФ" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "모드 변경" - -#: src/keycode.cpp msgid "Next" msgstr "다ìŒ" #: src/keycode.cpp #, fuzzy -msgid "Nonconvert" -msgstr "변환 안함" - -#: src/keycode.cpp -#, fuzzy msgid "Num Lock" msgstr "Num Lock" @@ -1153,6 +1273,11 @@ msgid "Numpad -" msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ /" @@ -1201,21 +1326,13 @@ msgid "OEM Clear" msgstr "" #: src/keycode.cpp -msgid "PA1" -msgstr "" - -#: src/keycode.cpp #, fuzzy msgid "Pause" msgstr "ì¼ì‹œ 중지" #: src/keycode.cpp -msgid "Period" -msgstr "기간" - -#: src/keycode.cpp -msgid "Plus" -msgstr "플러스" +msgid "Play" +msgstr "시작" #: src/keycode.cpp #, fuzzy @@ -1283,15 +1400,15 @@ msgstr "íƒ" #: src/keycode.cpp msgid "Up" -msgstr "" +msgstr "위" #: src/keycode.cpp msgid "X Button 1" -msgstr "" +msgstr "X 버튼 1" #: src/keycode.cpp msgid "X Button 2" -msgstr "" +msgstr "X 버튼 2" #: src/settings_translation_file.cpp msgid "" @@ -1317,6 +1434,20 @@ msgid "3D mode" msgstr "3D 모드" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "" "3D support.\n" @@ -1359,11 +1490,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "공중ì—서 ê°€ì†" #: src/settings_translation_file.cpp msgid "Active Block Management interval" -msgstr "" +msgstr "ë¸”ë¡ ê´€ë¦¬ 간격 활성" #: src/settings_translation_file.cpp msgid "Active Block Modifier interval" @@ -1389,6 +1520,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1396,13 +1531,14 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" #: src/settings_translation_file.cpp msgid "Advanced" -msgstr "" +msgstr "ê³ ê¸‰" #: src/settings_translation_file.cpp msgid "Altitude Chill" @@ -1410,7 +1546,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Always fly and fast" -msgstr "" +msgstr "í•ìƒ ë¹„í–‰í•˜ê³ ë¹ ë¥´ê²Œ" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" @@ -1422,6 +1558,12 @@ msgid "Amplifies the valleys" msgstr "계곡 ì¦í" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "ì´ë°©ì„± í•„í„°ë§" @@ -1438,7 +1580,12 @@ msgid "" "minetest.net." msgstr "" "ì„œë²„ë¦¬ìŠ¤íŠ¸ì— ë°œí‘œí•©ë‹ˆë‹¤.\n" -"만약 ë‹¹ì‹ ì˜ Ipv6 주소를 알리기 ì›í•œë‹¤ë©´ serverlist_url = v6.servers.minetest.net ì„ ì‚¬ìš©í•˜ì„¸ìš”." +"만약 ë‹¹ì‹ ì˜ Ipv6 주소를 알리기 ì›í•œë‹¤ë©´ serverlist_url = v6.servers.minetest." +"net ì„ ì‚¬ìš©í•˜ì„¸ìš”." + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" #: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." @@ -1449,12 +1596,25 @@ msgid "Ask to reconnect after crash" msgstr "ì¶©ëŒ í›„ 재연결 ìš”ì²" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "" #: src/settings_translation_file.cpp msgid "Autorun key" -msgstr "" +msgstr "ìžë™ 실행 키" #: src/settings_translation_file.cpp msgid "Backward key" @@ -1473,16 +1633,33 @@ msgid "Basic Privileges" msgstr "기본 권한" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "ì´ì¤‘ ì„ í˜• í•„í„°ë§" #: src/settings_translation_file.cpp msgid "Bind address" +msgstr "ë°”ì¸ë”© 주소" + +#: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome noise" +msgstr "ê°• 소리" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" +msgstr "ì „ì²´ 화면 모드ì—서 (ì¼ëª… 색 ë†ë„) 픽셀 당 비트." #: src/settings_translation_file.cpp msgid "Build inside player" @@ -1490,23 +1667,28 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "기본 ì œê³µ" #: src/settings_translation_file.cpp msgid "Bumpmapping" -msgstr "" +msgstr "범프맵핑" #: src/settings_translation_file.cpp msgid "Camera smoothing" -msgstr "" +msgstr "ì¹´ë©”ë¼ë¥¼ 부드럽게" #: src/settings_translation_file.cpp msgid "Camera smoothing in cinematic mode" -msgstr "" +msgstr "시네마틱 모드ì—서 ì¹´ë©”ë¼ ë¶€ë“œëŸ½ê²Œ" #: src/settings_translation_file.cpp msgid "Camera update toggle key" -msgstr "" +msgstr "ì¹´ë©”ë¼ ì—…ë°ì´íЏ í† ê¸€ 키" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "ë™êµ´ ìž¡ìŒ #1" #: src/settings_translation_file.cpp msgid "Cave noise #1" @@ -1521,6 +1703,34 @@ msgid "Cave width" msgstr "ë™êµ´ 너비" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "ë™êµ´ ìž¡ìŒ #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "ë™êµ´ ìž¡ìŒ #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "ë™êµ´ 너비" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "ë™êµ´ ìž¡ìŒ #1" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1558,6 +1768,25 @@ msgid "" "17 = 4D \"Mandelbulb\" mandelbrot set.\n" "18 = 4D \"Mandelbulb\" julia set." msgstr "" +"9가지 ê³µì‹ì—서 18 ë„í˜•ì„ ì„ íƒí•˜ì„¸ìš”.\n" +"1 = 4 D \"Roundy\" ë§Œë¸ë¸Œë¡œíЏ ì§‘í•©.\n" +"2 = 4 D \"Roundy\" 줄리아 ì§‘í•©.\n" +"3 = 4 D \"Squarry\" ë§Œë¸ë¸Œë¡œíЏ ì§‘í•©.\n" +"4 = 4 D \"Squarry\" 줄리아 ì§‘í•©.\n" +"5 = 4 D \"맨디 사촌\" ë§Œë¸ë¸Œë¡œíЏ ì§‘í•©.\n" +"6 = 4 D \"맨디 사촌\" 줄리아 ì§‘í•©.\n" +"7 = 4 D \"변형\" ë§Œë¸ë¸Œë¡œíЏ ì§‘í•©.\n" +"8 = 4 D \"변형\" 줄리아 ì§‘í•©.\n" +"9 = 3D \"ë§Œë¸ë¸Œë¡œíЏ/ë§Œë¸ë°”\" ë§Œë¸ë¸Œë¡œíЏ ì§‘í•©.\n" +"10 = 3D \"ë§Œë¸ë¸Œë¡œíЏ/ë§Œë¸ë°”\" 줄리아 ì§‘í•©.\n" +"11 = 3D \"í¬ë¦¬ìŠ¤ë§ˆìŠ¤ 트리\" ë§Œë¸ë¸Œë¡œíЏ ì§‘í•©.\n" +"12 = 3D \"í¬ë¦¬ìŠ¤ë§ˆìŠ¤ 트리\" 줄리아 ì§‘í•©.\n" +"13 = 3D \"ë§Œë¸ë²Œë¸Œ\" ë§Œë¸ë¸Œë¡œíЏ ì§‘í•©.\n" +"14 = 3D \"ë§Œë¸ë²Œë¸Œ\" 줄리아 ì§‘í•©.\n" +"15 = 3D \"ì½”ì‚¬ì¸ ë§Œë¸ë²Œë¸Œ\" ë§Œë¸ë¸Œë¡œíЏ ì§‘í•©.\n" +"16 = 3D \"ì½”ì‚¬ì¸ ë§Œë¸ë²Œë¸Œ\" 줄리아 ì§‘í•©.\n" +"17 = 4 D \"ë§Œë¸ë²Œë¸Œ\" ë§Œë¸ë¸Œë¡œíЏ ì§‘í•©.\n" +"18 = 4 D \"ë§Œë¸ë²Œë¸Œ\" 줄리아 ì§‘í•©." #: src/settings_translation_file.cpp #, fuzzy @@ -1578,10 +1807,19 @@ msgid "Clean transparent textures" msgstr "깨ë—í•˜ê³ íˆ¬ëª…í•œ í…스처" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "í´ë¼ì´ì–¸íЏ" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "í´ë¼ì´ì–¸íŠ¸ì™€ 서버" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "í´ë¼ì´ì–¸íЏ" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "오르기 ì†ë„" @@ -1599,11 +1837,11 @@ msgstr "구름" #: src/settings_translation_file.cpp msgid "Clouds are a client side effect." -msgstr "" +msgstr "êµ¬ë¦„ì€ í´ë¼ì´ì–¸íŠ¸ì— ì¸¡ë©´ 효과." #: src/settings_translation_file.cpp msgid "Clouds in menu" -msgstr "" +msgstr "ë©”ë‰´ì— êµ¬ë¦„" #: src/settings_translation_file.cpp msgid "Colored fog" @@ -1630,11 +1868,11 @@ msgstr "ëª…ë ¹ 키" #: src/settings_translation_file.cpp msgid "Connect glass" -msgstr "" +msgstr "ìœ ë¦¬ë¥¼ ì—°ê²°" #: src/settings_translation_file.cpp msgid "Connect to external media server" -msgstr "" +msgstr "외부 미디어 ì„œë²„ì— ì—°ê²°" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." @@ -1642,15 +1880,20 @@ 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 +#, fuzzy +msgid "Console height" +msgstr "콘솔 키" #: src/settings_translation_file.cpp msgid "Console key" -msgstr "" +msgstr "콘솔 키" #: src/settings_translation_file.cpp msgid "Continuous forward" @@ -1662,7 +1905,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Controls" -msgstr "" +msgstr "컨트롤" #: src/settings_translation_file.cpp msgid "" @@ -1670,24 +1913,26 @@ msgid "" "Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays " "unchanged." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" +"ë‚®/ë°¤ ì£¼ê¸°ì˜ ê¸¸ì´ë¥¼ 컨트롤.\n" +"예: 72 = 20 ë¶„, 360 = 4 ë¶„, 1 = 24 시간, 0 = ë‚®/ë°¤/바뀌지 ì•Šê³ ê·¸ëŒ€ë¡œ." #: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." -msgstr "" +msgstr "호수 ì¹¨í•˜ì˜ ê²½ì‚¬/깊ì´ë¥¼ ì¡°ì ˆ." #: src/settings_translation_file.cpp msgid "Controls steepness/height of hills." +msgstr "ì‚°ì˜ ë†’ì´/경사를 ì¡°ì ˆ." + +#: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." -msgstr "" +msgstr "í„°ë„ ë„ˆë¹„ë¥¼ ì¡°ì ˆ, ìž‘ì€ ìˆ˜ì¹˜ëŠ” ë„“ì€ í„°ë„ì„ ë§Œë“니다." #: src/settings_translation_file.cpp msgid "Crash message" @@ -1698,32 +1943,41 @@ msgid "" "Creates unpredictable lava features in caves.\n" "These can make mining difficult. Zero disables them. (0-10)" msgstr "" +"ì˜ˆì¸¡í• ìˆ˜ 없는 ìš©ì•”ì„ ë™êµ´ ì•ˆì— ë§Œë“니다.\n" +"ì´ê²ƒì€ ì±„ê´‘ì„ ì–´ë µê²Œ 만들 수 있습니다. 0ì€ ë‚˜íƒ€ë‚˜ì§€ 않습니다. (0-10)" #: src/settings_translation_file.cpp msgid "" "Creates unpredictable water features in caves.\n" "These can make mining difficult. Zero disables them. (0-10)" msgstr "" +"ì˜ˆì¸¡í• ìˆ˜ 없는 ë¬¼ì„ ë™êµ´ ì•ˆì— ë§Œë“니다.\n" +"ì´ê²ƒì€ ì±„ê´‘ì„ ì–´ë µê²Œ 만들 수 있습니다. 0ì€ ë‚˜íƒ€ë‚˜ì§€ 않습니다. (0-10)" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "만들기" #: src/settings_translation_file.cpp msgid "Crosshair alpha" -msgstr "" +msgstr "ì‹ìžì„ 투명ë„" #: src/settings_translation_file.cpp msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "" +msgstr "ì‹ìžì„ íˆ¬ëª…ë„ (불투명 함, 0ê³¼ 255 사ì´)." #: src/settings_translation_file.cpp msgid "Crosshair color" -msgstr "" +msgstr "ì‹ìžì„ 색" #: src/settings_translation_file.cpp msgid "Crosshair color (R,G,B)." -msgstr "" +msgstr "ì‹ìžì„ 색 (빨, ì´ˆ, 파)." #: src/settings_translation_file.cpp msgid "Crouch speed" -msgstr "" +msgstr "ìˆê·¸ë¦¬ê³ 앉기 ì†ë„" #: src/settings_translation_file.cpp msgid "DPI" @@ -1735,11 +1989,16 @@ msgstr "ë°ë¯¸ì§€" #: src/settings_translation_file.cpp msgid "Debug info toggle key" -msgstr "" +msgstr "디버그 ì •ë³´ í† ê¸€ 키" #: src/settings_translation_file.cpp msgid "Debug log level" -msgstr "" +msgstr "디버그 로그 수준" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "HUD í† ê¸€ 키" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -1747,7 +2006,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Default acceleration" -msgstr "" +msgstr "기본 ê°€ì†" #: src/settings_translation_file.cpp msgid "Default game" @@ -1772,7 +2031,7 @@ msgstr "기본 권한" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "기본 ë³´ê³ ì„œ 형ì‹" #: src/settings_translation_file.cpp msgid "" @@ -1781,6 +2040,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "" "Defines sampling step of texture.\n" @@ -1795,12 +2089,23 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "블ë¡ì— 최대 í”Œë ˆì´ì–´ ì „ì†¡ 거리를 ì •ì˜ í•©ë‹ˆë‹¤ (0 = ë¬´ì œí•œ)." #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "ê±´ì¶• 후 ë¸”ë¡ ì „ì†¡ 지연" #: src/settings_translation_file.cpp +#, fuzzy msgid "Delay showing tooltips, stated in milliseconds." -msgstr "" +msgstr "ë„구 설명 표시 지연, 1000ë¶„ì˜ 1ì´ˆ." #: src/settings_translation_file.cpp msgid "Deprecated Lua API handling" @@ -1808,40 +2113,48 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Depth below which you'll find large caves." -msgstr "" +msgstr "ê¹Šì´ ë‚´ë ¤ê°€ë©´ ë‹¹ì‹ ì€ í° ë™êµ´ì„ ë°œê²¬í• ê²ƒìž…ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "Depth below which you'll find massive caves." -msgstr "" +msgstr "ê¹Šì´ ë‚´ë ¤ê°€ë©´ ë‹¹ì‹ ì€ ê±°ëŒ€í•œ ë™êµ´ì„ ë°œê²¬í• ê²ƒìž…ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "Descending speed" -msgstr "" +msgstr "하강 ì†ë„" #: src/settings_translation_file.cpp msgid "" "Description of server, to be displayed when players join and in the " "serverlist." -msgstr "" +msgstr "í”Œë ˆì´ì–´ê°€ 서버리스트ì—서 ì¡°ì¸ í• ë•Œ ì„œë²„ì˜ ì„¤ëª…ì´ ë³´ì—¬ì§ˆ 것입니다." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" #: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "ë¸”ë¡ ì• ë‹ˆë©”ì´ì…˜ 비ë™ê¸°í™”" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "ìž…ìž íš¨ê³¼" + +#: src/settings_translation_file.cpp msgid "Disable anticheat" -msgstr "" +msgstr "Anticheat를 사용 안함" #: src/settings_translation_file.cpp msgid "Disable escape sequences" -msgstr "" +msgstr "ì´ìŠ¤ì¼€ì´í”„ 시퀀스 사용 안함" #: src/settings_translation_file.cpp msgid "" @@ -1850,6 +2163,9 @@ msgid "" "disable\n" "the escape sequences generated by mods." msgstr "" +"ì´ìŠ¤ì¼€ì´í”„ 시퀀스 사용 안함, 예: 채팅 채색.\n" +"만약 ë‹¹ì‹ ì´ pre-0.4.14í´ë¼ì´ì–¸íŠ¸ë¥¼ 사용하길 ì›í•˜ê±°ë‚˜ ëª¨ë“œì— ì˜í•´ ìƒì„±ë˜ëŠ” ì´" +"스케ì´í”„ 시퀀스를 사용하지 않길 ì›í•œë‹¤ë©´ ì´ê²ƒì„ 사용하세요." #: src/settings_translation_file.cpp msgid "Disallow empty passwords" @@ -1861,7 +2177,7 @@ msgstr "ë„ë©”ì¸ ì„œë²„ì˜ ì´ë¦„ì€ ì„œë²„ë¦¬ìŠ¤íŠ¸ì— í‘œì‹œ ë©ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "Double tap jump for fly" -msgstr "" +msgstr "ì 프를 비행으로 ë‘번 íƒ" #: src/settings_translation_file.cpp msgid "Double-tapping the jump key toggles fly mode." @@ -1873,27 +2189,41 @@ msgstr "ì•„ì´í…œ ë“œëž í‚¤" #: src/settings_translation_file.cpp msgid "Dump the mapgen debug infos." -msgstr "" +msgstr "Mapgen 디버그 ì •ë³´ë¥¼ ë¤í”„ 합니다." #: src/settings_translation_file.cpp msgid "Enable Joysticks" msgstr "ì¡°ì´ìŠ¤í‹± ì ìš©" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "VBO ì ìš©" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "보안 모드 ì ìš©" #: src/settings_translation_file.cpp msgid "Enable players getting damage and dying." -msgstr "í”Œë ˆì´ì–´ëŠ” ë°ë¯¸ì§€ë¥¼ 받거나 ì£½ì„ ìˆ˜ 있습니다." +msgstr "í”Œë ˆì´ì–´ëŠ” ë°ë¯¸ì§€ë¥¼ ë°›ê³ ì£½ì„ ìˆ˜ 있습니다." #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." -msgstr "" +msgstr "ëžœë¤ ì‚¬ìš©ìž ìž…ë ¥ (í…ŒìŠ¤íŠ¸ì— ì‚¬ìš©)를 사용 합니다." #: src/settings_translation_file.cpp msgid "" @@ -1909,6 +2239,9 @@ msgid "" "to new servers, but they may not support all new features that you are " "expecting." msgstr "" +"ì˜¤ëž˜ëœ í´ë¼ì´ì–¸íЏ ì—°ê²°ì„ í—ˆë½í•˜ì§€ ì•ŠëŠ”ê²ƒì„ ì‚¬ìš©.\n" +"ì´ì „ í´ë¼ì´ì–¸íŠ¸ëŠ” 서버ì—서 ë‹¹ì‹ ì´ ê¸°ëŒ€í•˜ëŠ” 새로운 íŠ¹ì§•ë“¤ì„ ì§€ì›í•˜ì§€ 않는다면 " +"새로운 서버로 ì—°ê²°í• ë•Œ ì¶©ëŒí•˜ì§€ ì•Šì„ ê²ƒìž…ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "" @@ -1917,6 +2250,22 @@ msgid "" "textures)\n" "when connecting to the server." msgstr "" +"(만약 서버ì—서 ì œê³µí•œë‹¤ë©´)ì›ê²© 미디어 서버 사용 가능.\n" +"ì›ê²© ì„œë²„ë“¤ì€ ì„œë²„ì— ì—°ê²°í• ë•Œ 매우 ë¹ ë¥´ê²Œ 미디어를 다운로드 í• ìˆ˜ 있ë„ë¡ ì œ" +"공합니다.(예: í…스처)" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Enable view bobbing" +msgstr "보기 만료" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"화면 í”들림 멀티플ë¼ì´ì–´\n" +"예 : 0ì€ í™”ë©´ í”들림 ì—†ìŒ; 1.0ì€ ë…¸ë©€; 2.0ì€ ë”블." #: src/settings_translation_file.cpp msgid "" @@ -1924,6 +2273,9 @@ msgid "" "to IPv6 clients, depending on system configuration.\n" "Ignored if bind_address is set." msgstr "" +"IPv6 서버를 실행 활성화/비활성화. IPv6 서버는 IPv6 í´ë¼ì´ì–¸íЏ 시스템 êµ¬ì„±ì— " +"ë”°ë¼ ì œí•œ ë 수 있습니다.\n" +"만약 Bind_addressê°€ ì„¤ì • ëœ ê²½ìš° 무시 ë©ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." @@ -1936,7 +2288,8 @@ msgid "" "or need to be auto-generated.\n" "Requires shaders to be enabled." msgstr "" -"í…ìŠ¤ì²˜ì— bumpmappingì„ í• ìˆ˜ 있습니다. Normalmaps는 í…ìŠ¤ì³ íŒ©ì—서 받거나 ìžë™ ìƒì„±ë 필요가 있습니다.\n" +"í…ìŠ¤ì²˜ì— bumpmappingì„ í• ìˆ˜ 있습니다. Normalmaps는 í…ìŠ¤ì³ íŒ©ì—서 받거나 ìž" +"ë™ ìƒì„±ë 필요가 있습니다.\n" "ì‰ì´ë”를 활성화 해야 합니다." #: src/settings_translation_file.cpp @@ -1965,10 +2318,16 @@ msgid "" "Enables parallax occlusion mapping.\n" "Requires shaders to be enabled." msgstr "" +"시차 êµí•© 맵핑 ì ìš©.\n" +"ì‰ì´ë”를 활성화 해야 합니다." + +#: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" -msgstr "" +msgstr "엔진 프로 파ì¼ë§ ë°ì´í„° ì¶œë ¥ 간격" #: src/settings_translation_file.cpp msgid "Entity methods" @@ -1982,88 +2341,101 @@ msgstr "" #: src/settings_translation_file.cpp msgid "FPS in pause menu" -msgstr "" +msgstr "메뉴 ì¼ì‹œì •ì§€ì—서 FPS" #: src/settings_translation_file.cpp msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Fall bobbing factor" +msgstr "낙하 í”들림" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Fallback font" msgstr "yes" #: src/settings_translation_file.cpp msgid "Fallback font shadow" -msgstr "" +msgstr "대체 글꼴 그림ìž" #: src/settings_translation_file.cpp msgid "Fallback font shadow alpha" -msgstr "" +msgstr "대체 글꼴 ê·¸ë¦¼ìž íˆ¬ëª…ë„" #: src/settings_translation_file.cpp msgid "Fallback font size" -msgstr "" +msgstr "대체 글꼴 í¬ê¸°" #: src/settings_translation_file.cpp msgid "Fast key" -msgstr "" +msgstr "ë¹ ë¥¸ 키" #: src/settings_translation_file.cpp msgid "Fast mode acceleration" -msgstr "" +msgstr "ê³ ì† ëª¨ë“œ ê°€ì†" #: src/settings_translation_file.cpp msgid "Fast mode speed" -msgstr "" +msgstr "ê³ ì† ëª¨ë“œ ì†ë„" #: src/settings_translation_file.cpp msgid "Fast movement" -msgstr "" +msgstr "ë¹ ë¥¸ ì´ë™" #: src/settings_translation_file.cpp msgid "" "Fast movement (via use key).\n" "This requires the \"fast\" privilege on the server." msgstr "" +"ë¹ ë¥¸ ì´ë™(키 사용).\n" +"서버ì—서 \"ë¹ ë¥¸\"íŠ¹ê¶Œì´ ìš”êµ¬ë©ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "Field of view" -msgstr "" +msgstr "시야" #: src/settings_translation_file.cpp msgid "Field of view for zoom" -msgstr "" +msgstr "확대/ì¶•ì†Œì— ëŒ€í•œ 시야" #: src/settings_translation_file.cpp msgid "Field of view in degrees." -msgstr "" +msgstr "ê°ë„ì— ëŒ€í•œ 시야." #: src/settings_translation_file.cpp msgid "" "Field of view while zooming in degrees.\n" "This requires the \"zoom\" privilege on the server." msgstr "" +"확대/ì¶•ì†Œì— ëŒ€í•œ 시야 \n" +"서버ì—서 \"확대/축소\" ê¶Œí•œì´ í•„ìš”í•©ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "" "File in client/serverlist/ that contains your favorite servers displayed in " "the Multiplayer Tab." -msgstr "" +msgstr "í´ë¼ì´ì–¸íЏ/서버리스트/ë©€í‹°í”Œë ˆì´ì–´ íƒì—서 ë‹¹ì‹ ì´ ê°€ìž¥ 좋아하는 서버" #: src/settings_translation_file.cpp msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp -msgid "Filmic tone mapping" +msgid "Filler depth noise" msgstr "" #: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "필름 형 톤 맵핑" + +#: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" "which PNG optimizers usually discard, sometimes resulting in a dark or\n" @@ -2076,10 +2448,35 @@ msgid "Filtering" msgstr "í•„í„°ë§" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "ìˆ˜ì •ëœ ë§µ 시드" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Floatland level" +msgstr "ë¬¼ì˜ ë†’ì´" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "비행 키" @@ -2092,6 +2489,10 @@ msgid "Fog" msgstr "안개" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "안개 스위치" @@ -2105,15 +2506,15 @@ msgstr "글꼴 그림ìž" #: src/settings_translation_file.cpp msgid "Font shadow alpha" -msgstr "" +msgstr "글꼴 ê·¸ë¦¼ìž íˆ¬ëª…ë„" #: src/settings_translation_file.cpp msgid "Font shadow alpha (opaqueness, between 0 and 255)." -msgstr "" +msgstr "글꼴 ê·¸ë¦¼ìž íˆ¬ëª…ë„ (불투명 함, 0ê³¼ 255 사ì´)." #: src/settings_translation_file.cpp msgid "Font shadow offset, if 0 then shadow will not be drawn." -msgstr "" +msgstr "글꼴 ê·¸ë¦¼ìž ì˜¤í”„ì…‹, 만약 0 ì´ë©´ 그림ìžëŠ” 나타나지 ì•Šì„ ê²ƒìž…ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "Font size" @@ -2121,17 +2522,25 @@ msgstr "글꼴 í¬ê¸°" #: src/settings_translation_file.cpp msgid "Format of screenshots." -msgstr "" +msgstr "Screenshotsì˜ í˜•ì‹ìž…니다." #: src/settings_translation_file.cpp msgid "Forward key" +msgstr "앞으로 키" + +#: src/settings_translation_file.cpp +msgid "Fractal type" msgstr "" #: src/settings_translation_file.cpp -msgid "Freetype fonts" +msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" #: src/settings_translation_file.cpp +msgid "Freetype fonts" +msgstr "Freetype 글꼴" + +#: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " "nodes)." @@ -2153,7 +2562,7 @@ msgstr "ì „ì²´ 화면" #: src/settings_translation_file.cpp msgid "Full screen BPP" -msgstr "" +msgstr "ì „ì²´ 화면 BPP" #: src/settings_translation_file.cpp msgid "Fullscreen mode." @@ -2161,15 +2570,15 @@ msgstr "ì „ì²´ 화면 모드." #: src/settings_translation_file.cpp msgid "GUI scaling" -msgstr "" +msgstr "GUI í¬ê¸° ì¡°ì •" #: src/settings_translation_file.cpp msgid "GUI scaling filter" -msgstr "" +msgstr "GUI í¬ê¸° ì¡°ì • í•„í„°" #: src/settings_translation_file.cpp msgid "GUI scaling filter txr2img" -msgstr "" +msgstr "GUI í¬ê¸° ì¡°ì • í•„í„° txr2img" #: src/settings_translation_file.cpp msgid "Gamma" @@ -2185,7 +2594,7 @@ msgstr "Normalmaps ìƒì„±" #: src/settings_translation_file.cpp msgid "Global callbacks" -msgstr "" +msgstr "글로벌 콜백" #: src/settings_translation_file.cpp msgid "" @@ -2203,17 +2612,26 @@ msgstr "그래픽" #: src/settings_translation_file.cpp msgid "Gravity" -msgstr "" +msgstr "ì¤‘ë ¥" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "ë¬¼ì˜ ë†’ì´" #: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "HTTP 모드" #: src/settings_translation_file.cpp -msgid "HUD toggle key" +msgid "HUD scale factor" msgstr "" #: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "HUD í† ê¸€ 키" + +#: src/settings_translation_file.cpp msgid "" "Handling for deprecated lua api calls:\n" "- legacy: (try to) mimic old behaviour (default for release).\n" @@ -2231,22 +2649,56 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "Heat blend noise" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "ë™êµ´ ìž¡ìŒ #1" + +#: src/settings_translation_file.cpp +msgid "Height component of the initial window size." +msgstr "초기 ì°½ í¬ê¸°ì˜ ë†’ì´ êµ¬ì„± 요소입니다." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "오른쪽 ì°½" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "ì„œë²„ì˜ í™ˆíŽ˜ì´ì§€ëŠ” 서버 ë¦¬ìŠ¤íŠ¸ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "얼마나 ê°•ì„ ê¹Šê²Œ 만들건가요" @@ -2268,6 +2720,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2293,6 +2757,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2312,7 +2785,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "" +msgstr "ì ìš©í• ê²½ìš°, ë©€í‹°í”Œë ˆì´ì–´ì—서 치트 방지를 í•´ì œí•©ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "" @@ -2322,7 +2795,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "If enabled, new players cannot join with an empty password." -msgstr "" +msgstr "ì ìš©í• ê²½ìš°, 새로운 í”Œë ˆì´ì–´ëŠ” 빈 암호로 가입 í• ìˆ˜ 없습니다." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "If enabled, show the server status message on player connection." +msgstr "연결하는 í”Œë ˆì´ì–´ì—게 보여지는 메시지." #: src/settings_translation_file.cpp msgid "" @@ -2333,11 +2811,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "If this is set, players will always (re)spawn at the given position." -msgstr "" +msgstr "ì ìš©í• ê²½ìš°, í”Œë ˆì´ì–´ëŠ” ì§€ì •ëœ ìœ„ì¹˜ì— í•ìƒ ìŠ¤í° ë 것입니다." #: src/settings_translation_file.cpp msgid "Ignore world errors" -msgstr "" +msgstr "월드 ì—러 무시" #: src/settings_translation_file.cpp msgid "In-Game" @@ -2353,6 +2831,16 @@ msgid "In-game chat console background color (R,G,B)." msgstr "게임 ë‚´ì—서 채팅 콘솔 ë°°ê²½ ìƒ‰ìƒ (빨,ì´ˆ,파)." #: src/settings_translation_file.cpp +#, fuzzy +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "게임 ë‚´ì—서 채팅 콘솔 ë°°ê²½ 알파 (불투명 함, 0와 255 사ì´)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "콘솔 키" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2395,8 +2883,13 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "ì¸ë²¤í† 리 키" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" -msgstr "" +msgstr "ì¸ë²¤í† 리 ì•„ì´í…œ ì• ë‹ˆë©”ì´ì…˜" #: src/settings_translation_file.cpp msgid "Inventory key" @@ -2404,7 +2897,7 @@ msgstr "ì¸ë²¤í† 리 키" #: src/settings_translation_file.cpp msgid "Invert mouse" -msgstr "" +msgstr "마우스 ë°˜ì „" #: src/settings_translation_file.cpp msgid "Invert vertical mouse movement." @@ -2415,12 +2908,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2458,6 +2963,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "ì 프 키" @@ -2472,8 +2993,19 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "보여지는 범위 ê°ì†Œì— 대한 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"보여지는 범위 ê°ì†Œì— 대한 키입니다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2482,8 +3014,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "현재 ì„ íƒëœ ì•„ì´í…œ 드ë¡ì— 대한 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2492,8 +3024,19 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "보여지는 범위 ì¦ê°€ì— 대한 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"보여지는 범위 ì¦ê°€ì— 대한 키입니다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2502,8 +3045,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "ì 프키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2512,8 +3055,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "ê³ ì† ëª¨ë“œì—서 ë¹ ë¥´ê²Œ ì´ë™í•˜ëŠ” 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2522,8 +3065,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "í”Œë ˆì´ì–´ê°€ 뒤쪽으로 움ì§ì´ëŠ” 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2532,8 +3075,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "í”Œë ˆì´ì–´ê°€ 앞으로 움ì§ì´ëŠ” 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2542,8 +3085,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "í”Œë ˆì´ì–´ê°€ 왼쪽으로 움ì§ì´ëŠ” 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2552,8 +3095,19 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "í”Œë ˆì´ì–´ê°€ 오른쪽으로 움ì§ì´ëŠ” 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ì 프키입니다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2562,8 +3116,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "채팅 ì°½ì„ ì—¬ëŠ” 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2572,8 +3126,19 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "ëª…ë ¹ì–´ë¥¼ ìž…ë ¥í•˜ê¸° 위해 ì±„íŒ…ì°½ì„ ì—¬ëŠ” 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ëª…ë ¹ì–´ë¥¼ ìž…ë ¥í•˜ê¸° 위해 ì±„íŒ…ì°½ì„ ì—¬ëŠ” 키입니다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2582,8 +3147,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "ì±„íŒ…ì°½ì„ ì—¬ëŠ” 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2592,8 +3157,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "ì¸ë²¤í† 리를 여는 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2602,8 +3167,30 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "디버그 무ë”기(stacks) ì¸ì‡„ 키. ê°œë°œì„ ìœ„í•´ 사용ë¨.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ì¸ë²¤í† 리를 여는 키입니다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ì¸ë²¤í† 리를 여는 키입니다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2614,9 +3201,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "살금살금걷기 키입니다.\n" -"만약 aux1_descends를 ì‚¬ìš©í• ìˆ˜ 없는 ê²½ìš°ì— ë¬¼ì—서 ë‚´ë ¤ê°€ê±°ë‚˜ 올ë¼ì˜¬ 수 있습니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"만약 aux1_descends를 ì‚¬ìš©í• ìˆ˜ 없는 ê²½ìš°ì— ë¬¼ì—서 ë‚´ë ¤ê°€ê±°ë‚˜ 올ë¼ì˜¬ 수 있습니" +"다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2625,8 +3213,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "1ì¸ì¹ì—서 3ì¸ì¹ê°„ ì¹´ë©”ë¼ ì „í™˜í‚¤ìž…ë‹ˆë‹¤.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2635,8 +3223,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "스í¬ë¦°ìƒ·í‚¤ìž…니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2652,8 +3240,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "시네마틱 모드 스위치 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2662,8 +3250,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "미니 ë§µ 표시 ì„¤ì •/í•´ì œ 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2672,8 +3260,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "ê³ ì† ëª¨ë“œ 스위치 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2682,8 +3270,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "비행 모드 스위치 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2692,8 +3280,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "ìžìœ 시ì 모드 스위치 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2702,8 +3290,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "ì¹´ë©”ë¼ ì—…ë°ì´íЏ 스위치 키입니다. ê°œë°œì„ ìœ„í•´ì„œë§Œ 사용ë©ë‹ˆë‹¤. \n" -"참조 http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e" -"3da1b0edf72eb3" +"참조 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2712,8 +3300,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "디버그 ì •ë³´ 표시 스위치 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2722,8 +3310,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "HUD 표시 스위치 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2732,8 +3320,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "채팅 스위치 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2742,8 +3330,19 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "안개 스위치 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"채팅 스위치 키입니다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "" @@ -2759,11 +3358,30 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "ì œí•œì—†ì´ ë³´ì—¬ì§€ëŠ” ë²”ìœ„ì— ëŒ€í•œ 스위치 키입니다.\n" -"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#" -"a54da2a0e231901735e3da1b0edf72eb3 참조" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ì 프키입니다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp msgid "Key use for climbing/descending" +msgstr "오르기/내리기 키사용" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" msgstr "" #: src/settings_translation_file.cpp @@ -2775,6 +3393,11 @@ msgid "Large cave depth" msgstr "í° ë™êµ´ 깊ì´" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "콘솔 키" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2835,6 +3458,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2907,6 +3537,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2934,9 +3568,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2945,7 +3588,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2957,35 +3601,32 @@ msgstr "ë§µ ìƒì„± ì œí•œ" #: src/settings_translation_file.cpp msgid "Map save interval" -msgstr "" +msgstr "ë§µ ì €ìž¥ 간격" #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "" +#, fuzzy +msgid "Mapblock mesh generation delay" +msgstr "ë§µ ìƒì„± ì œí•œ" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" +msgid "Mapgen Valleys" msgstr "" #: src/settings_translation_file.cpp msgid "Mapgen debug" -msgstr "" +msgstr "ë§µì 디버그" #: src/settings_translation_file.cpp msgid "Mapgen flags" @@ -2996,51 +3637,7 @@ msgid "Mapgen flat" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" +msgid "Mapgen flat specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3048,66 +3645,6 @@ msgid "Mapgen fractal" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "" @@ -3116,27 +3653,7 @@ msgid "Mapgen v5" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Mapgen v5 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3144,59 +3661,7 @@ msgid "Mapgen v6" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3204,55 +3669,7 @@ msgid "Mapgen v7" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3309,7 +3726,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Maximum number of blocks that are simultaneously sent per client." -msgstr "" +msgstr "í´ë¼ì´ì–¸íЏ 당 ë™ì‹œì— ì „ì†¡ë˜ëŠ” 블ë¡ì˜ 최대 수입니다." #: src/settings_translation_file.cpp msgid "Maximum number of blocks that can be queued for loading." @@ -3377,6 +3794,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Maximum time in ms a file download (e.g. a mod download) may take." msgstr "" +"ms ì—서 파ì¼ì„ 다운로드하면 (예 : 모드 다운로드) 최대 ì‹œê°„ì´ ê±¸ë¦´ 수 있습니" +"다." #: src/settings_translation_file.cpp msgid "Maximum users" @@ -3392,15 +3811,15 @@ msgstr "메쉬 ìºì‹œ" #: src/settings_translation_file.cpp msgid "Message of the day" -msgstr "" +msgstr "메시지" #: src/settings_translation_file.cpp msgid "Message of the day displayed to players connecting." -msgstr "" +msgstr "연결하는 í”Œë ˆì´ì–´ì—게 보여지는 메시지." #: src/settings_translation_file.cpp msgid "Method used to highlight selected object." -msgstr "" +msgstr "ì„ íƒí•œ 개체를 ê°•ì¡° 표시 하는 ë° ì‚¬ìš© 하는 방법입니다." #: src/settings_translation_file.cpp msgid "Minimap" @@ -3424,6 +3843,10 @@ msgid "Mipmapping" msgstr "밉매핑(Mipmapping)" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "Modstore ì •ë³´ URL" @@ -3444,11 +3867,23 @@ msgid "Monospace font size" msgstr "ê³ ì • í 글꼴 í¬ê¸°" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "마우스 ê°ë„" #: src/settings_translation_file.cpp msgid "Mouse sensitivity multiplier." +msgstr "마우스 ê°ë„ 멀티플ë¼ì´ì–´." + +#: src/settings_translation_file.cpp +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp @@ -3456,12 +3891,13 @@ msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" +"낙하 í”들림 멀티플ë¼ì´ì–´\n" +"예 : 0ì€ í™”ë©´ í”들림 ì—†ìŒ; 1.0ì€ ë…¸ë§; 2.0ì€ ë”블." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" +#, fuzzy +msgid "Mute key" +msgstr "키 사용" #: src/settings_translation_file.cpp #, fuzzy @@ -3478,6 +3914,9 @@ msgid "" "When running a server, clients connecting with this name are admins.\n" "When starting from the main menu, this is overridden." msgstr "" +"í”Œë ˆì´ì–´ì˜ ì´ë¦„.\n" +"서버가 ì—´ë ¤ ìžˆì„ ë•Œ ì´ ì´ë¦„으로 ì—°ê²°ë˜ëŠ” í´ë¼ì´ì–¸íŠ¸ëŠ” 관리ìžìž…니다.\n" +"ë©”ì¸ ë©”ë‰´ì—서 ì‹œìž‘í• ë•Œ ì´ê²ƒì€ ìž¬ì •ì˜ë©ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "" @@ -3515,10 +3954,6 @@ msgid "NodeTimer interval" msgstr "NodeTimer 간격" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "소리" @@ -3552,13 +3987,21 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Number of parallax occlusion iterations." +msgstr "시차 êµí•© ë°˜ë³µì˜ ìˆ˜" + +#: src/settings_translation_file.cpp +msgid "Offset" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgid "Opaque liquids" msgstr "" #: src/settings_translation_file.cpp +msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgstr "ì¼ë°˜ì ì¸ ê·œëª¨/2ì˜ ì‹œì°¨ êµí•© íš¨ê³¼ì˜ ì „ë°˜ì ì¸ ë°”ì´ì–´ìФ." + +#: src/settings_translation_file.cpp #, fuzzy msgid "Overall scale of parallax occlusion effect." msgstr "시차 êµí•© íš¨ê³¼ì˜ ì „ì²´ 규모" @@ -3574,11 +4017,11 @@ msgstr "시차 êµí•© 규모" #: src/settings_translation_file.cpp msgid "Parallax occlusion bias" -msgstr "" +msgstr "시차 êµí•© ë°”ì´ì–´ìФ" #: src/settings_translation_file.cpp msgid "Parallax occlusion iterations" -msgstr "" +msgstr "시차 êµí•© 반복" #: src/settings_translation_file.cpp #, fuzzy @@ -3599,6 +4042,12 @@ msgid "Path to save screenshots at." msgstr "스í¬ë¦°ìƒ· ì €ìž¥ 경로입니다." #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "í…스처 ë””ë ‰í„°ë¦¬ 경로입니다. ëª¨ë“ í…스처는 여기ì—서 ë¨¼ì € 검색 ë©ë‹ˆë‹¤." @@ -3620,7 +4069,7 @@ msgstr "í”Œë ˆì´ì–´ ì´ë¦„" #: src/settings_translation_file.cpp msgid "Player transfer distance" -msgstr "" +msgstr "í”Œë ˆì´ì–´ ì „ì†¡ 거리" #: src/settings_translation_file.cpp msgid "Player versus Player" @@ -3645,10 +4094,12 @@ msgid "" "Print the engine's profiling data in regular intervals (in seconds). 0 = " "disable. Useful for developers." msgstr "" +"ì—”ì§„ì˜ í”„ë¡œíŒŒì¼ë§ ë°ì´í„°ë¥¼ 규칙ì ì¸ ê°„ê²©(초단위)으로 ì¶œë ¥í•©ë‹ˆë‹¤.\n" +"0 = 사용안함. 개발ìžë“¤ì—게 ìœ ìš©í•©ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "Privileges that players with basic_privs can grant" -msgstr "" +msgstr "í”Œë ˆì´ì–´ì™€ 기본 íŠ¹ê¶Œì„ ë¶€ì—¬í• ìˆ˜ 있는 권한" #: src/settings_translation_file.cpp msgid "Profiler" @@ -3669,6 +4120,8 @@ msgid "" "Values larger than 26 will start to produce sharp cutoffs at cloud area " "corners." msgstr "" +"64node 구름 사ê°í˜•ì˜ì—ì˜ ë°˜ì§€ë¦„.\n" +"26보다 í° ìˆ˜ì¹˜ë“¤ì€ êµ¬ë¦„ì„ ì„ ëª…í•˜ê²Œ ë§Œë“¤ê³ ëª¨ì„œë¦¬ë¥¼ 잘ë¼ë‚¼ 것입니다." #: src/settings_translation_file.cpp #, fuzzy @@ -3703,6 +4156,15 @@ msgid "Report path" msgstr "ë³´ê³ ì„œ 경로" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ridge noise" +msgstr "ê°• 소리" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "오른쪽 키" @@ -3736,6 +4198,10 @@ msgid "Round minimap" msgstr "ì›í˜• 미니맵" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Save the map received by the client on disk." msgstr "디스í¬ì— í´ë¼ì´ì–¸íЏì—서 ë°›ì€ ë§µì„ ì €ìž¥ 합니다." @@ -3745,6 +4211,10 @@ msgid "Saving map received from server" msgstr "서버로부터 ë°›ì€ ë§µì„ ì €ìž¥" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3788,6 +4258,15 @@ msgstr "" "기본 í’ˆì§ˆì€ 0ì„ ì‚¬ìš© 합니다." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "ë™êµ´ ìž¡ìŒ #1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "보안" @@ -3832,6 +4311,10 @@ msgid "Server port" msgstr "서버 í¬íЏ" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "서버리스트 URL" @@ -3873,15 +4356,25 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Shader path" +msgstr "ì‰ì´ë”" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" -"ì‰ì´ë”는 í™•ìž¥ëœ ì‹œê° íš¨ê³¼ë¥¼ ì œê³µí•©ë‹ˆë‹¤ 그래서 비디오 ì¹´ë“œì˜ ì„±ëŠ¥ì´ ì¦ê°€ë 것입니다.\n" +"ì‰ì´ë”는 í™•ìž¥ëœ ì‹œê° íš¨ê³¼ë¥¼ ì œê³µí•©ë‹ˆë‹¤ 그래서 비디오 ì¹´ë“œì˜ ì„±ëŠ¥ì´ ì¦ê°€ë 것" +"입니다.\n" "Thy only work with the OpenGL video backend." #: src/settings_translation_file.cpp +msgid "Shadow limit" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." msgstr "미니맵 모양. 활성화 = ì›í˜•, 비활성화 = ì •ì‚¬ê°í˜•." @@ -3902,6 +4395,17 @@ msgstr "서버닫힘 메시지" msgid "" "Size of chunks to be generated at once by mapgen, stated in mapblocks (16 " "nodes)." +msgstr "ì •í•´ì§„ 맵블ëŸ(16 nodes), ë§µì ì— ì˜í•´ í•œë²ˆì— ìƒì„¤ë˜ì–´ì§ˆ ì–‘ì˜ í¬ê¸°." + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" msgstr "" #: src/settings_translation_file.cpp @@ -3910,6 +4414,14 @@ msgid "Slope and fill work together to modify the heights" msgstr "ë†’ì´ ìˆ˜ì •ì„ ìœ„í•´ 기울기와 채우기를 함께 작용합니다" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "부드러운 조명효과" @@ -3919,12 +4431,15 @@ msgid "" "Smooths camera when looking around. Also called look or mouse smoothing.\n" "Useful for recording videos." msgstr "" -"주위를 ëŒì•„ë³¼ 때 ì¹´ë©”ë¼ë¥¼ 부드럽게 í•´ì¤ë‹ˆë‹¤. 보기 ë˜ëŠ” 부드러운 마우스ë¼ê³ ë„ í•©ë‹ˆë‹¤.\n" +"주위를 ëŒì•„ë³¼ 때 ì¹´ë©”ë¼ë¥¼ 부드럽게 í•´ì¤ë‹ˆë‹¤. 보기 ë˜ëŠ” 부드러운 마우스ë¼ê³ ë„ " +"합니다.\n" "비디오를 ë…¹í™”í•˜ê¸°ì— ìœ ìš©í•©ë‹ˆë‹¤." #: src/settings_translation_file.cpp msgid "Smooths rotation of camera in cinematic mode. 0 to disable." -msgstr "시네마틱 모드ì—서 ì¹´ë©”ë¼ì˜ íšŒì „ì„ ë§¤ë„럽게 ë§Œë“니다. 사용 하지 ì•Šìœ¼ë ¤ë©´ 0입니다." +msgstr "" +"시네마틱 모드ì—서 ì¹´ë©”ë¼ì˜ íšŒì „ì„ ë§¤ë„럽게 ë§Œë“니다. 사용 하지 ì•Šìœ¼ë ¤ë©´ 0입니" +"다." #: src/settings_translation_file.cpp msgid "Smooths rotation of camera. 0 to disable." @@ -3951,10 +4466,18 @@ msgid "Static spawnpoint" msgstr "ê³ ì •ëœ ìŠ¤í°í¬ì¸íЏ" #: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." +msgid "Status message on connection" msgstr "" #: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of generated normalmaps." +msgstr "ìžë™ìœ¼ë¡œ ìƒì„±ë˜ëŠ” ë…¸ë©€ë§µì˜ ê°•ë„." + +#: src/settings_translation_file.cpp msgid "Strength of parallax." msgstr "" @@ -3971,10 +4494,33 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "지형 높ì´" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain base noise" +msgstr "지형 높ì´" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain higher noise" +msgstr "지형 높ì´" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain noise" +msgstr "지형 높ì´" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3989,6 +4535,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "í…스처 경로" @@ -4009,8 +4559,11 @@ msgstr "í™ì´ë‚˜ 다른 ê²ƒì˜ ê¹Šì´" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -4022,6 +4575,8 @@ msgid "" "The privileges that new users automatically get.\n" "See /privs in game for a full list on your server and mod configuration." msgstr "" +"새로운 ìœ ì €ê°€ ìžë™ìœ¼ë¡œ 얻는 권한입니다.\n" +"서버와 모드 í™˜ê²½ì„¤ì •ì˜ ì „ì²´ 목ë¡ì„ 게임ì—서 /privs를 참조하세요." #: src/settings_translation_file.cpp msgid "The rendering back-end for Irrlicht." @@ -4061,6 +4616,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "ì´ ê¸€ê¼´ì€ íŠ¹ì • ì–¸ì–´ì— ì‚¬ìš© ë©ë‹ˆë‹¤." @@ -4086,7 +4645,9 @@ msgstr "시간 ì†ë„" #: src/settings_translation_file.cpp #, fuzzy msgid "Timeout for client to remove unused map data from memory." -msgstr "메모리ì—서 사용 하지 않는 ë§µ ë°ì´í„°ë¥¼ ì œê±°í•˜ê¸° 위해 í´ë¼ì´ì–¸íŠ¸ì— ëŒ€í•œ 시간 ì œí•œìž…ë‹ˆë‹¤." +msgstr "" +"메모리ì—서 사용 하지 않는 ë§µ ë°ì´í„°ë¥¼ ì œê±°í•˜ê¸° 위해 í´ë¼ì´ì–¸íŠ¸ì— ëŒ€í•œ 시간 ì œ" +"한입니다." #: src/settings_translation_file.cpp #, fuzzy @@ -4110,6 +4671,10 @@ msgid "Tooltip delay" msgstr "ë„구 설명 지연" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "삼중 ì„ í˜• í•„í„°ë§" @@ -4128,10 +4693,28 @@ msgid "Trusted mods" msgstr "ì‹ ë¢°í• ìˆ˜ 있는 모드" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "멀티 íƒì— 표시 ëœ ì„œë²„ ëª©ë¡ URL입니다." #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Unlimited player transfer distance" msgstr "ë¬´ì œí•œ í”Œë ˆì´ì–´ ì „ì†¡ 거리" @@ -4163,7 +4746,8 @@ msgstr "키 사용" #: src/settings_translation_file.cpp msgid "Use mip mapping to scale textures. May slightly increase performance." -msgstr "í…스ì³ë¥¼ í¬ê²Œí•˜ê¸° 위해 mip mappingì„ ì‚¬ìš© 합니다. ì„±ëŠ¥ì´ ì•½ê°„ ì¦ê°€í• ê²ë‹ˆë‹¤." +msgstr "" +"í…스ì³ë¥¼ í¬ê²Œí•˜ê¸° 위해 mip mappingì„ ì‚¬ìš© 합니다. ì„±ëŠ¥ì´ ì•½ê°„ ì¦ê°€í• ê²ë‹ˆë‹¤." #: src/settings_translation_file.cpp #, fuzzy @@ -4202,6 +4786,43 @@ msgid "Valleys C Flags" msgstr "계곡 C 플래그" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "ì‚°ì˜ ë†’ì´/경사를 ì¡°ì ˆ." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "세로 화면 ë™ê¸°í™”." @@ -4211,14 +4832,12 @@ msgstr "비디오 드ë¼ì´ë²„" #: src/settings_translation_file.cpp #, fuzzy -msgid "View bobbing" +msgid "View bobbing factor" msgstr "보기 만료" #: src/settings_translation_file.cpp #, fuzzy -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" "nodeì˜ ë³´ì—¬ì§€ëŠ” 거리\n" "최소 = 20" @@ -4232,6 +4851,10 @@ msgid "View range increase key" msgstr "보여지는 범위 ì¦ê°€ 키" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "보여지는 범위" @@ -4299,8 +4922,9 @@ msgid "" "filtered in software, but some images are generated directly\n" "to hardware (e.g. render-to-texture for nodes in inventory)." msgstr "" -"Gui_scaling_filterì´ true ì´ë©´ ëª¨ë“ GUI ì´ë¯¸ì§€ 소프트웨어ì—서 í•„í„°ë§ ë 필요가 있습니다. 하지만 ì¼ë¶€ ì´ë¯¸ì§€ëŠ” " -"바로 í•˜ë“œì›¨ì–´ì— ìƒì„±ë©ë‹ˆë‹¤. (e.g. render-to-texture for nodes in inventory)." +"Gui_scaling_filterì´ true ì´ë©´ ëª¨ë“ GUI ì´ë¯¸ì§€ 소프트웨어ì—서 í•„í„°ë§ ë í•„ìš”" +"ê°€ 있습니다. 하지만 ì¼ë¶€ ì´ë¯¸ì§€ëŠ” 바로 í•˜ë“œì›¨ì–´ì— ìƒì„±ë©ë‹ˆë‹¤. (e.g. render-" +"to-texture for nodes in inventory)." #: src/settings_translation_file.cpp msgid "" @@ -4321,22 +4945,12 @@ msgid "" "have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" "enabled." msgstr "" -"ì´ì¤‘ì„ í˜•/ì‚¼ì¤‘ì„ í˜•/ì´ë°©ì„± 필터를 ì‚¬ìš©í• ë•Œ ì €í•´ìƒë„ íƒìФì³ëŠ” í¬ë¯¸í•˜ê²Œ ë³´ì¼ ìˆ˜ 있습니다.so automatically upscale " -"them with nearest-neighbor interpolation to preserve crisp pixels. This sets " -"the minimum texture size for the upscaled textures; ê°’ì´ ë†’ì„ìˆ˜ë¡ ì„ ëª…í•˜ê²Œ 보입니다. 하지만 " -"ë§Žì€ ë©”ëª¨ë¦¬ê°€ 필요합니다. Powers of 2 are recommended. Setting this higher than 1 may " -"not have a visible effect unless bilinear/trilinear/anisotropic filtering is " -"enabled." - -#: src/settings_translation_file.cpp -msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" +"ì´ì¤‘ì„ í˜•/ì‚¼ì¤‘ì„ í˜•/ì´ë°©ì„± 필터를 ì‚¬ìš©í• ë•Œ ì €í•´ìƒë„ íƒìФì³ëŠ” í¬ë¯¸í•˜ê²Œ ë³´ì¼ ìˆ˜ " +"있습니다.so automatically upscale them with nearest-neighbor interpolation " +"to preserve crisp pixels. This sets the minimum texture size for the " +"upscaled textures; ê°’ì´ ë†’ì„ìˆ˜ë¡ ì„ ëª…í•˜ê²Œ 보입니다. 하지만 ë§Žì€ ë©”ëª¨ë¦¬ê°€ í•„ìš”" +"합니다. Powers of 2 are recommended. Setting this higher than 1 may not have " +"a visible effect unless bilinear/trilinear/anisotropic filtering is enabled." #: src/settings_translation_file.cpp msgid "" @@ -4389,7 +5003,15 @@ msgstr "íì€ ì´ˆê¸° ì°½ í¬ê¸°ë¡œ 구성ë˜ì–´ 있습니다." #, fuzzy msgid "Width of the selectionbox's lines around nodes." msgstr "" -"node 주위 “selectionbox'†or (if UTF-8 supported) “selectionbox’†ë¼ì¸ì˜ 너비입니다." +"node 주위 “selectionbox'†or (if UTF-8 supported) “selectionbox’†ë¼ì¸ì˜ 너비" +"입니다." + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -4408,6 +5030,43 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "block send optimize distance" +msgstr "최대 ë¸”ë¡ ì „ì†¡ 거리" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4418,3 +5077,49 @@ msgstr "" #: src/settings_translation_file.cpp msgid "cURL timeout" msgstr "" + +#~ msgid "Hide mp content" +#~ msgstr "숨겨진 ë§µ 콘í…ì¸ " + +#~ msgid "Attn" +#~ msgstr "담당ìž" + +#~ msgid "Capital" +#~ msgstr "ìžë³¸" + +#~ msgid "Comma" +#~ msgstr "쉼표" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "최종" + +#~ msgid "Minus" +#~ msgstr "마ì´ë„ˆìФ" + +#~ msgid "Period" +#~ msgstr "기간" + +#~ msgid "Plus" +#~ msgstr "플러스" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Mapgen v6ì—서 사막과 í•´ë³€ì˜ í¬ê¸°ë¥¼ ì¡°ì •í•©ë‹ˆë‹¤.\n" +#~ "Snowbiomes 사용 하는 ê²½ìš°ì— 'mgv6_freq_desert'ì€ ë¬´ì‹œ ë©ë‹ˆë‹¤." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "지형 ëª¨ì–‘ì„ ê²°ì •í•©ë‹ˆë‹¤.\n" +#~ "ê´„í˜¸ì•ˆì˜ 3ê°œì˜ ìˆ«ìžëŠ” ì§€í˜•ì˜ ê·œëª¨ë¥¼ ì¡°ì •í•©ë‹ˆë‹¤.\n" +#~ "3ê°œì˜ ìˆ«ìžëŠ” ë™ì¼í•´ì•¼ 합니다." diff --git a/po/ky/minetest.po b/po/ky/minetest.po index 72c729f8d..ff9e55845 100644 --- a/po/ky/minetest.po +++ b/po/ky/minetest.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: 2013-06-01 18:09+0200\n" "Last-Translator: Chynggyz Jumaliev <translatorky@lavabit.com>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -18,6 +18,14 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 1.4-dev\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Кайтадан жаралуу" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Сиз өлдүңүз." + #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" msgstr "" @@ -76,13 +84,13 @@ msgstr "" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Жокко чыгаруу" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua #, fuzzy -msgid "Depends:" +msgid "Dependencies:" msgstr "көз карандылыктары:" #: builtin/mainmenu/dlg_config_world.lua @@ -92,6 +100,11 @@ msgstr "Баарын өчүрүү" #: builtin/mainmenu/dlg_config_world.lua #, fuzzy +msgid "Disable all" +msgstr "Баарын өчүрүү" + +#: builtin/mainmenu/dlg_config_world.lua +#, fuzzy msgid "Enable MP" msgstr "Баарын күйгүзүү" @@ -107,16 +120,11 @@ msgid "" msgstr "" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy -msgid "Hide Game" -msgstr "Оюн" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" +msgid "Mod:" msgstr "" -#: builtin/mainmenu/dlg_config_world.lua -msgid "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" msgstr "" #: builtin/mainmenu/dlg_config_world.lua @@ -182,8 +190,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Өчүрүү" @@ -200,7 +207,7 @@ msgstr "" msgid "Delete World \"$1\"?" msgstr "Дүйнөнү өчүрүү" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Кабыл алуу" @@ -281,6 +288,11 @@ msgstr "" msgid "Restore Default" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy msgid "Select path" @@ -291,11 +303,11 @@ msgid "Show technical names" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +msgid "The value must be at least $1." msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +msgid "The value must not be larger than $1." msgstr "" #: builtin/mainmenu/modmgr.lua @@ -321,6 +333,10 @@ msgstr "" msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "" @@ -342,10 +358,6 @@ msgid "Rating" msgstr "" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "" - -#: builtin/mainmenu/store.lua #, fuzzy msgid "Shortname:" msgstr "Дүйнө аты" @@ -382,6 +394,69 @@ msgstr "" msgid "Previous Core Developers" msgstr "" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "ЫраÑтоо" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Жаратуу режими" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Убалды күйгүзүү" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Оюн" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Оюнду баштоо/туташуу" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Ðты/ÑырÑөзү" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Жаңы" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Оюнду баштоо/туташуу" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Дүйнөнү тандаңыз:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "" @@ -391,6 +466,10 @@ msgid "Mod information:" msgstr "" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "" @@ -411,103 +490,52 @@ msgstr "" msgid "Uninstall selected modpack" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Address / Port" msgstr "Дареги/порту" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Туташуу" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Creative mode" msgstr "Жаратуу режими" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Damage enabled" msgstr "күйгүзүлгөн" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Del. Favorite" msgstr "Тандалмалар:" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Favorite" msgstr "Тандалмалар:" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Name / Password" msgstr "Ðты/ÑырÑөзү" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "PvP enabled" -msgstr "күйгүзүлгөн" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "ЫраÑтоо" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Жаратуу режими" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Убалды күйгүзүү" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Ðты/ÑырÑөзү" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Жаңы" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Port" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Жалпылык" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Дүйнөнү тандаңыз:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "" - -#: builtin/mainmenu/tab_server.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy -msgid "Start Game" -msgstr "Оюнду баштоо/туташуу" +msgid "PvP enabled" +msgstr "күйгүзүлгөн" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -541,6 +569,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Бир кишилик" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Bilinear Filter" msgstr "ÐкиÑызык чыпкалооÑу" @@ -631,6 +663,11 @@ msgid "Reset singleplayer world" msgstr "Бир кишилик" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "Тез Ñүрөт" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "ЫраÑтоолор" @@ -704,14 +741,6 @@ msgstr "Башкы меню" msgid "Start Singleplayer" msgstr "Бир кишилик" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Ойноо" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Бир кишилик" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "" @@ -776,6 +805,10 @@ msgid "Player name too long." msgstr "" #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "" @@ -793,6 +826,42 @@ msgstr "" #: src/game.cpp #, fuzzy +msgid "- Address: " +msgstr "Дареги/порту" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Жаратуу режими" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Убалды күйгүзүү" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +msgid "- Port: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Жалпылык" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +msgid "- Server Name: " +msgstr "" + +#: src/game.cpp +#, fuzzy msgid "Change Keys" msgstr "БаÑкычтарды өзгөртүү" @@ -809,27 +878,22 @@ msgid "Continue" msgstr "Улантуу" #: src/game.cpp -msgid "Creating client..." -msgstr "Клиент жаратылууда..." - -#: src/game.cpp -#, fuzzy -msgid "Creating server..." -msgstr "Сервер жаратылууда...." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "ЖарыÑÐ»Ð°Ð½Ð±Ð°Ñ Ð±Ð°ÑˆÐºÐ°Ñ€ÑƒÑƒ:\n" "- WASD: баÑуу\n" @@ -844,6 +908,15 @@ msgstr "" "- T: маек\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Клиент жаратылууда..." + +#: src/game.cpp +#, fuzzy +msgid "Creating server..." +msgstr "Сервер жаратылууда...." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -868,6 +941,20 @@ msgid "Exit to OS" msgstr "Оюндан чыгуу" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Оюн" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Сервер жаратылууда...." + +#: src/game.cpp #, fuzzy msgid "Item definitions..." msgstr "Буюм текÑтуралары..." @@ -889,12 +976,20 @@ msgid "Node definitions..." msgstr "" #: src/game.cpp -msgid "Resolving address..." -msgstr "Дареги чечилүүдө..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Кайтадан жаралуу" +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Дареги чечилүүдө..." #: src/game.cpp #, fuzzy @@ -902,12 +997,25 @@ msgid "Shutting down..." msgstr "Оюн өчүрүлүүдө..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Бир кишилик" + +#: src/game.cpp msgid "Sound Volume" msgstr "Үн көлөмү" #: src/game.cpp -msgid "You died." -msgstr "Сиз өлдүңүз." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -942,6 +1050,10 @@ msgid "Console" msgstr "КонÑоль" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "" @@ -954,6 +1066,11 @@ msgid "Forward" msgstr "Ðлга" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Үн көлөмү" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Мүлк-шайман" @@ -973,6 +1090,24 @@ msgstr "" msgid "Left" msgstr "Солго" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Команда" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Кийинки" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "" @@ -1051,38 +1186,22 @@ msgid "Apps" msgstr "Тиркемелер" #: src/keycode.cpp -msgid "Attn" -msgstr "" - -#: src/keycode.cpp msgid "Back" msgstr "Ðртка" #: src/keycode.cpp -msgid "Capital" -msgstr "Caps Lock" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Тазалоо" #: src/keycode.cpp -msgid "Comma" -msgstr "Үтүр" - -#: src/keycode.cpp msgid "Control" msgstr "Ctrl" #: src/keycode.cpp -msgid "Convert" -msgstr "" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "" - -#: src/keycode.cpp msgid "Down" msgstr "Ылдый" @@ -1091,15 +1210,7 @@ msgid "End" msgstr "End" #: src/keycode.cpp -msgid "Erase OEF" -msgstr "" - -#: src/keycode.cpp -msgid "Escape" -msgstr "Esc" - -#: src/keycode.cpp -msgid "ExSel" +msgid "Erase EOF" msgstr "" #: src/keycode.cpp @@ -1107,10 +1218,6 @@ msgid "Execute" msgstr "Ðткаруу" #: src/keycode.cpp -msgid "Final" -msgstr "" - -#: src/keycode.cpp msgid "Help" msgstr "Жардам" @@ -1119,20 +1226,31 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +#, fuzzy +msgid "IME Accept" +msgstr "Кабыл алуу" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +msgid "IME Convert" +msgstr "" #: src/keycode.cpp -msgid "Kana" -msgstr "Кана" +#, fuzzy +msgid "IME Escape" +msgstr "Esc" #: src/keycode.cpp -msgid "Kanji" -msgstr "Кандзи" +#, fuzzy +msgid "IME Mode Change" +msgstr "Режимди өзгөртүү" + +#: src/keycode.cpp +msgid "IME Nonconvert" +msgstr "" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1163,22 +1281,10 @@ msgid "Middle Button" msgstr "Ортоңку баÑкыч" #: src/keycode.cpp -msgid "Minus" -msgstr "Кемитүү белгиÑи" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Режимди өзгөртүү" - -#: src/keycode.cpp msgid "Next" msgstr "Кийинки" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1195,6 +1301,11 @@ msgid "Numpad -" msgstr "Кош. клав. -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Кош. клав. *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Кош. клав. /" @@ -1243,20 +1354,12 @@ msgid "OEM Clear" msgstr "" #: src/keycode.cpp -msgid "PA1" -msgstr "" - -#: src/keycode.cpp msgid "Pause" msgstr "Пауза" #: src/keycode.cpp -msgid "Period" -msgstr "Ðйланма Ñан" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Кошуу белгиÑи" +msgid "Play" +msgstr "Ойноо" #: src/keycode.cpp msgid "Print" @@ -1355,6 +1458,20 @@ msgid "3D mode" msgstr "" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1416,6 +1533,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1423,7 +1544,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" @@ -1448,6 +1570,12 @@ msgid "Amplifies the valleys" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Anisotropic filtering" msgstr "ÐÐ½Ð¸Ð·Ð°Ñ‚Ñ€Ð¾Ð¿Ð¸Ñ Ñ‡Ñ‹Ð¿ÐºÐ°Ð»Ð¾Ð¾Ñу" @@ -1464,6 +1592,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" @@ -1472,6 +1604,19 @@ msgid "Ask to reconnect after crash" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "" @@ -1497,6 +1642,14 @@ msgid "Basic Privileges" msgstr "" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Bilinear filtering" msgstr "ÐкиÑызык чыпкалооÑу" @@ -1507,6 +1660,14 @@ msgid "Bind address" msgstr "Дареги чечилүүдө..." #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" @@ -1537,6 +1698,10 @@ msgid "Camera update toggle key" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "" @@ -1549,6 +1714,30 @@ msgid "Cave width" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1609,10 +1798,18 @@ msgid "Clean transparent textures" msgstr "" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "" #: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "" @@ -1685,6 +1882,11 @@ msgstr "КонÑоль" #: src/settings_translation_file.cpp #, fuzzy +msgid "Console height" +msgstr "КонÑоль" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Console key" msgstr "КонÑоль" @@ -1709,17 +1911,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp @@ -1743,6 +1945,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Жаратуу" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" @@ -1780,6 +1987,10 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "" @@ -1817,6 +2028,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1827,6 +2073,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1857,17 +2113,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" #: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Баарын күйгүзүү" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Disable anticheat" msgstr "Бөлүкчөлөрдү күйгүзүү" @@ -1913,11 +2177,25 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Enable VBO" msgstr "Баарын күйгүзүү" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "" @@ -1953,6 +2231,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -1998,6 +2286,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2020,7 +2312,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2090,6 +2386,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2107,10 +2407,34 @@ msgid "Filtering" msgstr "ÐÐ½Ð¸Ð·Ð°Ñ‚Ñ€Ð¾Ð¿Ð¸Ñ Ñ‡Ñ‹Ð¿ÐºÐ°Ð»Ð¾Ð¾Ñу" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "" @@ -2123,6 +2447,10 @@ msgid "Fog" msgstr "" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -2160,6 +2488,14 @@ msgid "Forward key" msgstr "Ðлга" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2238,10 +2574,18 @@ msgid "Gravity" msgstr "" #: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2263,22 +2607,55 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Оң Windows" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2300,6 +2677,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2325,6 +2714,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2357,6 +2755,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2385,6 +2787,15 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "КонÑоль" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2427,6 +2838,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Мүлк-шайман" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2448,12 +2864,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2491,6 +2919,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Jump key" msgstr "Секирүү" @@ -2508,6 +2952,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2522,6 +2973,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2564,6 +3022,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2578,6 +3043,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2599,6 +3071,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2699,6 +3185,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2712,10 +3205,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2724,6 +3232,11 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "КонÑоль" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2780,6 +3293,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2854,6 +3374,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2881,9 +3405,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2892,7 +3425,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2911,23 +3445,19 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" +msgid "Mapgen Valleys" msgstr "" #: src/settings_translation_file.cpp @@ -2943,51 +3473,7 @@ msgid "Mapgen flat" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" +msgid "Mapgen flat specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -2995,66 +3481,6 @@ msgid "Mapgen fractal" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "" @@ -3063,27 +3489,7 @@ msgid "Mapgen v5" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Mapgen v5 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3091,59 +3497,7 @@ msgid "Mapgen v6" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3151,55 +3505,7 @@ msgid "Mapgen v7" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3368,6 +3674,10 @@ msgid "Mipmapping" msgstr "Mip-текÑтуралоо" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3388,6 +3698,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3396,18 +3714,21 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "баÑкычты баÑыңыз" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3456,10 +3777,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3496,6 +3813,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3536,6 +3861,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3630,6 +3961,14 @@ msgid "Report path" msgstr "Тандоо" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Right key" msgstr "Оң меню" @@ -3663,6 +4002,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3671,6 +4014,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3714,6 +4061,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3759,6 +4114,10 @@ msgid "Server port" msgstr "" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Serverlist URL" msgstr "Жалпылык Ñерверлердин тизмеÑи:" @@ -3793,10 +4152,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Көлөкөлөгүчтөр" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3822,10 +4190,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Smooth lighting" msgstr "Тегиз жарык" @@ -3866,6 +4253,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -3886,10 +4281,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3904,6 +4319,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "" @@ -3923,8 +4342,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -3975,6 +4397,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -4017,6 +4443,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Trilinear filtering" msgstr "ҮчÑызык чыпкалооÑу" @@ -4033,10 +4463,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4102,6 +4550,42 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4110,13 +4594,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4128,6 +4610,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4218,16 +4704,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4278,6 +4754,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4291,6 +4774,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4302,6 +4821,30 @@ msgstr "" msgid "cURL timeout" msgstr "" +#~ msgid "Capital" +#~ msgstr "Caps Lock" + +#~ msgid "Comma" +#~ msgstr "Үтүр" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Кана" + +#~ msgid "Kanji" +#~ msgstr "Кандзи" + +#~ msgid "Minus" +#~ msgstr "Кемитүү белгиÑи" + +#~ msgid "Period" +#~ msgstr "Ðйланма Ñан" + +#~ msgid "Plus" +#~ msgstr "Кошуу белгиÑи" + #, fuzzy #~ msgid "Public Serverlist" #~ msgstr "Жалпылык Ñерверлердин тизмеÑи:" @@ -4315,10 +4858,6 @@ msgstr "" #~ msgstr "күйгүзүлгөн" #, fuzzy -#~ msgid "Game Name" -#~ msgstr "Оюн" - -#, fuzzy #~ msgid "Password" #~ msgstr "ÐÑки ÑырÑөз" diff --git a/po/lt/minetest.po b/po/lt/minetest.po index ed31a75c8..6b602bb86 100644 --- a/po/lt/minetest.po +++ b/po/lt/minetest.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-12-10 20:29+0000\n" -"Last-Translator: Zygi Mantus <zygimantus@gmail.com>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2016-12-28 12:00+0000\n" +"Last-Translator: ignaloidas <ignaskiela@super.lt>\n" "Language-Team: Lithuanian <https://hosted.weblate.org/projects/minetest/" "minetest/lt/>\n" "Language: lt\n" @@ -18,7 +18,15 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 2.10-dev\n" +"X-Generator: Weblate 2.11-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Prisikelti" + +#: builtin/client/init.lua +msgid "You died." +msgstr "JÅ«s numirÄ—te." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -58,7 +66,7 @@ msgstr "Serveris reikalauja naudoti versijos $1 protokolÄ…. " #: builtin/mainmenu/common.lua msgid "Server supports protocol versions between $1 and $2. " -msgstr "" +msgstr "Serveris palaiko protokolo versijas nuo $1 iki $2 " #: builtin/mainmenu/common.lua msgid "Try reenabling public serverlist and check your internet connection." @@ -72,18 +80,19 @@ msgstr "Mes palaikome tik $1 protokolo versijÄ…." #: builtin/mainmenu/common.lua msgid "We support protocol versions between version $1 and $2." -msgstr "" +msgstr "Mes palaikome protokolo versijas nuo $1 iki $2." #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Atsisakyti" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Priklauso:" #: builtin/mainmenu/dlg_config_world.lua @@ -91,6 +100,11 @@ msgid "Disable MP" msgstr "IÅ¡jungti papildinį" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "IÅ¡jungti papildinį" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Ä®jungti papildinį" @@ -107,17 +121,13 @@ msgstr "" "raÅ¡menys [a-z0-9_] yra leidžiami." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "SlÄ—pti vidinius" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "SlÄ—pti papild. pakų turinį" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Papildinys:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -180,8 +190,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Ar tikrai norite iÅ¡trinti „$1“?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "IÅ¡trinti" @@ -197,7 +206,7 @@ msgstr "Papildtvrk: netinkamas papildinio kelias „$1“" msgid "Delete World \"$1\"?" msgstr "IÅ¡trinti pasaulį „$1“?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Priimti" @@ -211,11 +220,11 @@ msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" -msgstr "" +msgstr "(NÄ—ra nustatymo apraÅ¡ymo)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" -msgstr "" +msgstr "< Atgal į Nustatymus" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Browse" @@ -228,7 +237,7 @@ msgstr "IÅ¡jungti papildinį" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Edit" -msgstr "" +msgstr "Keisti" #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy @@ -263,20 +272,25 @@ msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." -msgstr "" +msgstr "PraÅ¡ome įvesti sveikÄ…jį skaiÄių." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid number." -msgstr "" +msgstr "PraÅ¡ome įvesti skaiÄių." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Possible values are: " -msgstr "" +msgstr "Tinkamos reikÅ¡mÄ—s yra: " #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Restore Default" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "IeÅ¡koti" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "" @@ -286,11 +300,11 @@ msgid "Show technical names" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +msgid "The value must be at least $1." msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +msgid "The value must not be larger than $1." msgstr "" #: builtin/mainmenu/modmgr.lua @@ -319,6 +333,10 @@ msgstr "" "Papildinio diegimas: nepavyksta rasti tinkamo aplanko pavadinimo papildinio " "paketui $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Užverti parduotuvÄ™" @@ -340,10 +358,6 @@ msgid "Rating" msgstr "Ä®vertinimas" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "IeÅ¡koti" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Trumpas pavadinimas:" @@ -379,6 +393,70 @@ msgstr "Ankstesni bendradarbiai" msgid "Previous Core Developers" msgstr "Ankstesni pagrindiniai kÅ«rÄ—jai" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Susieti adresÄ…" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "KonfigÅ«ruoti" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "KÅ«rybinÄ— veiksena" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Leisti sužeidimus" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "SlÄ—pti vidinius" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Serveris" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "PradÄ—ti žaidimÄ…" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Vardas/slaptažodis" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Naujas" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Nesukurtas ar pasirinktas joks pasaulis!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "PradÄ—ti žaidimÄ…" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Prievadas" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Pasirinkite pasaulį:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Serverio prievadas" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Ä®diegti papildiniai:" @@ -388,6 +466,10 @@ msgid "Mod information:" msgstr "Papildinio informacija:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Papildinio apraÅ¡ymas nepateiktas" @@ -407,99 +489,49 @@ msgstr "PaÅ¡alinti pasirinktÄ… papildinį" msgid "Uninstall selected modpack" msgstr "PaÅ¡alinti pasirinktÄ… papildinį" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Address / Port" msgstr "Adresas / Prievadas :" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Žaisti tinkle(klientas)" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Jungtis" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "KÅ«rybinÄ— veiksena" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Žalojimas įjungtas" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Del. Favorite" msgstr "MÄ—giami:" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Favorite" msgstr "MÄ—giami:" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Name / Password" msgstr "Vardas / Slaptažodis :" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP įjungtas" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Susieti adresÄ…" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "KonfigÅ«ruoti" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "KÅ«rybinÄ— veiksena" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Leisti sužeidimus" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Vardas/slaptažodis" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Naujas" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Nesukurtas ar pasirinktas joks pasaulis!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Prievadas" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "VieÅ¡as" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Pasirinkite pasaulį:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Serveris" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Serverio prievadas" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "PradÄ—ti žaidimÄ…" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP įjungtas" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -533,6 +565,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Atstatyti vieno žaidÄ—jo pasaulį" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "" @@ -615,6 +651,10 @@ msgid "Reset singleplayer world" msgstr "Atstatyti vieno žaidÄ—jo pasaulį" #: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Nustatymai" @@ -681,14 +721,6 @@ msgstr "Pagrindinis" msgid "Start Singleplayer" msgstr "Atstatyti vieno žaidÄ—jo pasaulį" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Žaisti" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Žaisti vienam" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "NÄ—ra pasiekiamos informacijos" @@ -751,6 +783,10 @@ msgid "Player name too long." msgstr "ŽaidÄ—jo vardas per ilgas." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Pateiktas pasaulio kelias neegzistuoja: " @@ -767,6 +803,44 @@ msgstr "" "Patikrinkite debug.txt dÄ—l papildomos informacijos." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Susieti adresÄ…" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "KÅ«rybinÄ— veiksena" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Leisti sužeidimus" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Prievadas" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "VieÅ¡as" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Serveris" + +#: src/game.cpp msgid "Change Keys" msgstr "Nustatyti klaviÅ¡us" @@ -783,26 +857,22 @@ msgid "Continue" msgstr "TÄ™sti" #: src/game.cpp -msgid "Creating client..." -msgstr "Kuriamas klientas..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Kuriamas serveris...." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Numatytas valdymas:\n" "- WASD: judÄ—ti\n" @@ -817,6 +887,14 @@ msgstr "" "- T: kalbÄ—tis\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Kuriamas klientas..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Kuriamas serveris...." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -853,6 +931,20 @@ msgid "Exit to OS" msgstr "IÅ¡eiti iÅ¡ žaidimo" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Žaidimo pavadinimas" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Kuriamas serveris...." + +#: src/game.cpp msgid "Item definitions..." msgstr "Elemento apibrėžimai..." @@ -873,24 +965,45 @@ msgid "Node definitions..." msgstr "Mazgo apibrėžimai..." #: src/game.cpp -msgid "Resolving address..." -msgstr "IeÅ¡koma adreso..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Prisikelti" +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "IeÅ¡koma adreso..." #: src/game.cpp msgid "Shutting down..." msgstr "IÅ¡jungiama..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Žaisti vienam" + +#: src/game.cpp msgid "Sound Volume" msgstr "Garso lygis" #: src/game.cpp -msgid "You died." -msgstr "JÅ«s numirÄ—te." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -925,6 +1038,10 @@ msgid "Console" msgstr "Pultas" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Du kart paliesti „šokti“, kad įjungti skrydį" @@ -937,6 +1054,11 @@ msgid "Forward" msgstr "Pirmyn" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Garso lygis" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventorius" @@ -956,6 +1078,24 @@ msgstr "KlaviÅ¡ai. (Jei Å¡is meniu sugenda, paÅ¡alinkite įraÅ¡us iÅ¡ minetest.c msgid "Left" msgstr "KairÄ—n" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Komanda" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Kitas" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Spausdinti rietuves" @@ -1033,38 +1173,22 @@ msgid "Apps" msgstr "Programos" #: src/keycode.cpp -msgid "Attn" -msgstr "" - -#: src/keycode.cpp msgid "Back" msgstr "Atgal" #: src/keycode.cpp -msgid "Capital" -msgstr "SostinÄ—" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "IÅ¡valyti" #: src/keycode.cpp -msgid "Comma" -msgstr "Kablelis" - -#: src/keycode.cpp msgid "Control" msgstr "Valdymas" #: src/keycode.cpp -msgid "Convert" -msgstr "Konvertuoti" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "" - -#: src/keycode.cpp msgid "Down" msgstr "Žemyn" @@ -1073,26 +1197,15 @@ msgid "End" msgstr "Baigti" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "IÅ¡trinti OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "AtÅ¡aukti" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "" - -#: src/keycode.cpp msgid "Execute" msgstr "Vykdyti" #: src/keycode.cpp -msgid "Final" -msgstr "Galutinis" - -#: src/keycode.cpp msgid "Help" msgstr "Pagalba" @@ -1101,20 +1214,32 @@ msgid "Home" msgstr "Pradžia" #: src/keycode.cpp -msgid "Insert" -msgstr "Ä®terpti" +#, fuzzy +msgid "IME Accept" +msgstr "Priimti" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Convert" +msgstr "Konvertuoti" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Escape" +msgstr "AtÅ¡aukti" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Mode Change" +msgstr "BÅ«senos keitimas" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +msgid "IME Nonconvert" +msgstr "" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +msgid "Insert" +msgstr "Ä®terpti" #: src/keycode.cpp msgid "Left Button" @@ -1145,22 +1270,10 @@ msgid "Middle Button" msgstr "Vidurinis mygtukas" #: src/keycode.cpp -msgid "Minus" -msgstr "Minus" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "BÅ«senos keitimas" - -#: src/keycode.cpp msgid "Next" msgstr "Kitas" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1177,6 +1290,11 @@ msgid "Numpad -" msgstr "SkaitKlav -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "SkaitKlav *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "SkaitKlav /" @@ -1225,20 +1343,12 @@ msgid "OEM Clear" msgstr "OEM valymas" #: src/keycode.cpp -msgid "PA1" -msgstr "" - -#: src/keycode.cpp msgid "Pause" msgstr "Pause" #: src/keycode.cpp -msgid "Period" -msgstr "Periodas" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Plius" +msgid "Play" +msgstr "Žaisti" #: src/keycode.cpp msgid "Print" @@ -1337,6 +1447,20 @@ msgid "3D mode" msgstr "" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1398,6 +1522,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1405,7 +1533,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" @@ -1430,6 +1559,12 @@ msgid "Amplifies the valleys" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "" @@ -1445,6 +1580,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" @@ -1453,6 +1592,19 @@ msgid "Ask to reconnect after crash" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "" @@ -1478,6 +1630,14 @@ msgid "Basic Privileges" msgstr "" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "" @@ -1487,6 +1647,14 @@ msgid "Bind address" msgstr "IeÅ¡koma adreso..." #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" @@ -1515,6 +1683,10 @@ msgid "Camera update toggle key" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "" @@ -1527,6 +1699,30 @@ msgid "Cave width" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1587,10 +1783,19 @@ msgid "Clean transparent textures" msgstr "" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Žaisti tinkle(klientas)" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Žaisti tinkle(klientas)" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "" @@ -1661,6 +1866,11 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Console height" +msgstr "Nustatyti klaviÅ¡us" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Console key" msgstr "Nustatyti klaviÅ¡us" @@ -1685,17 +1895,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp @@ -1719,6 +1929,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Sukurti" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" @@ -1756,6 +1971,10 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "" @@ -1794,6 +2013,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1804,6 +2058,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1834,17 +2098,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Ä®jungti visus" + +#: src/settings_translation_file.cpp msgid "Disable anticheat" msgstr "" @@ -1889,11 +2161,25 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Enable VBO" msgstr "Ä®jungti papildinį" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Enable mod security" msgstr "Papildiniai internete" @@ -1930,6 +2216,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -1975,6 +2271,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -1997,7 +2297,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2067,6 +2371,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2083,10 +2391,34 @@ msgid "Filtering" msgstr "" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "" @@ -2099,6 +2431,10 @@ msgid "Fog" msgstr "" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -2136,6 +2472,14 @@ msgid "Forward key" msgstr "Pirmyn" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2214,11 +2558,19 @@ msgid "Gravity" msgstr "" #: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "HTTP Mods" msgstr "Papildiniai" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2240,22 +2592,55 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "DeÅ¡inieji langai" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2277,6 +2662,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2302,6 +2699,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2334,6 +2740,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2362,6 +2772,15 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Nustatyti klaviÅ¡us" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2404,6 +2823,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Inventorius" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2425,12 +2849,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2468,6 +2904,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Jump key" msgstr "PaÅ¡okti" @@ -2485,6 +2937,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2499,6 +2958,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2541,6 +3007,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2555,6 +3028,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2576,6 +3056,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2676,6 +3170,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2689,10 +3190,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2701,6 +3217,11 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Nustatyti klaviÅ¡us" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2757,6 +3278,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2831,6 +3359,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2858,9 +3390,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2869,7 +3410,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2888,25 +3430,21 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen Valleys" -msgstr "ŽemÄ—lapių generavimas" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen Valleys" +msgstr "ŽemÄ—lapių generavimas" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -2922,52 +3460,7 @@ msgid "Mapgen flat" msgstr "ŽemÄ—lapių generavimas" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat cave width" -msgstr "ŽemÄ—lapių generavimas" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" +msgid "Mapgen flat specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -2975,67 +3468,6 @@ msgid "Mapgen fractal" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal cave width" -msgstr "ŽemÄ—lapių generavimas" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "" @@ -3044,27 +3476,7 @@ msgid "Mapgen v5" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Mapgen v5 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3072,59 +3484,7 @@ msgid "Mapgen v6" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3132,55 +3492,7 @@ msgid "Mapgen v7" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3348,6 +3660,10 @@ msgid "Mipmapping" msgstr "" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3368,6 +3684,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3376,18 +3700,21 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "paspauskite klavišą" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3436,10 +3763,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3476,6 +3799,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3516,6 +3847,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3609,6 +3946,14 @@ msgid "Report path" msgstr "" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Right key" msgstr "DeÅ¡inÄ—n" @@ -3642,6 +3987,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3650,6 +3999,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3690,6 +4043,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3740,6 +4101,10 @@ msgid "Server port" msgstr "Serverio prievadas" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Serverlist URL" msgstr "Viešų serverių sÄ…raÅ¡as" @@ -3774,10 +4139,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Å ešėliavimai" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3803,10 +4177,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Smooth lighting" msgstr "ApÅ¡vietimo efektai" @@ -3847,6 +4240,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -3867,10 +4268,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3885,6 +4306,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "" @@ -3904,8 +4329,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -3956,6 +4384,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -3998,6 +4430,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "" @@ -4013,10 +4449,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4082,6 +4536,42 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4090,13 +4580,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4108,6 +4596,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4196,16 +4688,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4256,6 +4738,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4269,6 +4758,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4280,6 +4805,44 @@ msgstr "" msgid "cURL timeout" msgstr "" +#~ msgid "Hide mp content" +#~ msgstr "SlÄ—pti papild. pakų turinį" + +#~ msgid "Capital" +#~ msgstr "SostinÄ—" + +#~ msgid "Comma" +#~ msgstr "Kablelis" + +#~ msgid "Final" +#~ msgstr "Galutinis" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Minus" + +#~ msgid "Period" +#~ msgstr "Periodas" + +#~ msgid "Plus" +#~ msgstr "Plius" + +#, fuzzy +#~ msgid "Mapgen flat cave width" +#~ msgstr "ŽemÄ—lapių generavimas" + +#, fuzzy +#~ msgid "Mapgen fractal cave width" +#~ msgstr "ŽemÄ—lapių generavimas" + #, fuzzy #~ msgid "Useful for mod developers." #~ msgstr "Pagrindiniai kÅ«rÄ—jai" @@ -4298,9 +4861,6 @@ msgstr "" #~ msgid "If enabled, " #~ msgstr "įjungtas" -#~ msgid "Game Name" -#~ msgstr "Žaidimo pavadinimas" - #~ msgid "GAMES" #~ msgstr "ŽAIDIMAI" diff --git a/po/minetest.pot b/po/minetest.pot index 46a74b448..592361c02 100644 --- a/po/minetest.pot +++ b/po/minetest.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,6 +17,14 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "" + +#: builtin/client/init.lua +msgid "You died." +msgstr "" + #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" msgstr "" @@ -74,19 +82,15 @@ msgid "World:" msgstr "" #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" +msgid "Mod:" msgstr "" -#: builtin/mainmenu/dlg_config_world.lua -msgid "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Dependencies:" msgstr "" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +msgid "Optional dependencies:" msgstr "" #: builtin/mainmenu/dlg_config_world.lua @@ -98,16 +102,16 @@ msgstr "" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "" #: builtin/mainmenu/dlg_config_world.lua -msgid "Enable MP" +msgid "Disable MP" msgstr "" #: builtin/mainmenu/dlg_config_world.lua -msgid "Disable MP" +msgid "Enable MP" msgstr "" #: builtin/mainmenu/dlg_config_world.lua @@ -115,6 +119,10 @@ msgid "enabled" msgstr "" #: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" msgstr "" @@ -173,8 +181,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "" @@ -194,7 +201,7 @@ msgstr "" msgid "Rename Modpack:" msgstr "" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "" @@ -249,11 +256,11 @@ msgid "Please enter a valid integer." msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +msgid "The value must be at least $1." msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +msgid "The value must not be larger than $1." msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -268,6 +275,11 @@ msgstr "" msgid "Select path" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" msgstr "" @@ -306,12 +318,12 @@ msgstr "" msgid "Install Mod: unable to find real modname for: $1" msgstr "" -#: builtin/mainmenu/store.lua -msgid "Unsorted" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" msgstr "" #: builtin/mainmenu/store.lua -msgid "Search" +msgid "Unsorted" msgstr "" #: builtin/mainmenu/store.lua @@ -366,122 +378,136 @@ msgstr "" msgid "Previous Contributors" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Installed Mods:" +#: builtin/mainmenu/tab_local.lua +msgid "New" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "No mod description available" +#: builtin/mainmenu/tab_local.lua +msgid "Configure" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Mod information:" +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Rename" +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Uninstall selected modpack" +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Uninstall selected mod" +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Select Mod File:" +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua -msgid "Address / Port" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" +#: builtin/mainmenu/tab_local.lua +msgid "Port" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "Creative mode" +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" +#: builtin/mainmenu/tab_mods.lua +msgid "Installed Mods:" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" +#: builtin/mainmenu/tab_mods.lua +msgid "No mod description available" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" +#: builtin/mainmenu/tab_mods.lua +msgid "Mod information:" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" +#: builtin/mainmenu/tab_mods.lua +msgid "Rename" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected modpack" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" +#: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected mod" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Public" +#: builtin/mainmenu/tab_mods.lua +msgid "Select Mod File:" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" +#: builtin/mainmenu/tab_online.lua +msgid "Address / Port" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Name / Password" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Port" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Connect" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Del. Favorite" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Favorite" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative mode" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Damage enabled" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -504,6 +530,10 @@ msgstr "" msgid "Node Highlighting" msgstr "" +#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua +msgid "None" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "" @@ -528,10 +558,6 @@ msgstr "" msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua -msgid "None" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "2x" msgstr "" @@ -584,6 +610,14 @@ msgstr "" msgid "Antialiasing:" msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" msgstr "" @@ -652,14 +686,6 @@ msgstr "" msgid "Main" msgstr "" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "" - #: builtin/mainmenu/tab_texturepacks.lua msgid "Select texture pack:" msgstr "" @@ -709,6 +735,10 @@ msgid "Connection error (timed out?)" msgstr "" #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "No world selected and no address provided. Nothing to do." msgstr "" @@ -729,11 +759,60 @@ msgid "needs_fallback_font" msgstr "" #: src/game.cpp -msgid "You died." +msgid "Shutting down..." msgstr "" #: src/game.cpp -msgid "Respawn" +msgid "Creating server..." +msgstr "" + +#: src/game.cpp +msgid "Creating client..." +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "" + +#: src/game.cpp +msgid "Connecting to server..." +msgstr "" + +#: src/game.cpp +msgid "Item definitions..." +msgstr "" + +#: src/game.cpp +msgid "Node definitions..." +msgstr "" + +#: src/game.cpp +msgid "Media..." +msgstr "" + +#: src/game.cpp +msgid "KiB/s" +msgstr "" + +#: src/game.cpp +msgid "MiB/s" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp src/guiFormSpecMenu.cpp +msgid "ok" msgstr "" #: src/game.cpp @@ -753,18 +832,22 @@ msgid "" msgstr "" #: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" #: src/game.cpp @@ -776,6 +859,10 @@ msgid "Change Password" msgstr "" #: src/game.cpp +msgid "Game paused" +msgstr "" + +#: src/game.cpp msgid "Sound Volume" msgstr "" @@ -792,47 +879,59 @@ msgid "Exit to OS" msgstr "" #: src/game.cpp -msgid "Shutting down..." +msgid "Game info:" msgstr "" #: src/game.cpp -msgid "Creating server..." +msgid "- Mode: " msgstr "" #: src/game.cpp -msgid "Creating client..." +msgid "Remote server" msgstr "" #: src/game.cpp -msgid "Resolving address..." +msgid "- Address: " msgstr "" #: src/game.cpp -msgid "Connecting to server..." +msgid "Hosting server" msgstr "" #: src/game.cpp -msgid "Item definitions..." +msgid "- Port: " msgstr "" #: src/game.cpp -msgid "Node definitions..." +msgid "Singleplayer" msgstr "" #: src/game.cpp -msgid "Media..." +msgid "On" msgstr "" #: src/game.cpp -msgid "KiB/s" +msgid "Off" msgstr "" #: src/game.cpp -msgid "MiB/s" +msgid "- Damage: " msgstr "" -#: src/game.cpp src/guiFormSpecMenu.cpp -msgid "ok" +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +msgid "- Public: " +msgstr "" + +#: src/game.cpp +msgid "- Server Name: " msgstr "" #: src/game.cpp @@ -906,6 +1005,26 @@ msgid "Inventory" msgstr "" #: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Chat" msgstr "" @@ -914,6 +1033,10 @@ msgid "Command" msgstr "" #: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Console" msgstr "" @@ -978,27 +1101,23 @@ msgid "Left Button" msgstr "" #: src/keycode.cpp -msgid "Middle Button" -msgstr "" - -#: src/keycode.cpp msgid "Right Button" msgstr "" #: src/keycode.cpp -msgid "X Button 1" +msgid "Middle Button" msgstr "" #: src/keycode.cpp -msgid "Back" +msgid "X Button 1" msgstr "" #: src/keycode.cpp -msgid "Clear" +msgid "X Button 2" msgstr "" #: src/keycode.cpp -msgid "Return" +msgid "Back" msgstr "" #: src/keycode.cpp @@ -1006,19 +1125,19 @@ msgid "Tab" msgstr "" #: src/keycode.cpp -msgid "X Button 2" +msgid "Clear" msgstr "" #: src/keycode.cpp -msgid "Capital" +msgid "Return" msgstr "" #: src/keycode.cpp -msgid "Control" +msgid "Shift" msgstr "" #: src/keycode.cpp -msgid "Kana" +msgid "Control" msgstr "" #: src/keycode.cpp @@ -1030,31 +1149,19 @@ msgid "Pause" msgstr "" #: src/keycode.cpp -msgid "Shift" +msgid "Caps Lock" msgstr "" #: src/keycode.cpp -msgid "Convert" -msgstr "" - -#: src/keycode.cpp -msgid "Escape" -msgstr "" - -#: src/keycode.cpp -msgid "Final" -msgstr "" - -#: src/keycode.cpp -msgid "Junja" +msgid "Space" msgstr "" #: src/keycode.cpp -msgid "Kanji" +msgid "Prior" msgstr "" #: src/keycode.cpp -msgid "Nonconvert" +msgid "Next" msgstr "" #: src/keycode.cpp @@ -1066,19 +1173,7 @@ msgid "Home" msgstr "" #: src/keycode.cpp -msgid "Mode Change" -msgstr "" - -#: src/keycode.cpp -msgid "Next" -msgstr "" - -#: src/keycode.cpp -msgid "Prior" -msgstr "" - -#: src/keycode.cpp -msgid "Space" +msgid "Up" msgstr "" #: src/keycode.cpp @@ -1086,7 +1181,7 @@ msgid "Down" msgstr "" #: src/keycode.cpp -msgid "Execute" +msgid "Select" msgstr "" #: src/keycode.cpp @@ -1094,15 +1189,11 @@ msgid "Print" msgstr "" #: src/keycode.cpp -msgid "Select" -msgstr "" - -#: src/keycode.cpp -msgid "Up" +msgid "Execute" msgstr "" #: src/keycode.cpp -msgid "Help" +msgid "Snapshot" msgstr "" #: src/keycode.cpp @@ -1110,7 +1201,7 @@ msgid "Insert" msgstr "" #: src/keycode.cpp -msgid "Snapshot" +msgid "Help" msgstr "" #: src/keycode.cpp @@ -1118,7 +1209,7 @@ msgid "Left Windows" msgstr "" #: src/keycode.cpp -msgid "Apps" +msgid "Right Windows" msgstr "" #: src/keycode.cpp @@ -1130,14 +1221,6 @@ msgid "Numpad 1" msgstr "" #: src/keycode.cpp -msgid "Right Windows" -msgstr "" - -#: src/keycode.cpp -msgid "Sleep" -msgstr "" - -#: src/keycode.cpp msgid "Numpad 2" msgstr "" @@ -1162,27 +1245,31 @@ msgid "Numpad 7" msgstr "" #: src/keycode.cpp -msgid "Numpad *" +msgid "Numpad 8" msgstr "" #: src/keycode.cpp -msgid "Numpad +" +msgid "Numpad 9" msgstr "" #: src/keycode.cpp -msgid "Numpad -" +msgid "Numpad *" msgstr "" #: src/keycode.cpp -msgid "Numpad /" +msgid "Numpad +" msgstr "" #: src/keycode.cpp -msgid "Numpad 8" +msgid "Numpad ." msgstr "" #: src/keycode.cpp -msgid "Numpad 9" +msgid "Numpad -" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad /" msgstr "" #: src/keycode.cpp @@ -1206,11 +1293,11 @@ msgid "Left Control" msgstr "" #: src/keycode.cpp -msgid "Left Menu" +msgid "Right Control" msgstr "" #: src/keycode.cpp -msgid "Right Control" +msgid "Left Menu" msgstr "" #: src/keycode.cpp @@ -1218,43 +1305,47 @@ msgid "Right Menu" msgstr "" #: src/keycode.cpp -msgid "Comma" +msgid "IME Escape" msgstr "" #: src/keycode.cpp -msgid "Minus" +msgid "IME Convert" msgstr "" #: src/keycode.cpp -msgid "Period" +msgid "IME Nonconvert" msgstr "" #: src/keycode.cpp -msgid "Plus" +msgid "IME Accept" msgstr "" #: src/keycode.cpp -msgid "Attn" +msgid "IME Mode Change" msgstr "" #: src/keycode.cpp -msgid "CrSel" +msgid "Apps" msgstr "" #: src/keycode.cpp -msgid "Erase OEF" +msgid "Sleep" msgstr "" #: src/keycode.cpp -msgid "ExSel" +msgid "Erase EOF" msgstr "" #: src/keycode.cpp -msgid "OEM Clear" +msgid "Play" msgstr "" #: src/keycode.cpp -msgid "PA1" +msgid "OEM Clear" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client" msgstr "" #: src/settings_translation_file.cpp @@ -1404,6 +1495,22 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -1536,6 +1643,13 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "" @@ -1591,6 +1705,61 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Autorun key" msgstr "" @@ -1646,6 +1815,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -1668,6 +1848,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -1813,6 +2004,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "" @@ -1913,6 +2114,14 @@ msgid "Method used to highlight selected object." msgstr "" #: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filtering" msgstr "" @@ -1986,10 +2195,32 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." msgstr "" #: src/settings_translation_file.cpp @@ -2165,9 +2396,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -2234,7 +2463,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" @@ -2274,17 +2504,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Enable view bobbing and amount of view bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2310,6 +2548,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Console color" msgstr "" @@ -2376,6 +2622,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -2384,6 +2638,27 @@ msgid "Enables caching of facedir rotated meshes." msgstr "" #: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Minimap" msgstr "" @@ -2440,6 +2715,32 @@ msgid "Enables animation of inventory items." msgstr "" #: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Menus" msgstr "" @@ -2598,6 +2899,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Sound" msgstr "" @@ -2834,6 +3146,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Damage" msgstr "" @@ -2842,6 +3162,14 @@ msgid "Enable players getting damage and dying." msgstr "" #: src/settings_translation_file.cpp +msgid "Creative" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" @@ -3204,6 +3532,36 @@ msgid "Liquid update interval in seconds." msgstr "" #: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "" @@ -3237,12 +3595,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." msgstr "" #: src/settings_translation_file.cpp @@ -3319,23 +3674,39 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." +msgid "Heat blend noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" +msgid "Small-scale temperature variation for blending biomes on borders." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" +msgid "Humidity noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." msgstr "" #: src/settings_translation_file.cpp @@ -3343,7 +3714,19 @@ msgid "Mapgen v5" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" +msgid "Mapgen v5 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave width" msgstr "" #: src/settings_translation_file.cpp @@ -3351,23 +3734,77 @@ msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" +msgid "Cave2 noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Second of 2 3D noises that together define tunnels." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" +msgid "Cavern noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" +msgid "3D noise defining giant caverns." msgstr "" #: src/settings_translation_file.cpp @@ -3375,75 +3812,112 @@ msgid "Mapgen v6" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height select noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" +msgid "Varies depth of biome surface nodes." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" +msgid "Beach noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" +msgid "Defines areas with sandy beaches." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" +msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" +msgid "Cave noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" +msgid "Variation of number of caves." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" +msgid "Trees noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" +msgid "Defines tree areas and tree density." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Apple trees noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" +msgid "Defines areas where trees have apples." msgstr "" #: src/settings_translation_file.cpp @@ -3451,174 +3925,211 @@ msgid "Mapgen v7" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" +msgid "Floatland mountain density" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" +msgid "Floatland mountain height" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" +msgid "Floatland level" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" +msgid "Y-level of floatland midpoint and lake surface." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" +msgid "Y-level to which floatland shadows extend." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" +msgid "Terrain alt noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" +msgid "Terrain persistence noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat" +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat flags" +msgid "Floatland base noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Map generation attributes specific to Mapgen flat.\n" -"Occasional lakes and hills can be added to the flat world.\n" -"Flags that are not specified in the flag string are not modified from the " -"default.\n" -"Flags starting with 'no' are used to explicitly disable them." +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" +msgid "Floatland base height noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Y of flat ground." +msgid "Variation of hill height and lake depth on floatland smooth terrain." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" +msgid "Mountain noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Y of upper limit of large pseudorandom caves." +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" +msgid "Mapgen flat" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" +msgid "Mapgen flat specific flags" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Terrain noise threshold for lakes.\n" -"Controls proportion of world area covered by lakes.\n" -"Adjust towards 0.0 for a larger proportion." +"Map generation attributes specific to Mapgen flat.\n" +"Occasional lakes and hills can be added to the flat world.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" +msgid "Ground level" msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Y of flat ground." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" +msgid "Large cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large pseudorandom caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Terrain noise threshold for hills.\n" -"Controls proportion of world area covered by hills.\n" +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" +msgid "Lake steepness" msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" +msgid "Hill threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" +msgid "Hill steepness" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" +msgid "Terrain noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal" +msgid "Defines location and terrain of optional hills and lakes." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" +msgid "Mapgen fractal" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" +msgid "Fractal type" msgstr "" #: src/settings_translation_file.cpp @@ -3645,7 +4156,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" +msgid "Iterations" msgstr "" #: src/settings_translation_file.cpp @@ -3655,7 +4166,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" +msgid "Scale" msgstr "" #: src/settings_translation_file.cpp @@ -3663,7 +4174,7 @@ msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" +msgid "Offset" msgstr "" #: src/settings_translation_file.cpp @@ -3676,7 +4187,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" +msgid "Slice w" msgstr "" #: src/settings_translation_file.cpp @@ -3688,7 +4199,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" +msgid "Julia x" msgstr "" #: src/settings_translation_file.cpp @@ -3699,7 +4210,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" +msgid "Julia y" msgstr "" #: src/settings_translation_file.cpp @@ -3710,7 +4221,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" +msgid "Julia z" msgstr "" #: src/settings_translation_file.cpp @@ -3721,7 +4232,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" +msgid "Julia w" msgstr "" #: src/settings_translation_file.cpp @@ -3733,19 +4244,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" +msgid "Seabed noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" +msgid "Y-level of seabed." msgstr "" #: src/settings_translation_file.cpp @@ -3782,10 +4285,6 @@ msgid "The altitude at which temperature drops by 20C" msgstr "" #: src/settings_translation_file.cpp -msgid "Large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Depth below which you'll find large caves." msgstr "" @@ -3834,10 +4333,6 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Cave width" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3976,8 +4471,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." msgstr "" #: src/settings_translation_file.cpp diff --git a/po/ms/minetest.po b/po/ms/minetest.po new file mode 100644 index 000000000..82a38557f --- /dev/null +++ b/po/ms/minetest.po @@ -0,0 +1,5356 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: minetest\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-06-02 15:18+0000\n" +"Last-Translator: Muhammad Nur Hidayat Yasuyoshi <muhdnurhidayat96@yahoo.com>" +"\n" +"Language-Team: Malay " +"<https://hosted.weblate.org/projects/minetest/minetest/ms/>\n" +"Language: ms\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 2.15-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Lahir semula" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Anda telah meninggal dunia." + +#: builtin/fstk/ui.lua +msgid "An error occured in a Lua script, such as a mod:" +msgstr "Terdapat ralat dalam skrip Lua, contohnya mods:" + +#: builtin/fstk/ui.lua +msgid "An error occured:" +msgstr "Telah berlakunya ralat:" + +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "Menu utama" + +#: builtin/fstk/ui.lua builtin/mainmenu/store.lua +msgid "Ok" +msgstr "Ok" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "Sambung semula" + +#: builtin/fstk/ui.lua +msgid "The server has requested a reconnect:" +msgstr "Pelayan permainan meminta anda untuk menyambung semula:" + +#: builtin/mainmenu/common.lua src/game.cpp +msgid "Loading..." +msgstr "Sedang memuatkan..." + +#: builtin/mainmenu/common.lua +msgid "Protocol version mismatch. " +msgstr "Versi protokol tidak serasi. " + +#: builtin/mainmenu/common.lua +msgid "Server enforces protocol version $1. " +msgstr "Pelayan permainan menguatkuasakan protokol versi $1. " + +#: builtin/mainmenu/common.lua +msgid "Server supports protocol versions between $1 and $2. " +msgstr "Pelayan permainan menyokong protokol versi $1 hingga $2. " + +#: builtin/mainmenu/common.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Cuba aktifkan semula senarai pelayan awam dan periksa sambungan internet " +"anda." + +#: builtin/mainmenu/common.lua +msgid "We only support protocol version $1." +msgstr "Kami hanya menyokong protokol versi $1." + +#: builtin/mainmenu/common.lua +msgid "We support protocol versions between version $1 and $2." +msgstr "Kami menyokong protokol versi $1 hingga $2." + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp +msgid "Cancel" +msgstr "Batal" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Dependencies:" +msgstr "Kebergantungan:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable MP" +msgstr "Melumpuhkan MP" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Lumpuhkan semua" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable MP" +msgstr "Membolehkan MP" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable all" +msgstr "Membolehkan semua" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "" +"Failed to enable mod \"$1\" as it contains disallowed characters. Only " +"chararacters [a-z0-9_] are allowed." +msgstr "" +"Gagal untuk membolehkan mods \"$1\" kerana ia mengandungi aksara yang tidak " +"dibenarkan. Hanya aksara [a-z0-9_] sahaja yang dibenarkan." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Mod:" +msgstr "Mods:" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "Kebergantungan pilihan:" + +#: builtin/mainmenu/dlg_config_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp +msgid "Save" +msgstr "Simpan" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "World:" +msgstr "Dunia:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "enabled" +msgstr "Dibolehkan" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "A world named \"$1\" already exists" +msgstr "Dunia bernama \"$1\" telah wujud" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "Cipta" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Download a subgame, such as minetest_game, from minetest.net" +msgstr "Muat turun subpermainan, contohnya minetest_game, dari minetest.net" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Download one from minetest.net" +msgstr "Muat turun satu dari minetest.net" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Game" +msgstr "Permainan" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "Janaan peta" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "No worldname given or no game selected" +msgstr "Nama dunia tidak diberi atau tiada permainan dipilih" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Seed" +msgstr "Benih" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Warning: The minimal development test is meant for developers." +msgstr "" +"Amaran: Percubaan pembangunan minimum hanyalah untuk kegunaan pembangun." + +#: builtin/mainmenu/dlg_create_world.lua +msgid "World name" +msgstr "Nama dunia" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "You have no subgames installed." +msgstr "Anda tidak memasang sebarang subpermainan." + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Are you sure you want to delete \"$1\"?" +msgstr "Adakah anda pasti anda ingin memadam \"$1\"?" + +#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua +#: builtin/mainmenu/tab_local.lua src/keycode.cpp +msgid "Delete" +msgstr "Padam" + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Modmgr: failed to delete \"$1\"" +msgstr "Pengurus mods: gagal memadam \"$1\"" + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Modmgr: invalid modpath \"$1\"" +msgstr "Pengurus mods: laluan mods tidak sah - \"$1\"" + +#: builtin/mainmenu/dlg_delete_world.lua +msgid "Delete World \"$1\"?" +msgstr "Padam Dunia \"$1\"?" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Accept" +msgstr "Terima" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "Menamakan semula pek mods:" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "\"$1\" is not a valid flag." +msgstr "\"$1\" bukanlah bendera yang sah." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "(No description of setting given)" +msgstr "(Tiada perihal untuk tetapan yang diberi)" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "< Back to Settings page" +msgstr "< Kembali ke halaman Tetapan" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Browse" +msgstr "Layar" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Disabled" +msgstr "Dilumpuhkan" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "Edit" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "Dibolehkan" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Format is 3 numbers separated by commas and inside brackets." +msgstr "Formatnya ialah 3 nombor dalam kurungan dipisahkan dengan koma." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "" +"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " +"<octaves>, <persistence>" +msgstr "" +"Format: <ofset>, <skala>, (<sebarX>, <sebarY>, <sebarZ>), <benih>, <oktaf>, " +"<penerusan>" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Games" +msgstr "Permainan" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua +msgid "Mods" +msgstr "Mods" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Optionally the lacunarity can be appended with a leading comma." +msgstr "Anda juga boleh tambah lakunariti dengan koma pelopor." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a comma seperated list of flags." +msgstr "Sila masukkan senarai bendera dipisahkan dengan koma." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid integer." +msgstr "Sila masukkan integer yang sah." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "Sila masukkan nombor yang sah." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Possible values are: " +msgstr "Nilai yang boleh digunakan: " + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "Pulihkan Tetapan Asal" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Cari" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select path" +msgstr "Pilih laluan" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Show technical names" +msgstr "Tunjukkan nama teknikal" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "Nilai mestilah sekurang-kurangnya $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "Nilai mestilah tidak lebih daripada $1." + +#: builtin/mainmenu/modmgr.lua +msgid "" +"\n" +"Install Mod: unsupported filetype \"$1\" or broken archive" +msgstr "" +"\n" +"Pasang Mods: jenis fail \"$1\" tidak disokong atau arkib rosak" + +#: builtin/mainmenu/modmgr.lua +msgid "Failed to install $1 to $2" +msgstr "Gagal memasang $1 pada $2" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: file: \"$1\"" +msgstr "Pasang Mods: fail: \"$1\"" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: unable to find real modname for: $1" +msgstr "Pasang Mods: gagal mencari nama mods sebenar untuk: $1" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: unable to find suitable foldername for modpack $1" +msgstr "Pasang Mods: tidak jumpa nama folder yang sesuai untuk pek mods $1" + +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "Mods Subpermainan" + +#: builtin/mainmenu/store.lua +msgid "Close store" +msgstr "Tutup kedai" + +#: builtin/mainmenu/store.lua +msgid "Downloading $1, please wait..." +msgstr "Sedang muat turun $1, sila tunggu..." + +#: builtin/mainmenu/store.lua +msgid "Install" +msgstr "Pasang" + +#: builtin/mainmenu/store.lua +msgid "Page $1 of $2" +msgstr "Ms. $1 drpd $2" + +#: builtin/mainmenu/store.lua +msgid "Rating" +msgstr "Rating" + +#: builtin/mainmenu/store.lua +msgid "Shortname:" +msgstr "Nama Singkat:" + +#: builtin/mainmenu/store.lua +msgid "Successfully installed:" +msgstr "Berjaya dipasang:" + +#: builtin/mainmenu/store.lua +msgid "Unsorted" +msgstr "Tidak bersusun" + +#: builtin/mainmenu/store.lua +msgid "re-Install" +msgstr "Pasang Semula" + +#: builtin/mainmenu/tab_credits.lua +msgid "Active Contributors" +msgstr "Penyumbang Aktif" + +#: builtin/mainmenu/tab_credits.lua +msgid "Core Developers" +msgstr "Pembangun Teras" + +#: builtin/mainmenu/tab_credits.lua +msgid "Credits" +msgstr "Penghargaan" + +#: builtin/mainmenu/tab_credits.lua +msgid "Previous Contributors" +msgstr "Penyumbang Terdahulu" + +#: builtin/mainmenu/tab_credits.lua +msgid "Previous Core Developers" +msgstr "Pembangun Teras Terdahulu" + +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "Umumkan Pelayan" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Alamat Ikatan" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Konfigurasi" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Mod Kreatif" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Boleh Cedera" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "Permainan Hos" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "Pelayan Hos" + +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" +msgstr "Permainan Tempatan" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nama/Kata laluan" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Buat Baru" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Tiada dunia dicipta atau dipilih!" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Mula Main" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Port" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Pilih Dunia:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Port Pelayan" + +#: builtin/mainmenu/tab_mods.lua +msgid "Installed Mods:" +msgstr "Mods Dipasang:" + +#: builtin/mainmenu/tab_mods.lua +msgid "Mod information:" +msgstr "Maklumat Mods:" + +#: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "Tiada kebergantungan." + +#: builtin/mainmenu/tab_mods.lua +msgid "No mod description available" +msgstr "Tiada perihal mods" + +#: builtin/mainmenu/tab_mods.lua +msgid "Rename" +msgstr "Namakan Semula" + +#: builtin/mainmenu/tab_mods.lua +msgid "Select Mod File:" +msgstr "Pilih Fail Mods:" + +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected mod" +msgstr "Nyahpasang mods dipilih" + +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected modpack" +msgstr "Nyahpasangkan pek mods yang dipilih" + +#: builtin/mainmenu/tab_online.lua +msgid "Address / Port" +msgstr "Alamat / Port" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Connect" +msgstr "Sambung" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative mode" +msgstr "Mod Kreatif" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Damage enabled" +msgstr "Boleh Cedera" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Del. Favorite" +msgstr "Padam Kegemaran" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Favorite" +msgstr "Kegemaran" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Name / Password" +msgstr "Nama / Kata laluan" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "Ping" + +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "Main Dalam Talian" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "Boleh Berlawan PvP" + +#: builtin/mainmenu/tab_settings.lua +msgid "2x" +msgstr "2x" + +#: builtin/mainmenu/tab_settings.lua +msgid "3D Clouds" +msgstr "Awan 3D" + +#: builtin/mainmenu/tab_settings.lua +msgid "4x" +msgstr "4x" + +#: builtin/mainmenu/tab_settings.lua +msgid "8x" +msgstr "8x" + +#: builtin/mainmenu/tab_settings.lua +msgid "Advanced Settings" +msgstr "Tetapan Mendalam" + +#: builtin/mainmenu/tab_settings.lua +msgid "Antialiasing:" +msgstr "Antialias:" + +#: builtin/mainmenu/tab_settings.lua +msgid "Are you sure to reset your singleplayer world?" +msgstr "Adakah anda mahu set semula dunia pemain perseorangan?" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "Autosimpan saiz skrin" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bilinear Filter" +msgstr "Penapisan Bilinear" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bump Mapping" +msgstr "Pemetaan Benggol" + +#: builtin/mainmenu/tab_settings.lua +msgid "Change keys" +msgstr "Tukar kekunci" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "Kaca Bersambungan" + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "Daun Beragam" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "Peta Mip" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "Peta Mip + Penapisan Aniso" + +#: builtin/mainmenu/tab_settings.lua +msgid "No" +msgstr "Tidak" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "Tiada Tapisan" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "Tiada Peta Mip" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "Tonjolan Nod" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "Kerangka Nod" + +#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua +msgid "None" +msgstr "Tiada" + +#: builtin/mainmenu/tab_settings.lua +msgid "Normal Mapping" +msgstr "Pemetaan Biasa" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "Daun Legap" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "Air Legap" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Parallax Occlusion" +msgstr "Oklusi Paralaks" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "Partikel" + +#: builtin/mainmenu/tab_settings.lua +msgid "Reset singleplayer world" +msgstr "Set semula dunia pemain perseorangan" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Skrin:" + +#: builtin/mainmenu/tab_settings.lua +msgid "Settings" +msgstr "Tetapan" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "Pembayang" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "Daun Ringkas" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "Pencahayaan Lembut" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "Jalinan:" + +#: builtin/mainmenu/tab_settings.lua +msgid "To enable shaders the OpenGL driver needs to be used." +msgstr "Untuk membolehkan pembayang, pemacu OpenGL mesti digunakan." + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "Pemetaan Tona" + +#: builtin/mainmenu/tab_settings.lua +msgid "Touchthreshold (px)" +msgstr "Nilai ambang sentuhan (px)" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "Penapisan Trilinear" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "Daun Bergoyang" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Plants" +msgstr "Tumbuhan Bergoyang" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Water" +msgstr "Air Bergelora" + +#: builtin/mainmenu/tab_settings.lua +msgid "Yes" +msgstr "Ya" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Config mods" +msgstr "Konfigurasi mods" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Main" +msgstr "Utama" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Start Singleplayer" +msgstr "Mula Main Seorang" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "No information available" +msgstr "Tiada maklumat tersedia" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "Select texture pack:" +msgstr "Pilih pek tekstur:" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "Texturepacks" +msgstr "Pek tekstur" + +#: src/client.cpp +msgid "Connection timed out." +msgstr "Sambungan tamat tempoh." + +#: src/client.cpp +msgid "Done!" +msgstr "Selesai!" + +#: src/client.cpp +msgid "Initializing nodes" +msgstr "Mengasalkan nod" + +#: src/client.cpp +msgid "Initializing nodes..." +msgstr "Sedang mengasalkan nod..." + +#: src/client.cpp +msgid "Loading textures..." +msgstr "Sedang memuatkan tekstur..." + +#: src/client.cpp +msgid "Rebuilding shaders..." +msgstr "Sedang membina semula pembayang..." + +#: src/client/clientlauncher.cpp +msgid "Connection error (timed out?)" +msgstr "Ralat dalam penyambungan (tamat tempoh?)" + +#: src/client/clientlauncher.cpp +msgid "Could not find or load game \"" +msgstr "Tidak jumpa atau tidak boleh muatkan permainan \"" + +#: src/client/clientlauncher.cpp +msgid "Invalid gamespec." +msgstr "Spesifikasi permainan tidak sah." + +#: src/client/clientlauncher.cpp +msgid "Main Menu" +msgstr "Menu Utama" + +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "" +"Tiada dunia dipilih atau tiada alamat diberi. Tiada apa boleh dilakukan." + +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "Nama pemain terlalu panjang." + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Sila masukkan nama!" + +#: src/client/clientlauncher.cpp +msgid "Provided world path doesn't exist: " +msgstr "Laluan dunia diberi tidak wujud: " + +#: src/fontengine.cpp +msgid "needs_fallback_font" +msgstr "no" + +#: src/game.cpp +msgid "" +"\n" +"Check debug.txt for details." +msgstr "" +"\n" +"Periksa fail debug.txt untuk maklumat lanjut." + +#: src/game.cpp +msgid "- Address: " +msgstr "- Alamat: " + +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "- Mod Kreatif: " + +#: src/game.cpp +msgid "- Damage: " +msgstr "- Boleh cedera: " + +#: src/game.cpp +msgid "- Mode: " +msgstr "- Mod: " + +#: src/game.cpp +msgid "- Port: " +msgstr "- Port: " + +#: src/game.cpp +msgid "- Public: " +msgstr "- Awam: " + +#: src/game.cpp +msgid "- PvP: " +msgstr "- PvP: " + +#: src/game.cpp +msgid "- Server Name: " +msgstr "- Nama Pelayan: " + +#: src/game.cpp +msgid "Change Keys" +msgstr "Tukar Kekunci" + +#: src/game.cpp +msgid "Change Password" +msgstr "Tukar Kata Laluan" + +#: src/game.cpp +msgid "Connecting to server..." +msgstr "Sedang menyambung kepada pelayan..." + +#: src/game.cpp +msgid "Continue" +msgstr "Teruskan" + +#: src/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse left: dig/punch\n" +"- Mouse right: place/use\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" +msgstr "" +"Kawalan:\n" +"- %s: bergerak ke depan\n" +"- %s: bergerak ke belakang\n" +"- %s: bergerak ke kiri\n" +"- %s: bergerak ke kanan\n" +"- %s: lompat/naik atas\n" +"- %s: selinap/turun bawah\n" +"- %s: jatuhkan item\n" +"- %s: inventori\n" +"- Tetikus: pusing/lihat sekeliling\n" +"- Butang tetikus kiri: gali/ketuk\n" +"- Butang tetikus kanan: letak barang/guna\n" +"- Roda tetikus: pilih item\n" +"- %s: sembang\n" + +#: src/game.cpp +msgid "Creating client..." +msgstr "Sedang mencipta klien..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Sedang mencipta pelayan..." + +#: src/game.cpp +msgid "" +"Default Controls:\n" +"No menu visible:\n" +"- single tap: button activate\n" +"- double tap: place/use\n" +"- slide finger: look around\n" +"Menu/Inventory visible:\n" +"- double tap (outside):\n" +" -->close\n" +"- touch stack, touch slot:\n" +" --> move stack\n" +"- touch&drag, tap 2nd finger\n" +" --> place single item to slot\n" +msgstr "" +"Kawalan Asal:\n" +"Tiada menu kelihatan:\n" +"- tekan sekali: aktifkan butang\n" +"- tekan dua kali: letak barang/guna sesuatu\n" +"- tarik dengan jari: lihat sekeliling\n" +"Menu/Inventori kelihatan:\n" +"- tekan berganda (luar kawasan inventori):\n" +" -->tutup\n" +"- tekan tindanan, tekan slot:\n" +" --> pindah tindanan\n" +"- sentuh & tarik, tekan skrin pakai jari kedua\n" +" --> letak satu item dari tindanan ke dalam slot\n" + +#: src/game.cpp +msgid "Exit to Menu" +msgstr "Keluar ke Menu" + +#: src/game.cpp +msgid "Exit to OS" +msgstr "Keluar Terus Permainan" + +#: src/game.cpp +msgid "Game info:" +msgstr "Maklumat permainan:" + +#: src/game.cpp +msgid "Game paused" +msgstr "Permainan dijedakan" + +#: src/game.cpp +msgid "Hosting server" +msgstr "Mengehos pelayan" + +#: src/game.cpp +msgid "Item definitions..." +msgstr "Sedang mentakrifkan item..." + +#: src/game.cpp +msgid "KiB/s" +msgstr "KiB/s" + +#: src/game.cpp +msgid "Media..." +msgstr "Sedang memuatkan media..." + +#: src/game.cpp +msgid "MiB/s" +msgstr "MiB/s" + +#: src/game.cpp +msgid "Node definitions..." +msgstr "Sedang mentakrifkan nod..." + +#: src/game.cpp +msgid "Off" +msgstr "Tutup" + +#: src/game.cpp +msgid "On" +msgstr "Buka" + +#: src/game.cpp +msgid "Remote server" +msgstr "Pelayan jarak jauh" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Sedang menyelesaikan alamat..." + +#: src/game.cpp +msgid "Shutting down..." +msgstr "Sedang menutup..." + +#: src/game.cpp +msgid "Singleplayer" +msgstr "Pemain Perseorangan" + +#: src/game.cpp +msgid "Sound Volume" +msgstr "Kekuatan Bunyi" + +#: src/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "Kekuatan bunyi diubah kepada %d%%" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "Kekuatan bunyi diubah kepada 0%" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "Kekuatan bunyi diubah kepada 100%" + +#: src/game.cpp src/guiFormSpecMenu.cpp +msgid "ok" +msgstr "ok" + +#: src/guiFormSpecMenu.cpp +msgid "Enter " +msgstr "Masuk " + +#: src/guiFormSpecMenu.cpp +msgid "Proceed" +msgstr "Teruskan" + +#: src/guiKeyChangeMenu.cpp +msgid "\"Use\" = climb down" +msgstr "\"Guna sesuatu\" = panjat turun" + +#: src/guiKeyChangeMenu.cpp +msgid "Backward" +msgstr "Ke Belakang" + +#: src/guiKeyChangeMenu.cpp +msgid "Chat" +msgstr "Sembang" + +#: src/guiKeyChangeMenu.cpp +msgid "Command" +msgstr "Arahan" + +#: src/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "Konsol" + +#: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Perlahankan bunyi" + +#: src/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "Tekan dua kali \"lompat\" untuk menogol terbang" + +#: src/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "Jatuhkan" + +#: src/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "Ke Depan" + +#: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "Kuatkan bunyi" + +#: src/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "Inventori" + +#: src/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "Lompat" + +#: src/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "Kekunci telah digunakan untuk fungsi lain" + +#: src/guiKeyChangeMenu.cpp +msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgstr "" +"Ikatan kekunci. (Jika menu ini berselerak, padam sesetengah benda dari fail " +"minetest.conf)" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Left" +msgstr "Ke Kiri" + +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "Arahan tempatan" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Bisu" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "Item seterusnya" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "Item sebelumnya" + +#: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Print stacks" +msgstr "Tindanan Cetak" + +#: src/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "Jarak Pemilihan" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Right" +msgstr "Ke Kanan" + +#: src/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "Selinap" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle Cinematic" +msgstr "Togol Sinematik" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "Togol pergerakan pantas" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "Togol Terbang" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "Togol tembus blok" + +#: src/guiKeyChangeMenu.cpp +msgid "Use" +msgstr "Guna" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Zoom" +msgstr "Zum" + +#: src/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "tekan kekunci" + +#: src/guiPasswordChange.cpp +msgid "Change" +msgstr "Tukar" + +#: src/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Sahkan Kata Laluan" + +#: src/guiPasswordChange.cpp +msgid "New Password" +msgstr "Kata Laluan Baru" + +#: src/guiPasswordChange.cpp +msgid "Old Password" +msgstr "Kata Laluan Lama" + +#: src/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Kata laluan tidak padan!" + +#: src/guiVolumeChange.cpp +msgid "Exit" +msgstr "Keluar" + +#: src/guiVolumeChange.cpp +msgid "Sound Volume: " +msgstr "Kekuatan Bunyi: " + +#: src/keycode.cpp +msgid "Apps" +msgstr "Aplikasi" + +#: src/keycode.cpp +msgid "Back" +msgstr "Butang Backspace" + +#: src/keycode.cpp +msgid "Caps Lock" +msgstr "Kunci Huruf Besar" + +#: src/keycode.cpp +msgid "Clear" +msgstr "Padam" + +#: src/keycode.cpp +msgid "Control" +msgstr "Butang Ctrl" + +#: src/keycode.cpp +msgid "Down" +msgstr "Bawah" + +#: src/keycode.cpp +msgid "End" +msgstr "Butang End" + +#: src/keycode.cpp +msgid "Erase EOF" +msgstr "Padam EOF" + +#: src/keycode.cpp +msgid "Execute" +msgstr "Lakukan" + +#: src/keycode.cpp +msgid "Help" +msgstr "Bantuan" + +#: src/keycode.cpp +msgid "Home" +msgstr "Butang Home" + +#: src/keycode.cpp +msgid "IME Accept" +msgstr "IME - Terima" + +#: src/keycode.cpp +msgid "IME Convert" +msgstr "IME - Tukar" + +#: src/keycode.cpp +msgid "IME Escape" +msgstr "IME - Keluar" + +#: src/keycode.cpp +msgid "IME Mode Change" +msgstr "IME - Tukar Mod" + +#: src/keycode.cpp +msgid "IME Nonconvert" +msgstr "IME - Tidaktukar" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Butang Insert" + +#: src/keycode.cpp +msgid "Left Button" +msgstr "Butang Kiri" + +#: src/keycode.cpp +msgid "Left Control" +msgstr "Butang Ctrl Kiri" + +#: src/keycode.cpp +msgid "Left Menu" +msgstr "Menu Kiri" + +#: src/keycode.cpp +msgid "Left Shift" +msgstr "Butang Shift Kiri" + +#: src/keycode.cpp +msgid "Left Windows" +msgstr "Butang Windows Kiri" + +#: src/keycode.cpp +msgid "Menu" +msgstr "Butang Menu" + +#: src/keycode.cpp +msgid "Middle Button" +msgstr "Butang Tengah" + +#: src/keycode.cpp +msgid "Next" +msgstr "Bawah Halaman (PgDn)" + +#: src/keycode.cpp +msgid "Num Lock" +msgstr "Butang Num Lock" + +#: src/keycode.cpp +msgid "Numpad *" +msgstr "Numpad *" + +#: src/keycode.cpp +msgid "Numpad +" +msgstr "Numpad +" + +#: src/keycode.cpp +msgid "Numpad -" +msgstr "Numpad -" + +#: src/keycode.cpp +msgid "Numpad ." +msgstr "Numpad ." + +#: src/keycode.cpp +msgid "Numpad /" +msgstr "Numpad /" + +#: src/keycode.cpp +msgid "Numpad 0" +msgstr "Numpad 0" + +#: src/keycode.cpp +msgid "Numpad 1" +msgstr "Numpad 1" + +#: src/keycode.cpp +msgid "Numpad 2" +msgstr "Numpad 2" + +#: src/keycode.cpp +msgid "Numpad 3" +msgstr "Numpad 3" + +#: src/keycode.cpp +msgid "Numpad 4" +msgstr "Numpad 4" + +#: src/keycode.cpp +msgid "Numpad 5" +msgstr "Numpad 5" + +#: src/keycode.cpp +msgid "Numpad 6" +msgstr "Numpad 6" + +#: src/keycode.cpp +msgid "Numpad 7" +msgstr "Numpad 7" + +#: src/keycode.cpp +msgid "Numpad 8" +msgstr "Numpad 8" + +#: src/keycode.cpp +msgid "Numpad 9" +msgstr "Numpad 9" + +#: src/keycode.cpp +msgid "OEM Clear" +msgstr "Padam OEM" + +#: src/keycode.cpp +msgid "Pause" +msgstr "Butang Pause" + +#: src/keycode.cpp +msgid "Play" +msgstr "Mula Main" + +#: src/keycode.cpp +msgid "Print" +msgstr "Cetak" + +#: src/keycode.cpp +msgid "Prior" +msgstr "Atas Halaman (PgUp)" + +#: src/keycode.cpp +msgid "Return" +msgstr "Butang Enter" + +#: src/keycode.cpp +msgid "Right Button" +msgstr "Butang Kanan" + +#: src/keycode.cpp +msgid "Right Control" +msgstr "Butang Ctrl Kanan" + +#: src/keycode.cpp +msgid "Right Menu" +msgstr "Butang Menu Kanan" + +#: src/keycode.cpp +msgid "Right Shift" +msgstr "Butang Shift Kanan" + +#: src/keycode.cpp +msgid "Right Windows" +msgstr "Butang Windows Kanan" + +#: src/keycode.cpp +msgid "Scroll Lock" +msgstr "Butang Scroll Lock" + +#: src/keycode.cpp +msgid "Select" +msgstr "Pilih kekunci" + +#: src/keycode.cpp +msgid "Shift" +msgstr "Butang Shift" + +#: src/keycode.cpp +msgid "Sleep" +msgstr "Butang Tidur" + +#: src/keycode.cpp +msgid "Snapshot" +msgstr "Tangkap Gambar Skrin" + +#: src/keycode.cpp +msgid "Space" +msgstr "Butang Selang" + +#: src/keycode.cpp +msgid "Tab" +msgstr "Butang Tab" + +#: src/keycode.cpp +msgid "Up" +msgstr "Atas" + +#: src/keycode.cpp +msgid "X Button 1" +msgstr "Butang X 1" + +#: src/keycode.cpp +msgid "X Button 2" +msgstr "Butang X 2" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n" +"Used to move a suitable spawn area of low land close to (0, 0).\n" +"The default is suitable for mandelbrot sets, it needs to be edited for julia " +"sets.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." +msgstr "" +"Ofset fraktal (X,Y,Z) dari pusat dunia dalam unit 'skala'.\n" +"Digunakan untuk memindahkan kawasan kelahiran tanah rendah lebih dekat " +"kepada (0, 0).\n" +"Nilai lalai sesuai untuk set mandelbrot, ia perlu disunting untuk set julia." +"\n" +"Jaraknya secara kasar -2 sehingga 2. Darabkan dengan 'skala' untuk ofset " +"dalam nod." + +#: src/settings_translation_file.cpp +msgid "" +"0 = parallax occlusion with slope information (faster).\n" +"1 = relief mapping (slower, more accurate)." +msgstr "" +"0 = oklusi paralaks dengan maklumat cerun (lebih cepat).\n" +"1 = pemetaan bentuk muka bumi (lebih lambat, lebih tepat)." + +#: src/settings_translation_file.cpp +msgid "3D clouds" +msgstr "Awan 3D" + +#: src/settings_translation_file.cpp +msgid "3D mode" +msgstr "Mod 3D" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "Hingar 3D mentakrifkan gua gergasi." + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" +"Hingar 3D yang mentakrifkan struktur gunung dan ketinggiannya.\n" +"Ia juga mentakrifkan struktur rupa bumi gunung tanah terapung." + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "Hingar 3D mentakrifkan struktur dinding ngarai sungai." + +#: src/settings_translation_file.cpp +msgid "" +"3D support.\n" +"Currently supported:\n" +"- none: no 3d output.\n" +"- anaglyph: cyan/magenta color 3d.\n" +"- interlaced: odd/even line based polarisation screen support.\n" +"- topbottom: split screen top/bottom.\n" +"- sidebyside: split screen side by side.\n" +"- pageflip: quadbuffer based 3d." +msgstr "" +"Sokongan 3D.\n" +"Yang disokong pada masa ini:\n" +"- tiada: tiada output 3D.\n" +"- anaglif: 3D warna biru/merah.\n" +"- selang-seli: garis genap/ganjil berdasarkan sokongan skrin polarisasi.\n" +"- atas-bawah: pisah skrin atas/bawah.\n" +"- kiri-kanan: pisah skrin kiri/kanan.\n" +"- selak halaman: 3D berasaskan penimbal kuad." + +#: src/settings_translation_file.cpp +msgid "" +"A chosen map seed for a new map, leave empty for random.\n" +"Will be overridden when creating a new world in the main menu." +msgstr "" +"Benih peta yang dipilih untuk peta baru, biarkan kosong untuk benih rawak.\n" +"Tidak digunapakai sekiranya mencipta dunia baru melalui menu utama." + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server crashes." +msgstr "Mesej yang akan dipaparkan kepada semua klien apabila pelayan runtuh." + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "Mesej yang akan dipaparkan dekat semua klien apabila pelayan ditutup." + +#: src/settings_translation_file.cpp +msgid "Absolute limit of emerge queues" +msgstr "Had mutlak baris gilir keluar" + +#: src/settings_translation_file.cpp +msgid "Acceleration in air" +msgstr "Pecutan dalam udara" + +#: src/settings_translation_file.cpp +msgid "Active Block Management interval" +msgstr "Selang masa Pengurusan Blok Aktif" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifier interval" +msgstr "Selang masa pengubah blok aktif" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "Pengubah Blok Aktif" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "Jarak blok aktif" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "Jarak penghantaran objek aktif" + +#: src/settings_translation_file.cpp +msgid "" +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." +msgstr "" +"Alamat untuk menyambung.\n" +"Biar kosong untuk memulakan pelayan permainan tempatan.\n" +"Ambil perhatian bahawa medan alamat dalam menu utama mengatasi tetapan ini." + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "Menambah partikel apabila menggali nod." + +#: src/settings_translation_file.cpp +msgid "" +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." +msgstr "" +"Laraskan konfigurasi DPI ke skrin anda (bukan X11/Android sahaja) cth. untuk " +"skrin 4K." + +#: src/settings_translation_file.cpp +msgid "" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" +"This setting is for the client only and is ignored by the server." +msgstr "" +"Laraskan pengekodan gama untuk jadual cahaya. Nombor lebih tinggi lebih " +"cerah.\n" +"Tetapan ini hanya untuk klien dan diabaikan oleh pelayan permainan." + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "Tetapan mendalam" + +#: src/settings_translation_file.cpp +msgid "Altitude Chill" +msgstr "Kedinginan Altitud" + +#: src/settings_translation_file.cpp +msgid "Always fly and fast" +msgstr "Sentiasa terbang dan bergerak pantas" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "Gama oklusi sekitar" + +#: src/settings_translation_file.cpp +msgid "Amplifies the valleys" +msgstr "Memperbesarkan lembah" + +#: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" +"Sistem Android sahaja: Cuba untuk mencipta tekstur inventori daripada\n" +"jejaring apabila tiada penerjemahan yang disokong dijumpai." + +#: src/settings_translation_file.cpp +msgid "Anisotropic filtering" +msgstr "Penapisan anisotropik" + +#: src/settings_translation_file.cpp +msgid "Announce server" +msgstr "Mengumumkan pelayan permainan" + +#: src/settings_translation_file.cpp +msgid "" +"Announce to this serverlist.\n" +"If you want to announce your ipv6 address, use serverlist_url = v6.servers." +"minetest.net." +msgstr "" +"Umumkan ke senarai pelayan ini.\n" +"Jika anda ingin umumkan alamat IPv6 anda, gunakan serverlist_url = v6." +"servers.minetest.net." + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "Hingar pokok epal" + +#: src/settings_translation_file.cpp +msgid "Approximate (X,Y,Z) scale of fractal in nodes." +msgstr "Skala anggaran (X,Y,Z) fraktal dalam nod." + +#: src/settings_translation_file.cpp +msgid "Ask to reconnect after crash" +msgstr "Minta sambung semula selepas keruntuhan" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" +"Pada jarak ini, pelayan akan mengoptimumkan secara agresif blok yang mana " +"akan dihantar kepada klien.\n" +"Nilai lebih kecil berkemungkinan besar boleh meningkatkan prestasi dengan " +"banyak, dengan mengorbankan glic penerjemahan tampak.\n" +"(sesetengah blok tidak akan diterjemah di bawah air dan dalam gua, kadang-" +"kadang turut berlaku atas daratan)\n" +"Menetapkan nilai ini lebih bear daripada nilai max_block_send_distance akan " +"melumpuhkan pengoptimunan ini.\n" +"Nyatakan dalam unit blokpeta (16 nod)" + +#: src/settings_translation_file.cpp +msgid "Automaticaly report to the serverlist." +msgstr "Melaporkan pelayan kepada senarai pelayan permainan secara automatik." + +#: src/settings_translation_file.cpp +msgid "Autorun key" +msgstr "Kekunci berlari auto" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "Kekunci ke belakang" + +#: src/settings_translation_file.cpp +msgid "Base terrain height" +msgstr "Ketinggian rupa bumi asas" + +#: src/settings_translation_file.cpp +msgid "Basic" +msgstr "Asas" + +#: src/settings_translation_file.cpp +msgid "Basic Privileges" +msgstr "Keistimewaan asas" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "Hingar pantai" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "Nilai ambang hingar pantai" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "Penapisan bilinear" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "Alamat ikatan" + +#: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "Parameter suhu API biom dan hingar kelembapan" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "Hingar biom" + +#: src/settings_translation_file.cpp +msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgstr "Bit per piksel (atau kedalaman warna) dalam mod skrin penuh." + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "Bina dalam sistem pemain" + +#: src/settings_translation_file.cpp +msgid "Builtin" +msgstr "Terbina dalam" + +#: src/settings_translation_file.cpp +msgid "Bumpmapping" +msgstr "Pemetaan timbul" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "Pelembutan kamera" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "Pelembutan kamera dalam mod sinematik" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "Kekunci togol kemas kini kamera" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "Hingar gua" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "Hingar gua #1" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "Hingar gua #2" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "Lebar gua" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "Hingar gua1" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "Hingar gua2" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "Had jana gua" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "Hingar gua" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "Tirusan gua" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "Nilai ambang gua" + +#: src/settings_translation_file.cpp +msgid "Caves and tunnels form at the intersection of the two noises" +msgstr "Gua dan terowong yang terbentuk di persimpangan dua hingar" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "Kekunci sembang" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "Kekunci togol sembang" + +#: src/settings_translation_file.cpp +msgid "Chatcommands" +msgstr "Perintah sembang" + +#: src/settings_translation_file.cpp +msgid "" +"Choice of 18 fractals from 9 formulas.\n" +"1 = 4D \"Roundy\" mandelbrot set.\n" +"2 = 4D \"Roundy\" julia set.\n" +"3 = 4D \"Squarry\" mandelbrot set.\n" +"4 = 4D \"Squarry\" julia set.\n" +"5 = 4D \"Mandy Cousin\" mandelbrot set.\n" +"6 = 4D \"Mandy Cousin\" julia set.\n" +"7 = 4D \"Variation\" mandelbrot set.\n" +"8 = 4D \"Variation\" julia set.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot set.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" julia set.\n" +"11 = 3D \"Christmas Tree\" mandelbrot set.\n" +"12 = 3D \"Christmas Tree\" julia set.\n" +"13 = 3D \"Mandelbulb\" mandelbrot set.\n" +"14 = 3D \"Mandelbulb\" julia set.\n" +"15 = 3D \"Cosine Mandelbulb\" mandelbrot set.\n" +"16 = 3D \"Cosine Mandelbulb\" julia set.\n" +"17 = 4D \"Mandelbulb\" mandelbrot set.\n" +"18 = 4D \"Mandelbulb\" julia set." +msgstr "" +"18 pilihan fraktal daripada 9 formula.\n" +"1 = Set mandelbrot \"Bulatan\" 4D\n" +"2 = Set julia \"Bulatan\" 4D.\n" +"3 = Set mandelbrot \"Persegi\" 4D.\n" +"4 = Set julia \"Persegi\" 4D.\n" +"5 = Set mandelbrot \"Sepupu Mandy\" 4D.\n" +"6 = Set julia \"Sepupu Mandy\" 4D.\n" +"7 = Set mandelbrot \"Variasi\" 4D.\n" +"8 = Set julia \"Variasi\" 4D.\n" +"9 = Set mandelbrot \"Mandelbrot/Mandelbar\" 3D.\n" +"10 = Set julia \"Mandelbrot/Mandelbar\" 3D.\n" +"11 = Set mandelbrot \"Pokok Krismas\" 3D.\n" +"12 = Set julia \"Pokok Krismas\" 3D.\n" +"13 = Set mandelbrot \"Mandelbulb\" 3D.\n" +"14 = Set julia \"Mandelbulb\" 3D.\n" +"15 = Set mandelbrot \"Mandelbulb Kosinus\" 3D.\n" +"16 = Set julia \"Mandelbulb Kosinus\" 3D.\n" +"17 = Set mandelbrot \"Mandelbulb\" 4D.\n" +"18 = Set julia \"Mandelbulb\" 4D." + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "Saiz ketulan" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "Mod sinematik" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "Kekunci mod sinematik" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "Bersihkan tekstur lut sinar" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "Klien" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "Klien dan Pelayan" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "Mods klien" + +#: src/settings_translation_file.cpp +msgid "Climbing speed" +msgstr "Kelajuan memanjat" + +#: src/settings_translation_file.cpp +msgid "Cloud height" +msgstr "Tinggi awan" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "Jejari awan" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "Awan" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "Awan itu efek pada pihak klien." + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "Awan dalam menu" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "Kabut berwarna" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of mods that are allowed to access HTTP APIs, which\n" +"allow them to upload and download data to/from the internet." +msgstr "" +"Senarai mods yang dibenarkan mengakses API HTTP dipisahkan dengan koma,\n" +"ini membolehkan mereka memuat naik kepada atau muat turun daripada internet." + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of trusted mods that are allowed to access insecure\n" +"functions even when mod security is on (via request_insecure_environment())." +msgstr "" +"Senarai mods boleh dipercayai yang dibenarkan mengakses fungsi tidak\n" +"selamat walaupun ketika keselamatan mods diaktifkan\n" +"(melalui request_insecure_environment())." + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "Kekunci arahan" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "Sambung kaca" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "Sambung ke pelayan media luaran" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "Sambungkan kaca jika disokong oleh nod." + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "Nilai alfa konsol" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "Warna konsol" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "Ketinggian konsol" + +#: src/settings_translation_file.cpp +msgid "Console key" +msgstr "Kekunci konsol" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "Ke depan berterusan" + +#: src/settings_translation_file.cpp +msgid "Continuous forward movement (only used for testing)." +msgstr "Sentiasa bergerak ke depan tanpa henti (hanya untuk percubaan)." + +#: src/settings_translation_file.cpp +msgid "Controls" +msgstr "Kawalan" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays " +"unchanged." +msgstr "" +"Mengawal panjang kitaran siang/malam.\n" +"Contohnya: 72 = 20 minit, 360 = 4 minit, 1 = 24 jam, 0 = siang/malam/lain-" +"lain kekal tidak berubah." + +#: src/settings_translation_file.cpp +msgid "Controls steepness/depth of lake depressions." +msgstr "Mengawal kecuraman/kedalaman tekanan rendah tasik." + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "Mengawal kecuraman/ketinggian bukit." + +#: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" +"Mengawal ketumpatan rupa bumi gunung tanah terapung.\n" +"Nilainya ialah ofset yang menambah kepada nilai hingar 'np_mountain'." + +#: src/settings_translation_file.cpp +msgid "Controls width of tunnels, a smaller value creates wider tunnels." +msgstr "" +"Mengawal lebar terowong, nilai lebih kecil mencipta terowong lebih lebar." + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "Mesej keruntuhan" + +#: src/settings_translation_file.cpp +msgid "" +"Creates unpredictable lava features in caves.\n" +"These can make mining difficult. Zero disables them. (0-10)" +msgstr "" +"Mencipta ciri lava yang tidak dapat diramal di dalam gua.\n" +"Ini boleh menyukarkan penggalian. Kosong melumpuhkan tetapan ini. (0-10)" + +#: src/settings_translation_file.cpp +msgid "" +"Creates unpredictable water features in caves.\n" +"These can make mining difficult. Zero disables them. (0-10)" +msgstr "" +"Mencipta ciri air yang tidak dapat diramal di dalam gua.\n" +"Ini boleh menyukarkan penggalian. Kosong melumpuhkan tetapan ini. (0-10)" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "Kreatif" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "Nilai alfa rerambut silang" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgstr "Nilai alfa rerambut silang (kelegapan, antara 0 dan 255)." + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "Warna rerambut silang" + +#: src/settings_translation_file.cpp +msgid "Crosshair color (R,G,B)." +msgstr "Warna bagi kursor rerambut silang (R,G,B)." + +#: src/settings_translation_file.cpp +msgid "Crouch speed" +msgstr "Kelajuan mendekam" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "DPI" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "Boleh cedera" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "Kekunci togol maklumat nyahpepijat" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "Tahap log nyahpepijat" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "Kekunci perlahankan bunyi" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "Langkah pelayan khusus" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "Pecutan lalai" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "Permainan lalai" + +#: src/settings_translation_file.cpp +msgid "" +"Default game when creating a new world.\n" +"This will be overridden when creating a world from the main menu." +msgstr "" +"Permainan lalai yang akan digunakan ketika mencipta dunia baru.\n" +"Tetapan ini akan diatasi apabila membuat dunia dari menu utama." + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "Kata laluan lalai" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "Keistimewaan lalai" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "Format laporan lalai" + +#: src/settings_translation_file.cpp +msgid "" +"Default timeout for cURL, stated in milliseconds.\n" +"Only has an effect if compiled with cURL." +msgstr "" +"Had masa lalai untuk cURL, dinyatakan dalam milisaat.\n" +"Hanya berkesan jika dikompil dengan pilihan cURL." + +#: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "Mentakrifkan kawasan 'terrain_higher' (rupa bumi atas-cenuram)." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" +"Mentakrifkan kawasan rupa bumi lembut tanah terapung.\n" +"Tanag terapung lembut berlaku apabila hingar > 0." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" +"Mentakrifkan kawasan rupa bumi lebih tinggi (atas-cenuram) dan memberi kesan " +"kecuraman cenuram." + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "Mentakrifkan kawasan di mana pokok mempunyai epal." + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "Mentakrifkan kawasan dengan pantai berpasir." + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" +"Mentakrifkan saiz penuh gua, nilai lebih kecil mencipta gua lebih besar." + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "Mentakrifkan struktur saluran sungai berskala besar." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "Mentakrifkan kedudukan dan rupa bumi bukit dan tasik pilihan." + +#: src/settings_translation_file.cpp +msgid "" +"Defines sampling step of texture.\n" +"A higher value results in smoother normal maps." +msgstr "" +"Mentakrifkan tahap persampelan tekstur.\n" +"Nilai lebih tinggi menghasilakn peta normal lebih lembut." + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" +"Mentakrifkan jarak maksimum untuk pemindahan pemain dalam unit blok (0 = " +"tiada had)." + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "Mentakrifkan kawasan pokok dan ketumpatan pokok." + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" +"Lengah masa di antara kemaskini jejaring dekat klien dalam unit ms.\n" +"Menaikkan nilai ini akan mengurangkan kadar kemaskini jejaring, lalu\n" +"mengurangkan ketaran dekat klien yang lebih perlahan." + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "Lengah penghantaran blok selepas pembinaan" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "Jumlah lengah untuk menunjukkan tip alatan, dinyatakan dalam milisaat." + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "Pengendalian API Lua terkecam" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +msgstr "Kedalaman di mana anda akan mula jumpa gua besar." + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find massive caves." +msgstr "Kedalaman di mana anda akan mula jumpa banyak gua." + +#: src/settings_translation_file.cpp +msgid "Descending speed" +msgstr "Kelajuan turun" + +#: src/settings_translation_file.cpp +msgid "" +"Description of server, to be displayed when players join and in the " +"serverlist." +msgstr "" +"Perihal pelayan permainan, untuk dipaparkan apabila pemain masuk dan juga " +"dalam senarai pelayan." + +#: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "Nilai ambang hingar gurun" + +#: src/settings_translation_file.cpp +msgid "" +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" +"Gurun akan dijana apabila np_biome melebihi nilai ini.\n" +"Apabila sistem biom baru dibolehkan, tetapan ini diabaikan." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Menyahsegerakkan animasi blok" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "Partikel ketika menggali" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "Melumpuhkan antitipu" + +#: src/settings_translation_file.cpp +msgid "Disable escape sequences" +msgstr "Melumpuhkan jujukan lepas" + +#: src/settings_translation_file.cpp +msgid "" +"Disable escape sequences, e.g. chat coloring.\n" +"Use this if you want to run a server with pre-0.4.14 clients and you want to " +"disable\n" +"the escape sequences generated by mods." +msgstr "" +"Melumpuhkan jujukan lepas (escape sequences), cth: pewarnaan sembang.\n" +"Gunakan ini jika anda ingin menjalankan pelayan dengan klien sebelum 0.4.14 " +"dan\n" +"anda ingin melumpuhkan jujukan lepas yang dijana oleh mods." + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "Menolak kata laluan kosong" + +#: src/settings_translation_file.cpp +msgid "Domain name of server, to be displayed in the serverlist." +msgstr "" +"Nama domain pelayan permainan, untuk dipaparkan dalam senarai pelayan " +"permainan." + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "Tekan \"lompat\" dua kali untuk terbang" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "" +"Tekan butang \"lompat\" secara cepat dua kali untuk menogol mod terbang." + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "Kekunci jatuhkan item" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug infos." +msgstr "Longgokkan maklumat nyahpepijat janapeta." + +#: src/settings_translation_file.cpp +msgid "Enable Joysticks" +msgstr "Membolehkan Kayu Bedik" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" +"Membolehkan sokongan pembuatan mods Lua dekat klien.\n" +"Sokongan ini dalam ujikaji dan API boleh berubah." + +#: src/settings_translation_file.cpp +msgid "Enable VBO" +msgstr "Membolehkan VBO" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Membolehkan tetingkap konsol" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "Membolehkan mod kreatif untuk peta baru dicipta." + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "Membolehkan keselamatan mods" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "Membolehkan pemain menerima kecederaan dan mati." + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "Membolehkan input pengguna secara rawak (hanya untuk percubaan)." + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +msgstr "" +"Membolehkan pencahayaan lembut dengan oklusi sekitar yang ringkas.\n" +"Lumpuhkannya untuk kelajuan atau untuk kelihatan berbeza." + +#: src/settings_translation_file.cpp +msgid "" +"Enable to disallow old clients from connecting.\n" +"Older clients are compatible in the sense that they will not crash when " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" +"Bolehkan tetapan untuk melarang klien lama daripada menyambung.\n" +"Klien lama masih sesuai digunakan jika mereka tidak runtuh (crash) apabila " +"cuba\n" +"untuk menyambung ke pelayan baharu, tetapi mereka mungkin tidak mampu\n" +"menyokong semua sifat baharu yang anda sangkakan." + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" +"Membolehkan penggunaan pelayan media jarak jauh (jika diberikan oleh " +"pelayan).\n" +"Pelayan jarak jauh menawarkan cara lebih cepat untuk muat turun media (cth. " +"tekstur)\n" +"apabila menyambung ke pelayan permainan." + +#: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "Membolehkan apungan pandang" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Pendarab untuk pengapungan pandangan.\n" +"Contohnya: 0 untuk tiada apungan; 1.0 untuk biasa; 2.0 untuk dua kali ganda." + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" +"to IPv6 clients, depending on system configuration.\n" +"Ignored if bind_address is set." +msgstr "" +"Membolehkan/melumpuhkan penjalanan pelayan IPv6. Sebuah pelayan IPv6\n" +"mungkin hanya melayan klien IPv6, bergantung kepada konfigurasi sistem.\n" +"Diabaikan jika bind_address (alamat ikatan) ditetapkan." + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "Membolehkan animasi item dalam inventori." + +#: src/settings_translation_file.cpp +msgid "" +"Enables bumpmapping for textures. Normalmaps need to be supplied by the " +"texture pack\n" +"or need to be auto-generated.\n" +"Requires shaders to be enabled." +msgstr "" +"Membolehkan pemetaan timbul pada tekstur. Peta normal perlu disediakan oleh " +"pek\n" +"tekstur atau perlu dijana secara automatik.\n" +"Perlukan pembayang dibolehkan." + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "Membolehkan pengagregatan jejaring yang diputar di paksi Y (facedir)." + +#: src/settings_translation_file.cpp +msgid "Enables filmic tone mapping" +msgstr "Membolehkan pemetaan tona sinematik" + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "Membolehkan peta mini." + +#: src/settings_translation_file.cpp +msgid "" +"Enables on the fly normalmap generation (Emboss effect).\n" +"Requires bumpmapping to be enabled." +msgstr "" +"Membolehkan penjanaan peta normal secara layang (Kesan cetak timbul).\n" +"Perlukan pemetaan timbul untuk dibolehkan." + +#: src/settings_translation_file.cpp +msgid "" +"Enables parallax occlusion mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Membolehkan pemetaan oklusi paralaks.\n" +"Memerlukan pembayang untuk dibolehkan." + +#: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "Membolehkan apungan pandang ketika berjalan." + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "Selang masa cetak data pemprofilan enjin" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "Kaedah entiti" + +#: src/settings_translation_file.cpp +msgid "" +"Experimental option, might cause visible spaces between blocks\n" +"when set to higher number than 0." +msgstr "" +"Pilihan percubaan, mungkin menampakkan ruang yang nyata di\n" +"antara blok apabila ditetapkan dengan nombor lebih besar daripada 0." + +#: src/settings_translation_file.cpp +msgid "FPS in pause menu" +msgstr "FPS di menu jeda" + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "FSAA" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "Hingar faktor" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "Faktor apungan kejatuhan" + +#: src/settings_translation_file.cpp +msgid "Fallback font" +msgstr "Fon berbalik" + +#: src/settings_translation_file.cpp +msgid "Fallback font shadow" +msgstr "Bayang fon berbalik" + +#: src/settings_translation_file.cpp +msgid "Fallback font shadow alpha" +msgstr "Nilai alfa bayang fon berbalik" + +#: src/settings_translation_file.cpp +msgid "Fallback font size" +msgstr "Saiz fon berbalik" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "Kekunci pergerakan pantas" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "Pecutan mod pergerakan pantas" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "Kelajuan mod pergerakan pantas" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "Pergerakan pantas" + +#: src/settings_translation_file.cpp +msgid "" +"Fast movement (via use key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" +"Bergerak pantas (dengan kekunci \"guna\").\n" +"Ini memerlukan keistimewaan \"pergerakan pantas\" dalam pelayan permainan " +"tersebut." + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "Medan pandang" + +#: src/settings_translation_file.cpp +msgid "Field of view for zoom" +msgstr "Medan pandang untuk zum" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "Medan pandang dalam darjah sudut." + +#: src/settings_translation_file.cpp +msgid "" +"Field of view while zooming in degrees.\n" +"This requires the \"zoom\" privilege on the server." +msgstr "" +"Medan pandang apabila mengezum, dalam darjah sudut.\n" +"Ini memerlukan keistimewaan \"zum\" dalam pelayan." + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the Multiplayer Tab." +msgstr "" +"Fail dalam laluan client/serverlist/ yang mengandungi senarai pelayan " +"kegemaran yang dipaparkan dalam Tab Pemain Ramai." + +#: src/settings_translation_file.cpp +msgid "Filler Depth" +msgstr "Kedalaman Pengisi" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "Hingar kedalaman pengisi" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "Pemetaan tona sinematik" + +#: src/settings_translation_file.cpp +msgid "" +"Filtered textures can blend RGB values with fully-transparent neighbors,\n" +"which PNG optimizers usually discard, sometimes resulting in a dark or\n" +"light edge to transparent textures. Apply this filter to clean that up\n" +"at texture load time." +msgstr "" +"Tekstur yang ditapis boleh sebatikan nilai RGB dengan jiran yang\n" +"lut sinar sepenuhnya, yang mana pengoptimum PNG sering abaikan\n" +"dan kadangkala menyebabkan sisi gelap atau terang pada tekstur\n" +"lut sinar. Guna penapisan ini untuk membersihkan tekstur tersebut\n" +"ketika ia sedang dimuatkan." + +#: src/settings_translation_file.cpp +msgid "Filtering" +msgstr "Penapisan" + +#: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "Dua hingar 3D pertama yang mentakrifkan terowong." + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "Benih peta tetap" + +#: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "Hingar ketinggian asas tanah terapung" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "Hingar asas tanah terapung" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "Aras tanah terapung" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "Ketumpatan gunung tanah terapung" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "Ketinggian gunung tanah terapung" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "Kekunci terbang" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "Terbang" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "Kabut" + +#: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "Mula Kabut" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "Kekunci togol kabut" + +#: src/settings_translation_file.cpp +msgid "Font path" +msgstr "Laluan fon" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "Bayang fon" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "Nilai alfa bayang fon" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha (opaqueness, between 0 and 255)." +msgstr "Nilai alfa bayang fon (kelegapan, antara 0 dan 255)." + +#: src/settings_translation_file.cpp +msgid "Font shadow offset, if 0 then shadow will not be drawn." +msgstr "Ofset bayang fon, jika 0 maka bayang tidak akan dilukis." + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "Saiz fon" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "Format yang digunakan untuk tangkap layar." + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "Kekunci ke depan" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "Jenis fraktal" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "Bahagian daripada jarak boleh lihat di mana kabut mula dijana" + +#: src/settings_translation_file.cpp +msgid "Freetype fonts" +msgstr "Fon Freetype" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" +"Sejauh manakah blok akan dijana untuk klien, dinyatakan dalam unit blokpeta " +"(16 nod)." + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" +"Sejauh manakah blok-blok dihantar kepada klien, dinyatakan dalam unit " +"blokpeta (16 nod)." + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes)." +msgstr "" +"Sejauh manakah klien dapat tahu mengenai objek, dinyatakan dalam unit " +"blokpeta (16 nod)." + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "Skrin penuh" + +#: src/settings_translation_file.cpp +msgid "Full screen BPP" +msgstr "BPP skrin penuh" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "Mod skrin penuh." + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "Skala GUI" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "Penapis skala GUI" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter txr2img" +msgstr "Penapis skala GUI txr2img" + +#: src/settings_translation_file.cpp +msgid "Gamma" +msgstr "Gama" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "Umum" + +#: src/settings_translation_file.cpp +msgid "Generate normalmaps" +msgstr "Jana peta normal" + +#: src/settings_translation_file.cpp +msgid "Global callbacks" +msgstr "Panggil balik sejagat" + +#: src/settings_translation_file.cpp +msgid "" +"Global map generation attributes.\n" +"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" +"and junglegrass, in all other mapgens this flag controls all decorations.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Atribut penjanaan peta sejagat.\n" +"Dalam janapeta v6, bendera 'decorations' mengawal semua hiasan kecuali " +"pokok\n" +"dan rumput hutan, dalam janapeta lain pula bendera ini mengawal semua hiasan." +"\n" +"Bendera yang tidak ditetapkan dalam rentetan bendera tidak diubah daripada " +"nilai lalai.\n" +"Bendera bermula dengan 'no' digunakan untuk betul-betul melumpuhkan mereka." + +#: src/settings_translation_file.cpp +msgid "Graphics" +msgstr "Grafik" + +#: src/settings_translation_file.cpp +msgid "Gravity" +msgstr "Graviti" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "Aras laut" + +#: src/settings_translation_file.cpp +msgid "HTTP Mods" +msgstr "Mods HTTP" + +#: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "Faktor skala HUD" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "Kekunci menogol HUD" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated lua api calls:\n" +"- legacy: (try to) mimic old behaviour (default for release).\n" +"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" +"Cara pengendalian panggilan API Lua yang terkecam:\n" +"- pusaka: (cuba untuk) meniru tingkah laku yang lama (lalai untuk " +"keluaran).\n" +"- log: meniru dan menulis log runut balik kesemua panggilan terkecam " +"(lalai untuk nyahpepijat).\n" +"- ralat: gugurkan penggunaan panggilan terkecam (dicadangkan untuk " +"pembangun mods)." + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" +"Membuatkan pembukah memasang diri sendiri:\n" +"* Memasang sebuah fungsi kosong.\n" +"Ini menganggarkan overhed, bahawa pemasangan ditambah (+1 panggilan fungsi)." +"\n" +"* Memasang pensampel yang digunakan untuk mengemaskini statistik." + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "Hingar penyebatian haba" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "Hingar haba" + +#: src/settings_translation_file.cpp +msgid "Height component of the initial window size." +msgstr "Komponen tinggi saiz tetingkap asal." + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "Hingar ketinggian" + +#: src/settings_translation_file.cpp +msgid "Height on which clouds are appearing." +msgstr "Ketinggian di mana awan muncul." + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "Hingar pilihan ketinggian" + +#: src/settings_translation_file.cpp +msgid "High-precision FPU" +msgstr "Unit titik terapung (FPU) ketepatan tinggi" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "Kecuraman bukit" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "Nilai ambang bukit" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "" +"Laman utama pelayan permainan, untuk dipaparkan dalam senarai pelayan " +"permainan." + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "Kekunci item seterusnya dalam hotbar" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "Kekunci item sebelumnya dalam hotbar" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers" +msgstr "Kedalaman maksimum pembuatan sungai" + +#: src/settings_translation_file.cpp +msgid "" +"How large area of blocks are subject to the active block stuff, stated in " +"mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run." +msgstr "" +"Berapa luas kawasan blok-blok yang tertakluk kepada barangan blok aktif, " +"dinyatakan dalam unit blokpeta (16 nod).\n" +"Dalam blok aktif, objek akan dimuatkan dan ABM akan berjalan." + +#: src/settings_translation_file.cpp +msgid "" +"How much the server will wait before unloading unused mapblocks.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" +"Berapa lama pelayan akan tunggu sebelum menyahmuat blokpeta yang tidak " +"digunakan.\n" +"Nilai lebih tinggi lebih lembut, tetapi akan menggunakan lebih banyak RAM." + +#: src/settings_translation_file.cpp +msgid "How wide to make rivers" +msgstr "Keluasan maksimum pembuatan sungai" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "Hingar penyebatian kelembapan" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "Hingar kelembapan" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "Variasi kelembapan untuk biom." + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "IPv6" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "Pelayan IPv6" + +#: src/settings_translation_file.cpp +msgid "IPv6 support." +msgstr "Sokongan IPv6." + +#: src/settings_translation_file.cpp +msgid "" +"If FPS would go higher than this, limit it by sleeping\n" +"to not waste CPU power for no benefit." +msgstr "" +"Jika bingkai per saat (FPS) ingin naik lebih tinggi\n" +"daripada nilai ini, hadkan ia dengan tidurkannya supaya\n" +"tidak bazirkan kuasa CPU dengan sia-sia." + +#: src/settings_translation_file.cpp +msgid "" +"If disabled \"use\" key is used to fly fast if both fly and fast mode are " +"enabled." +msgstr "" +"Jika dilumpuhkan, kekunci \"guna\" akan digunakan untuk terbang laju " +"sekiranya kedua-dua mod terbang dan mod pergerakan pantas dibolehkan." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" +"Jika dibolehkan, pelayan akan membuat penakaian oklusi blok peta\n" +"berdasarkan kedudukan mata pemain. Ini boleh mengurangkan jumlah\n" +"blok dihantar kepada klien sebanyak 50-80%. Klien sudah tidak menerima\n" +"kebanyakan blok tak kelihatan supaya utiliti mod tembus blok dikurangkan." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" +"Jika dibolehkan bersama mod terbang, pemain boleh terbang menerusi nod " +"pepejal.\n" +"Ini memerlukan keistimewaan \"tembus blok\" dalam pelayan permainan tersebut." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, \"use\" key instead of \"sneak\" key is used for climbing down " +"and descending." +msgstr "" +"Jika dibolehkan, kekunci \"guna\" akan digunakan untuk panjat ke bawah dan " +"turun dalam mod terbang, menggantikan kekunci \"selinap\"." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, actions are recorded for rollback.\n" +"This option is only read when server starts." +msgstr "" +"Jika dibolehkan, semua tindakan akan dirakam untuk gulung balik.\n" +"Pilihan ini hanya dibaca ketika pelayan bermula." + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "" +"Jika dibolehkan, ia akan melumpuhkan pencegahan penipuan dalam pemain ramai." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, invalid world data won't cause the server to shut down.\n" +"Only enable this if you know what you are doing." +msgstr "" +"Jika dibolehkan, data dunia tidak sah tidak akan menyebabkan pelayan " +"ditutup.\n" +"Hanya bolehkan tetapan ini jika anda tahu apa yang anda lakukan." + +#: src/settings_translation_file.cpp +msgid "If enabled, new players cannot join with an empty password." +msgstr "" +"Jika dibolehkan, pemain-pemain baru tidak boleh masuk dengan kata laluan " +"yang kosong." + +#: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" +"Jika dibolehkan, tunjukkan mesej status pelayan ketika pemain berjaya " +"menyambung." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" +"Jika dibolehkan, anda boleh meletak blok di kedudukan berdiri (aras kaki + " +"mata).\n" +"Ini sangat berguna apabila bekerja dengan kotak nod di kawasan yang kecil." + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" +"Jika tetapan ini ditetapkan, pemain akan sentiasa dilahirkan (semula) dekat " +"kedudukan yang diberikan." + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "Abaikan ralat dunia" + +#: src/settings_translation_file.cpp +msgid "In-Game" +msgstr "Dalam Permainan" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" +"Nilai alfa latar belakang konsol sembang dalam permainan (kelehapan, antara " +"0 dan 255)." + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "Warna latar belakang konsol sembang dalam permainan (R,G,B)." + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" +"Nilai ketinggian konsol sembang dalam permainan, antara 0.1 (10%) dan 1.0 " +"(100%)." + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "Kekunci kuatkan bunyi" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" +"Alatan terbina dalam.\n" +"Ini selalunya hanya diperlukan oleh penyumbang teras/terbina dalam" + +#: src/settings_translation_file.cpp +msgid "Instrument chatcommands on registration." +msgstr "Memasang perintah sembang ketika pendaftaran." + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" +"Memasang fungsi panggil balik sejagat ketika pendaftaran.\n" +"(semua benda yang anda salurkan kepada fungsi minetest.register_*())" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "Memasang fungsi perbuatan Pengubah Blok Aktif ketika pendaftaran." + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "Memasang fungsi perbuatan Pengubah Blok Pemuatan ketika pendaftaran." + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +msgstr "Memasang kaedah entiti ketika pendaftaran." + +#: src/settings_translation_file.cpp +msgid "Instrumentation" +msgstr "Instrumentasi" + +#: src/settings_translation_file.cpp +msgid "Interval of saving important changes in the world, stated in seconds." +msgstr "" +"Selang masa di antara penyimpanan perubahan penting dalam dunia, dinyatakan " +"dalam unit saat." + +#: src/settings_translation_file.cpp +msgid "Interval of sending time of day to clients." +msgstr "Selang di antara penghantaran maklumat masa pelayan kepada klien." + +#: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "Godaman imej inventori" + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "Animasi item inventori" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "Kekunci inventori" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "Tetikus songsang" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "Menyongsangkan pergerakan tetikus menegak." + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "TTL entiti item" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "Lelaran" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Controls the amount of fine detail." +msgstr "" +"Lelaran fungsi rekursif.\n" +"Mengawal jumlah perincian halus." + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "ID Kayu Bedik" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "Jenis Kayu Bedik" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "Selang masa pengulangan butang kayu bedik" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "Kepekaan frustum kayu bedik" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: W component of hypercomplex constant determining julia " +"shape.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" +"Set julia sahaja: Komponen W tetapan hiperkompleks menentukan bentuk julia.\n" +"Tiada kesan terhadap fraktal 3D.\n" +"Julat secara kasarnya -2 hingga 2." + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: X component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" +"Set julia sahaja: Komponen X tetapan hiperkompleks menentukan bentuk julia.\n" +"Julat secara kasarnya -2 hingga 2." + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: Y component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" +"Set julia sahaja: Komponen Y tetapan hiperkompleks menentukan bentuk julia.\n" +"Julat secara kasarnya -2 hingga 2." + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: Z component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" +"Set julia sahaja: Komponen Z tetapan hiperkompleks menentukan bentuk julia.\n" +"Julat secara kasarnya -2 hingga 2." + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "W julia" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "X julia" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "Y julia" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "Z julia" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "Kekunci lompat" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "Kelajuan melompat" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk mengurangkan jarak pandang.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk memperlahankan bunyi.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menjatuhkan item yang sedang dipilih.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menambah jarak pandang.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menguatkan bunyi.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk melompat.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk bergerak pantas dalam mod pergerakan pantas.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menggerakkan pemain ke belakang.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menggerakkan pemain ke depan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menggerakkan pemain ke kiri.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menggerakkan pemain ke kanan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk membisukan permainan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk membuka konsol sembang.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk membuka tetingkap sembang untuk menaip arahan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk membuka tetingkap sembang untuk menaip arahan tempatan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk membuka tetingkap sembang.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk membuka inventori.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for printing debug stacks. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk mencetak tindanan nyahpepijat. Digunakan untuk pembangunan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk memilih item seterusnya di dalam hotbar.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk memilih item sebelumnya di dalam hotbar.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menyelinap.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk bertukar antara kamera orang pertama dan ketiga.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menangkap gambar layar.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autorun.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol penjalanan automatik.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol mod sinematik.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol paparan peta mini.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol mod pergerakan pantas.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol mod terbang.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol mod tembus blok.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol pengemaskinian kamera. Hanya digunakan untuk " +"pembangunan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol paparan maklumat nyahpepijat.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol papar pandu (HUD).\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol paparan sembang.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol paparan kabut.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol paparan konsol sembang besar.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol paparan pembukah. Digunakan untuk pembangunan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menogol jarak pandangan tiada had.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menggunakan pandangan zum apabila dibenarkan.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319017" +"35e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "Key use for climbing/descending" +msgstr "Kekunci untuk memanjat/menurun" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "Kecuraman tasik" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "Nilai ambang tasik" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "Bahasa" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "Kedalaman gua besar" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "Kekunci konsol sembang besar" + +#: src/settings_translation_file.cpp +msgid "Lava Features" +msgstr "Ciri-Ciri Lava" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "Gaya daun" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" +"Gaya daun:\n" +"- Beragam: semua susu kelihatan\n" +"- Ringkas: hanya sisi luar kelihatan, jika special_tiles yang ditentukan " +"digunakan\n" +"- Legap: melumpuhkan lut sinar" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "Kekunci ke kiri" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over network." +msgstr "" +"Penjang setiap detik pelayan dan selang masa ketika mana objek-objek " +"selalunya dikemaskini menerusi rangkaian." + +#: src/settings_translation_file.cpp +msgid "Length of time between ABM execution cycles" +msgstr "Panjang masa di antara kitaran pelaksanaan ABM" + +#: src/settings_translation_file.cpp +msgid "Length of time between NodeTimer execution cycles" +msgstr "Jumlah masa selangan di antara kitaran pelaksanaan NodeTimer" + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose" +msgstr "" +"Tahap pengelogan untuk ditulis kepada fail debug.txt:\n" +"- <tidak ada apa-apa> (tidak mengelog)\n" +"- tiada (mesej tanpa tahap)\n" +"- ralat\n" +"- amaran\n" +"- perbuatan\n" +"- maklumat\n" +"- berjela-jela" + +#: src/settings_translation_file.cpp +msgid "Limit of emerge queues on disk" +msgstr "Had baris hilir keluar pada cakera" + +#: src/settings_translation_file.cpp +msgid "Limit of emerge queues to generate" +msgstr "Had baris gilir keluar untuk dijana" + +#: src/settings_translation_file.cpp +msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" +"Had penjanaan peta dalam unit nod, dalam kesemua 6 arah daripada (0, 0, 0).\n" +"Hanya ketulan peta yang berasa sepenuhnya di dalam had janapeta akan dijana." +"\n" +"Nilai disimpan pada setiap dunia berbeza." + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" +"Mengehadkan jumlah permintaan HTTP selari. Memberi kesan:\n" +"- Ambil media sekiranya pelayan menggunakan tetapan remote_media.\n" +"- Muat turun senarai pelayan dan pengumuman pelayan.\n" +"- Muat turun dilakukan oleh menu utama (cth. pengurus mods).\n" +"Hanya mempunyai kesan sekiranya dikompil dengan pilihan cURL." + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "Kebendaliran cecair" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "Pelembutan kebendaliran cecair" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "Jumlah gelung cecair maksimum" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "Masa pembersihan giliran cecair" + +#: src/settings_translation_file.cpp +msgid "Liquid sink" +msgstr "Lubuk cecair" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "Selamg masa kemas kini cecair dalam unit saat." + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "Detik kemas kini cecair" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "Memuatkan pembukah permainan" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" +"Memuatkan pembukah permainan untuk mengutip data pemprofilan permainan.\n" +"Menyediakan perintah /profiler untuk mengakses profil yang dikompil.\n" +"Berguna untuk pembangun mods dan pengendali pelayan." + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "Memuatkan Pengubah Blok" + +#: src/settings_translation_file.cpp +msgid "Main menu game manager" +msgstr "Pengurus permainan menu utama" + +#: src/settings_translation_file.cpp +msgid "Main menu mod manager" +msgstr "Pengurus mods menu utama" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "Skrip menu utama" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" +"Buatkan warna kabut dan langit bergantung kepada waktu (fajar/matahari " +"terbenam) dan arah pandang." + +#: src/settings_translation_file.cpp +msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgstr "" +"Membuatkan DirectX bekerja dengan LuaJIT. Lumpuhkan tetapan jika bermasalah." + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "Buatkan semua cecair menjadi legap" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "Direktori peta" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill' makes higher elevations colder, which may cause biome " +"issues.\n" +"'humid_rivers' modifies the humidity around rivers and in areas where water " +"would tend to pool,\n" +"it may interfere with delicately adjusted biomes.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Artibut penjanaan peta khusus untuk janapeta Valleys.\n" +"'altitude_chill' membuatkan ketinggian lebih tinggi lebih sejuk, boleh " +"menjadi isu biom.\n" +"'humid_rivers' mengubah kelembapan sekitar sungai dan dalam kawasan di mana " +"air berkemungkinan mencipta kolam,\n" +"ia mungkin mengganggu biom yang dilaraskan dengan teliti.\n" +"Bendera yang tidak dinyatakan dalam rentetan bendera tidak diubah daripada " +"nilai lalai.\n" +"Bendera bermula dengan 'no' digunakan untuk betul-betul melumpuhkan mereka." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen flat.\n" +"Occasional lakes and hills can be added to the flat world.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Atribut penjanaan peta khusus untuk janapeta rata (Flat).\n" +"Kadang-kala tasik dan bukit boleh ditambah ke dunia rata.\n" +"Bendera yang tidak dinyatakan dalam rentetan bendera tidak diubah daripada " +"nilai lalai.\n" +"Bendera bermula dengan 'no' digunakan untuk betul-betul melumpuhkan mereka." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Atribut penjanaan peta khusus untuk janapeta v5.\n" +"Bendera yang tidak dinyatakan dalam rentetan bendera tidak diubah daripada " +"nilai lalai.\n" +"Bendera bermula dengan 'no' digunakan untuk betul-betul melumpuhkan mereka." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Atribut penjanaan peta khusus untuk janapeta v6.\n" +"Bendera 'snowbiomes' membolehkan sistem 5 biom baharu.\n" +"Apabila sistem biom baharu dibolehkan, hutan akan dibolehkan secara " +"automatik dan\n" +"bendera 'jungles' diabaikan.\n" +"Bendera yang tidak dinyatakan dalam rentetan bendera tidak diubah daripada " +"nilai lalai.\n" +"Bendera bermula dengan 'no' digunakan untuk betul-betul melumpuhkan mereka." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Atribut penjanaan peta khusus untuk janapeta v7.\n" +"Bendera 'ridges' membolehkan sungai-sungai dijana.\n" +"Tanah terapung masih dalam ujikaji ketika ini dan mungkin berubah.\n" +"Bendera yang tidak dinyatakan dalam rentetan bendera tidak diubah daripada " +"nilai lalai.\n" +"Bendera bermula dengan 'no' digunakan untuk betul-betul melumpuhkan mereka." + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "Had penjanaan peta" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "Selang masa penyimpanan peta" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "Had blok peta" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "Lengah masa penjanaan jejaring blok peta" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "Saiz cache BlokPeta untuk penjana jejaring blokpeta dalam unit MB" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "Had masa nyahmuat blok peta" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "Janapeta Valleys" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "Nyahpepijat janapeta" + +#: src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "Bendera janapeta" + +#: src/settings_translation_file.cpp +msgid "Mapgen flat" +msgstr "Janapeta rata" + +#: src/settings_translation_file.cpp +msgid "Mapgen flat specific flags" +msgstr "Bendera khusus janapeta rata" + +#: src/settings_translation_file.cpp +msgid "Mapgen fractal" +msgstr "Fraktal janapeta" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "Nama janapeta" + +#: src/settings_translation_file.cpp +msgid "Mapgen v5" +msgstr "Janapeta v5" + +#: src/settings_translation_file.cpp +msgid "Mapgen v5 specific flags" +msgstr "Bendera khusus janapeta v5" + +#: src/settings_translation_file.cpp +msgid "Mapgen v6" +msgstr "Janapeta v6" + +#: src/settings_translation_file.cpp +msgid "Mapgen v6 specific flags" +msgstr "Bendera khusus janapeta v6" + +#: src/settings_translation_file.cpp +msgid "Mapgen v7" +msgstr "Janapeta v7" + +#: src/settings_translation_file.cpp +msgid "Mapgen v7 specific flags" +msgstr "Bendera khusus janapeta v7" + +#: src/settings_translation_file.cpp +msgid "Massive cave depth" +msgstr "Kedalaman gua raksasa" + +#: src/settings_translation_file.cpp +msgid "Massive cave noise" +msgstr "Hingar gua raksasa" + +#: src/settings_translation_file.cpp +msgid "Massive caves form here." +msgstr "Banyak gua terbentuk di sini." + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "Jarak penjanaan blok maksimum" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "Jarak maksimum penghantaran blok" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "Jumlah maksimum bagi cecair yang diproses pada setiap langkah." + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "Jumlah maksimum blok tambahan bersihobjek" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "Bingkisan maksima setiap lelaran" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "FPS maksima" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when game is paused." +msgstr "Bingkai per saat (FPS) maksima apabila permainan dijedakan." + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "Jumlah maksimum blok yang dipaksa muat" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "Lebar hotbar maksima" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that are simultaneously sent in total." +msgstr "" +"Jumlah maksimum kesemua blok-blok yang boleh dihantar serentak dari pelayan." + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that are simultaneously sent per client." +msgstr "" +"Jumlah maksimum untuk blok-blok yang dihantar serentak kepada setiap klien." + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "Jumlah maksimum blok yang boleh dibaris gilirkan untuk dimuatkan." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks to be queued that are to be generated.\n" +"Set to blank for an appropriate amount to be chosen automatically." +msgstr "" +"Jumlah maksimum blok baris gilir untuk dijana.\n" +"Tetapkan kepada kosong untuk memilih jumlah sesuai secara automatik." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks to be queued that are to be loaded from file.\n" +"Set to blank for an appropriate amount to be chosen automatically." +msgstr "" +"Jumlah maksimum blok baris gilir untuk dimuatkan daripada fail.\n" +"Tetapkan kepada kosong untuk memilih jumlah sesuai secara automatik." + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "Jumlah maksimum blokpeta yang dipaksa muat." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of mapblocks for client to be kept in memory.\n" +"Set to -1 for unlimited amount." +msgstr "" +"Jumlah peta blok maksima yang klien boleh simpan dalam memori.\n" +"Tetapkan kepada -1 untuk jumlah tanpa had." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" +"Jumlah maksima bingkisan yang dihantar pada setiap langkah penghantaran,\n" +"jika anda mempunyai sambungan yang perlahan maka cuba kurangkannya,\n" +"namun jangan kurangkan kepada nilai di bawah ganda dua jumlah klien sasaran." + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can connect simultaneously." +msgstr "Had jumlah pemain maksimum yang boleh menyambung serentak." + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "Jumlah maksimum objek yang disimpan secara statik di dalam blok." + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "Jumlah maksimum objek setiap blok" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum proportion of current window to be used for hotbar.\n" +"Useful if there's something to be displayed right or left of hotbar." +msgstr "" +"Perkadaran maksima untuk tetingkap semasa yang digunakan untuk hotbar.\n" +"Berguna jika ada sesuatu yang akan dipaparkan di sebelah kanan atau kiri " +"hotbar." + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "Jumlah blok maksimum yang dihantar serentak kepada setiap klien" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends total" +msgstr "Jumlah maksimum kesemua blok yang dihantar serentak" + +#: src/settings_translation_file.cpp +msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgstr "" +"Masa maksimum dalam unit ms untuk muat turun fail (cth. muat turun mods)." + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "Had jumlah pengguna" + +#: src/settings_translation_file.cpp +msgid "Menus" +msgstr "Menu" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "Cache jejaring" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "Mesej hari ini" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "Mesej hari ini yang akan dipaparkan kepada pemain yang menyambung." + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "Kaedah yang digunakan untuk menonjolkan objek dipilih." + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "Peta mini" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "Kekunci peta mini" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "Ketinggian imbasan peta mini" + +#: src/settings_translation_file.cpp +msgid "Minimum texture size for filters" +msgstr "Saiz tekstur minima untuk penapisan" + +#: src/settings_translation_file.cpp +msgid "Mipmapping" +msgstr "Pemetaan Mip" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "Mengubah saiz elemen hudbar." + +#: src/settings_translation_file.cpp +msgid "Modstore details URL" +msgstr "Kedai Mods: URL perincian" + +#: src/settings_translation_file.cpp +msgid "Modstore download URL" +msgstr "Kedai Mods: URL muat turun" + +#: src/settings_translation_file.cpp +msgid "Modstore mods list URL" +msgstr "Kedai Mods: URL senarai mods" + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "Laluan fon monospace" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "Saiz fon monospace" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "Hingar ketinggian gunung" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "Hingar gunung" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "Kepekaan tetikus" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "Pendarab kepekaan tetikus." + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "Hingar lumpur" + +#: src/settings_translation_file.cpp +msgid "" +"Multiplier for fall bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Pendarab untuk apungan timbul tenggelam.\n" +"Contohnya: 0 untuk tiada apungan; 1.0 untuk biasa; 2.0 untuk dua kali ganda." + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "Kekunci bisu" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this." +msgstr "" +"Nama penjana peta yang akan digunakan apabila mencipta dunia baru.\n" +"Mencipta dunia baru melalui menu utama akan mengatasi tetapan ini." + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" +"Nama pemain.\n" +"Apabila menjalankan pelayan, klien yang menyambung dengan nama ini menjadi " +"pentadbir.\n" +"Apabila memulakan daripada menu utama, nilai ini diatasi dengan nilai dari " +"menu utama." + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" +"Nama pelayan permainan, untuk dipaparkan apabila pemain masuk dan juga dalam " +"senarai pelayan." + +#: src/settings_translation_file.cpp +msgid "Network" +msgstr "Rangkaian" + +#: src/settings_translation_file.cpp +msgid "" +"Network port to listen (UDP).\n" +"This value will be overridden when starting from the main menu." +msgstr "" +"Port rangkaian untuk dengar (UDP).\n" +"Nilai ini akan diatasi apabila memulakan pelayan dari menu utama." + +#: src/settings_translation_file.cpp +msgid "New users need to input this password." +msgstr "Pengguna baru mesti memasukkan kata laluan ini." + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "Tembus blok" + +#: src/settings_translation_file.cpp +msgid "Noclip key" +msgstr "Kekunci tembus blok" + +#: src/settings_translation_file.cpp +msgid "Node highlighting" +msgstr "Tonjolan nod" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "Selang masa NodeTimer" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "Hingar" + +#: src/settings_translation_file.cpp +msgid "Normalmaps sampling" +msgstr "Persampelan peta normal" + +#: src/settings_translation_file.cpp +msgid "Normalmaps strength" +msgstr "Kekuatan peta normal" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "Jumlah jalur keluar" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use. Make this field blank, or increase this " +"number\n" +"to use multiple threads. On multiprocessor systems, this will improve mapgen " +"speed greatly\n" +"at the cost of slightly buggy caves." +msgstr "" +"Jumlah jalur keluar yang akan digunakan. Kosongkan medan ini, atau naikkan " +"nilai ini untuk\n" +"menggunakan pelbagai jalur. Dalam sistem pemproses berbilang, nilai ini " +"boleh meningkatkan\n" +"kelajuan penjanaan peta dengan mengorbankan kualiti gua." + +#: src/settings_translation_file.cpp +msgid "" +"Number of extra blocks that can be loaded by /clearobjects at once.\n" +"This is a trade-off between sqlite transaction overhead and\n" +"memory consumption (4096=100MB, as a rule of thumb)." +msgstr "" +"Jumlah blok-blok tambahan yang boleh dimuatkan oleh /clearobjects pada " +"sesuatu masa.\n" +"Ini merupakan keseimbangan antara overhed urus niaga sqlite\n" +"dan penggunaan memori (Kebiasaannya, 4096=100MB)." + +#: src/settings_translation_file.cpp +msgid "Number of parallax occlusion iterations." +msgstr "Jumlah lelaran oklusi paralaks." + +#: src/settings_translation_file.cpp +msgid "Offset" +msgstr "Ofset" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "Cecair legap" + +#: src/settings_translation_file.cpp +msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgstr "" +"Pengaruh kesan oklusi paralaks pada keseluruhannya, kebiasaannya skala/2." + +#: src/settings_translation_file.cpp +msgid "Overall scale of parallax occlusion effect." +msgstr "Skala keseluruhan kesan oklusi paralaks." + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion" +msgstr "Oklusi paralaks" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion Scale" +msgstr "Skala oklusi paralaks" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion bias" +msgstr "Pengaruh oklusi paralaks" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion iterations" +msgstr "Lelaran oklusi paralaks" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion mode" +msgstr "Mod oklusi paralaks" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion strength" +msgstr "Kekuatan oklusi paralaks" + +#: src/settings_translation_file.cpp +msgid "Path to TrueTypeFont or bitmap." +msgstr "Laluan ke fon TrueType atau peta bit." + +#: src/settings_translation_file.cpp +msgid "Path to save screenshots at." +msgstr "Laluan untuk simpan tangkap layar." + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" +"Laluan ke direktori pembayang. Jika tiada laluan ditakrifkan, lokasi lalai " +"akan digunakan." + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "Laluan ke direktori tekstur. Semua tekstur dicari dari sini dahulu." + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "Ikut fizik" + +#: src/settings_translation_file.cpp +msgid "" +"Player is able to fly without being affected by gravity.\n" +"This requires the \"fly\" privilege on the server." +msgstr "" +"Pemain boleh terbang tanpa terkesan dengan graviti.\n" +"Ini memerlukan keistimewaan \"terbang\" dalam pelayan permainan tersebut." + +#: src/settings_translation_file.cpp +msgid "Player name" +msgstr "Nama pemain" + +#: src/settings_translation_file.cpp +msgid "Player transfer distance" +msgstr "Jarak pemindahan pemain" + +#: src/settings_translation_file.cpp +msgid "Player versus Player" +msgstr "Pemain lawan Pemain" + +#: src/settings_translation_file.cpp +msgid "" +"Port to connect to (UDP).\n" +"Note that the port field in the main menu overrides this setting." +msgstr "" +"Port untuk menyambung (UDP).\n" +"Ambil perhatian bahawa medan port dalam menu utama mengatasi tetapan ini." + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" +"Mencegah mods daripada melakukan perkara tidak selamat seperti menjalankan " +"perintah cangkerang." + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds). 0 = " +"disable. Useful for developers." +msgstr "" +"Mencetak data pemprofilan enjin dalam selang masa biasa (dalam unit saat). 0 " +"= lumpuhkan. Berguna untuk pembangun." + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "" +"Keistimewaan-keistimewaan yang boleh diberikan oleh pemain yang mempunyai " +"keistimewaan basic_privs" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "Pembukah" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "Kekunci togol pembukah" + +#: src/settings_translation_file.cpp +msgid "Profiling" +msgstr "Pemprofilan" + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" +"Jejari keluasan awan dinyatakan dalam jumlah 64 nod petak awan.\n" +"Nilai lebih besar daripada 26 akan mula menghasilkan pemotongan tajam di " +"sudut kawasan awan." + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers" +msgstr "Menaikkan rupa bumi untuk membuat lembah di sekitar sungai" + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "Input rawak" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "Kekunci jarak pemilihan" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "Media jarak jauh" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "Port jarak jauh" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "Gantikan menu utama lalai dengan menu yang dibuat lain." + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "Laluan laporan" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "Hingar rabung" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "Hingar rabung bawah air" + +#: src/settings_translation_file.cpp +msgid "Right key" +msgstr "Kekunci ke kanan" + +#: src/settings_translation_file.cpp +msgid "Rightclick repetition interval" +msgstr "Selang pengulangan klik kanan" + +#: src/settings_translation_file.cpp +msgid "River Depth" +msgstr "Kedalaman Sungai" + +#: src/settings_translation_file.cpp +msgid "River Noise" +msgstr "Hingar Sungai" + +#: src/settings_translation_file.cpp +msgid "River Size" +msgstr "Saiz Sungai" + +#: src/settings_translation_file.cpp +msgid "River noise -- rivers occur close to zero" +msgstr "Hingar sungai -- sungai terjadi dekat dengan nilai kosong" + +#: src/settings_translation_file.cpp +msgid "Rollback recording" +msgstr "Rakaman gulung balik" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "Peta mini bulat" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "Pantai berpasir terjadi apabila nilai np_beach melebihi nilai ini." + +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "Simpan peta yang diterima oleh klien dalam cakera." + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "Simpan peta diterima dari pelayan permainan" + +#: src/settings_translation_file.cpp +msgid "Scale" +msgstr "Skala" + +#: src/settings_translation_file.cpp +msgid "" +"Scale gui by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." +msgstr "" +"Menyesuaikan GUI dengan nilai ditentukan oleh pengguna.\n" +"Gunakan penapis antialias jiran terdekat untuk menyesuaikan GUI.\n" +"Ini membolehkan sisi tajam dilembutkan, dan sebatikan piksel\n" +"apabila menyesuaiturunkan, namun ia akan mengkaburkan\n" +"sesetengah piksel di sisi apabila imej disesuaikan dengan saiz\n" +"bukan integer." + +#: src/settings_translation_file.cpp +msgid "Screen height" +msgstr "Tinggi skrin" + +#: src/settings_translation_file.cpp +msgid "Screen width" +msgstr "Lebar skrin" + +#: src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "Tangkap layar" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "Folder tangkap layar" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "Format tangkap layar" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "Kualiti tangkap layar" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" +"Kualiti tangkap layar. Hanya digunakan untuk format JPEG.\n" +"1 maksudnya paling teruk; 100 maksudnya paling bagus.\n" +"Gunakan 0 untuk kualiti lalai." + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "Hingar dasar laut" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "Hingar 3D kedua yang mentakrifkan terowong bersama-sama." + +#: src/settings_translation_file.cpp +msgid "Security" +msgstr "Keselamatan" + +#: src/settings_translation_file.cpp +msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "Lihat http://www.sqlite.org/pragma.html#pragma_synchronous" + +#: src/settings_translation_file.cpp +msgid "Selection box border color (R,G,B)." +msgstr "Warna sempadan kotak pemilihan (R,G,B)." + +#: src/settings_translation_file.cpp +msgid "Selection box color" +msgstr "Warna kotak pemilihan" + +#: src/settings_translation_file.cpp +msgid "Selection box width" +msgstr "Lebar kotak pemilihan" + +#: src/settings_translation_file.cpp +msgid "Server / Singleplayer" +msgstr "Pelayan permainan / Pemain perseorangan" + +#: src/settings_translation_file.cpp +msgid "Server URL" +msgstr "URL pelayan permainan" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "Alamat pelayan permainan" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "Perihal pelayan permainan" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "Nama pelayan permainan" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "Port pelayan permainan" + +#: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "Penakaian oklusi pihak pelayan" + +#: src/settings_translation_file.cpp +msgid "Serverlist URL" +msgstr "URL senarai pelayan" + +#: src/settings_translation_file.cpp +msgid "Serverlist file" +msgstr "Fail senarai pelayan" + +#: src/settings_translation_file.cpp +msgid "" +"Set the language. Leave empty to use the system language.\n" +"A restart is required after changing this." +msgstr "" +"Menetapkan bahasa. Biarkan kosong untuk menggunakan bahasa sistem.\n" +"Sebuah mula semula diperlukan selepas menukar tetapan ini." + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" +"Tetapkan kepada \"true\" untuk membolehkan daun bergoyang.\n" +"Memerlukan pembayang untuk dibolehkan." + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving plants.\n" +"Requires shaders to be enabled." +msgstr "" +"Tetapkan kepada \"true\" untuk membolehkan tumbuhan bergoyang.\n" +"Memerlukan pembayang untuk dibolehkan." + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving water.\n" +"Requires shaders to be enabled." +msgstr "" +"Tetapkan ke \"true\" untuk membolehkan air bergelora.\n" +"Memerlukan pembayang dibolehkan." + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "Laluan pembayang" + +#: src/settings_translation_file.cpp +msgid "" +"Shaders allow advanced visual effects and may increase performance on some " +"video cards.\n" +"This only works with the OpenGL video backend." +msgstr "" +"Pembayang membolehkan kesan visual mendalam dan boleh meningkatkan prestasi " +"untuk sesetengah kad video.\n" +"Namun ia hanya berfungsi dengan pembahagian belakang video OpenGL." + +#: src/settings_translation_file.cpp +msgid "Shadow limit" +msgstr "Had bayang" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "Bentuk peta mini. Dibolehkan = bulat, dilumpuhkan = petak." + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "Tunjukkan maklumat nyahpepijat" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "Tunjukkan kotak pemilihan entiti" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "Mesej penutupan" + +#: src/settings_translation_file.cpp +msgid "" +"Size of chunks to be generated at once by mapgen, stated in mapblocks (16 " +"nodes)." +msgstr "" +"Saiz ketulan untuk dijana serentak oleh janapeta, dinyatakan dalam unit " +"blokpeta (16 nod)." + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" +"Saiz cache blokpeta untuk penjana jejaring. Menaikkan nilai ini akan\n" +"meningkatkan jumlah % hit cache, mengurangkan data yang perlu disalin\n" +"daripada jalur utama, lalu mengurangkan ketaran." + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "Hirisan w" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights" +msgstr "Cerun dan pengisian bekerja bersama untuk mengubah ketinggian" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" +"Variasi kelembapan berskala kecil untuk menyebatikan biom dekat sempadan." + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "Variasi suhu berskala kecil untuk menyebatikan biom dekat sempadan." + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "Pencahayaan lembut" + +#: src/settings_translation_file.cpp +msgid "" +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." +msgstr "" +"Melembutkan kamera apabila melihat sekeliling. Juga dikenali sebagai " +"pelembutan penglihatan atau pelembutan tetikus.\n" +"Berguna untuk merakam video." + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "" +"Melembutkan pemutaran kamera dalam mod sinematik. Set sebagai 0 untuk " +"melumpuhkannya." + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "Melembutkan pemutaran kamera. Set sebagai 0 untuk melumpuhkannya." + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "Kekunci selinap" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "Bunyi" + +#: src/settings_translation_file.cpp +msgid "" +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." +msgstr "" +"Menetapkan URL dari mana klien mengambil media, menggantikan UDP.\n" +"$filename mestilah boleh diakses daripada $remote_media$filename\n" +"melalui cURL (sudah tentu, remote_media mesti berakhir dengan tanda\n" +"condong).\n" +"Fail yang tidak wujud akan diambil dengan cara biasa." + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "Titik lahir statik" + +#: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "Mesej status apabila disambung" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "Hingar kecuraman" + +#: src/settings_translation_file.cpp +msgid "Strength of generated normalmaps." +msgstr "Kekuatan peta normal yang dijana." + +#: src/settings_translation_file.cpp +msgid "Strength of parallax." +msgstr "Kekuatan paralaks." + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "Pemeriksaan protokal ketat" + +#: src/settings_translation_file.cpp +msgid "Support older servers" +msgstr "Sokong pelayan permainan lama" + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "SQLite segerak" + +#: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "Variasi suhu untuk biom." + +#: src/settings_translation_file.cpp +msgid "Terrain Height" +msgstr "Ketinggian Rupa Bumi" + +#: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "Hingar lain untuk rupa bumi" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "Hingar asas rupa bumi" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "Hingar rupa bumi lebih tinggi" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "Hingar rupa bumi" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" +"Nilai ambang hingar rupa bumi untuk bukit.\n" +"Mengawal perkadaran kawasan dunia dipenuhi bukit.\n" +"Laraskan kepada 0.0 untuk perkadaran lebih besar." + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" +"Nilai ambang hingar rupa bumi untuk tasik.\n" +"Mengawal perkadaran untuk kawasan dunia dilitupi laut.\n" +"Laras menjadi 0.0 untuk perkadaran yang lebih besar." + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "Hingar penerusan rupa bumi" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "Laluan tekstur" + +#: src/settings_translation_file.cpp +msgid "The altitude at which temperature drops by 20C" +msgstr "Ketinggian di mana suhu jatuh sebanyak 20C" + +#: src/settings_translation_file.cpp +msgid "" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." +msgstr "" +"Format lalai di untuk menyimpan profil,\n" +"apabila memanggil `/profiler save [format]` tanpa format." + +#: src/settings_translation_file.cpp +msgid "The depth of dirt or other filler" +msgstr "Kedalaman tanah atau pengisi yang lain" + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" +"Laluan fail relatif kepada laluan dunia anda di mana profil akan disimpan." + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "Pengenal pasti kayu bedik yang digunakan" + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "Antaramuka rangkaian yang pelayan permainan dengar." + +#: src/settings_translation_file.cpp +msgid "" +"The privileges that new users automatically get.\n" +"See /privs in game for a full list on your server and mod configuration." +msgstr "" +"Keistimewaan yang pengguna-pengguna baru dapat secara automatik.\n" +"Lihat /privs dalam permainan untuk senarai penuh keistimewaan pelayan dan " +"konfigurasi mods." + +#: src/settings_translation_file.cpp +msgid "The rendering back-end for Irrlicht." +msgstr "Penerjemahan bahagian belakang untuk Irrlicht." + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"ingame view frustum around." +msgstr "" +"Kepekaan paksi kayu bedik untuk menggerakkan\n" +"frustum penglihatan dalam permainan." + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n" +"set to the nearest valid value." +msgstr "" +"Kekuatan (kegelapan) pembayang nod oklusi-sekitar.\n" +"Lebih rendah lebih gelap, lebih tinggi lebih terang. Nilai yang sah\n" +"untuk tetapan ini hanyalah dari 0.25 hingga 4.0. Jika nilai di\n" +"luar julat, ia akan ditetapkan kepada nilai sah yang terdekat." + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" +"Jumlah masa (dalam unit saat) yang dibenarkan untuk giliran cecair " +"berkembang\n" +"melebihi kapasiti pemprosesan sehingga percubaan untuk mengurangkan saiznya\n" +"dibuat dengan membuang giliran item yang lama. Nilai 0 melumpuhkan fungsi " +"ini." + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" +"Selang masa dalam saat, diambil antara peristiwa yang berulangan\n" +"apabila menekan kombinasi butang kayu bedik." + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated right clicks when holding the " +"right mouse button." +msgstr "" +"Jumlah selang masa dalam saat, diambil untuk melakukan klik kanan yang " +"berulang apabila pemain menekan butang tetikus kanan tanpa melepaskannya." + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "Jenis kayu bedik" + +#: src/settings_translation_file.cpp +msgid "This font will be used for certain languages." +msgstr "Fon ini akan digunakan untuk sesetengah bahasa." + +#: src/settings_translation_file.cpp +msgid "Time in between active block management cycles" +msgstr "Selang masa di antara setiap kitaran pengurusan blok aktif" + +#: 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 "" +"Masa untuk entiti item (item yang dijatuhkan) terus hidup dalam unit saat.\n" +"Tetapkan kepada -1 untuk melumpuhkan sifat tersebut." + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "Selang penghantaran masa" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "Kelajuan masa" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory." +msgstr "Had masa untuk klien membuang peta yang tidak digunakan dari memori." + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" +"Untuk mengurangkan lembapnya tindak balas, pemindahan blok diperlahankan " +"apabila\n" +"pemain membina sesuatu. Tetapan ini menetapkan berapa lama ianya " +"diperlahankan\n" +"setelah meletakkan atau menggali sesebuah nod." + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "Kekunci togol mod kamera" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "Lengah tip alatan" + +#: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "Hingar pokok" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "Penapisan trilinear" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Useable to make minimap smoother on slower machines." +msgstr "" +"True = 256\n" +"False = 128\n" +"Boleh digunakan untuk membuatkan peta mini kelihatan lebih lembut pada mesin " +"yang lebih perlahan." + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "Mods yang dipercayai" + +#: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" +"Ketinggian maksimum biasa, di atas dan bawah titik tengah, untuk rupa bumi " +"gunung tanah terapung." + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "URL kepada senarai pelayan yang dipaparkan dalam Tab Permainan Ramai." + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "Pensampelan pengurangan" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" +"Pensampelan pengurangan serupa seperti menggunakan resolusi skrin rendah,\n" +"tetapi ia hanya diaplikasikan kepada dunia permainan sahaja, tidak mengubah " +"GUI.\n" +"Ia boleh meningkatkan prestasi dengan mengorbankan perincian imej." + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "Jarak pemindahan pemain tanpa had" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "Nyahmuat data pelayan yang tidak digunakan" + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "Guna paparan awan 3D menggantikan awan rata." + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "Gunakan animasi awan sebagai latar belakang menu utama." + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "" +"Gunakan penapisan anisotropik apabila melihat tekstur dari suatu sudut." + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "Gunakan penapisan bilinear apabila menyesuaikan tekstur." + +#: src/settings_translation_file.cpp +msgid "Use key" +msgstr "Kekunci guna" + +#: src/settings_translation_file.cpp +msgid "Use mip mapping to scale textures. May slightly increase performance." +msgstr "" +"Gunakan pemetaan Mip untuk menyesuaikan tekstur. Mungkin boleh meningkatkan " +"prestasi sedikit." + +#: src/settings_translation_file.cpp +msgid "Use trilinear filtering when scaling textures." +msgstr "Gunakan penapisan trilinear apabila menyesuaikan tekstur." + +#: src/settings_translation_file.cpp +msgid "V-Sync" +msgstr "Segerak-V" + +#: src/settings_translation_file.cpp +msgid "VBO" +msgstr "VBO" + +#: src/settings_translation_file.cpp +msgid "Valley Depth" +msgstr "Kedalaman Lembah" + +#: src/settings_translation_file.cpp +msgid "Valley Fill" +msgstr "Isi Lembah" + +#: src/settings_translation_file.cpp +msgid "Valley Profile" +msgstr "Profil Lembah" + +#: src/settings_translation_file.cpp +msgid "Valley Slope" +msgstr "Kecerunan Lembah" + +#: src/settings_translation_file.cpp +msgid "Valleys C Flags" +msgstr "Bendera C Lembah" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "Variasi kedalaman pengisi biom." + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" +"Variasi ketinggian bukit dan kedalaman tasik rupa bumi lembut tanah terapung." + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "Variasi ketinggian maksimum gunung (dalam unit nod)." + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "Variasi jumlah gua." + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" +"Variasi skala menegak rupa bumi.\n" +"Apabila hingar < -0.55 maka rupa bumi hampir rata." + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "Pelbagai kedalaman nod permukaan biom." + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" +"Pelbagai kekasaran rupa bumi.\n" +"Mentakrifkan nilai penerusan 'persistence' untuk hingar terrain_base dan " +"terrain_alt." + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "Pelbagai kecuraman cenuram." + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "Penyegerakan menegak skrin." + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "Pemacu video" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "Faktor apungan pandang" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "Jarak pandang dalam unit nod." + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "Kekunci mengurang jarak pandang" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "Kekunci menambah jarak pandang" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "Kekunci zum pandangan" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "Jarak pandang" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "Kekuatan bunyi" + +#: src/settings_translation_file.cpp +msgid "" +"W co-ordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" +"Koordinat W untuk hirisan 3D yang dijana daripada fraktal 4D.\n" +"Menentukan hirisan 3D yang mana akan dijana daripada bentuk 4D.\n" +"Tidak memberi kesan kepada fraktal 3D.\n" +"Julat secara kasarnya -2 sehingga 2." + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "Kelajuan berjalan" + +#: src/settings_translation_file.cpp +msgid "Water Features" +msgstr "Ciri-ciri Air" + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "Aras air" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "Aras permukaan air dunia." + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "Nod bergoyang" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "Daun bergoyang" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "Tumbuhan bergoyang" + +#: src/settings_translation_file.cpp +msgid "Waving water" +msgstr "Air bergelora" + +#: src/settings_translation_file.cpp +msgid "Waving water height" +msgstr "Ketinggian air bergelora" + +#: src/settings_translation_file.cpp +msgid "Waving water length" +msgstr "Panjang air bergelora" + +#: src/settings_translation_file.cpp +msgid "Waving water speed" +msgstr "Kelajuan air bergelora" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." +msgstr "" +"Apabila penapis skala GUI (gui_scaling_filter) ditetapkan kepada\n" +"\"true\", semua imej GUI perlu ditapis dalam perisian, tetapi sesetengah\n" +"imeg dijana secara terus ke perkakasan (contohnya, render-to-texture\n" +"untuk nod dalam inventori)." + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." +msgstr "" +"Apabila gui_scaling_filter_txr2img ditetapkan kepada \"true\",\n" +"salin semula kesemua imej tersebut dari perkakasan\n" +"kepada perisian untuk disesuaikan. Sekiranya ia ditetapkan\n" +"kepada \"false\", berbalik kepada kaedah penyesuaian yang\n" +"lama, untuk pemacu video yang tidak mampu menyokong\n" +"dengan sempurna fungsi muat turun semula tekstur\n" +"daripada perkakasan." + +#: src/settings_translation_file.cpp +msgid "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" +"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" +"enabled." +msgstr "" +"Apabila menggunakan tapisan bilinear/trilinear/anisotropik, tekstur " +"resolusi\n" +"rendah boleh jadi kabur, jadi tekstur ini disesuai-naikkan dengan sisipan " +"jiran\n" +"terdekat untuk memelihara piksel keras. Tetapan ini menetapkan saiz " +"tekstur\n" +"minima untuk tekstur selepas penyesuai-naikkan; nilai lebih tinggi tampak\n" +"lebih tajam, tetapi memerlukan memori yang lebih banyak. Nilai kuasa 2\n" +"disyorkan. Menetapkan nilai ini lebih tinggi dari 1 tidak akan menampakkan\n" +"kesan yang nyata melainkan tapisan bilinear/trilinear/anisotropik dibolehkan." + +#: src/settings_translation_file.cpp +msgid "" +"Whether freetype fonts are used, requires freetype support to be compiled in." +msgstr "" +"Menetapkan sama ada fon Freetype akan digunakan, memerlukan sokongan " +"Freetype dibina bersama." + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "" +"Sama ada animasi tekstur nod perlu dinyahsegerakkan pada setiap blok peta." + +#: src/settings_translation_file.cpp +msgid "" +"Whether players are shown to clients without any range limit.\n" +"Deprecated, use the setting player_transfer_distance instead." +msgstr "" +"Tetapkan sama ada pemain ditunjukkan kepada klien tanpa sebarang had jarak.\n" +"Tetapan ini terkecam, gunakan tetapan player_transfer_distance sebagai ganti." + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" +"Menetapkan sama ada ingin membenarkan pemain untuk mencederakan dan membunuh " +"satu sama lain." + +#: src/settings_translation_file.cpp +msgid "" +"Whether to ask clients to reconnect after a (Lua) crash.\n" +"Set this to true if your server is set up to restart automatically." +msgstr "" +"Tetapan sama ada untuk meminta klien menyambung semula selepas berlakunya " +"keruntuhan (Lua).\n" +"Tetapkan kepada benar jika pelayan anda ditetapkan untuk mula semula secara " +"automatik." + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "Sama ada hendak mengkabutkan penghujung kawasan yang kelihatan." + +#: src/settings_translation_file.cpp +msgid "" +"Whether to show the client debug info (has the same effect as hitting F5)." +msgstr "" +"Tetapkan sama ada hendak menunjukkan maklumat nyahpepijat (kesannya sama " +"seperti menekan butang F5)." + +#: src/settings_translation_file.cpp +msgid "" +"Whether to support older servers before protocol version 25.\n" +"Enable if you want to connect to 0.4.12 servers and before.\n" +"Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n" +"Disabling this option will protect your password better." +msgstr "" +"Pilihan untuk menyokong pelayan permainan lama sebelum protokol versi 25.\n" +"Bolehkan pilihan jika anda ingin sambung ke pelayan permainan 0.4.12 dan " +"sebelumnya.\n" +"Pelayan 0.4.13 ke atas akan berjaya sambung, pelayan 0.4.12-dev mungkin " +"boleh sambung.\n" +"Lumpuhkan pilihan ini akan melindungi kata laluan anda dengan lebih baik." + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size." +msgstr "Komponen lebar saiz tetingkap awal." + +#: src/settings_translation_file.cpp +msgid "Width of the selectionbox's lines around nodes." +msgstr "Lebar garisan kotak pemilihan sekeliling nod." + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" +"Sistem Windows sahaja: Mulakan Minetest dengan tetingkap garis perintah " +"dekat latar belakang.\n" +"Mengandungi maklumat yang sama seperti fail debug.txt (nama lalai)." + +#: src/settings_translation_file.cpp +msgid "" +"World directory (everything in the world is stored here).\n" +"Not needed if starting from the main menu." +msgstr "" +"Direktori dunia (semua benda dalam dunia disimpan di sini).\n" +"Tidak diperlukan jika bermula dari menu utama." + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "Y untuk tanah rata." + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large pseudorandom caves." +msgstr "Y untuk had pengatas gua rawak semu yang besar." + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "Jarak Y di mana gua berkembang kepada saiz penuh." + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "Aras Y untuk permukaan rupa bumi purata." + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "Aras Y untuk had pengatas gua." + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "Aras Y untuk titik tengah tanah terapung dan permukaan tasik." + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "Aras Y untuk rupa bumi (atas cenuram) yang lebih tinggi." + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "Aras Y untuk rupa bumi lebih rendah dan dasar tasik." + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "Aras Y untuk dasar laut." + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "Aras Y di mana bayang tanah terapung diperluaskan." + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "Jarak optimum penghantaran blok" + +#: src/settings_translation_file.cpp +msgid "cURL file download timeout" +msgstr "Had masa muat turun fail cURL" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "Had cURL selari" + +#: src/settings_translation_file.cpp +msgid "cURL timeout" +msgstr "Had masa cURL" + +#~ msgid "Hide mp content" +#~ msgstr "" +#~ "Sembunyikan\n" +#~ "Kandungan MP" + +#~ msgid "Capital" +#~ msgstr "Butang Caps Lock" + +#~ msgid "Kana" +#~ msgstr "Butang Kana" + +#~ msgid "Final" +#~ msgstr "Butang Final" + +#~ msgid "Junja" +#~ msgstr "Butang Junja" + +#~ msgid "Kanji" +#~ msgstr "Butang Kanji" + +#~ msgid "Comma" +#~ msgstr "Koma" + +#~ msgid "Minus" +#~ msgstr "Minus" + +#~ msgid "Period" +#~ msgstr "Noktah" + +#~ msgid "Plus" +#~ msgstr "Plus" + +#~ msgid "Attn" +#~ msgstr "Butang Attn" + +#~ msgid "CrSel" +#~ msgstr "Butang CrSel" + +#~ msgid "ExSel" +#~ msgstr "Butang ExSel" + +#~ msgid "PA1" +#~ msgstr "Butang PA1" diff --git a/po/nb/minetest.po b/po/nb/minetest.po index 990783744..b8d57d935 100644 --- a/po/nb/minetest.po +++ b/po/nb/minetest.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-10-25 21:41+0000\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-01-15 14:54+0000\n" "Last-Translator: Petter Reinholdtsen <pere-weblate@hungry.com>\n" "Language-Team: Norwegian BokmÃ¥l <https://hosted.weblate.org/projects/" "minetest/minetest/nb/>\n" @@ -17,7 +17,15 @@ 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 2.9-dev\n" +"X-Generator: Weblate 2.11-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Du døde." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -62,6 +70,8 @@ msgstr "Tjener støtter protokollversjoner mellom $1 og $2. " #: builtin/mainmenu/common.lua msgid "Try reenabling public serverlist and check your internet connection." msgstr "" +"Forsøk Ã¥ aktivere offentlig tjenerliste pÃ¥ nytt og sjekk " +"Internettforbindelsen din." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -75,12 +85,13 @@ msgstr "Vi støtter protokollversjoner mellom versjon $1 og $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Avbryt" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Avhengigheter:" #: builtin/mainmenu/dlg_config_world.lua @@ -88,6 +99,11 @@ msgid "Disable MP" msgstr "Koble ut MP" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Koble ut MP" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Aktiver MP" @@ -104,17 +120,13 @@ msgstr "" "symbolene [a-z0-9_] er tillatt." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Skjul spill" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Skjul mp-innhold" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -142,7 +154,7 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Download one from minetest.net" -msgstr "" +msgstr "Last ned en fra minetest.net" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Game" @@ -150,11 +162,11 @@ msgstr "Spill" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" -msgstr "" +msgstr "Mapgen" #: builtin/mainmenu/dlg_create_world.lua msgid "No worldname given or no game selected" -msgstr "" +msgstr "Mangler verdensnavn eller intet spill valgt" #: builtin/mainmenu/dlg_create_world.lua msgid "Seed" @@ -162,7 +174,7 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Warning: The minimal development test is meant for developers." -msgstr "" +msgstr "Advarsel: Den minimale utviklingstesten er tiltenkt utviklere." #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -177,8 +189,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "" @@ -194,7 +205,7 @@ msgstr "" msgid "Delete World \"$1\"?" msgstr "" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "" @@ -275,6 +286,11 @@ msgstr "" msgid "Restore Default" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "" @@ -284,11 +300,11 @@ msgid "Show technical names" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +msgid "The value must be at least $1." msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +msgid "The value must not be larger than $1." msgstr "" #: builtin/mainmenu/modmgr.lua @@ -313,6 +329,10 @@ msgstr "" msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "" @@ -334,10 +354,6 @@ msgid "Rating" msgstr "" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "" - -#: builtin/mainmenu/store.lua #, fuzzy msgid "Shortname:" msgstr "Navnet pÃ¥ verdenen" @@ -374,127 +390,143 @@ msgstr "" msgid "Previous Core Developers" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Installed Mods:" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Mod information:" +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "No mod description available" +#: builtin/mainmenu/tab_local.lua +msgid "Configure" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Rename" +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Select Mod File:" +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Uninstall selected mod" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Skjul spill" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" msgstr "" -#: builtin/mainmenu/tab_mods.lua -msgid "Uninstall selected modpack" +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua -msgid "Address / Port" +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" +#: builtin/mainmenu/tab_local.lua +msgid "New" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua #, fuzzy -msgid "Creative mode" -msgstr "Opprett" +msgid "Play Game" +msgstr "Spill" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "Damage enabled" -msgstr "aktivert" +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" +#: builtin/mainmenu/tab_mods.lua +msgid "Installed Mods:" msgstr "" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "PvP enabled" -msgstr "aktivert" +#: builtin/mainmenu/tab_mods.lua +msgid "Mod information:" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" +#: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" +#: builtin/mainmenu/tab_mods.lua +msgid "No mod description available" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" +#: builtin/mainmenu/tab_mods.lua +msgid "Rename" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" +#: builtin/mainmenu/tab_mods.lua +msgid "Select Mod File:" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected mod" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected modpack" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" +#: builtin/mainmenu/tab_online.lua +msgid "Address / Port" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Port" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Connect" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Public" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#, fuzzy +msgid "Creative mode" +msgstr "Opprett" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#, fuzzy +msgid "Damage enabled" +msgstr "aktivert" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Del. Favorite" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Favorite" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Name / Password" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" msgstr "" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#, fuzzy +msgid "PvP enabled" +msgstr "aktivert" + #: builtin/mainmenu/tab_settings.lua msgid "2x" msgstr "" @@ -524,6 +556,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "" @@ -601,6 +637,10 @@ msgid "Reset singleplayer world" msgstr "" #: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "" @@ -664,14 +704,6 @@ msgstr "" msgid "Start Singleplayer" msgstr "" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "" @@ -733,6 +765,10 @@ msgid "Player name too long." msgstr "" #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "" @@ -747,42 +783,80 @@ msgid "" msgstr "" #: src/game.cpp -msgid "Change Keys" +msgid "- Address: " msgstr "" #: src/game.cpp -msgid "Change Password" +#, fuzzy +msgid "- Creative Mode: " +msgstr "Opprett" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "aktivert" + +#: src/game.cpp +msgid "- Mode: " msgstr "" #: src/game.cpp -msgid "Connecting to server..." +msgid "- Port: " msgstr "" #: src/game.cpp -msgid "Continue" +msgid "- Public: " msgstr "" #: src/game.cpp -msgid "Creating client..." +msgid "- PvP: " msgstr "" #: src/game.cpp -msgid "Creating server..." +msgid "- Server Name: " msgstr "" #: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +msgid "Change Keys" +msgstr "" + +#: src/game.cpp +msgid "Change Password" +msgstr "" + +#: src/game.cpp +msgid "Connecting to server..." +msgstr "" + +#: src/game.cpp +msgid "Continue" +msgstr "" + +#: src/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" +msgstr "" + +#: src/game.cpp +msgid "Creating client..." +msgstr "" + +#: src/game.cpp +msgid "Creating server..." msgstr "" #: src/game.cpp @@ -810,6 +884,19 @@ msgid "Exit to OS" msgstr "" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Spill" + +#: src/game.cpp +msgid "Hosting server" +msgstr "" + +#: src/game.cpp msgid "Item definitions..." msgstr "" @@ -830,11 +917,19 @@ msgid "Node definitions..." msgstr "" #: src/game.cpp -msgid "Resolving address..." +msgid "Off" msgstr "" #: src/game.cpp -msgid "Respawn" +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." msgstr "" #: src/game.cpp @@ -842,12 +937,25 @@ msgid "Shutting down..." msgstr "" #: src/game.cpp +msgid "Singleplayer" +msgstr "" + +#: src/game.cpp msgid "Sound Volume" msgstr "" #: src/game.cpp -msgid "You died." -msgstr "Du døde." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -882,6 +990,10 @@ msgid "Console" msgstr "" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "" @@ -894,6 +1006,10 @@ msgid "Forward" msgstr "" #: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "" @@ -913,6 +1029,22 @@ msgstr "" msgid "Left" msgstr "" +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "" @@ -990,15 +1122,11 @@ msgid "Apps" msgstr "" #: src/keycode.cpp -msgid "Attn" -msgstr "" - -#: src/keycode.cpp msgid "Back" msgstr "" #: src/keycode.cpp -msgid "Capital" +msgid "Caps Lock" msgstr "" #: src/keycode.cpp @@ -1006,22 +1134,10 @@ msgid "Clear" msgstr "" #: src/keycode.cpp -msgid "Comma" -msgstr "" - -#: src/keycode.cpp msgid "Control" msgstr "" #: src/keycode.cpp -msgid "Convert" -msgstr "" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "" - -#: src/keycode.cpp msgid "Down" msgstr "" @@ -1030,47 +1146,43 @@ msgid "End" msgstr "" #: src/keycode.cpp -msgid "Erase OEF" -msgstr "" - -#: src/keycode.cpp -msgid "Escape" +msgid "Erase EOF" msgstr "" #: src/keycode.cpp -msgid "ExSel" +msgid "Execute" msgstr "" #: src/keycode.cpp -msgid "Execute" +msgid "Help" msgstr "" #: src/keycode.cpp -msgid "Final" +msgid "Home" msgstr "" #: src/keycode.cpp -msgid "Help" +msgid "IME Accept" msgstr "" #: src/keycode.cpp -msgid "Home" +msgid "IME Convert" msgstr "" #: src/keycode.cpp -msgid "Insert" +msgid "IME Escape" msgstr "" #: src/keycode.cpp -msgid "Junja" +msgid "IME Mode Change" msgstr "" #: src/keycode.cpp -msgid "Kana" +msgid "IME Nonconvert" msgstr "" #: src/keycode.cpp -msgid "Kanji" +msgid "Insert" msgstr "" #: src/keycode.cpp @@ -1102,22 +1214,10 @@ msgid "Middle Button" msgstr "" #: src/keycode.cpp -msgid "Minus" -msgstr "" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "" - -#: src/keycode.cpp msgid "Next" msgstr "" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "" - -#: src/keycode.cpp msgid "Num Lock" msgstr "" @@ -1134,6 +1234,10 @@ msgid "Numpad -" msgstr "" #: src/keycode.cpp +msgid "Numpad ." +msgstr "" + +#: src/keycode.cpp msgid "Numpad /" msgstr "" @@ -1182,19 +1286,11 @@ msgid "OEM Clear" msgstr "" #: src/keycode.cpp -msgid "PA1" -msgstr "" - -#: src/keycode.cpp msgid "Pause" msgstr "" #: src/keycode.cpp -msgid "Period" -msgstr "" - -#: src/keycode.cpp -msgid "Plus" +msgid "Play" msgstr "" #: src/keycode.cpp @@ -1293,6 +1389,20 @@ msgid "3D mode" msgstr "" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1354,6 +1464,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1361,7 +1475,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" @@ -1386,6 +1501,12 @@ msgid "Amplifies the valleys" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "" @@ -1401,6 +1522,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" @@ -1409,6 +1534,19 @@ msgid "Ask to reconnect after crash" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "" @@ -1433,6 +1571,14 @@ msgid "Basic Privileges" msgstr "" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "" @@ -1441,6 +1587,14 @@ msgid "Bind address" msgstr "" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" @@ -1469,6 +1623,10 @@ msgid "Camera update toggle key" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "" @@ -1481,6 +1639,30 @@ msgid "Cave width" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1538,10 +1720,18 @@ msgid "Clean transparent textures" msgstr "" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "" #: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "" @@ -1606,6 +1796,10 @@ msgid "Console color" msgstr "" #: src/settings_translation_file.cpp +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "" @@ -1629,17 +1823,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp @@ -1663,6 +1857,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Opprett" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" @@ -1700,6 +1899,10 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "" @@ -1736,6 +1939,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1746,6 +1984,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1776,17 +2024,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" #: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Aktiver Alle" + +#: src/settings_translation_file.cpp msgid "Disable anticheat" msgstr "" @@ -1831,11 +2087,25 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Enable VBO" msgstr "Aktiver Alle" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "" @@ -1871,6 +2141,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -1916,6 +2196,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -1938,7 +2222,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2008,6 +2296,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2024,10 +2316,34 @@ msgid "Filtering" msgstr "" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "" @@ -2040,6 +2356,10 @@ msgid "Fog" msgstr "" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -2076,6 +2396,14 @@ msgid "Forward key" msgstr "" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2154,10 +2482,18 @@ msgid "Gravity" msgstr "" #: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2179,22 +2515,54 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2216,6 +2584,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2241,6 +2621,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2273,6 +2662,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2301,6 +2694,14 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2343,6 +2744,10 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2363,12 +2768,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2406,6 +2823,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "" @@ -2422,6 +2855,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2436,6 +2876,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2478,6 +2925,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2492,6 +2946,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2513,6 +2974,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2613,6 +3088,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2626,10 +3108,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2638,6 +3135,10 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2693,6 +3194,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2765,6 +3273,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2792,9 +3304,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2803,7 +3324,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2822,23 +3344,19 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" +msgid "Mapgen Valleys" msgstr "" #: src/settings_translation_file.cpp @@ -2854,51 +3372,7 @@ msgid "Mapgen flat" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" +msgid "Mapgen flat specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -2906,66 +3380,6 @@ msgid "Mapgen fractal" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "" @@ -2974,27 +3388,7 @@ msgid "Mapgen v5" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Mapgen v5 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3002,59 +3396,7 @@ msgid "Mapgen v6" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3062,55 +3404,7 @@ msgid "Mapgen v7" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3277,6 +3571,10 @@ msgid "Mipmapping" msgstr "" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3297,6 +3595,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3305,15 +3611,17 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mute key" msgstr "" #: src/settings_translation_file.cpp @@ -3365,10 +3673,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3405,6 +3709,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3445,6 +3757,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3538,6 +3856,14 @@ msgid "Report path" msgstr "" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "" @@ -3570,6 +3896,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3578,6 +3908,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3618,6 +3952,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3662,6 +4004,10 @@ msgid "Server port" msgstr "" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "" @@ -3694,10 +4040,18 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3723,10 +4077,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "" @@ -3765,6 +4138,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -3785,10 +4166,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3803,6 +4204,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "" @@ -3822,8 +4227,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -3874,6 +4282,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -3916,6 +4328,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "" @@ -3931,10 +4347,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -3999,6 +4433,42 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4007,13 +4477,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4025,6 +4493,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4112,16 +4584,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4172,6 +4634,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4185,6 +4654,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4196,6 +4701,9 @@ msgstr "" msgid "cURL timeout" msgstr "" +#~ msgid "Hide mp content" +#~ msgstr "Skjul mp-innhold" + #, fuzzy #~ msgid "If disabled " #~ msgstr "Deaktiver Alle" @@ -4204,10 +4712,6 @@ msgstr "" #~ msgid "If enabled, " #~ msgstr "aktivert" -#, fuzzy -#~ msgid "Game Name" -#~ msgstr "Spill" - #~ msgid "" #~ "Warning: Some mods are not configured yet.\n" #~ "They will be enabled by default when you save the configuration. " diff --git a/po/nl/minetest.po b/po/nl/minetest.po index 68e3e7b6d..bb49fc13c 100644 --- a/po/nl/minetest.po +++ b/po/nl/minetest.po @@ -6,9 +6,9 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-12-16 10:49+0000\n" -"Last-Translator: Rogier <rogier777@gmail.com>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-06-03 09:50+0000\n" +"Last-Translator: Emiel van Rooijen <evrooije@outlook.com>\n" "Language-Team: Dutch " "<https://hosted.weblate.org/projects/minetest/minetest/nl/>\n" "Language: nl\n" @@ -16,11 +16,20 @@ 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 2.10\n" +"X-Generator: Weblate 2.15-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Herboren worden" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Je bent dood." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" -msgstr "Er is een fout opgetreden in een Lua script (bijvoorbeeld van een mod):" +msgstr "" +"Er is een fout opgetreden in een Lua script (bijvoorbeeld van een mod):" #: builtin/fstk/ui.lua msgid "An error occured:" @@ -76,21 +85,26 @@ msgstr "Wij ondersteunen protocol versies $1 tot en met $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Annuleer" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +msgid "Dependencies:" msgstr "Afhankelijkheden:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable MP" -msgstr "MV uitzetten" +msgstr "ModVerzameling uitschakelen" + +#: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Alles uitschakelen" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" -msgstr "MV aanzetten" +msgstr "Mod Verzameling aanzetten" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" @@ -105,17 +119,14 @@ msgstr "" "Enkel [a-z0-9_] zijn toegestaan." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Verberg std. mods" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Verberg MV mods" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +#, fuzzy +msgid "Optional dependencies:" +msgstr "Optionele afhankelijkheden" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -139,11 +150,11 @@ msgstr "Maak aan" #: builtin/mainmenu/dlg_create_world.lua msgid "Download a subgame, such as minetest_game, from minetest.net" -msgstr "Download een sub-spel, zoals minetest_game, van minetest.net" +msgstr "Laad een spel, zoals minetest_game, van minetest.net" #: builtin/mainmenu/dlg_create_world.lua msgid "Download one from minetest.net" -msgstr "Download er een van minetest.net" +msgstr "Laad er een van minetest.net" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Game" @@ -180,8 +191,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Weet je zeker dat je mod \"$1\" wilt verwijderen?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Verwijderen" @@ -191,13 +201,13 @@ msgstr "Modmgr: kan mod \"$1\" niet verwijderen" #: builtin/mainmenu/dlg_delete_mod.lua msgid "Modmgr: invalid modpath \"$1\"" -msgstr "Modbeheer: onjuist pad \"$1\"" +msgstr "Modmgr: verkeerd pad voor mod \"$1\"" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" msgstr "Verwijder wereld \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Accepteren" @@ -243,8 +253,8 @@ msgid "" "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " "<octaves>, <persistence>" msgstr "" -"Formaat: <basiswaarde>, <schaal>, (<X-spreiding>, <Y-spreiding>, " -"<Z-spreiding>),\n" +"Formaat: <basiswaarde>, <schaal>, (<X-spreiding>, <Y-spreiding>, <Z-" +"spreiding>),\n" "<kiemgetal>, <octaven>, <persistentie>" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -280,7 +290,12 @@ msgstr "Mogelijke waarden zijn: " #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Restore Default" -msgstr "Standaardwaarde" +msgstr "Herstel de Standaardwaarde" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Zoeken" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" @@ -291,12 +306,14 @@ msgid "Show technical names" msgstr "Technische namen weergeven" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." -msgstr "De waarde moet groter zijn dan $1." +#, fuzzy +msgid "The value must be at least $1." +msgstr "De waarde moet tenminste $1 zijn." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." -msgstr "De waarde moet lager zijn dan $1." +#, fuzzy +msgid "The value must not be larger than $1." +msgstr "De waarde mag niet groter zijn dan $1." #: builtin/mainmenu/modmgr.lua msgid "" @@ -323,6 +340,10 @@ msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" "Mod installeren: kan geen geschikte map-naam vinden voor modverzameling $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "Subspel Mods" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Winkel sluiten" @@ -344,10 +365,6 @@ msgid "Rating" msgstr "Waardering" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Zoeken" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Korte naam:" @@ -383,6 +400,72 @@ msgstr "Vroegere ontwikkelaars" msgid "Previous Core Developers" msgstr "Vroegere hoofdontwikkelaars" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "Meldt server aan bij de server-lijst" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Lokaal server-adres" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Instellingen" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Creatieve modus" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Verwondingen inschakelen" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Spel Hosten" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Server Hosten" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Lokaal Spel" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Naam / Wachtwoord" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Nieuw" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Geen wereldnaam opgegeven of geen wereld aangemaakt!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Spel Spelen" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Poort" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Selecteer Wereld:" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Server Port" +msgstr "Server-poort" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Geïnstalleerde Mods:" @@ -392,6 +475,10 @@ msgid "Mod information:" msgstr "Mod-beschrijving:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "Geen afhankelijkheden." + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Geen mod-beschrijving aanwezig" @@ -411,95 +498,46 @@ msgstr "Geselecteerde mod deïnstalleren" msgid "Uninstall selected modpack" msgstr "Geselecteerde modverzameling deïnstalleren" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Server adres / Poort" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Cliënt" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Verbinden" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Creatieve modus" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Verwondingen aangeschakeld" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Verwijder Favoriete" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Favorieten" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Naam / Wachtwoord" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Spelergevechten aangeschakeld" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Lokaal server-adres" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Instellingen" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Creatieve modus" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Verwondingen inschakelen" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Naam / Wachtwoord" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Nieuw" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Geen wereldnaam opgegeven of geen wereld aangemaakt!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Poort" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "Ping" -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Publiek" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Selecteer Wereld:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Server" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Serverpoort" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Play Online" +msgstr "Online Spelen" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Start spel" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "Spelergevechten aangeschakeld" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -530,6 +568,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Weet je zeker dat je je wereld wilt resetten?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "Scherm afmetingen automatisch bewaren" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Bilineaire Filtering" @@ -606,6 +648,11 @@ msgid "Reset singleplayer world" msgstr "Reset Singleplayer wereld" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "Screenshot" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Instellingen" @@ -669,14 +716,6 @@ msgstr "Hoofdmenu" msgid "Start Singleplayer" msgstr "Start Singleplayer" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Spelen" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Singleplayer" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Geen informatie aanwezig" @@ -738,6 +777,10 @@ msgid "Player name too long." msgstr "Spelernaam is te lang." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Kies een naam, a.u.b.!" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Het gespecificeerde wereld-pad bestaat niet: " @@ -754,6 +797,44 @@ msgstr "" "Kijk in debug.txt voor details." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Lokaal server-adres" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Creatieve modus" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Verwondingen" + +#: src/game.cpp +msgid "- Mode: " +msgstr "- Mode(creatief/overleving): " + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Poort" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Publiek" + +#: src/game.cpp +msgid "- PvP: " +msgstr "- PVP; " + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Naam van de server" + +#: src/game.cpp msgid "Change Keys" msgstr "Toetsen aanpassen" @@ -770,26 +851,22 @@ msgid "Continue" msgstr "Verder spelen" #: src/game.cpp -msgid "Creating client..." -msgstr "Bezig cliënt te maken..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Bezig server te maken..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Standaard toetsen:\n" "- W,A,S,D: bewegen\n" @@ -804,6 +881,14 @@ msgstr "" "- T: chatten\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Bezig cliënt te maken..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Bezig server te maken..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -840,6 +925,20 @@ msgid "Exit to OS" msgstr "Afsluiten" #: src/game.cpp +msgid "Game info:" +msgstr "Spel info:" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Spel" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Bezig server te maken..." + +#: src/game.cpp msgid "Item definitions..." msgstr "Voorwerpdefinities..." @@ -860,24 +959,46 @@ msgid "Node definitions..." msgstr "Node definities..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Server-adres opzoeken..." +msgid "Off" +msgstr "Uitgeschakeld" #: src/game.cpp -msgid "Respawn" -msgstr "Respawn" +msgid "On" +msgstr "Ingeschakeld" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "Poort van externe server" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Server-adres opzoeken..." #: src/game.cpp msgid "Shutting down..." msgstr "Uitschakelen..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Singleplayer" + +#: src/game.cpp msgid "Sound Volume" msgstr "Geluidsvolume" #: src/game.cpp -msgid "You died." -msgstr "Je bent dood." +#, c-format, fuzzy +msgid "Volume changed to %d%%" +msgstr "Volume veranderd naar %d1%%2" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "Volume veranderd naar 0%" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "Volume veranderd naar 100%" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -912,6 +1033,10 @@ msgid "Console" msgstr "Console" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Volume verminderen" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "2x \"springen\" schakelt vliegen aan/uit" @@ -924,6 +1049,11 @@ msgid "Forward" msgstr "Vooruit" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Geluidsvolume" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "inventaris" @@ -945,6 +1075,24 @@ msgstr "" msgid "Left" msgstr "Links" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Chat-commando's" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Dempen" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Volgende" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "Vorig element" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Print debug-stacks" @@ -1022,38 +1170,22 @@ msgid "Apps" msgstr "Menu" #: src/keycode.cpp -msgid "Attn" -msgstr "SAK" - -#: src/keycode.cpp msgid "Back" msgstr "Terug" #: src/keycode.cpp -msgid "Capital" -msgstr "Hoofdletter" +msgid "Caps Lock" +msgstr "Hoofdletter vergrendeling" #: src/keycode.cpp msgid "Clear" msgstr "Wissen" #: src/keycode.cpp -msgid "Comma" -msgstr "Komma" - -#: src/keycode.cpp msgid "Control" msgstr "Control" #: src/keycode.cpp -msgid "Convert" -msgstr "Converteren" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Omlaag" @@ -1062,26 +1194,15 @@ msgid "End" msgstr "Einde" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Erase EOF" #: src/keycode.cpp -msgid "Escape" -msgstr "Escape" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Uitvoeren" #: src/keycode.cpp -msgid "Final" -msgstr "Laatste" - -#: src/keycode.cpp msgid "Help" msgstr "Help" @@ -1090,20 +1211,33 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +#, fuzzy +msgid "IME Accept" +msgstr "Accepteren" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Convert" +msgstr "Converteren" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +#, fuzzy +msgid "IME Escape" +msgstr "Escape" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +#, fuzzy +msgid "IME Mode Change" +msgstr "Modus verandering" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "Nonconvert" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1134,22 +1268,10 @@ msgid "Middle Button" msgstr "Muiswielknop" #: src/keycode.cpp -msgid "Minus" -msgstr "Min" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Modus verandering" - -#: src/keycode.cpp msgid "Next" msgstr "Volgende" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nonconvert" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1166,6 +1288,11 @@ msgid "Numpad -" msgstr "Numpad -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Numpad *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Numpad /" @@ -1214,20 +1341,12 @@ msgid "OEM Clear" msgstr "OEM Clear" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pauze" #: src/keycode.cpp -msgid "Period" -msgstr "Punt" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Plus" +msgid "Play" +msgstr "Spelen" #: src/keycode.cpp msgid "Print" @@ -1337,6 +1456,22 @@ msgid "3D mode" msgstr "3D modus" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "3D geluid voor grote holtes." + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" +"3D geluid voor gebergte of hoge toppen.\n" +"Ook voor luchtdrijvende bergen." + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "3D geluid voor wanden van diepe rivier kloof." + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1417,6 +1552,10 @@ msgstr "" "In het hoofdmenu kan een ander adres opgegeven worden." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "Voeg opvliegende deeltjes toe bij het graven." + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1425,8 +1564,10 @@ msgstr "" "Bijv. voor 4k schermen (niet voor X11 of Android)." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "Aangepaste gamma voor de licht-tabellen. Lagere waardes zijn helderder.\n" @@ -1454,6 +1595,16 @@ msgid "Amplifies the valleys" msgstr "Vergroot de valleien" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" +"Enkel bij Android systemen: Tracht inventaris beelden te maken van object " +"mazen\n" +"\n" +"als er geen ondersteunde afbeelding werd gevonden." + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Anisotropische filtering" @@ -1472,6 +1623,10 @@ msgstr "" "'v6.servers.minetest.net'." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "Appel boom geluid" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "Ingeschatte (X,Y,Z) schaal van fractal in nodes." @@ -1480,6 +1635,28 @@ msgid "Ask to reconnect after crash" msgstr "verbinding herstellen na een server-crash" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" +"Op deze afstand zal de server agressief optimaliseren welke blokken naar de " +"cliënt worden gezonden.\n" +"Kleine waarden kunnen prestaties verbeteren ten koste van zichtbare fouten " +"in de weergave.\n" +"(sommige blokken onder water en in grotten en soms op land zullen niet " +"worden weergegeven)\n" +"Indien deze waarde groter is dan max_block_send_distance is deze " +"optimalisatie uitgeschakeld.\n" +"Getal duidt het aantal mapblocks aan (16 nodes)" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Meldt de server automatisch aan bij de serverlijst." @@ -1504,6 +1681,14 @@ msgid "Basic Privileges" msgstr "Basisvoorrechten" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "Strand geluid" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "Strand geluid grenswaarde" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Bi-Lineaire filtering" @@ -1512,6 +1697,16 @@ msgid "Bind address" msgstr "Lokaal server-adres" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome API temperature and humidity noise parameters" +msgstr "Vochtigheid ruisparameters" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome noise" +msgstr "Rivier ruis parameters" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "Aantal bits per pixel (oftewel: kleurdiepte) in full-screen modus." @@ -1540,6 +1735,11 @@ msgid "Camera update toggle key" msgstr "Toets voor cameraverversing aan/uit" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "Grot ruispatroon #1" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "Grot ruispatroon #1" @@ -1552,6 +1752,35 @@ msgid "Cave width" msgstr "Grot breedte" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "Grot ruispatroon #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "Grot ruispatroon #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "Grot breedte" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "Grot ruispatroon #1" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "Grot hoogtepunt" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Heuvel-grenswaarde" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "Grotten en tunnels vormen bij het kruispunt van twee ruis patronen" @@ -1626,10 +1855,19 @@ msgid "Clean transparent textures" msgstr "Schoonmaken Transparante texturen" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Cliënt" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Cliënt en server" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Cliënt" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Klimsnelheid" @@ -1672,8 +1910,8 @@ msgid "" "functions even when mod security is on (via request_insecure_environment())." msgstr "" "Lijst van vertrouwde mods die onveilige functies mogen gebruiken,\n" -"zelfs wanneer mod-beveiliging aan staat (via request_insecure_environment())." -"\n" +"zelfs wanneer mod-beveiliging aan staat (via " +"request_insecure_environment()).\n" "Gescheiden door komma's." #: src/settings_translation_file.cpp @@ -1701,6 +1939,11 @@ msgid "Console color" msgstr "Console-kleur" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Console-toets" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Console-toets" @@ -1730,15 +1973,6 @@ msgstr "" "0 = de kloktijd (dag, nacht, schemering) verandert niet." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Bepaalt de grootte van woestijnen en stranden in de wereld-generator (mapgen)" -" v6.\n" -"Als 'snowbiomes' aan staat, wordt deze instelling genegeerd." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Bepaalt steilheid/diepte van meer depressies." @@ -1747,8 +1981,17 @@ msgid "Controls steepness/height of hills." msgstr "Bepaalt steilheid/hoogte van heuvels." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" +"Bepaalt de dichtheid van drijvende bergen.\n" +"Dit wordt bijgevoegd bij de 'np_mountain' ruis waarde." + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." -msgstr "Bepaalt breedte van tunnels, een kleinere waarde maakt bredere tunnels." +msgstr "" +"Bepaalt breedte van tunnels, een kleinere waarde maakt bredere tunnels." #: src/settings_translation_file.cpp msgid "Crash message" @@ -1771,6 +2014,11 @@ msgstr "" "Dit kan het graven bemoeilijken. Waardes: 0-10; 0 = uit" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Maak aan" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Draadkruis-alphawaarde" @@ -1807,6 +2055,11 @@ msgid "Debug log level" msgstr "Debug logniveau" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "HUD aan/uitschakelen toets" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Tijdsstaplengte van de server" @@ -1847,6 +2100,45 @@ msgstr "" "Wordt alleen gebruikt indien gecompileerd met cURL ingebouwd." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "Bepaalt gebieden van 'terrain_higher' (rotswand-top terrein)." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" +"Bepaalt gebieden van drijvend glijdend terrein.\n" +"Drijvend glijdend terrein ontstaat wanneer ruis > 0." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" +"Bepaalt gebieden van hoger (rotswand-top) terrein en de steilte van de " +"rotswand." + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "Bepaalt gebieden met appels in de bomen." + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "Bepaalt gebieden met zandstranden." + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "Bepaalt de grootte van grotten, kleinere waarden geven grotere grotten." + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "Bepaalt de grootschalige rivierkanaal structuren." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "Bepaalt de plaats van bijkomende heuvels en vijvers." + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1862,6 +2154,19 @@ msgstr "" "(0 = oneindig ver)." #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "Bepaalt de gebieden met bomen en hun dichtheid." + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" +"Tussenpauze tussen bijwerkingen van de maas weergave bij de cliënt in ms.\n" +"Dit verhogen zal de bijwerkingen vertragen wat flikkeringen op langzamere " +"cliënten moet verminderen." + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "Vertraging bij het versturen van blokken na het bouwen" @@ -1894,18 +2199,25 @@ msgstr "" "spelers inloggen." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "Textuur-animaties niet synchroniseren" +msgid "Desert noise threshold" +msgstr "Woestijn ruis drempelwaarde" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"Bepaalt de vorm van het terrein.\n" -"De 3 getallen tussen vierkante haken bepalen de schaal\n" -"van het terrein. Ze dienen alle drie hetzelfde te zijn." +"Woestijnen ontstaan wanneer np_biome deze waarde overstijgt.\n" +"Indien het nieuwe biome systeem is ingeschakeld wordt dit genegeerd." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Textuur-animaties niet synchroniseren" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Effectdeeltjes" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1956,10 +2268,26 @@ msgid "Enable Joysticks" msgstr "Joysticks aanzetten" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" +"Schakel Lua modding ondersteuning op cliënt in.\n" +"Deze ondersteuning is experimenteel en de API kan wijzigen." + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "VBO aanzetten" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Schakel het console venster in" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "Schakel creatieve modus in voor nieuwe kaarten." + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Veilige modus voor mods aanzetten" @@ -2007,6 +2335,22 @@ msgstr "" "(bijv. texturen) aanzienlijk bij het maken van een verbinding met een server." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Enable view bobbing" +msgstr "Loopbeweging" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Vermenigvuldigingsfactor van loopbeweging.\n" +"Bijvoorbeeld:\n" +"0 voor geen loopbeweging.\n" +"1.0 voor normale loopbeweging.\n" +"2.0 voor twee keer grotere loopbeweging." + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2061,6 +2405,10 @@ msgstr "" "Dit vereist dat shaders ook aanstaan." #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "Schakel op en neer gaan bij wandelen in." + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Profilergegevens print interval" @@ -2085,7 +2433,12 @@ msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "Ruis factor" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Fall bobbing factor" msgstr "Loopbeweging bij vallen" #: src/settings_translation_file.cpp @@ -2161,6 +2514,11 @@ msgid "Filler Depth" msgstr "Filler Diepte" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Filler depth noise" +msgstr "Filler Diepte" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "Filmisch tone-mapping" @@ -2182,10 +2540,35 @@ msgid "Filtering" msgstr "Filters" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "Eerste van 2 3D geluiden voor tunnels." + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "Vast kiemgetal" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "Drijvend land basis hoogte ruis" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "Drijvend land basis ruis" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Floatland level" +msgstr "Waterniveau" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "Drijvend gebergte dichtheid" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "Drijvend gebergte hoogte" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Vliegen toets" @@ -2198,6 +2581,10 @@ msgid "Fog" msgstr "Mist" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "Nevel aanvang" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Mist aan/uitschakelen toets" @@ -2234,16 +2621,25 @@ msgid "Forward key" msgstr "Vooruit toets" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "Fractaal type" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "Fractie van de zichtbare afstand vanaf waar de nevel wordt getoond" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Freetype fonts" -msgstr "Freetype fonts" +msgstr "Freetype lettertypes" #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " "nodes)." msgstr "" -"Tot welke afstand blokken gegenereerd worden voor cliënten. In mapblokken (" -"16 nodes)." +"Tot welke afstand blokken gegenereerd worden voor cliënten. In mapblokken " +"(16 nodes)." #: src/settings_translation_file.cpp msgid "" @@ -2326,10 +2722,19 @@ msgid "Gravity" msgstr "Zwaartekracht" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "Grondniveau" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "HTTP Modules" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "HUD schaal factor" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "HUD aan/uitschakelen toets" @@ -2364,22 +2769,60 @@ msgstr "" "* Profileer de code die de statistieken ververst." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat blend noise" +msgstr "Wereldgenerator landschapstemperatuurovergangen" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "Grot ruispatroon #1" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "Aanvangshoogte van het venster." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Rechter Windowstoets" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "Hoogte waarop wolken voorbijdrijven." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height select noise" +msgstr "Hoogte-selectie ruisparameters" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "Hoge-nauwkeurigheid FPU" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Steilheid van de heuvels" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Heuvel-grenswaarde" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Home-pagina van de server. Wordt getoond in de serverlijst." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "Toets voor volgend gebruikte tool" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "Toets voor vorig gebruikte tool" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Diepte van de rivieren" @@ -2389,8 +2832,8 @@ msgid "" "mapblocks (16 nodes).\n" "In active blocks objects are loaded and ABMs run." msgstr "" -"Tot op welke afstand van actieve spelers blokken 'actief' zijn. In blokken (" -"van 16 nodes).\n" +"Tot op welke afstand van actieve spelers blokken 'actief' zijn. In blokken " +"(van 16 nodes).\n" "In actieve blokken worden objecten geladen (bijv. dieren die rondlopen) en " "ABMs uitgevoerd\n" "(bijv. groeien van planten)." @@ -2409,6 +2852,18 @@ msgid "How wide to make rivers" msgstr "Breedte van rivieren" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "Vochtigheid vermenging ruis" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "Vochtigheid ruis" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "Vochtigheidsvariatie voor biomen." + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2439,6 +2894,21 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" +"Indien aan zal de server achterliggende map blokken niet tonen afgaande\n" +"op de oog positie van de speler. Dit kan de hoeveelheid blokken die naar de " +"cliënt\n" +"gestuurd worden met 50-80 % verminderen. De cliënt zal niet langer de " +"meeste\n" +"onzichtbare blokken ontvangen zodat noclip mode niet meer nodig is." + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2483,6 +2953,11 @@ msgstr "" "Spelers kunnen zich niet aanmelden zonder wachtwoord indien aangeschakeld." #: src/settings_translation_file.cpp +#, fuzzy +msgid "If enabled, show the server status message on player connection." +msgstr "Toon bericht aan spelers die verbinding maken." + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2515,6 +2990,17 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Chat console achtergrondkleur (R,G,B)." #: src/settings_translation_file.cpp +#, fuzzy +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" +"Chat console achtergrond alphawaarde (ondoorzichtigheid, tussen 0 en 255)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Console-toets" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2564,6 +3050,11 @@ msgid "Interval of sending time of day to clients." msgstr "Interval voor het sturen van de kloktijd naar cliënten." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Rugzak toets" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "Inventaris items animaties" @@ -2584,6 +3075,11 @@ msgid "Item entity TTL" msgstr "Bestaansduur van objecten" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Iterations" +msgstr "Per soort" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." @@ -2592,6 +3088,14 @@ msgstr "" "Bepaalt de schaal van de kleinste details." #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "Stuurknuppel ID" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "Stuurknuppel Type" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "Joystick-knop herhalingsinterval" @@ -2638,6 +3142,26 @@ msgstr "" "Bereik is ongeveer -2 tot 2." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Julia w" +msgstr "Julia w" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Julia x" +msgstr "Julia x" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Julia y" +msgstr "Julia y" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Julia z" +msgstr "Julia z" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Springen toets" @@ -2652,8 +3176,19 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om de zichtastand te verminderen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Toets om de zichtastand te verminderen.\n" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2662,8 +3197,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets voor het weggooien van het geselecteerde object.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2672,8 +3207,19 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om de zichtastand te vergroten.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Toets om de zichtastand te vergroten.\n" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2682,8 +3228,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets voor springen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2692,8 +3238,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om snel te bewegen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2702,8 +3248,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om de speler achteruit te bewegen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2712,8 +3258,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om de speler vooruit te bewegen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2722,8 +3268,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om de speler naar links te bewegen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2732,8 +3278,19 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om de speler naar rechts te bewegen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Toets voor springen.\n" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2742,8 +3299,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om de chat-console te openen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2752,8 +3309,19 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om het chat-window te openen om commando's te typen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Toets om het chat-window te openen om commando's te typen.\n" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2762,8 +3330,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om het chat-window te openen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2772,8 +3340,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om het rugzak-window te openen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2782,8 +3350,30 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om debug-stacks te printen. Gebruikt voor ontwikkeling.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Toets om het rugzak-window te openen.\n" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Toets om het rugzak-window te openen.\n" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2796,8 +3386,8 @@ msgstr "" "Toets om te sluipen.\n" "Wordt ook gebruikt om naar beneden te klimmen en te dalen indien " "aux1_descends uitstaat.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2806,8 +3396,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om tussen 1e-persoon camera en 3e-persoon camera te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2816,8 +3406,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om screenshot te maken.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2826,8 +3416,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om automatisch lopen aan/uit te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2836,8 +3426,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om cinematic modus aan/uit te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2846,8 +3436,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om de mini-kaart aan/uit te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2856,8 +3446,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om snelle modus aan/uit te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2866,8 +3456,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om vliegen aan/uit te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2876,8 +3466,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om 'noclip' modus aan/uit te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2887,8 +3477,8 @@ msgid "" msgstr "" "Toets om camera-verversing aan/uit te schakelen. Enkel gebruikt voor " "ontwikkeling.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2897,8 +3487,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om debug informatie aan/uit te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2907,8 +3497,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om de HUD aan/uit te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2917,8 +3507,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om het tonen van chatberichten aan/uit te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2927,8 +3517,19 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om mist aan/uit te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Toets om het tonen van chatberichten aan/uit te schakelen.\n" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2938,8 +3539,8 @@ msgid "" msgstr "" "Toets om het tonen van de code-profiler aan/uit te schakelen. Gebruikt voor " "ontwikkeling.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2948,14 +3549,35 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om oneindige zichtastand aan/uit te schakelen.\n" -"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" -"e3da1b0edf72eb3" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Toets voor springen.\n" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "Gebruik de 'gebruiken'-toets voor klimmen en dalen" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Steilheid Van de meren" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Meren-grenswaarde" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "Taal" @@ -2964,6 +3586,11 @@ msgid "Large cave depth" msgstr "Diepte van grote grotten" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Console-toets" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "Lava Kenmerken" @@ -3035,6 +3662,17 @@ msgstr "Emerge-wachtrij voor genereren" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" +"Limiet van de landkaart generatie in aantal noden van (0,0,0) in alle 6 " +"richtingen.\n" +"Enkel mapchunks die volledig in de limiet vallen worden gegenereerd.\n" +"Deze waarde wordt per wereld bewaard." + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -3085,8 +3723,8 @@ msgid "" "Provides a /profiler command to access the compiled profile.\n" "Useful for mod developers and server operators." msgstr "" -"Gebruik de spel-profiler om profileringsgegevens van het spel te verzamelen." -"\n" +"Gebruik de spel-profiler om profileringsgegevens van het spel te " +"verzamelen.\n" "Hierbij komt ook het server-commando '/profiler' beschikbaar.\n" "Nuttig voor mod-ontwikkelaars en server-beheerders." @@ -3119,6 +3757,10 @@ msgstr "" "Maakt dat DirectX werkt met LuaJIT. Schakel dit uit als het problemen geeft." #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "Maak alle vloeistoffen ondoorzichtig" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "Wereld map" @@ -3139,8 +3781,8 @@ msgstr "" "de biomen.\n" "'humid_rivers' verhoogt de vochtigheidsgraad bij rivieren en andere " "gebieden\n" -"met water. Dit kan gevolgen hebben voor de zorgvuldig geconfigureerde biomen." -"\n" +"met water. Dit kan gevolgen hebben voor de zorgvuldig geconfigureerde " +"biomen.\n" "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-" "waarde.\n" "Zet \"no\" voor een vlag om hem expliciet uit te zetten." @@ -3160,10 +3802,26 @@ msgstr "" "Zet \"no\" voor een vlag om hem expliciet uit te zetten." #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Wereldgenerator instellingen specifiek voor generator v7.\n" +"\"ridges\" zijn rivieren.\n" +"Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-" +"waarde.\n" +"Zet \"no\" voor een vlag om hem expliciet uit te zetten." + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3176,9 +3834,11 @@ msgstr "" "Zet \"no\" voor een vlag om hem expliciet uit te zetten." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3202,24 +3862,21 @@ msgid "Mapblock limit" msgstr "Max aantal wereldblokken" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "Wereldblok vergeet-tijd" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Valleien Wereldgenerator" +#, fuzzy +msgid "Mapblock mesh generation delay" +msgstr "Wereld-grens" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "Wereldgenerator landschapstemperatuur" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "Mapblock maas generator's MapBlock cache grootte in MB" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "Wereldgenerator landschapsvochtigheidsovergangen" +msgid "Mapblock unload timeout" +msgstr "Wereldblok vergeet-tijd" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "Wereldgenerator landschapsvochtigheid" +msgid "Mapgen Valleys" +msgstr "Valleien Wereldgenerator" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3234,118 +3891,15 @@ msgid "Mapgen flat" msgstr "Vlakke Wereldgenerator" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Grot breedte" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "Grotten (1) ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "Grotten (2) ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "Vuldiepte ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" +#, fuzzy +msgid "Mapgen flat specific flags" msgstr "Vlaggen" #: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "Grondniveau" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "Steilheid van de heuvels" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "Heuvel-grenswaarde" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "Steilheid Van de meren" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "Meren-grenswaarde" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "Grote Grotten diepte" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "Terrein ruisparameters" - -#: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "Fractal wereldgenerator" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "Grot breedte" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "Grotten (1) ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "Grotten (2) ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "Vuldiepte ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "Fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "Aantal iteraties" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "Fractal W" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "Fractal X" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "Fractal Y" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "Fractal Z" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "Centrum-positie" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "Schaal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "Zeebodem ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "W-doorsnede" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "Wereldgenerator landschapstemperatuurovergangen" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Wereldgenerator" @@ -3354,146 +3908,29 @@ msgid "Mapgen v5" msgstr "Wereldgenerator v5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "Grot-breedte" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "Grot 1 ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "Grot 2 ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "Ruisparameters factor" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "Vuldiepte ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "Hoogte ruisparameters" +#, fuzzy +msgid "Mapgen v5 specific flags" +msgstr "Vlaggen" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "Wereldgenerator v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "Appelbomen ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "Strand frequentie" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "Strand ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "Landschap ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "Grotten ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "Woestijn frequentie" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" +#, fuzzy +msgid "Mapgen v6 specific flags" msgstr "Vlaggen" #: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "Hoogte-selectie ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "Vochtigheid ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "Modder ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "Steilheid ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "Terrein-hoogte ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "Basisterrein ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "Bomen ruisparameters" - -#: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "Wereldgenerator v7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "Grot-breedte" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "Grotten (1) ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "Grotten (2) ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "Vuldiepte ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" +#, fuzzy +msgid "Mapgen v7 specific flags" msgstr "Vlaggen" #: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "Hoogte-selectie ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "Heuvel-hoogte ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "Bergen ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "Richel ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "Ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "Terrein-hoogte ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "Terrein basis ruisparameters" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "Terrein-'persist' ruisparameters" - -#: src/settings_translation_file.cpp msgid "Massive cave depth" msgstr "Zeer grote grotten: diepte" @@ -3637,7 +4074,7 @@ msgstr "Maximaal aantal gebruikers" #: src/settings_translation_file.cpp msgid "Menus" -msgstr "Menus" +msgstr "Menu's" #: src/settings_translation_file.cpp msgid "Mesh cache" @@ -3679,6 +4116,10 @@ msgid "Mipmapping" msgstr "Mip-Mapping" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "Veranderd de grootte van de HUDbar elementen." + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "Mod-winkel details URL" @@ -3699,6 +4140,15 @@ msgid "Monospace font size" msgstr "Vaste-breedte font grootte" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mountain height noise" +msgstr "Heuvel-hoogte ruisparameters" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "Bergen ruis" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "Muis-gevoeligheid" @@ -3707,6 +4157,10 @@ msgid "Mouse sensitivity multiplier." msgstr "Muis-gevoeligheidsfactor." #: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "Modder ruis" + +#: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." @@ -3718,15 +4172,9 @@ msgstr "" "2.0 voor twee keer grotere loopbeweging." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" -"Vermenigvuldigingsfactor van loopbeweging.\n" -"Bijvoorbeeld:\n" -"0 voor geen loopbeweging.\n" -"1.0 voor normale loopbeweging.\n" -"2.0 voor twee keer grotere loopbeweging." +#, fuzzy +msgid "Mute key" +msgstr "Gebruiken toets" #: src/settings_translation_file.cpp msgid "" @@ -3788,11 +4236,6 @@ msgid "NodeTimer interval" msgstr "Interval voor node-timers" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" -"Ruisparameters voor landschapstemperaturen, -vochtigheid en -overgangen." - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "Ruis" @@ -3828,8 +4271,8 @@ msgid "" "This is a trade-off between sqlite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" -"Aantal extra blokken (van 16x16x16 nodes) dat door het commando " -"'/clearobjects'\n" +"Aantal extra blokken (van 16x16x16 nodes) dat door het commando '/" +"clearobjects'\n" "tegelijk geladen mag worden.\n" "Dit aantal is een compromis tussen snelheid enerzijds (vanwege de overhead " "van een sqlite\n" @@ -3840,8 +4283,17 @@ msgid "Number of parallax occlusion iterations." msgstr "Aantal parallax occlusie iteraties." #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "afstand" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "Ondoorschijnende vloeistoffen" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Algemene afwijking van het parallax occlusie effect. Normaal: schaal/2." +msgstr "" +"Algemene afwijking van het parallax occlusie effect. Normaal: schaal/2." #: src/settings_translation_file.cpp msgid "Overall scale of parallax occlusion effect." @@ -3880,6 +4332,14 @@ msgid "Path to save screenshots at." msgstr "Pad waar screenshots bewaard worden." #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" +"Pad naar de schader. Indien geen pad wordt gegeven zal de standaard locatie " +"gebruikt worden." + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" "Pad van de texturen-map. Naar texturen wordt gezocht beginnend bij deze map." @@ -3983,6 +4443,15 @@ msgid "Report path" msgstr "Rapport pad" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ridge noise" +msgstr "Rivier ruis parameters" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "Onderwater richel ruis" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Toets voor rechts" @@ -4017,6 +4486,10 @@ msgid "Round minimap" msgstr "Ronde mini-kaart" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "Zandstranden komen voor wanneer np_beach groter is dan deze waarde." + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "Bewaar de ontvangen wereld lokaal (op de cliënt)." @@ -4025,6 +4498,10 @@ msgid "Saving map received from server" msgstr "Lokaal bewaren van de server-wereld" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "Schaal" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -4073,6 +4550,15 @@ msgstr "" "0 = een redelijke standaardwaarde." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "Grot ruispatroon #1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "Tweede van 2 3d geluiden voor tunnels." + +#: src/settings_translation_file.cpp msgid "Security" msgstr "Veiligheid" @@ -4117,6 +4603,10 @@ msgid "Server port" msgstr "Netwerkpoort van de server" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "Door server worden onzichtbare nodes niet doorgegeven" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL van de publieke serverlijst" @@ -4156,16 +4646,27 @@ msgstr "" "Golvend water staat aan indien 'true'Dit vereist dat 'shaders' ook aanstaan." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Shaders" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" "Shaders maken bijzondere visuele effecten mogelijk, en kunnen op sommige\n" "videokaarten ook sneller zijn.\n" "Alleen mogelijk met OpenGL." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow limit" +msgstr "Max aantal wereldblokken" + +#: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." msgstr "Vorm van de mini-kaart. Aan = rond, uit = vierkant." @@ -4190,10 +4691,33 @@ msgstr "" "in mapblokken (16 nodes)." #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" +"Grootte van de MapBlock cache voor de maas generator. Dit verhogen vergroot\n" +"de kans op een cache hit, waardoor minder data van de main thread\n" +"wordt gekopieerd waardoor flikkeren verminderd." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Slice w" +msgstr "Slice w" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "Helling en vulling bepalen in combinatie de hoogte" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "Kleinschalig vochtigheidsvariatie voor de overgang van biomen." + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "Kleinschalig temperatuursvariatie voor de overgang van biomen." + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "Vloeiende verlichting" @@ -4241,6 +4765,14 @@ msgid "Static spawnpoint" msgstr "Vast geboortepunt" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "Status bericht bij verbinding" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "Steilte ruis" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "Sterkte van de normal-maps." @@ -4261,10 +4793,33 @@ msgid "Synchronous SQLite" msgstr "Sqlite synchrone modus" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "Temperatuurvariatie voor biomen." + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "Terrein hoogte" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "Terrain_alt ruis" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain base noise" +msgstr "Terrein hoogte" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain higher noise" +msgstr "Terrein hoogte" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain noise" +msgstr "Terrein hoogte" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4285,6 +4840,10 @@ msgstr "" "Een lagere waarde (richting 0.0) geeft meer meren." #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "Terrein persistentie ruis" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "Pad van texturen" @@ -4305,14 +4864,18 @@ msgid "The depth of dirt or other filler" msgstr "De diepte van aarde of andersoortige toplaag" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." msgstr "" "Het pad, ten opzichte van het wereld-pad, waar profilerings-gegevens worden " "opgeslagen.\n" #: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "De identificatie van de stuurknuppel die u gebruikt" + +#: src/settings_translation_file.cpp msgid "The network interface that the server listens on." msgstr "Het netwerk-adres waar de server op verbindingen wacht." @@ -4377,6 +4940,10 @@ msgstr "" "ingedrukt gehouden wordt." #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "Het type van stuurknuppel" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "Dit font wordt gebruikt voor bepaalde talen." @@ -4427,6 +4994,10 @@ msgid "Tooltip delay" msgstr "Tooltip tijdsduur" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "Bomen ruis" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Tri-Lineare Filtering" @@ -4445,10 +5016,36 @@ msgid "Trusted mods" msgstr "Vertrouwde mods" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" +"Typisch maximum hoogte, boven en onder het middelpunt van drijvend berg " +"terrein." + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "URL voor de serverlijst in de multiplayer tab." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Undersampling" +msgstr "Rendering:" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" +"Onderbemonstering is gelijkaardig aan het gebruik van een lagere " +"schermresolutie,\n" +"maar het behelst enkel de spel wereld. De GUI resolutie blijft intact.\n" +"Dit zou een gewichtige prestatie verbetering moeten geven ten koste van een " +"verminderde detailweergave." + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "Onbeperkte speler zichtbaarheidsafstand" @@ -4515,6 +5112,48 @@ msgid "Valleys C Flags" msgstr "Valleien vlaggen" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "Variatie van de biome vullingsdiepte." + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" +"Variatie van de heuvel hoogte en vijver diepte op drijvend egaal terrein." + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "Variatie van de maximum berg hoogte (in noden)." + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "Variatie van het aantal grotten." + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" +"Variatie in de verticale schaal van het terrein.\n" +"Indien ruis < -0.55 is het terrein haast vlak." + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "Varieert de diepte van de biome oppervlakte noden." + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" +"Varieert de ruwheid van het terrein.\n" +"Definieert de 'persistence' waarde voor terrain_base en terrain_alt ruis." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "Bepaalt steilheid/hoogte van heuvels." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "Vertikale scherm-synchronisatie." @@ -4523,13 +5162,13 @@ msgid "Video driver" msgstr "Video driver" #: src/settings_translation_file.cpp -msgid "View bobbing" +#, fuzzy +msgid "View bobbing factor" msgstr "Loopbeweging" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +#, fuzzy +msgid "View distance in nodes." msgstr "" "Zichtafstand in nodes.\n" "Minimaal: 20" @@ -4543,6 +5182,10 @@ msgid "View range increase key" msgstr "Toets voor vergroten zichtafstand" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "Toets voor het inzoomen" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "Zichtafstand" @@ -4654,26 +5297,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" -"Grenzen van de wereldgenerator.\n" -"- Maximale waarde: 31000 (hogere waarden worden niet gehonoreerd).\n" -"- De wereld wordt standaard gegenereerd per gebied van 80x80x80 nodes\n" -" (5x5x5 mapblokken).\n" -"- Coordinaat (0,0,0) bevindt zich zoveel mogelijk in het centrum van een " -"gebied.\n" -" Dat betekent dat standaard, het meest centrale gebied begint op " -"coördinaat (-32,-32,-32)\n" -"- Enkel gebieden (van standaard 5x5x5 blokken) die geheel vallen binnen\n" -" map_generation_limit worden gegenereerd" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "Gebruik freetype fonts. Dit vereist dat freetype ingecompileerd is." @@ -4703,7 +5326,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Whether to fog out the end of the visible area." -msgstr "Maak het einde van het zichtbereik mistig, zodat het einde niet opvalt." +msgstr "" +"Maak het einde van het zichtbereik mistig, zodat het einde niet opvalt." #: src/settings_translation_file.cpp msgid "" @@ -4735,6 +5359,16 @@ msgstr "Breedte van de lijnen om een geselecteerde node." #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" +"Enkel Windows systemen: Start Minetest met een commando (DOS-prompt) window " +"in de achtergrond.\n" +"Bevat dezelfde informatie als het bestand debug.txt (standaard naam)." + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4751,6 +5385,43 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "Minimale diepte van grote semi-willekeurige grotten." #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "Y-niveau van gemiddeld terrein oppervlak." + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "Y-niveau van hoogste limiet voor grotten." + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "Y-niveau van drijvend land middelpunt en vijver oppervlak." + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "Y-niveau van hoger (rotswand-top) terrein." + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "Y-niveau van lager terrein en vijver bodems." + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "Y-niveau van zee bodem." + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "Y-niveau tot waar de schaduw van drijvend land reikt." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "block send optimize distance" +msgstr "Maximale afstand voor te versturen blokken" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "timeout voor cURL download" @@ -4762,6 +5433,247 @@ msgstr "Maximaal parallellisme in cURL" msgid "cURL timeout" msgstr "cURL timeout" +#~ msgid "Hide mp content" +#~ msgstr "Verberg MV mods" + +#~ msgid "Start Game" +#~ msgstr "Start spel" + +#~ msgid "Attn" +#~ msgstr "SAK" + +#~ msgid "Capital" +#~ msgstr "Hoofdletter" + +#~ msgid "Comma" +#~ msgstr "Komma" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Laatste" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Min" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Punt" + +#~ msgid "Plus" +#~ msgstr "Plus" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Bepaalt de grootte van woestijnen en stranden in de wereld-generator " +#~ "(mapgen) v6.\n" +#~ "Als 'snowbiomes' aan staat, wordt deze instelling genegeerd." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Bepaalt de vorm van het terrein.\n" +#~ "De 3 getallen tussen vierkante haken bepalen de schaal\n" +#~ "van het terrein. Ze dienen alle drie hetzelfde te zijn." + +#~ msgid "Mapgen biome heat noise parameters" +#~ msgstr "Wereldgenerator landschapstemperatuur" + +#~ msgid "Mapgen biome humidity blend noise parameters" +#~ msgstr "Wereldgenerator landschapsvochtigheidsovergangen" + +#~ msgid "Mapgen biome humidity noise parameters" +#~ msgstr "Wereldgenerator landschapsvochtigheid" + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Grot breedte" + +#~ msgid "Mapgen flat cave1 noise parameters" +#~ msgstr "Grotten (1) ruisparameters" + +#~ msgid "Mapgen flat cave2 noise parameters" +#~ msgstr "Grotten (2) ruisparameters" + +#~ msgid "Mapgen flat filler depth noise parameters" +#~ msgstr "Vuldiepte ruisparameters" + +#~ msgid "Mapgen flat large cave depth" +#~ msgstr "Grote Grotten diepte" + +#~ msgid "Mapgen flat terrain noise parameters" +#~ msgstr "Terrein ruisparameters" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Grot breedte" + +#~ msgid "Mapgen fractal cave1 noise parameters" +#~ msgstr "Grotten (1) ruisparameters" + +#~ msgid "Mapgen fractal cave2 noise parameters" +#~ msgstr "Grotten (2) ruisparameters" + +#~ msgid "Mapgen fractal filler depth noise parameters" +#~ msgstr "Vuldiepte ruisparameters" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Fractal" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Aantal iteraties" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "Fractal W" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "Fractal X" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "Fractal Y" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "Fractal Z" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "Centrum-positie" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Schaal" + +#~ msgid "Mapgen fractal seabed noise parameters" +#~ msgstr "Zeebodem ruisparameters" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "W-doorsnede" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Grot-breedte" + +#~ msgid "Mapgen v5 cave1 noise parameters" +#~ msgstr "Grot 1 ruisparameters" + +#~ msgid "Mapgen v5 cave2 noise parameters" +#~ msgstr "Grot 2 ruisparameters" + +#~ msgid "Mapgen v5 factor noise parameters" +#~ msgstr "Ruisparameters factor" + +#~ msgid "Mapgen v5 filler depth noise parameters" +#~ msgstr "Vuldiepte ruisparameters" + +#~ msgid "Mapgen v5 height noise parameters" +#~ msgstr "Hoogte ruisparameters" + +#~ msgid "Mapgen v6 apple trees noise parameters" +#~ msgstr "Appelbomen ruisparameters" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "Strand frequentie" + +#~ msgid "Mapgen v6 beach noise parameters" +#~ msgstr "Strand ruisparameters" + +#~ msgid "Mapgen v6 biome noise parameters" +#~ msgstr "Landschap ruisparameters" + +#~ msgid "Mapgen v6 cave noise parameters" +#~ msgstr "Grotten ruisparameters" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "Woestijn frequentie" + +#~ msgid "Mapgen v6 mud noise parameters" +#~ msgstr "Modder ruisparameters" + +#~ msgid "Mapgen v6 steepness noise parameters" +#~ msgstr "Steilheid ruisparameters" + +#~ msgid "Mapgen v6 terrain altitude noise parameters" +#~ msgstr "Terrein-hoogte ruisparameters" + +#~ msgid "Mapgen v6 terrain base noise parameters" +#~ msgstr "Basisterrein ruisparameters" + +#~ msgid "Mapgen v6 trees noise parameters" +#~ msgstr "Bomen ruisparameters" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Grot-breedte" + +#~ msgid "Mapgen v7 cave1 noise parameters" +#~ msgstr "Grotten (1) ruisparameters" + +#~ msgid "Mapgen v7 cave2 noise parameters" +#~ msgstr "Grotten (2) ruisparameters" + +#~ msgid "Mapgen v7 filler depth noise parameters" +#~ msgstr "Vuldiepte ruisparameters" + +#~ msgid "Mapgen v7 height select noise parameters" +#~ msgstr "Hoogte-selectie ruisparameters" + +#~ msgid "Mapgen v7 mountain noise parameters" +#~ msgstr "Bergen ruisparameters" + +#~ msgid "Mapgen v7 ridge noise parameters" +#~ msgstr "Richel ruisparameters" + +#~ msgid "Mapgen v7 ridge water noise parameters" +#~ msgstr "Ruisparameters" + +#~ msgid "Mapgen v7 terrain altitude noise parameters" +#~ msgstr "Terrein-hoogte ruisparameters" + +#~ msgid "Mapgen v7 terrain base noise parameters" +#~ msgstr "Terrein basis ruisparameters" + +#~ msgid "Mapgen v7 terrain persistation noise parameters" +#~ msgstr "Terrein-'persist' ruisparameters" + +#~ msgid "" +#~ "Noise parameters for biome API temperature, humidity and biome blend." +#~ msgstr "" +#~ "Ruisparameters voor landschapstemperaturen, -vochtigheid en -overgangen." + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "Grenzen van de wereldgenerator.\n" +#~ "- Maximale waarde: 31000 (hogere waarden worden niet gehonoreerd).\n" +#~ "- De wereld wordt standaard gegenereerd per gebied van 80x80x80 nodes\n" +#~ " (5x5x5 mapblokken).\n" +#~ "- Coordinaat (0,0,0) bevindt zich zoveel mogelijk in het centrum van " +#~ "een gebied.\n" +#~ " Dat betekent dat standaard, het meest centrale gebied begint op " +#~ "coördinaat (-32,-32,-32)\n" +#~ "- Enkel gebieden (van standaard 5x5x5 blokken) die geheel vallen " +#~ "binnen\n" +#~ " map_generation_limit worden gegenereerd" + #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "" #~ "Gedetailleerde profiling-data voor mods. Nuttig voor mod-ontwikkelaars." @@ -4817,15 +5729,9 @@ msgstr "cURL timeout" #~ msgid "If enabled, " #~ msgstr "ingeschakeld" -#~ msgid "Rendering:" -#~ msgstr "Rendering:" - #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "Herstart minetest om de driver te activeren" -#~ msgid "Game Name" -#~ msgstr "Spel" - #~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\"" #~ msgstr "Gamemgr: Kan mod \"$1\" niet naar spel \"$2\" kopiëren" @@ -4880,9 +5786,6 @@ msgstr "cURL timeout" #~ msgid "Add mod:" #~ msgstr "Mod toevoegen:" -#~ msgid "Local install" -#~ msgstr "Plaatselijk installeren" - #~ msgid "" #~ "Warning: Some mods are not configured yet.\n" #~ "They will be enabled by default when you save the configuration. " @@ -5135,8 +6038,8 @@ msgstr "cURL timeout" #~ "Flags starting with 'no' are used to explicitly disable them." #~ msgstr "" #~ "Wereldgenerator instellingen specified voor generator v6.\n" -#~ "Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt " -#~ "de \"jungles\" vlag genegeerd.\n" +#~ "Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en " +#~ "wordt de \"jungles\" vlag genegeerd.\n" #~ "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-" #~ "waarde.\n" #~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten." diff --git a/po/pl/minetest.po b/po/pl/minetest.po index b767a560a..e8609ea7d 100644 --- a/po/pl/minetest.po +++ b/po/pl/minetest.po @@ -7,18 +7,26 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-11-08 17:20+0000\n" -"Last-Translator: Jakub Mendel <jimikuba@o2.pl>\n" -"Language-Team: Polish <https://hosted.weblate.org/projects/minetest/minetest/" -"pl/>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-05-31 19:57+0000\n" +"Last-Translator: Mateusz Mendel <mendelm9@gmail.com>\n" +"Language-Team: Polish " +"<https://hosted.weblate.org/projects/minetest/minetest/pl/>\n" "Language: pl\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%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 2.9\n" +"X-Generator: Weblate 2.15-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Wróć do gry" + +#: builtin/client/init.lua +msgid "You died." +msgstr "ZginÄ…Å‚eÅ›." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -78,19 +86,24 @@ msgstr "Wspieramy protokoÅ‚y w wersji od $1 do $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Anuluj" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" -msgstr "Zależy od:" +#, fuzzy +msgid "Dependencies:" +msgstr "ZależnoÅ›ci" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable MP" msgstr "Wyłącz paczkÄ™ modów" #: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Wyłącz wszystko" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Włącz paczkÄ™ modów" @@ -107,17 +120,14 @@ msgstr "" "Tylko znaki [a-z0-9_] sÄ… dozwolone." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Ukryj GrÄ™" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Ukryj zawartość paczki modów" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +#, fuzzy +msgid "Optional dependencies:" +msgstr "Dodatkowe zależnoÅ›ci:" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -181,8 +191,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Na pewno usunąć \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "UsuÅ„" @@ -198,7 +207,7 @@ msgstr "Modmgr: nieprawidÅ‚owy katalog \"$1\"" msgid "Delete World \"$1\"?" msgstr "Usunąć Å›wiat \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Zaakceptuj" @@ -256,7 +265,7 @@ msgstr "Mody" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Optionally the lacunarity can be appended with a leading comma." -msgstr "" +msgstr "Opcjonalnie można dołączyć lakunarność poprzedzonÄ… przecinkiem." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a comma seperated list of flags." @@ -278,6 +287,11 @@ msgstr "Możliwe wartoÅ›ci to: " msgid "Restore Default" msgstr "Przywróć domyÅ›lne" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Szukaj" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Wybierz Å›cieżkÄ™" @@ -287,11 +301,13 @@ msgid "Show technical names" msgstr "Pokaż nazwy techniczne" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "Wartość musi być wiÄ™ksza niż $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "Wartość musi być mniejsza niż $1." #: builtin/mainmenu/modmgr.lua @@ -319,6 +335,11 @@ msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" "Instalacja moda: nie można znaleźć odpowiedniego folderu dla paczki modów $1" +#: builtin/mainmenu/modmgr.lua +#, fuzzy +msgid "Subgame Mods" +msgstr "Mody trybów gry" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Zamknij" @@ -340,10 +361,6 @@ msgid "Rating" msgstr "Ocena" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Szukaj" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Nazwa skrócona:" @@ -379,6 +396,70 @@ msgstr "Byli współautorzy" msgid "Previous Core Developers" msgstr "Poprzedni Główni Deweloperzy" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "RozgÅ‚oÅ› serwer" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Adres" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Ustaw" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Tryb kreatywny" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Włącz obrażenia" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Utwórz grÄ™" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "UdostÄ™pnij serwer" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Lokalna gra" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nazwa gracza/HasÅ‚o" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Nowy" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Nie wybrano bÄ…dź nie utworzono Å›wiata!" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Graj" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Port" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Wybierz Å›wiat:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Port Serwera" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Zainstalowane Mody:" @@ -388,6 +469,11 @@ msgid "Mod information:" msgstr "Informacje o modzie:" #: builtin/mainmenu/tab_mods.lua +#, fuzzy +msgid "No dependencies." +msgstr "Brak wymaganych zależnoÅ›ci." + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Brak dostÄ™pnych informacji o modzie" @@ -407,95 +493,47 @@ msgstr "UsuÅ„ zaznaczony modyfikacjÄ™" msgid "Uninstall selected modpack" msgstr "Odinstaluj wybranÄ… paczkÄ™ modów" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Adres / Port" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Klient" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Połącz" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Tryb kreatywny" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Obrażenia włączone" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "UsuÅ„ ulubiony" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Ulubione" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Nazwa gracza / HasÅ‚o" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP włączone" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Adres" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Ustaw" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Tryb kreatywny" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Włącz obrażenia" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Nazwa gracza/HasÅ‚o" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Nowy" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Nie wybrano bÄ…dź nie utworzono Å›wiata!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Port" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Publiczne" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Wybierz Å›wiat:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Serwer" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#, fuzzy +msgid "Ping" +msgstr "Ping" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Port Serwera" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Play Online" +msgstr "Gra przez sieć" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Rozpocznij grÄ™/Połącz" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP włączone" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -526,6 +564,11 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "JesteÅ› pewny że chcesz zresetować Å›wiat singleplayer?" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Autosave screen size" +msgstr "Automatyczny zapis rozmiaru okienka" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Filtrowanie dwuliniowe" @@ -567,7 +610,7 @@ msgstr "Mip-Mappowanie wyłączone" #: builtin/mainmenu/tab_settings.lua msgid "Node Highlighting" -msgstr "PodÅ›wietlanie bloku" +msgstr "PodÅ›wietlanie bloków" #: builtin/mainmenu/tab_settings.lua msgid "Node Outlining" @@ -602,6 +645,11 @@ msgid "Reset singleplayer world" msgstr "Resetuj Å›wiat pojedynczego gracza" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "Ekran:" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Ustawienia" @@ -665,14 +713,6 @@ msgstr "Menu główne" msgid "Start Singleplayer" msgstr "Tryb jednoosobowy" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Graj" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Pojedynczy gracz" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Brak informacjii" @@ -734,6 +774,11 @@ msgid "Player name too long." msgstr "Nazwa gracza jest za dÅ‚uga." #: src/client/clientlauncher.cpp +#, fuzzy +msgid "Please choose a name!" +msgstr "Wybierz nazwÄ™" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Podana Å›cieżka Å›wiata nie istnieje: " @@ -750,6 +795,41 @@ msgstr "" "Sprawdź plik debug.txt by uzyskać wiÄ™cej informacji." #: src/game.cpp +msgid "- Address: " +msgstr "Adres " + +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "Tryb kreatywny " + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Włącz obrażenia " + +#: src/game.cpp +#, fuzzy +msgid "- Mode: " +msgstr "Tryb: " + +#: src/game.cpp +msgid "- Port: " +msgstr "Port " + +#: src/game.cpp +msgid "- Public: " +msgstr "Publiczne " + +#: src/game.cpp +msgid "- PvP: " +msgstr "Gracz przeciwko graczowi: " + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Nazwa serwera " + +#: src/game.cpp msgid "Change Keys" msgstr "ZmieÅ„ klawisze" @@ -766,29 +846,29 @@ msgid "Continue" msgstr "Dalej" #: src/game.cpp -msgid "Creating client..." -msgstr "Tworzenie klienta..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Tworzenie serwera...." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "DomyÅ›lne sterowanie:↵\n" "- WASD: ruch↵\n" +"- W: do przodu\n" +"- S: do tyÅ‚u\n" +"- A: lewo\n" +"- D: prawo\n" "- Spacja: skok/wspinanie się↵\n" "- Shift: skradanie siÄ™/schodzenie w dół↵\n" "- Q: upuszczenie przedmiotu↵\n" @@ -800,6 +880,14 @@ msgstr "" "- T: chat\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Tworzenie klienta..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Tworzenie serwera...." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -836,6 +924,20 @@ msgid "Exit to OS" msgstr "WyjÅ›cie z gry" #: src/game.cpp +msgid "Game info:" +msgstr "Informacje o grze:" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Gra wstrzymana" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Tworzenie serwera...." + +#: src/game.cpp msgid "Item definitions..." msgstr "Definicje przedmiotów..." @@ -853,27 +955,52 @@ msgstr "MiB/s" #: src/game.cpp msgid "Node definitions..." -msgstr "Definicje nod..." +msgstr "Definicje bloków..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Sprawdzanie adresu..." +#, fuzzy +msgid "Off" +msgstr "Wyłącz" #: src/game.cpp -msgid "Respawn" -msgstr "Wróć do gry" +#, fuzzy +msgid "On" +msgstr "Włącz" + +#: src/game.cpp +msgid "Remote server" +msgstr "Serwer zdalny" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Sprawdzanie adresu..." #: src/game.cpp msgid "Shutting down..." msgstr "Wyłączanie..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Pojedynczy gracz" + +#: src/game.cpp msgid "Sound Volume" msgstr "GÅ‚oÅ›ność" #: src/game.cpp -msgid "You died." -msgstr "ZginÄ…Å‚eÅ›." +#, c-format, fuzzy +msgid "Volume changed to %d%%" +msgstr "Zmieniono poziom gÅ‚oÅ›noÅ›ci na %d%%" + +#: src/game.cpp +#, fuzzy +msgid "Volume changed to 0%" +msgstr "Zmieniono poziom gÅ‚oÅ›noÅ›ci na 0%" + +#: src/game.cpp +#, fuzzy +msgid "Volume changed to 100%" +msgstr "Zmieniono poziom gÅ‚oÅ›noÅ›ci na 100%" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -908,6 +1035,11 @@ msgid "Console" msgstr "Konsola" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Dec. volume" +msgstr "Zmniejsz gÅ‚oÅ›ność" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "WciÅ›nij dwukrotnie \"Skok\" by włączyć tryb latania" @@ -920,6 +1052,11 @@ msgid "Forward" msgstr "Przód" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "ZwiÄ™ksz GÅ‚oÅ›ność" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Ekwipunek" @@ -941,6 +1078,26 @@ msgstr "" msgid "Left" msgstr "Lewo" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Główne polecenie" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Mute" +msgstr "Wycisz" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "NastÄ™pny" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Prev. item" +msgstr "Poprzedni" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Drukuj stosy" @@ -1018,38 +1175,23 @@ msgid "Apps" msgstr "Menu" #: src/keycode.cpp -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" msgstr "Backspace" #: src/keycode.cpp -msgid "Capital" -msgstr "Caps Lock" +#, fuzzy +msgid "Caps Lock" +msgstr "Klawisz Caps Lock" #: src/keycode.cpp msgid "Clear" msgstr "Delete" #: src/keycode.cpp -msgid "Comma" -msgstr "Przecinek" - -#: src/keycode.cpp msgid "Control" msgstr "Control" #: src/keycode.cpp -msgid "Convert" -msgstr "Konwertuj" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Dół" @@ -1058,26 +1200,15 @@ msgid "End" msgstr "End" #: src/keycode.cpp -msgid "Erase OEF" -msgstr "Erase OEF" - -#: src/keycode.cpp -msgid "Escape" -msgstr "Escape" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" +#, fuzzy +msgid "Erase EOF" +msgstr "UsuÅ„ EOF" #: src/keycode.cpp msgid "Execute" msgstr "Wykonaj" #: src/keycode.cpp -msgid "Final" -msgstr "Final" - -#: src/keycode.cpp msgid "Help" msgstr "Pomoc" @@ -1086,20 +1217,32 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +#, fuzzy +msgid "IME Accept" +msgstr "Zaakceptuj IME" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Convert" +msgstr "Konwertuj IME" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Escape" +msgstr "Escape" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +#, fuzzy +msgid "IME Mode Change" +msgstr "Zmiana Trybu" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +msgid "IME Nonconvert" +msgstr "Niezmienialny" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1130,22 +1273,10 @@ msgid "Middle Button" msgstr "Åšrodkowy przycisk myszy" #: src/keycode.cpp -msgid "Minus" -msgstr "Minus" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Zmiana Trybu" - -#: src/keycode.cpp msgid "Next" msgstr "NastÄ™pny" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nonconvert" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1162,6 +1293,11 @@ msgid "Numpad -" msgstr "Numeryczna -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Numeryczna *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Numeryczna /" @@ -1210,20 +1346,12 @@ msgid "OEM Clear" msgstr "OEM Clear" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pause" #: src/keycode.cpp -msgid "Period" -msgstr "Kropka" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Plus" +msgid "Play" +msgstr "Graj" #: src/keycode.cpp msgid "Print" @@ -1262,16 +1390,18 @@ msgid "Scroll Lock" msgstr "Scroll Lock" #: src/keycode.cpp +#, fuzzy msgid "Select" -msgstr "Select" +msgstr "Wybierz" #: src/keycode.cpp msgid "Shift" msgstr "Shift" #: src/keycode.cpp +#, fuzzy msgid "Sleep" -msgstr "Sleep" +msgstr "UÅ›pij" #: src/keycode.cpp msgid "Snapshot" @@ -1330,6 +1460,25 @@ msgid "3D mode" msgstr "Modele 3D" #: src/settings_translation_file.cpp +#, fuzzy +msgid "3D noise defining giant caverns." +msgstr "Szum 3d okreÅ›lajÄ…cy olbrzymie jaskinie." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" +"Szum 3d okreÅ›lajÄ…cy strukturÄ™ i wysokość gór.\n" +"OkreÅ›la również strukturÄ™ wznoszÄ…cego siÄ™ terenu górzystego." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "3D noise defining structure of river canyon walls." +msgstr "Szum 3d okreÅ›lajÄ…cy strukturÄ™ kanionów rzecznych." + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1398,7 +1547,6 @@ msgid "Active object send range" msgstr "ZasiÄ™g wysyÅ‚ania aktywnego obiektu" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Address to connect to.\n" "Leave this blank to start a local server.\n" @@ -1409,6 +1557,10 @@ msgstr "" "Zauważ że pole adresu w głównym menu nadpisuje te ustawienie." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "Dodaje efekty czÄ…stkowe podczas wykopywania bloków." + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1417,12 +1569,15 @@ msgstr "" "ekranów 4k." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" -"Ustaw enkodowanie gamma dla tablic Å›wiateÅ‚. Niższe wartoÅ›ci sÄ… jaÅ›niejsze.\n" -"Te ustawienie jest tylko dla klientów i jest ignorowane przez serwer." +"Ustaw kodowanie gamma dla tablic Å›wiateÅ‚. Niższe wartoÅ›ci to wiÄ™ksza jasność." +"\n" +"To ustawienie jest tylko dla klientów, ignorowane przez serwer." #: src/settings_translation_file.cpp msgid "Advanced" @@ -1437,14 +1592,23 @@ msgid "Always fly and fast" msgstr "Zawsze lataj oraz poruszaj siÄ™ szybko" #: src/settings_translation_file.cpp +#, fuzzy msgid "Ambient occlusion gamma" -msgstr "" +msgstr "Ambient occlusion gamma" #: src/settings_translation_file.cpp msgid "Amplifies the valleys" msgstr "Wzmacnia doliny" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" +"Tylko na systemie Android: próba stworzenia tekstur inwentarza z meshy, " +"kiedy nie znaleziono wspomaganego renderowania." + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Filtrowanie anizotropowe" @@ -1463,6 +1627,11 @@ msgstr "" "minetest.net." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Apple trees noise" +msgstr "Szum jabÅ‚oni" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "Przybliżona (X,Y,Z) skala fraktali w wÄ™zÅ‚ach." @@ -1471,12 +1640,36 @@ msgid "Ask to reconnect after crash" msgstr "PoproÅ› o ponowne połączenie po awarii" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" +"Z tej odlegÅ‚oÅ›ci serwer mocno zoptymalizuje, które bloki sÄ… wysÅ‚ane do " +"klientów.\n" +"MaÅ‚e wartoÅ›ci mogÄ… bardzo poprawić dziaÅ‚anie, kosztem widocznego " +"renderowania glitchy.\n" +"(Niektóre bloki nie bÄ™dÄ… wygenerowane pod wodÄ… ani w jaskiniach, jak również " +"na lÄ…dzie.\n" +"Zmiana wartoÅ›ci na wyższÄ… niż max_block_send_distance wyłącza tÄ… " +"optymalizacjÄ™.\n" +"Zapisane w blokach mapy (16 bloków)" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Automatycznie zgÅ‚oÅ› do listy serwerów." #: src/settings_translation_file.cpp +#, fuzzy msgid "Autorun key" -msgstr "" +msgstr "Tryb automatycznego biegania" #: src/settings_translation_file.cpp msgid "Backward key" @@ -1495,6 +1688,16 @@ msgid "Basic Privileges" msgstr "Podstawowe uprawnienia" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Beach noise" +msgstr "Szum plaży" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Beach noise threshold" +msgstr "Granica szumu plaży" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Filtrowanie dwuliniowe" @@ -1504,13 +1707,21 @@ msgstr "Sprawdzanie adresu" #: src/settings_translation_file.cpp #, fuzzy +msgid "Biome API temperature and humidity noise parameters" +msgstr "Parametry temperatury oraz wilgotnoÅ›ci biomu Mapgen" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "Szum biomu" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bity na pixel (głębia koloru) w trybie peÅ‚noekranowym." +msgstr "Bity na piksel (głębia koloru) w trybie peÅ‚noekranowym." #: src/settings_translation_file.cpp #, fuzzy msgid "Build inside player" -msgstr "Gra wieloosobowa" +msgstr "Buduj w pozycji gracza" #: src/settings_translation_file.cpp msgid "Builtin" @@ -1533,6 +1744,11 @@ msgid "Camera update toggle key" msgstr "Klawisz przełączania kamery" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "Szum jaskini #1" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "Szum jaskini #1" @@ -1545,6 +1761,33 @@ msgid "Cave width" msgstr "Szerokość jaskini" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "Szum jaskini #1" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "Szum jaskini #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "Szerokość jaskini" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "Szum jaskini #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern taper" +msgstr "Zwężenie jaskini" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Granica jaskinii" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "Jaskinie i tunele tworzÄ… siÄ™ na przeciÄ™ciu dwóch szumów" @@ -1619,10 +1862,19 @@ msgid "Clean transparent textures" msgstr "Czyste przeźroczyste tekstury" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Klient" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Klient i Serwer" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Modyfikacja klienta" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Szybkość wspinania" @@ -1691,6 +1943,11 @@ msgid "Console color" msgstr "Kolor konsoli" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Wysokość konsoli" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Klawisz konsoli" @@ -1703,9 +1960,8 @@ msgid "Continuous forward movement (only used for testing)." msgstr "CiÄ…gÅ‚e poruszanie siÄ™ na przód (tylko do testowania)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Controls" -msgstr "Control" +msgstr "Sterowanie" #: src/settings_translation_file.cpp msgid "" @@ -1718,14 +1974,6 @@ msgstr "" "zostaje niezmienione." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Kontrola szerokoÅ›ci pustyni i plaż w generatorze map v6.\n" -"Kiedy Å›nieżne biomy sÄ… włączone to 'mgv6_freq_desert' zostanie zignorowane." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Kontroluje stromość/głębokość depresji jeziora." @@ -1734,6 +1982,15 @@ msgid "Controls steepness/height of hills." msgstr "Kontroluje stromość/wysokość gór." #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" +"Kontroluje gÄ™stość wznoszÄ…cego siÄ™ terenu górzystego.\n" +"Jest to wartość dodana do wartość szumu 'np_mountain'." + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "Kontroluje szerokość tuneli, mniejsze wartoÅ›ci tworzÄ… szersze tunele." @@ -1758,6 +2015,11 @@ msgstr "" "Może zwiÄ™kszyć trudność kopania. Zero wyłącza tÄ™ opcjÄ™. (0-10)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Kreatywny" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "KanaÅ‚ alfa celownika" @@ -1794,6 +2056,11 @@ msgid "Debug log level" msgstr "Poziom logowania debugowania" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "Klawisz zmniejszania gÅ‚oÅ›noÅ›ci" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Krok serwera dedykowanego" @@ -1834,6 +2101,48 @@ msgstr "" "Ma znaczenie tylko gdy skompilowane z cURL." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "OkreÅ›la obszary 'terrain_higher' (szczyt wzgórza)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" +"OkreÅ›la obszary wznoszÄ…cego siÄ™ gÅ‚adkiego terenu.\n" +"WygÅ‚adzone powierzchnie pojawiajÄ… siÄ™ gdy szum > 0." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "OkreÅ›la obszary wyższych terenów oraz wpÅ‚ywa na stromość klifów." + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "OkreÅ›la obszary na których drzewa majÄ… jabÅ‚ka." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Defines areas with sandy beaches." +msgstr "OkreÅ›la obszary z piaszczystymi plażami." + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "OkreÅ›la wielkość jaskiÅ„, mniejsze wartoÅ›ci tworzÄ… wiÄ™ksze jaskinie." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Defines large-scale river channel structure." +msgstr "OkreÅ›la strukturÄ™ kanałów rzecznych." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "OkreÅ›la poÅ‚ożenie oraz teren z dodatkowymi górami i jeziorami." + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1848,8 +2157,23 @@ msgstr "" "nieskoÅ„czoność)." #: src/settings_translation_file.cpp -msgid "Delay in sending blocks after building" +#, fuzzy +msgid "Defines tree areas and tree density." +msgstr "OkreÅ›la obszar z drzewami oraz ich gÄ™stość." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." msgstr "" +"Opóźnienie miÄ™dzy aktualizacjÄ… meshy na kliencie podawane w milisekundach. " +"ZwiÄ™kszenie zredukuje czÄ™stość aktualizacji meshy, ograniczajÄ…c w ten sposób " +"jitter na wolniejszych klientach." + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "Opóźnienie w przesyÅ‚aniu bloków, kiedy gracz buduje" #: src/settings_translation_file.cpp msgid "Delay showing tooltips, stated in milliseconds." @@ -1880,18 +2204,23 @@ msgstr "" "serwerów." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "Odsynchronizuj animacjÄ™ bloków" +msgid "Desert noise threshold" +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"Determinuje ksztaÅ‚t terenu.\n" -"Trzy liczby w nawiasach kontrolujÄ… skalÄ™ terenu\n" -"oraz powinny być identyczne." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Odsynchronizuj animacjÄ™ bloków" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Włącz Efekty CzÄ…steczkowe" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1942,10 +2271,24 @@ msgid "Enable Joysticks" msgstr "Włącz joystick" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "Włącz VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Włącz tryb mod security" @@ -1992,6 +2335,16 @@ msgstr "" "jeżeli nastÄ™puje połączenie z serwerem." #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2046,10 +2399,15 @@ msgstr "" "Wymaga włączenia shaderów." #: src/settings_translation_file.cpp -msgid "Engine profiling data print interval" +msgid "Enables view bobbing when walking." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiling data print interval" +msgstr "InterwaÅ‚ wyÅ›wietlania danych profilowych" + +#: src/settings_translation_file.cpp msgid "Entity methods" msgstr "" @@ -2067,10 +2425,14 @@ msgstr "FPS podczas pauzy w menu" #: src/settings_translation_file.cpp msgid "FSAA" +msgstr "FSAA" + +#: src/settings_translation_file.cpp +msgid "Factor noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2143,7 +2505,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Filler Depth" -msgstr "" +msgstr "Głębokość wypeÅ‚nienia" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Filler depth noise" +msgstr "Głębokość wypeÅ‚nienia" #: src/settings_translation_file.cpp msgid "Filmic tone mapping" @@ -2168,10 +2535,34 @@ msgid "Filtering" msgstr "Filtrowanie anizotropowe" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "StaÅ‚e ziarno mapy" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Klawisz latania" @@ -2184,6 +2575,10 @@ msgid "Fog" msgstr "MgÅ‚a" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Klawisz przełączania mgÅ‚y" @@ -2220,6 +2615,14 @@ msgid "Forward key" msgstr "Do przodu" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "Czcionki Freetype" @@ -2241,6 +2644,8 @@ msgstr "" msgid "" "From how far clients know about objects, stated in mapblocks (16 nodes)." msgstr "" +"OdlegÅ‚ość, z jakiej klient dowiaduje siÄ™ o obiektach, wyrażona w blokach " +"mapy (16 bloków)." #: src/settings_translation_file.cpp msgid "Full screen" @@ -2280,7 +2685,7 @@ msgstr "Generuj mapy normalnych" #: src/settings_translation_file.cpp msgid "Global callbacks" -msgstr "" +msgstr "Globalne wywoÅ‚ania zwrotne" #: src/settings_translation_file.cpp msgid "" @@ -2308,10 +2713,19 @@ msgid "Gravity" msgstr "Grawitacja" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "Generator mapy flat poziom ziemi" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "Mody" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Klawisz przełączania HUD" @@ -2339,22 +2753,58 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "Szum jaskini #1" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "Wysokość poczÄ…tkowego rozmiaru okna." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Wysokość szumu" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "Wysokość na której pojawiajÄ… się chmury." #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "FPU Wysokiej precyzji" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Stromość zbocza" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Granica zbocza" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Główna strona serwera, wyÅ›wietlana na liÅ›cie serwerów." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Jak głębokie robić rzeki" @@ -2381,10 +2831,22 @@ msgid "How wide to make rivers" msgstr "Jak szerokie sÄ… rzeki" #: src/settings_translation_file.cpp -msgid "IPv6" +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." msgstr "" #: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "IPv6" + +#: src/settings_translation_file.cpp msgid "IPv6 server" msgstr "Serwer IPv6" @@ -2410,6 +2872,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2452,6 +2923,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "JeÅ›li włączone, nowi gracze nie mogÄ… dołączyć do gry z pustym hasÅ‚em." #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2477,9 +2952,18 @@ msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "KanaÅ‚ alfa konsoli w grze (od 0 do 255)." #: src/settings_translation_file.cpp -#, fuzzy msgid "In-game chat console background color (R,G,B)." -msgstr "Kolor konsoli czatu w grze (R,G,B)." +msgstr "Kolor tÅ‚a konsoli czatu w grze (R,G,B)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "KanaÅ‚ alfa konsoli w grze (od 0 do 255)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Klawisz konsoli" #: src/settings_translation_file.cpp msgid "" @@ -2516,7 +3000,6 @@ msgid "Instrumentation" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Interval of saving important changes in the world, stated in seconds." msgstr "InterwaÅ‚ zapisywania ważnych zmian w Å›wiecie, w sekundach." @@ -2526,6 +3009,10 @@ msgstr "InterwaÅ‚ wysyÅ‚ania czasu gry do klientów." #: src/settings_translation_file.cpp #, fuzzy +msgid "Inventory image hack" +msgstr "Ekwipunek" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "Animacje przedmiotów w ekwipunku" @@ -2534,14 +3021,12 @@ msgid "Inventory key" msgstr "Ekwipunek" #: src/settings_translation_file.cpp -#, fuzzy msgid "Invert mouse" msgstr "Odwróć mysz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Invert vertical mouse movement." -msgstr "Odwróć ruch pionowy ruchu myszy." +msgstr "Odwróć pionowy ruch myszy." #: src/settings_translation_file.cpp #, fuzzy @@ -2549,7 +3034,10 @@ msgid "Item entity TTL" msgstr "TTL przedmiotu" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." @@ -2558,7 +3046,14 @@ msgstr "" "Kontroluje ilość drobnych szczegółów." #: src/settings_translation_file.cpp -#, fuzzy +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "Interwał powtarzania przycisku joysticka" @@ -2567,62 +3062,72 @@ msgid "Joystick frustum sensitivity" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only: W component of hypercomplex constant determining julia " "shape.\n" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" -"Zbiór Julii tylko: W komponent staÅ‚ej liczby hiperzespolonej determinujÄ…cej " -"ksztaÅ‚t Julii.\n" -"Nie ma efektu dla fraktali 3D.\n" -"Zakres w przybliżeniu -2 do 2." +"Wyłącznie dla Zbioru Julii: komponent W staÅ‚ej hiperzespolonej, która " +"determinuje ksztaÅ‚t Julii.\n" +"Nie ma wpÅ‚ywu na fraktale trójwymiarowe.\n" +"Zakres to w przybliżeniu -2 do 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only: X component of hypercomplex constant determining julia " "shape.\n" "Range roughly -2 to 2." msgstr "" -"Zbiór Julii tylko: X komponent staÅ‚ej hiperzespolonej liczby determinujÄ…cej " -"ksztaÅ‚t Julii.\n" -"Zakres w przybliżeniu -2 do 2." +"Wyłącznie dla Zbioru Julii: komponent X staÅ‚ej hiperzespolonej, która " +"determinuje ksztaÅ‚t Julii.\n" +"Zakres to w przybliżeniu -2 do 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only: Y component of hypercomplex constant determining julia " "shape.\n" "Range roughly -2 to 2." msgstr "" -"Zbiór Julii tylko: Y komponent staÅ‚ej hiperzespolonej liczby determinujÄ…cej " -"ksztaÅ‚t Julii.\n" -"Zakres w przybliżeniu -2 do 2." +"Wyłącznie dla Zbioru Julii: komponent Y staÅ‚ej hiperzespolonej, która " +"determinuje ksztaÅ‚t Julii.\n" +"Zakres to w przybliżeniu -2 do 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only: Z component of hypercomplex constant determining julia " "shape.\n" "Range roughly -2 to 2." msgstr "" -"Zbiór Julii tylko: Z komponent staÅ‚ej hiperzespolonej liczby determinujÄ…cej " -"ksztaÅ‚t Julii.\n" -"Zakres w przybliżeniu -2 do 2." +"Wyłącznie dla Zbioru Julii: komponent Z staÅ‚ej hiperzespolonej, która " +"determinuje ksztaÅ‚t Julii.\n" +"Zakres to w przybliżeniu -2 do 2." + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" #: src/settings_translation_file.cpp msgid "Jump key" msgstr "Skok" #: src/settings_translation_file.cpp -#, fuzzy msgid "Jumping speed" msgstr "Szybkość skoku" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for decreasing the viewing range.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2635,6 +3140,16 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klawisz zmniejszania gÅ‚oÅ›noÅ›ci.\n" +"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2644,7 +3159,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for increasing the viewing range.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2657,6 +3171,16 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klawisz zwiÄ™kszania gÅ‚oÅ›noÅ›ci.\n" +"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2666,7 +3190,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for moving fast in fast mode.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2677,7 +3200,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for moving the player backward.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2688,7 +3210,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for moving the player forward.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2699,7 +3220,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for moving the player left.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2710,7 +3230,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for moving the player right.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2723,6 +3242,16 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klawisz wyciszania gry.\n" +"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2732,7 +3261,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for opening the chat window to type commands.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2745,6 +3273,16 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klawisz otwierania okna czatu aby wpisać komendÄ™.\n" +"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2754,7 +3292,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for opening the inventory.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2765,7 +3302,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for printing debug stacks. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2778,6 +3314,27 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klawisz wyboru nastÄ™pnej pozycji na pasku akcji.\n" +"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klawisz wyboru poprzedniej pozycji na pasku akcji.\n" +"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2791,7 +3348,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for switching between first- and third-person camera.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2802,7 +3358,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for taking screenshots.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2824,7 +3379,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling cinematic mode.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2835,7 +3389,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling display of minimap.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2846,7 +3399,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling fast mode.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2857,7 +3409,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling flying.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2868,7 +3419,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling noclip mode.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2879,7 +3429,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the camera update. Only used for development\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2890,7 +3439,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of debug info.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2901,7 +3449,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of the HUD.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2912,7 +3459,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of the chat.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2923,7 +3469,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of the fog.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2936,6 +3481,16 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klawisz przełączania wyÅ›wietlania czatu.\n" +"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2945,7 +3500,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling unlimited view range.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2957,31 +3511,49 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klawisz wyÅ›wietlania zoom kiedy to możliwe.\n" +"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "Klawisz używany do wspinania" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Lake steepness" +msgstr "Stromość jeziora" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "Granica jeziora" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "JÄ™zyk" #: src/settings_translation_file.cpp -#, fuzzy msgid "Large cave depth" msgstr "Głębia dużej jaskini" #: src/settings_translation_file.cpp #, fuzzy +msgid "Large chat console key" +msgstr "Klawisz konsoli" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "FunkcjonalnoÅ›ci lawy" #: src/settings_translation_file.cpp -#, fuzzy msgid "Leaves style" msgstr "Styl liÅ›ci" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Leaves style:\n" "- Fancy: all faces visible\n" @@ -2998,7 +3570,6 @@ msgid "Left key" msgstr "W lewo" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of a server tick and the interval at which objects are generally " "updated over network." @@ -3007,16 +3578,15 @@ msgstr "" "aktualizowane przez sieć." #: src/settings_translation_file.cpp -#, fuzzy msgid "Length of time between ABM execution cycles" msgstr "DÅ‚ugość czasu pomiÄ™dzy wykonywanymi cyklami ABM" #: src/settings_translation_file.cpp -#, fuzzy msgid "Length of time between NodeTimer execution cycles" -msgstr "DÅ‚ugość czasu pomiÄ™dzy wykonywanymi cyklami NodeTimer." +msgstr "DÅ‚ugość czasu pomiÄ™dzy wykonywanymi cyklami NodeTimer" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Level of logging to be written to debug.txt:\n" "- <nothing> (no logging)\n" @@ -3027,6 +3597,14 @@ msgid "" "- info\n" "- verbose" msgstr "" +"Poziom logowania zapisywany do pliku debug.txt:\n" +"- <nic> (brak logowania)\n" +"- none (logi bez poziomu)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose" #: src/settings_translation_file.cpp #, fuzzy @@ -3040,12 +3618,25 @@ msgstr "Limit kolejek oczekujÄ…cych do wytworzenia" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" "- Downloads performed by main menu (e.g. mod manager).\n" "Only has an effect if compiled with cURL." msgstr "" +"Liczba limitu współbieżnych zapytaÅ„ HTTP. Dotyczy:\n" +"- Pobierania mediów jeżeli serwer używa opcji remote_media.\n" +"- Pobierania listy serwerów oraz rozgÅ‚oszeÅ„ serwera.\n" +"- PobieraÅ„ wykonywanych w menu głównym (np. mod manager).\n" +"DziaÅ‚a tylko jeżeli skompilowany z cURL." #: src/settings_translation_file.cpp #, fuzzy @@ -3062,7 +3653,6 @@ msgid "Liquid loop max" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid queue purge time" msgstr "Czas kolejki czyszczenia cieczy" @@ -3072,18 +3662,17 @@ msgid "Liquid sink" msgstr "Zanurzanie cieczy" #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid update interval in seconds." -msgstr "InterwaÅ‚ aktualizacji cieczy podany w sekundach" +msgstr "InterwaÅ‚ aktualizacji cieczy podany w sekundach." #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid update tick" msgstr "InterwaÅ‚ czasowy aktualizacji cieczy" #: src/settings_translation_file.cpp +#, fuzzy msgid "Load the game profiler" -msgstr "" +msgstr "Wczytaj profiler gry" #: src/settings_translation_file.cpp msgid "" @@ -3111,24 +3700,26 @@ msgid "Main menu script" msgstr "Skrypt głównego menu" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" -"Ustwa mgłę i kolor nieba zależny od pory dnia(Å›wit/zachód sÅ‚oÅ„ca) i pokaż " -"kierunek" +"Ustawia mgłę i kolor nieba zależny od pory dnia (Å›wit/zachód sÅ‚oÅ„ca) oraz " +"kierunku patrzenia." #: src/settings_translation_file.cpp -#, fuzzy msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "Sprawia, że DirectX dziaÅ‚a z LuaJIT. Wyłącz jeÅ›li wystÄ™pujÄ… kÅ‚opoty" +msgstr "Sprawia, że DirectX dziaÅ‚a z LuaJIT. Wyłącz jeÅ›li wystÄ™pujÄ… kÅ‚opoty." + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Map directory" msgstr "Katalog map" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen Valleys.\n" "'altitude_chill' makes higher elevations colder, which may cause biome " @@ -3140,6 +3731,13 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Atrybuty generacji mapy specyficzn dla Mapgen Valleys.\n" +"'altitude_chill' powoduje wyższe poziomy zimniejsze, może wpÅ‚ywać na biom.\n" +"'humid_rivers' modyfikuje wilgotność wokół rzek i w obszarach gdzie woda " +"tworzy zbiorniki,\n" +"może koidować z precyzyjnie ustawionymi biomami.\n" +"Flagi które nie sÄ… sprecyzowane ciÄ…gu flag nie bÄ™dÄ… modyfikowane domyÅ›lnie.\n" +"Flagi zaczynajÄ…ce siÄ™ od 'no' sÄ… używane aby je wyraźnie wyłączyć." #: src/settings_translation_file.cpp msgid "" @@ -3151,31 +3749,63 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Globalne wÅ‚aÅ›ciwoÅ›ci generowania map.\n" +"W generatorze map v6 flaga \"decorations\" kontroluje wszystkie dekoracje\n" +"z wyjÄ…tkiem drzew i trawy dżungli. we wszystkich innych generatorach flaga\n" +"ta kontroluje wszystkie dekoracje.\n" +"Flagi, które nie sÄ… wymienione w ciÄ…gu flagi nie sÄ… modyfikowane z " +"domyÅ›lnych.\n" +"Flagi rozpoczynajÄ…ce siÄ™ od \"no\" sÄ… stosowane aby jawnie jÄ… wyłączyć." + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Globalne wÅ‚aÅ›ciwoÅ›ci generowania map.\n" +"W generatorze map v6 flaga \"decorations\" kontroluje wszystkie dekoracje\n" +"z wyjÄ…tkiem drzew i trawy dżungli. we wszystkich innych generatorach flaga\n" +"ta kontroluje wszystkie dekoracje.\n" +"Flagi, które nie sÄ… wymienione w ciÄ…gu flagi nie sÄ… modyfikowane z " +"domyÅ›lnych.\n" +"Flagi rozpoczynajÄ…ce siÄ™ od \"no\" sÄ… stosowane aby jawnie jÄ… wyłączyć." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Globalne wÅ‚aÅ›ciwoÅ›ci generowania map.\n" +"W generatorze map v6 flaga \"decorations\" kontroluje wszystkie dekoracje\n" +"z wyjÄ…tkiem drzew i trawy dżungli. we wszystkich innych generatorach flaga\n" +"ta kontroluje wszystkie dekoracje.\n" +"Flagi, które nie sÄ… wymienione w ciÄ…gu flagi nie sÄ… modyfikowane z " +"domyÅ›lnych.\n" +"Flagi rozpoczynajÄ…ce siÄ™ od \"no\" sÄ… stosowane aby jawnie jÄ… wyłączyć." #: src/settings_translation_file.cpp -#, fuzzy msgid "Map generation limit" msgstr "Limit generacji mapy" #: src/settings_translation_file.cpp -#, fuzzy msgid "Map save interval" msgstr "InterwaÅ‚ zapisu mapy" @@ -3186,25 +3816,21 @@ msgstr "Limit bloków mapy" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapblock unload timeout" -msgstr "Przekroczenie czasu wyÅ‚adowania bloków mapy" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Generator mapy Valleys" +msgid "Mapblock mesh generation delay" +msgstr "Limit generacji mapy" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "" +#, fuzzy +msgid "Mapblock unload timeout" +msgstr "Przekroczenie czasu wyÅ‚adowania bloków mapy" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen biome humidity noise parameters" -msgstr "Wilgotność oraz parametry haÅ‚asu biomu Mapgen" +msgid "Mapgen Valleys" +msgstr "Generator mapy Valleys" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3219,123 +3845,15 @@ msgid "Mapgen flat" msgstr "Generator mapy flat" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Generator mapy flat szerokość jaskini" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "Generator mapy flat flagi" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "Generator mapy flat poziom ziemi" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen flat lake steepness" -msgstr "Generator mapy" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake threshold" -msgstr "Generator mapy" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" +msgid "Mapgen flat specific flags" +msgstr "Generator mapy flat flagi" #: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "Generator mapy fractal" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "Generator mapy fractal szerokość jaskini" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal fractal" -msgstr "Generator mapy" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "Generator mapy fractal iteracje" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal offset" -msgstr "Generator mapy" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "Generator mapy fractal skala" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal slice w" -msgstr "Generator mapy" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Nazwa generatora mapy" @@ -3344,144 +3862,27 @@ msgid "Mapgen v5" msgstr "Generator mapy v5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "Generator mapy v5 szerokość jaskini" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen v5 specific flags" +msgstr "Generator mapy flat flagi" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "Generator mapy v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen v6 specific flags" +msgstr "Generator mapy flat flagi" #: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "Generator mapy v7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "Generator mapy v7 szerokość jaskini" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen v7 specific flags" +msgstr "Generator mapy flat flagi" #: src/settings_translation_file.cpp msgid "Massive cave depth" @@ -3512,28 +3913,33 @@ msgid "Max. clearobjects extra blocks" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "Max. packets per iteration" -msgstr "" +msgstr "Max. pakietów na iteracjÄ™" #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum FPS" -msgstr "" +msgstr "Maksymalny FPS" #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum FPS when game is paused." -msgstr "" +msgstr "Maksymalny FPS gdy gra spauzowana." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum hotbar width" -msgstr "" +msgstr "Maksymalna dÅ‚ugość hotbar" #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum number of blocks that are simultaneously sent in total." -msgstr "" +msgstr "Maksymalna liczba bloków które sÄ… jednoczeÅ›nie przesyÅ‚ane w caÅ‚oÅ›ci." #: src/settings_translation_file.cpp #, fuzzy @@ -3541,49 +3947,68 @@ msgid "Maximum number of blocks that are simultaneously sent per client." msgstr "Jak dużo bloków może być przesyÅ‚anych jednoczeÅ›nie na jednego klienta." #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum number of blocks that can be queued for loading." msgstr "" +"Maksymalna liczba bloków, które mogÄ… być skolejkowane podczas wczytywania." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "Set to blank for an appropriate amount to be chosen automatically." msgstr "" +"Maksymalna liczba bloków do skolejkowana, które majÄ… być wygenerowane.\n" +"Pozostaw puste a odpowiednia liczba zostanie dobrana automatycznie." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "Set to blank for an appropriate amount to be chosen automatically." msgstr "" +"Maksymalna liczba bloków do skolejkowania które majÄ… być wczytane z pliku.\n" +"Pozostaw puste a odpowiednia liczba zostanie dobrana automatycznie." #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Maximum number of mapblocks for client to be kept in memory.\n" "Set to -1 for unlimited amount." msgstr "" +"Maksymalna liczba bloków mapy, które majÄ… być trzymane w pamiÄ™ci klienta.\n" +"Ustaw -1 dla nieskoÅ„czonej liczby." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Maximum number of packets sent per send step, if you have a slow connection\n" "try reducing it, but don't reduce it to a number below double of targeted\n" "client number." msgstr "" +"Maksymalna liczba pakietów przesyÅ‚anych podczas kroku, jeżeli masz wolne " +"łącze\n" +"spróbuj zredukować to, ale nie redukuj jej poniżej podwojonej liczby " +"klientów." #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum number of players that can connect simultaneously." -msgstr "" +msgstr "Maksymalna liczba graczy, która może siÄ™ jednoczeÅ›nie połączyć." #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum number of statically stored objects in a block." -msgstr "" +msgstr "Maksymalna liczba statycznie przechowywanych obiektów w bloku." #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum objects per block" -msgstr "" +msgstr "Maksymalna liczba obiektów na blok" #: src/settings_translation_file.cpp msgid "" @@ -3628,7 +4053,6 @@ msgid "Method used to highlight selected object." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimap" msgstr "Minimapa" @@ -3637,9 +4061,8 @@ msgid "Minimap key" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimap scan height" -msgstr "Wysokość skonowania minimapy" +msgstr "Wysokość skanowania minimapy" #: src/settings_translation_file.cpp msgid "Minimum texture size for filters" @@ -3650,6 +4073,10 @@ msgid "Mipmapping" msgstr "Mip-Mappowanie" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3662,38 +4089,45 @@ msgid "Modstore mods list URL" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Monospace font path" msgstr "Åšcieżka czcionki typu Monospace" #: src/settings_translation_file.cpp -#, fuzzy msgid "Monospace font size" msgstr "Rozmiar czcionki Monospace" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "CzuÅ‚ość myszy" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mouse sensitivity multiplier." msgstr "Mnożnik czuÅ‚oÅ›ci myszy." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "Klawisz użycia" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3712,7 +4146,6 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Network" msgstr "Sieć" @@ -3735,7 +4168,6 @@ msgid "Noclip key" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Node highlighting" msgstr "PodÅ›wietlanie bloków" @@ -3744,10 +4176,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp #, fuzzy msgid "Noises" msgstr "Szumy" @@ -3757,7 +4185,6 @@ msgid "Normalmaps sampling" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Normalmaps strength" msgstr "SiÅ‚a map normlanych" @@ -3782,11 +4209,18 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Number of parallax occlusion iterations." msgstr "Liczba iteracji dla parallax occlusion." #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3799,7 +4233,6 @@ msgid "Parallax occlusion" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Parallax occlusion Scale" msgstr "Skala parallax occlusion" @@ -3825,6 +4258,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Path to save screenshots at." +msgstr "Åšcieżka, pod którÄ… zapisywane sÄ… zrzuty ekranu." + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." msgstr "" #: src/settings_translation_file.cpp @@ -3843,16 +4282,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Player name" msgstr "Nazwa gracza" #: src/settings_translation_file.cpp msgid "Player transfer distance" -msgstr "" +msgstr "OdlegÅ‚ość przesyÅ‚ania graczy" #: src/settings_translation_file.cpp -#, fuzzy msgid "Player versus Player" msgstr "PvP" @@ -3901,7 +4338,6 @@ msgid "Raises terrain to make valleys around the rivers" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Random input" msgstr "Losowe wejÅ›cie" @@ -3914,7 +4350,6 @@ msgid "Remote media" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Remote port" msgstr "Port zdalny" @@ -3928,6 +4363,15 @@ msgid "Report path" msgstr "Åšcieżka czcionki" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ridge noise" +msgstr "Szum rzeki" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "W prawo" @@ -3936,17 +4380,14 @@ msgid "Rightclick repetition interval" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "River Depth" msgstr "Głębokość rzeki" #: src/settings_translation_file.cpp -#, fuzzy msgid "River Noise" msgstr "Szum rzeki" #: src/settings_translation_file.cpp -#, fuzzy msgid "River Size" msgstr "Rozmiar rzeki" @@ -3959,20 +4400,26 @@ msgid "Rollback recording" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Round minimap" msgstr "OkrÄ…gÅ‚a minimapa" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Saving map received from server" msgstr "Zapisz mapÄ™ otrzymanÄ… z serwera" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3982,12 +4429,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screen height" msgstr "Wysokość ekranu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screen width" msgstr "Szerokość ekranu" @@ -3996,7 +4441,6 @@ msgid "Screenshot" msgstr "Zrzut ekranu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screenshot folder" msgstr "Folder zrzutu ekranu" @@ -4017,6 +4461,14 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Seabed noise" +msgstr "Szum jaskini #1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "BezpieczeÅ„stwo" @@ -4061,6 +4513,10 @@ msgid "Server port" msgstr "Port Serwera" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "Lista publicznych serwerów" @@ -4093,13 +4549,23 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Shadery" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow limit" +msgstr "Limit bloków mapy" + +#: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." msgstr "" @@ -4122,10 +4588,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "PÅ‚ynne oÅ›wietlenie" @@ -4148,7 +4633,6 @@ msgid "Sneak key" msgstr "Skradanie" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sound" msgstr "DźwiÄ™k" @@ -4161,11 +4645,18 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Static spawnpoint" msgstr "Statyczny punkt spawnu" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -4186,10 +4677,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4204,6 +4715,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "Paczki tekstur" @@ -4223,8 +4738,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -4275,6 +4793,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -4317,6 +4839,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Filtrowanie trójliniowe" @@ -4332,10 +4858,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4400,6 +4944,43 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "Kontroluje stromość/wysokość gór." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4408,13 +4989,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4426,6 +5005,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4513,16 +5096,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4572,7 +5145,13 @@ msgid "Width of the selectionbox's lines around nodes." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." @@ -4591,7 +5170,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "Y górnego limitu preudolosowych jaskiÅ„." #: src/settings_translation_file.cpp -#, fuzzy +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "cURL przekroczono limit pobierania pliku" @@ -4603,6 +5217,98 @@ msgstr "" msgid "cURL timeout" msgstr "Limit czasu cURL" +#~ msgid "Hide mp content" +#~ msgstr "Ukryj zawartość paczki modów" + +#~ msgid "Start Game" +#~ msgstr "Rozpocznij grÄ™/Połącz" + +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "Caps Lock" + +#~ msgid "Comma" +#~ msgstr "Przecinek" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Final" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Minus" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Kropka" + +#~ msgid "Plus" +#~ msgstr "Plus" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Kontrola szerokoÅ›ci pustyni i plaż w generatorze map v6.\n" +#~ "Kiedy Å›nieżne biomy sÄ… włączone to 'mgv6_freq_desert' zostanie " +#~ "zignorowane." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Determinuje ksztaÅ‚t terenu.\n" +#~ "Trzy liczby w nawiasach kontrolujÄ… skalÄ™ terenu\n" +#~ "oraz powinny być identyczne." + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Generator mapy flat szerokość jaskini" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Generator mapy fractal szerokość jaskini" + +#, fuzzy +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Generator mapy" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Generator mapy fractal iteracje" + +#, fuzzy +#~ msgid "Mapgen fractal offset" +#~ msgstr "Generator mapy" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Generator mapy fractal skala" + +#, fuzzy +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Generator mapy" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Generator mapy v5 szerokość jaskini" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Generator mapy v7 szerokość jaskini" + #, fuzzy #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "Szczegółowe dane profilowania. Przydatne dla twórców modyfikacji." @@ -4642,9 +5348,6 @@ msgstr "Limit czasu cURL" #~ msgid "If enabled, " #~ msgstr "włączone" -#~ msgid "Game Name" -#~ msgstr "Nazwa Gry" - #~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\"" #~ msgstr "Gamemgr: Kopiowanie moda \"$1\" do gry \"$2\" nie powiodÅ‚o siÄ™" @@ -4700,10 +5403,6 @@ msgstr "Limit czasu cURL" #~ msgid "Add mod:" #~ msgstr "<<--Dodaj mod" -#, fuzzy -#~ msgid "Local install" -#~ msgstr "Instaluj" - #~ msgid "" #~ "Warning: Some mods are not configured yet.\n" #~ "They will be enabled by default when you save the configuration. " diff --git a/po/pt/minetest.po b/po/pt/minetest.po index cef144845..4d64d4516 100644 --- a/po/pt/minetest.po +++ b/po/pt/minetest.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-11-08 00:48+0000\n" -"Last-Translator: João Rodrigues <joaoadriano3@gmail.com>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-04-23 14:54+0000\n" +"Last-Translator: Mário <branco.ana8@gmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/minetest/" "minetest/pt/>\n" "Language: pt\n" @@ -17,7 +17,15 @@ 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 2.9\n" +"X-Generator: Weblate 2.14-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Renascer" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Morreste." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -77,12 +85,13 @@ msgstr "Nós suportamos as versões de protocolo entre $1 e $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Cancelar" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Depende de:" #: builtin/mainmenu/dlg_config_world.lua @@ -90,6 +99,11 @@ msgid "Disable MP" msgstr "Desativar MP (mod pack)" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Desativar MP (mod pack)" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Ativar MP (mod pack)" @@ -106,17 +120,13 @@ msgstr "" "caracteres [a-z0-9_] são permitidos." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Esconder Jogo" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Ocultar conteúdo do pacote" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -179,8 +189,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Tem a certeza que pretende eliminar \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Eliminar" @@ -196,7 +205,7 @@ msgstr "Modmgr: caminho para o mod inválido \"$1\"" msgid "Delete World \"$1\"?" msgstr "Eliminar mundo \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Aceitar" @@ -277,6 +286,11 @@ msgstr "Os valores possÃveis são: " msgid "Restore Default" msgstr "Restaurar valores por defeito" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Procurar" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Seleccionar diretório" @@ -286,11 +300,13 @@ msgid "Show technical names" msgstr "Mostrar nomes técnicos" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "O valor deve ser maior do que $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "O valor deve ser menor do que $1." #: builtin/mainmenu/modmgr.lua @@ -320,6 +336,10 @@ msgstr "" "Instalação de Mod: não foi possÃvel encontrar o nome adequado da pasta para " "o pacote de mods $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Fechar repositório" @@ -341,10 +361,6 @@ msgid "Rating" msgstr "Classificação" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Procurar" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Nome curto:" @@ -380,6 +396,71 @@ msgstr "Antigos Contribuidores" msgid "Previous Core Developers" msgstr "Desenvolvedores principais anteriores" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "Anunciar servidor" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Endereço de ligação" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Configurar" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Modo Criativo" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Ativar Dano" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Esconder Jogo" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Servidor" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Instalar" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nome/Senha" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Novo" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Nenhum mundo criado ou seleccionado!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Iniciar Jogo" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Porta" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Seleccionar Mundo:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Porta do servidor" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Mods Instalados:" @@ -389,6 +470,10 @@ msgid "Mod information:" msgstr "Informação do Mod:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Nenhuma descrição do Mod disponÃvel" @@ -408,95 +493,45 @@ msgstr "Desinstalar mod selecionado" msgid "Uninstall selected modpack" msgstr "Desinstalar pacote de mods selecionado" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Endereço / Porta" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Cliente" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Ligar" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Modo Criativo" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Dano ativado" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Rem. Favorito" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Favorito" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Nome / Senha" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP ativado" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Endereço de ligação" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Configurar" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Modo Criativo" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Ativar Dano" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Nome/Senha" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Novo" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Nenhum mundo criado ou seleccionado!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Porta" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Público" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Seleccionar Mundo:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Servidor" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Porta do servidor" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Iniciar Jogo" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP ativado" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -527,6 +562,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Tem a certeza que deseja reiniciar o seu mundo?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Filtro bilinear" @@ -603,6 +642,11 @@ msgid "Reset singleplayer world" msgstr "Reiniciar mundo singleplayer" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "Captura de ecrã" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Definições" @@ -666,14 +710,6 @@ msgstr "Principal" msgid "Start Singleplayer" msgstr "Iniciar Um Jogador" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Jogar" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Um Jogador" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Sem informações disponÃveis" @@ -735,6 +771,10 @@ msgid "Player name too long." msgstr "Nome de jogador demasiado longo." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "O caminho fornecido do mundo não existe: " @@ -751,6 +791,44 @@ msgstr "" "Consulte debug.txt para mais detalhes." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Endereço de ligação" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Modo Criativo" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Ativar dano" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Porta" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Público" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Nome do servidor" + +#: src/game.cpp msgid "Change Keys" msgstr "Mudar teclas" @@ -767,26 +845,22 @@ msgid "Continue" msgstr "Continuar" #: src/game.cpp -msgid "Creating client..." -msgstr "A criar cliente..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "A criar servidor..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Teclas por defeito:\n" "- WASD: andar\n" @@ -801,6 +875,14 @@ msgstr "" "- T: chat\n" #: src/game.cpp +msgid "Creating client..." +msgstr "A criar cliente..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "A criar servidor..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -837,6 +919,20 @@ msgid "Exit to OS" msgstr "Sair para o S.O" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Nome do Jogo" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "A criar servidor..." + +#: src/game.cpp msgid "Item definitions..." msgstr "Definições dos Itens..." @@ -857,24 +953,46 @@ msgid "Node definitions..." msgstr "A definir cubos..." #: src/game.cpp -msgid "Resolving address..." -msgstr "A resolver endereço..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Renascer" +msgid "On" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "Anunciar servidor" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "A resolver endereço..." #: src/game.cpp msgid "Shutting down..." msgstr "A desligar..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Um Jogador" + +#: src/game.cpp msgid "Sound Volume" msgstr "Volume do som" #: src/game.cpp -msgid "You died." -msgstr "Morreste." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -909,6 +1027,10 @@ msgid "Console" msgstr "Consola" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Carregue duas vezes em \"saltar\" para voar" @@ -921,6 +1043,11 @@ msgid "Forward" msgstr "Avançar" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Volume do som" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventário" @@ -940,6 +1067,24 @@ msgstr "Teclas. (Se este menu se estragar, remova as linhas do minetest.conf)" msgid "Left" msgstr "Esquerda" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Comandos do Chat" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Próximo" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Imprimir stacks" @@ -1017,38 +1162,22 @@ msgid "Apps" msgstr "Aplicações" #: src/keycode.cpp -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" msgstr "Voltar" #: src/keycode.cpp -msgid "Capital" -msgstr "Caps Lock" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Limpar" #: src/keycode.cpp -msgid "Comma" -msgstr "Virgula" - -#: src/keycode.cpp msgid "Control" msgstr "Control" #: src/keycode.cpp -msgid "Convert" -msgstr "Convert" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "Tecla CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Baixo" @@ -1057,26 +1186,15 @@ msgid "End" msgstr "Tecla End" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Apagar OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "ESC" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "Tecla ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Executar" #: src/keycode.cpp -msgid "Final" -msgstr "Tecla Final" - -#: src/keycode.cpp msgid "Help" msgstr "Ajuda" @@ -1085,20 +1203,33 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +#, fuzzy +msgid "IME Accept" +msgstr "Aceitar" #: src/keycode.cpp -msgid "Junja" -msgstr "Tecla Junja" +#, fuzzy +msgid "IME Convert" +msgstr "Convert" #: src/keycode.cpp -msgid "Kana" -msgstr "Tecla Kana" +#, fuzzy +msgid "IME Escape" +msgstr "ESC" #: src/keycode.cpp -msgid "Kanji" -msgstr "Tecla Kanji" +#, fuzzy +msgid "IME Mode Change" +msgstr "Tecla Mode Change" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "Nãoconverter" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1129,22 +1260,10 @@ msgid "Middle Button" msgstr "Roda do Rato" #: src/keycode.cpp -msgid "Minus" -msgstr "Menos" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Tecla Mode Change" - -#: src/keycode.cpp msgid "Next" msgstr "Próximo" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nãoconverter" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1161,6 +1280,11 @@ msgid "Numpad -" msgstr "Tecla numérica -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Tecla numérica *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Tecla numérica /" @@ -1209,20 +1333,12 @@ msgid "OEM Clear" msgstr "Limpar OEM" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pausa" #: src/keycode.cpp -msgid "Period" -msgstr "Ponto" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Mais" +msgid "Play" +msgstr "Jogar" #: src/keycode.cpp msgid "Print" @@ -1329,6 +1445,20 @@ msgid "3D mode" msgstr "Modo 3D" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1406,6 +1536,10 @@ msgstr "" "Note que o campo de endereço no menu principal sobrescreve esta configuração." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1414,8 +1548,10 @@ msgstr "" "para ecrãs 4K." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "Ajusta a codificação gama nas tabelas de luminosidade. Valores mais baixos " @@ -1444,6 +1580,12 @@ msgid "Amplifies the valleys" msgstr "Amplia os vales" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Filtro anisotrópico" @@ -1462,6 +1604,10 @@ msgstr "" "minetest.net." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "Aproxima escala (X,Y,Z) do fractal em cubos." @@ -1470,6 +1616,19 @@ msgid "Ask to reconnect after crash" msgstr "Pedir para reconectar após de bloqueio de sistema" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Informar automáticamente a lista de servidores." @@ -1494,6 +1653,14 @@ msgid "Basic Privileges" msgstr "Privilégios básicos" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Filtro bi-linear" @@ -1502,6 +1669,14 @@ msgid "Bind address" msgstr "Endereço de bind" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "Bits por pixel (profundidade de cor) no modo de ecrã inteiro." @@ -1530,6 +1705,11 @@ msgid "Camera update toggle key" msgstr "Tecla para ativar/desativar atualização da câmera" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "RuÃdo para cavernas #1" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "RuÃdo para cavernas #1" @@ -1542,6 +1722,35 @@ msgid "Cave width" msgstr "Largura da caverna" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "RuÃdo para cavernas #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "RuÃdo para cavernas #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "Largura da caverna" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "RuÃdo para cavernas #1" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Limite de lagos no gerador de mapa plano" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "Cavernas e túneis formam-se na interseção entre os dois ruÃdos" @@ -1616,10 +1825,19 @@ msgid "Clean transparent textures" msgstr "Limpar texturas transparentes" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Cliente" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Cliente e servidor" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Cliente" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Velocidade de escalada" @@ -1691,6 +1909,11 @@ msgid "Console color" msgstr "Cor da consola" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Tecla da consola" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Tecla da consola" @@ -1717,14 +1940,6 @@ msgstr "" "inalterado." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Controla o tamanho dos desertos e das praias no gerador de mapa v6.\n" -"Quando o bioma de neve está ativado 'mgv6_freq_desert' é ignorado." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Controla a inclinação/profundidade dos lagos." @@ -1733,6 +1948,12 @@ msgid "Controls steepness/height of hills." msgstr "Controla a inclinação/altura das colinas." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "Controla a largura dos túneis, um valor menor cria túneis maiores." @@ -1757,6 +1978,11 @@ msgstr "" "dificultar a mineração. Zero desativa-os por completo. (0-10)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Criar" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Opacidade do cursor" @@ -1793,6 +2019,10 @@ msgid "Debug log level" msgstr "NÃvel de log de depuração" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Intervalo de atualização do servidor" @@ -1833,6 +2063,41 @@ msgstr "" "Só tem efeito se compilado com cURL." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1847,6 +2112,16 @@ msgstr "" "ilimitado)." #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "Atraso no envio de blocos após construção" @@ -1879,18 +2154,23 @@ msgstr "" "de servidores." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "Dessincroniza animação de blocos" +msgid "Desert noise threshold" +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"Determina a forma do terreno\n" -"Os 3 números entre '[' e ']' controlam a escala do\n" -"terreno, os 3 números devem ser idênticos." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Dessincroniza animação de blocos" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Ativar Particulas" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1940,10 +2220,24 @@ msgid "Enable Joysticks" msgstr "Ativar Joysticks" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "Ativar VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Ativar segurança de extras" @@ -1990,6 +2284,17 @@ msgstr "" "(ex. texturas) quando se estiver a conectar ao servidor." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Enable view bobbing" +msgstr "Cair balançando" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2043,6 +2348,10 @@ msgstr "" "Requer sombreadores ativados." #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2067,7 +2376,12 @@ msgid "FSAA" msgstr "FSAA (Antialiasing de ecrã inteiro)" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Fall bobbing factor" msgstr "Cair balançando" #: src/settings_translation_file.cpp @@ -2141,6 +2455,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "Mapeamento de tom fÃlmico" @@ -2157,10 +2475,34 @@ msgid "Filtering" msgstr "Filtros" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "Semente aleatória do mapa fixa" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Tecla de voar" @@ -2173,6 +2515,10 @@ msgid "Fog" msgstr "Nevoeiro" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Tecla de ativar/desativar nevoeiro" @@ -2202,13 +2548,21 @@ msgstr "Tamanho da fonte" #: src/settings_translation_file.cpp msgid "Format of screenshots." -msgstr "" +msgstr "Formato das capturas de ecrã." #: src/settings_translation_file.cpp msgid "Forward key" msgstr "Tecla para avançar" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "Fontes FreeType" @@ -2292,10 +2646,19 @@ msgid "Gravity" msgstr "Gravidade" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "NÃvel do terreno para o gerador de mapa plano" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "Extras HTTP" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2322,22 +2685,58 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "RuÃdo para cavernas #1" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "Altura da janela inicial." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Tecla WINDOWS direita" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "Altitude das nuvens." #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "FPU de alta precisão" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Inclinação dos lagos no gerador de mapa plano" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Limite de lagos no gerador de mapa plano" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Página web do servidor, a ser exibido na lista de servidores." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Quão profundos são os rios" @@ -2355,12 +2754,27 @@ msgid "" "How much the server will wait before unloading unused mapblocks.\n" "Higher value is smoother, but will use more RAM." msgstr "" +"A quantidade que o servidor vai esperar antes de descarregar mapblocks não " +"utilizados.\n" +"Valor maior é mais suave, mas irá usar mais memoria RAM." #: src/settings_translation_file.cpp msgid "How wide to make rivers" msgstr "Quão largos são os rios" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2386,6 +2800,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2421,6 +2844,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "Se ativado, novos jogadores não podem entrar com uma senha vazia." #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2451,6 +2878,15 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Côr de fundo da consola de conversação (R,G,B)." #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Tecla da consola" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2493,6 +2929,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Tecla de inventário" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "Animações dos itens do inventário" @@ -2513,12 +2954,24 @@ msgid "Item entity TTL" msgstr "Tempo de vida de itens largados" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2569,6 +3022,22 @@ msgstr "" "Valor varia sensivelmente entre -2 e 2." #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Tecla de saltar" @@ -2584,6 +3053,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para mover o jogador para a esquerda.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2598,6 +3078,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para mover o jogador para a esquerda.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2646,6 +3137,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para mover o jogador para a esquerda.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2660,6 +3162,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para mover o jogador para a frente.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2684,6 +3197,28 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para mover o jogador para a esquerda.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para mover o jogador para a esquerda.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " @@ -2796,6 +3331,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para ativar/desativar a exibição de informações de depuração.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2810,10 +3356,31 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para mover o jogador para a esquerda.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Inclinação dos lagos no gerador de mapa plano" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Limite de lagos no gerador de mapa plano" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2822,6 +3389,11 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Tecla da consola" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "CaracterÃsticas da lava" @@ -2889,6 +3461,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2961,6 +3540,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2988,9 +3571,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2999,7 +3591,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3018,24 +3611,20 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Vales do mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +msgid "Mapgen Valleys" +msgstr "Vales do mapgen" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3050,119 +3639,15 @@ msgid "Mapgen flat" msgstr "Gerador de mapa plano" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Tamanho de cavernas lisas no Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" +#, fuzzy +msgid "Mapgen flat specific flags" msgstr "Flags do gerador de mapa plano" #: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "NÃvel do terreno para o gerador de mapa plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "Inclinação dos lagos no gerador de mapa plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "Limite de lagos no gerador de mapa plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "Gerador de mapa fractal" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "Tamanho da caverna mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "Parâmetros de ruÃdo caverna1 no gerador de mapa fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "Parâmetros de ruÃdo caverna2 no gerador de mapa fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" -"Parâmetros de ruÃdo da profundidade de enchimento no gerador de mapa fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "Fractal do gerador de mapa fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "Iterações no gerador de mapa fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "W do gerador de mapa fractal Julia" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "X do gerador de mapa fractal Julia" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "Y do gerador de mapa fractal Julia" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "Z do gerador de mapa fractal Julia" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "Deslocamento do gerador de mapa fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "Escala do gerador de mapa fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "Parâmetros de ruÃdo do fundo do mar no gerador de mapa fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "W do corte do gerador de mapa fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Nome do gerador de mapa" @@ -3171,144 +3656,27 @@ msgid "Mapgen v5" msgstr "Gerador de mapa V5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "Tamanho da Caverna no Mapgen v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen v5 specific flags" +msgstr "Flags do gerador de mapa plano" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "Gerador de mapa V6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen v6 specific flags" +msgstr "Flags do gerador de mapa plano" #: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "Gerador de mapa V7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "Tamanho da caverna no mapgen v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen v7 specific flags" +msgstr "Flags do gerador de mapa plano" #: src/settings_translation_file.cpp msgid "Massive cave depth" @@ -3474,6 +3842,10 @@ msgid "Mipmapping" msgstr "Mapeamento MIP" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3494,6 +3866,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3502,18 +3882,21 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "Tecla de usar" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3562,10 +3945,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3602,6 +3981,14 @@ msgid "Number of parallax occlusion iterations." msgstr "Número de iterações de oclusão de paralaxe." #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "Enviesamento do efeito de oclusão de paralaxe, normalmente escala/2." @@ -3642,6 +4029,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3737,6 +4130,14 @@ msgid "Report path" msgstr "Diretório para logs" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Tecla para a direita" @@ -3769,6 +4170,10 @@ msgid "Round minimap" msgstr "Mini-map redondo" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3777,6 +4182,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3822,6 +4231,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "RuÃdo para cavernas #1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3866,6 +4284,10 @@ msgid "Server port" msgstr "Porta do servidor" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL da lista de servidores" @@ -3900,10 +4322,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Sombras" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3930,10 +4361,29 @@ msgstr "" "Dimensão da parcela a ser gerada por mapgen, em mapblocks (16^3 cubos)." #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "Iluminação suave" @@ -3972,6 +4422,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -3992,10 +4450,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4010,6 +4488,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "Caminho para a pasta de texturas" @@ -4029,8 +4511,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -4081,6 +4566,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -4128,6 +4617,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Filtro tri-linear" @@ -4146,10 +4639,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "URL da lista de servidores exibida no separador multi-jogador." #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4214,6 +4725,43 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "Controla a inclinação/altura das colinas." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4222,13 +4770,12 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +#, fuzzy +msgid "View distance in nodes." msgstr "" "Distância de visualização, em cubos.\n" "MÃnimo é 20" @@ -4242,6 +4789,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4332,24 +4883,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" -"Limite da geração do mapa.\n" -"Note:\n" -"- Limitado a 31000 (valor superior não tem efeito)\n" -"- O gerador funciona em grupos de 80x80x80 cubos (5x5x5 MapBlocks).\n" -"- Esses grupos têm um deslocamento de -32, -32 cubos em relação à " -"origem.\n" -"- Apenas grupos dentro do limite definido por map_generation_limit são " -"gerados" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4408,6 +4941,13 @@ msgstr "Grossura das linhas de selecção à volta dos cubos." #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4421,6 +4961,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4432,6 +5008,135 @@ msgstr "" msgid "cURL timeout" msgstr "" +#~ msgid "Hide mp content" +#~ msgstr "Ocultar conteúdo do pacote" + +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "Caps Lock" + +#~ msgid "Comma" +#~ msgstr "Virgula" + +#~ msgid "CrSel" +#~ msgstr "Tecla CrSel" + +#~ msgid "ExSel" +#~ msgstr "Tecla ExSel" + +#~ msgid "Final" +#~ msgstr "Tecla Final" + +#~ msgid "Junja" +#~ msgstr "Tecla Junja" + +#~ msgid "Kana" +#~ msgstr "Tecla Kana" + +#~ msgid "Kanji" +#~ msgstr "Tecla Kanji" + +#~ msgid "Minus" +#~ msgstr "Menos" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Ponto" + +#~ msgid "Plus" +#~ msgstr "Mais" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Controla o tamanho dos desertos e das praias no gerador de mapa v6.\n" +#~ "Quando o bioma de neve está ativado 'mgv6_freq_desert' é ignorado." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Determina a forma do terreno\n" +#~ "Os 3 números entre '[' e ']' controlam a escala do\n" +#~ "terreno, os 3 números devem ser idênticos." + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Tamanho de cavernas lisas no Mapgen" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Tamanho da caverna mapgen" + +#~ msgid "Mapgen fractal cave1 noise parameters" +#~ msgstr "Parâmetros de ruÃdo caverna1 no gerador de mapa fractal" + +#~ msgid "Mapgen fractal cave2 noise parameters" +#~ msgstr "Parâmetros de ruÃdo caverna2 no gerador de mapa fractal" + +#~ msgid "Mapgen fractal filler depth noise parameters" +#~ msgstr "" +#~ "Parâmetros de ruÃdo da profundidade de enchimento no gerador de mapa " +#~ "fractal" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Fractal do gerador de mapa fractal" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Iterações no gerador de mapa fractal" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "W do gerador de mapa fractal Julia" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "X do gerador de mapa fractal Julia" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "Y do gerador de mapa fractal Julia" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "Z do gerador de mapa fractal Julia" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "Deslocamento do gerador de mapa fractal" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Escala do gerador de mapa fractal" + +#~ msgid "Mapgen fractal seabed noise parameters" +#~ msgstr "Parâmetros de ruÃdo do fundo do mar no gerador de mapa fractal" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "W do corte do gerador de mapa fractal" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Tamanho da Caverna no Mapgen v5" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Tamanho da caverna no mapgen v7" + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "Limite da geração do mapa.\n" +#~ "Note:\n" +#~ "- Limitado a 31000 (valor superior não tem efeito)\n" +#~ "- O gerador funciona em grupos de 80x80x80 cubos (5x5x5 MapBlocks).\n" +#~ "- Esses grupos têm um deslocamento de -32, -32 cubos em relação à " +#~ "origem.\n" +#~ "- Apenas grupos dentro do limite definido por map_generation_limit são " +#~ "gerados" + #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "" #~ "Dados de perfil detalhados do extra. Útil para desenvolvedores de extras." @@ -4462,9 +5167,6 @@ msgstr "" #~ msgid "If enabled, " #~ msgstr "ativo" -#~ msgid "Game Name" -#~ msgstr "Nome do Jogo" - #~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\"" #~ msgstr "" #~ "Mensagem de Jogo: ImpossÃvel fazer cópia do extra \"$1\" para o jogo " @@ -4522,10 +5224,6 @@ msgstr "" #~ msgid "Add mod:" #~ msgstr "<<-- Adicionar extra" -#, fuzzy -#~ msgid "Local install" -#~ msgstr "Instalar" - #~ msgid "" #~ "Warning: Some mods are not configured yet.\n" #~ "They will be enabled by default when you save the configuration. " diff --git a/po/pt_BR/minetest.po b/po/pt_BR/minetest.po index d759c87b4..845b9b174 100644 --- a/po/pt_BR/minetest.po +++ b/po/pt_BR/minetest.po @@ -7,17 +7,25 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-12-20 06:07+0000\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-03-23 18:38+0000\n" "Last-Translator: Cold Meson 06 <fernando.devmines@gmail.com>\n" -"Language-Team: Portuguese (Brazil) " -"<https://hosted.weblate.org/projects/minetest/minetest/pt_BR/>\n" +"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" +"minetest/minetest/pt_BR/>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 2.10\n" +"X-Generator: Weblate 2.12\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Reviver" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Você morreu." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -41,7 +49,7 @@ msgstr "Reconectar" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "O servidor solicitou uma reconexão:" +msgstr "O servidor solicitou uma nova conexão:" #: builtin/mainmenu/common.lua src/game.cpp msgid "Loading..." @@ -77,12 +85,13 @@ msgstr "Nós suportamos as versões de protocolo entre $1 e $2 ." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Cancelar" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Dependências:" #: builtin/mainmenu/dlg_config_world.lua @@ -90,6 +99,11 @@ msgid "Disable MP" msgstr "Desabilitar PMs" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Desabilitar PMs" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Habilitar MP" @@ -107,17 +121,13 @@ msgstr "" "permitidos." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Ocultar jogos" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Ocultar conteúdo PMs" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -182,8 +192,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Tem certeza que deseja excluir \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Excluir" @@ -199,7 +208,7 @@ msgstr "Modmgr: caminho inválido do módulo \"$1\"" msgid "Delete World \"$1\"?" msgstr "Excluir o mundo \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Aceitar" @@ -280,6 +289,11 @@ msgstr "Valores possÃveis são: " msgid "Restore Default" msgstr "Restaurar para o padrão" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Buscar" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Selecionar diretório" @@ -289,11 +303,13 @@ msgid "Show technical names" msgstr "Mostrar nomes técnicos" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "O valor deve ser maior que $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "O valor deve ser menor que $1." #: builtin/mainmenu/modmgr.lua @@ -323,6 +339,10 @@ msgstr "" "Instalação de módulo: não foi possÃvel encontrar o nome adequado da pasta " "para o pacote de módulos $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Fechar loja" @@ -344,10 +364,6 @@ msgid "Rating" msgstr "Classificação" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Buscar" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Nome curto:" @@ -383,6 +399,71 @@ msgstr "Colaboradores anteriores" msgid "Previous Core Developers" msgstr "Desenvolvedores principais anteriores" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "Anunciar servidor" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Endereço de Bind" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Configurar" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Modo criativo" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Habilitar dano" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Ocultar jogo" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Servidor" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Instalação local" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nome / Senha" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Novo" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Nenhum mundo criado ou selecionado!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Nome do Jogador" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Porta" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Selecione um mundo:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Porta do servidor" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Módulos instalados:" @@ -392,6 +473,10 @@ msgid "Mod information:" msgstr "Informação do módulo:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Nenhuma descrição do módulo disponÃvel" @@ -411,95 +496,46 @@ msgstr "Desinstalar o módulo selecionado" msgid "Uninstall selected modpack" msgstr "Desinstalar o pacote de módulos selecionado" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Endereço / Porta" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Cliente" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Conectar" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Modo criativo" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Dano habilitado" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Deletar Favorito" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Favoritos" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Nome / Senha" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP habilitado" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Endereço de Bind" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Configurar" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Modo criativo" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Habilitar dano" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Nome / Senha" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Novo" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Nenhum mundo criado ou selecionado!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Porta" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Público" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Selecione um mundo:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Servidor" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Porta do servidor" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Play Online" +msgstr "Nome do Jogador" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Iniciar o jogo" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP habilitado" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -530,6 +566,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Você tem certeza que deseja resetar seu mundo um-jogador?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Filtragem bi-linear" @@ -606,6 +646,11 @@ msgid "Reset singleplayer world" msgstr "Resetar mundo um-jogador" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "Captura de tela" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Configurações" @@ -669,14 +714,6 @@ msgstr "Principal" msgid "Start Singleplayer" msgstr "Iniciar Um jogador" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Jogar" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Um jogador" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Nenhuma informação disponÃvel" @@ -739,6 +776,10 @@ msgid "Player name too long." msgstr "Nome de jogador muito longo." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "O caminho do mundo providenciado não existe. " @@ -755,6 +796,44 @@ msgstr "" "Verifique o debug.txt para mais detalhes." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Endereço de Bind" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Modo criativo" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Dano" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Porta" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Público" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Nome do servidor" + +#: src/game.cpp msgid "Change Keys" msgstr "Mudar teclas" @@ -771,26 +850,22 @@ msgid "Continue" msgstr "Continuar" #: src/game.cpp -msgid "Creating client..." -msgstr "Criando o cliente..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Criando o servidor..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Controles padrão:\n" "- WASD: mover\n" @@ -805,6 +880,14 @@ msgstr "" "- T: bate-papo\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Criando o cliente..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Criando o servidor..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -841,6 +924,20 @@ msgid "Exit to OS" msgstr "Sair do Minetest" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Nome do jogo" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Criando o servidor..." + +#: src/game.cpp msgid "Item definitions..." msgstr "Carregando itens..." @@ -861,24 +958,46 @@ msgid "Node definitions..." msgstr "Carregando blocos..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Resolvendo os endereços..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Reviver" +msgid "On" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "Porta remota" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Resolvendo os endereços..." #: src/game.cpp msgid "Shutting down..." msgstr "Desligando tudo..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Um jogador" + +#: src/game.cpp msgid "Sound Volume" msgstr "Volume do som" #: src/game.cpp -msgid "You died." -msgstr "Você morreu." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -913,6 +1032,10 @@ msgid "Console" msgstr "Console" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "\"Pular\" duas vezes para ativar o voo" @@ -925,6 +1048,11 @@ msgid "Forward" msgstr "Avançar" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Volume do som" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventário" @@ -946,6 +1074,24 @@ msgstr "" msgid "Left" msgstr "Esquerda" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Comandos de Chat" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Page Down" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Impr. pilha (log)" @@ -1023,38 +1169,22 @@ msgid "Apps" msgstr "Aplicativos" #: src/keycode.cpp -msgid "Attn" -msgstr "ATTN" - -#: src/keycode.cpp msgid "Back" msgstr "Backspace" #: src/keycode.cpp -msgid "Capital" -msgstr "Caps Lock" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Limpar" #: src/keycode.cpp -msgid "Comma" -msgstr "VÃrgula" - -#: src/keycode.cpp msgid "Control" msgstr "Ctrl" #: src/keycode.cpp -msgid "Convert" -msgstr "Convert (tecla)" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel (tecla)" - -#: src/keycode.cpp msgid "Down" msgstr "Abaixo" @@ -1063,26 +1193,15 @@ msgid "End" msgstr "Tecla End" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Apagar OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Esc" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel (tecla)" - -#: src/keycode.cpp msgid "Execute" msgstr "Executar" #: src/keycode.cpp -msgid "Final" -msgstr "Final (tecla)" - -#: src/keycode.cpp msgid "Help" msgstr "Ajuda" @@ -1091,20 +1210,33 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +#, fuzzy +msgid "IME Accept" +msgstr "Aceitar" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja (tecla)" +#, fuzzy +msgid "IME Convert" +msgstr "Convert (tecla)" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana (tecla)" +#, fuzzy +msgid "IME Escape" +msgstr "Esc" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji (tecla)" +#, fuzzy +msgid "IME Mode Change" +msgstr "Mode Change (tecla)" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "Nonconvert (tecla)" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1135,22 +1267,10 @@ msgid "Middle Button" msgstr "Roda do mouse" #: src/keycode.cpp -msgid "Minus" -msgstr "Menos" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Mode Change (tecla)" - -#: src/keycode.cpp msgid "Next" msgstr "Page Down" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nonconvert (tecla)" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1167,6 +1287,11 @@ msgid "Numpad -" msgstr "Tecl.num.-" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Tecl.num.*" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Tecl.num./" @@ -1215,20 +1340,12 @@ msgid "OEM Clear" msgstr "Limpar OEM" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pause" #: src/keycode.cpp -msgid "Period" -msgstr "Ponto" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Mais" +msgid "Play" +msgstr "Jogar" #: src/keycode.cpp msgid "Print" @@ -1334,6 +1451,20 @@ msgid "3D mode" msgstr "modo 3D" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1411,6 +1542,10 @@ msgstr "" "Note que o campo de endereço no menu principal sobrescreve essa configuração." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1419,8 +1554,10 @@ msgstr "" "quem não usa X11/Android) Ex para telas 4K." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "Ajustar a gama de codificação para a tabela de claridade. Os números mais " @@ -1448,6 +1585,12 @@ msgid "Amplifies the valleys" msgstr "Amplia os vales" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Filtragem anisotrópica" @@ -1466,6 +1609,10 @@ msgstr "" "minetest.net." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "Aproxima os valores (X, Y, Z) de escala do fractal em blocos." @@ -1474,6 +1621,19 @@ msgid "Ask to reconnect after crash" msgstr "Peça para reconectar depois de queda" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Informar lista de servidores automaticamente." @@ -1498,6 +1658,14 @@ msgid "Basic Privileges" msgstr "Privilégios básicos" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Filtragem bi-linear" @@ -1506,6 +1674,16 @@ msgid "Bind address" msgstr "Endereço de bind" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome API temperature and humidity noise parameters" +msgstr "Parâmetros de ruido de umidade do gerador de mundo v6" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome noise" +msgstr "Ruido do Rio" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" "Bits por pixel (Também conhecido como profundidade de cor) no modo de tela " @@ -1516,7 +1694,6 @@ msgid "Build inside player" msgstr "Construir com o jogador dentro do bloco" #: src/settings_translation_file.cpp -#, fuzzy msgid "Builtin" msgstr "Embutido" @@ -1537,6 +1714,11 @@ msgid "Camera update toggle key" msgstr "Tecla para alternar atualização da câmera" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "RuÃdo nas cavernas #1" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "RuÃdo nas cavernas #1" @@ -1549,6 +1731,35 @@ msgid "Cave width" msgstr "Largura da caverna" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "RuÃdo nas cavernas #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "RuÃdo nas cavernas #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "Largura da caverna" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "RuÃdo nas cavernas #1" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Threshold das colinas no gerador de mundo plano" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" "Formação de cavernas e túneis na interseção entre dois ruÃdos diferentes" @@ -1624,10 +1835,19 @@ msgid "Clean transparent textures" msgstr "Texturas transparentes limpas" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Cliente" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Cliente e servidor" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Cliente" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Velocidade de subida (em escadas e outros)" @@ -1698,6 +1918,11 @@ msgid "Console color" msgstr "Cor do console" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Tecla do console" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Tecla do console" @@ -1724,15 +1949,6 @@ msgstr "" "inalterado." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Controla o tamanho dos desertos e das praias no Mapgen v6.\n" -"Quando \"snowbiomes\" (bioma de neve) está habilitado 'mgv6_freq_desert' é " -"ignorado." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Controla o esparsamento/profundidade dos lagos." @@ -1741,6 +1957,12 @@ msgid "Controls steepness/height of hills." msgstr "Controla o esparsamento/altura das colinas." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "Controla a largura dos túneis, um valor menor cria túneis mais largos." @@ -1765,6 +1987,11 @@ msgstr "" "Isso pode dificultar a mineração. Zero desabilita isso. (0-10)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Criar" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Alpha do cursor" @@ -1801,6 +2028,11 @@ msgid "Debug log level" msgstr "NÃvel de log do Debug" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "Tecla de comutação HUD" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Passo do servidor dedicado" @@ -1841,6 +2073,41 @@ msgstr "" "Só tem efeito se compilado com cURL." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1855,6 +2122,16 @@ msgstr "" "ilimitado)." #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "Atraso em enviar blocos depois da construção" @@ -1887,18 +2164,23 @@ msgstr "" "na lista de servidores." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "Dessincronizar animação do bloco" +msgid "Desert noise threshold" +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"Determina a forma do terreno\n" -"Os 3 números entre '[' e ']' controla a escala do\n" -"terreno, os 3 números devem ser idênticos." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Dessincronizar animação do bloco" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "PartÃculas" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1948,10 +2230,24 @@ msgid "Enable Joysticks" msgstr "Habilitar Joysticks" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "Habilitar VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Habilitar Mod Security (Segurança nos mods)" @@ -1998,6 +2294,19 @@ msgstr "" "servidor." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Enable view bobbing" +msgstr "Visualização de balanço" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Multiplicador para sacudir a exibição.\n" +"Por exemplo: 0 para não ver balançando; 1.0 para normal; 2.0 para duplo." + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2054,6 +2363,10 @@ msgstr "" "Requer shaders a serem ativados." #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Intervalo de exibição dos dados das analizes do motor" @@ -2074,11 +2387,17 @@ msgid "FPS in pause menu" msgstr "FPS no menu de pausa" #: src/settings_translation_file.cpp +#, fuzzy msgid "FSAA" msgstr "FSAA Antialiasing de tela cheia" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Fall bobbing factor" msgstr "Cair balançando" #: src/settings_translation_file.cpp @@ -2154,6 +2473,11 @@ msgid "Filler Depth" msgstr "Profundidade de enchimento" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Filler depth noise" +msgstr "Profundidade de enchimento" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "Filmic Tone Mapping" @@ -2174,10 +2498,35 @@ msgid "Filtering" msgstr "Filtros" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "Semente do mapa fixa" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Floatland level" +msgstr "NÃvel de água" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Tecla de voar" @@ -2190,6 +2539,10 @@ msgid "Fog" msgstr "Névoa" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Tecla de comutação de névoa" @@ -2226,6 +2579,14 @@ msgid "Forward key" msgstr "Tecla para frente" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "Fontes Freetype" @@ -2319,10 +2680,19 @@ msgid "Gravity" msgstr "Gravidade" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "NÃvel do terreno para o gerador de mundo plano" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "Modúlos HTTP" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Tecla de comutação HUD" @@ -2356,22 +2726,60 @@ msgstr "" "* Monitorar o amostrador que está sendo usado para atualizar as estatÃsticas." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat blend noise" +msgstr "Parâmetros de mistura de ruido do gerador de mundo \"heat\"" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "RuÃdo nas cavernas #1" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "Altura da janela inicial." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Windows direito" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "Altura em que as nuvens ficam aparecendo." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height select noise" +msgstr "Parâmetros de ruido de seleção de altura do gerador de mundo v6" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "FPU de alta precisão" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Esparsamento das colinas no gerador de mundo plano" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Threshold das colinas no gerador de mundo plano" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Pagina principal do servidor, a ser exibido na lista de servidores." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Quão profundo são os rios" @@ -2398,6 +2806,18 @@ msgid "How wide to make rivers" msgstr "Quão largos serão os rios" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "Protocolo IPv6" @@ -2427,6 +2847,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2468,6 +2897,11 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "Se habilitado, novos jogadores não podem entrar com uma senha vazia." #: src/settings_translation_file.cpp +#, fuzzy +msgid "If enabled, show the server status message on player connection." +msgstr "Mensagem do dia exibida aos jogadores ao conectar." + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2502,6 +2936,18 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Cor de fundo do Bate-papo no jogo (R,G,B)." #: src/settings_translation_file.cpp +#, fuzzy +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" +"Valor alfa do fundo do console do bate-papo no jogo (opacidade, entre 0 e " +"255)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Tecla do console" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2552,6 +2998,11 @@ msgid "Interval of sending time of day to clients." msgstr "Intervalo de envio de hora do dia para os clientes." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Inventário" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "Animações nos itens do inventário" @@ -2572,6 +3023,11 @@ msgid "Item entity TTL" msgstr "Entidade item TTL" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Iterations" +msgstr "Monitorização" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." @@ -2580,6 +3036,14 @@ msgstr "" "Controles da escala de detalhes." #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "Intervalo de repetição do botão do Joystick" @@ -2631,6 +3095,22 @@ msgstr "" "Intervalo rugoso entre -2 e 2." #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Tecla para Pular" @@ -2649,6 +3129,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para diminuir o alcance de visão.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2669,14 +3160,25 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para aumentar o alcance de visão.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Tecla para pular. \n" -"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" -"01735e3da1b0edf72eb3" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2685,8 +3187,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Tecla para mover-se rápido no modo rápido. \n" -"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" -"01735e3da1b0edf72eb3" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2729,6 +3231,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para pular. \n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2749,6 +3262,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para abrir a janela de bate-papo para digitar comandos.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2779,6 +3303,28 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para abrir o inventário.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para abrir o inventário.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " @@ -2819,8 +3365,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Tecla para ativar/desativar o modo auto acionamento.\n" -"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" -"01735e3da1b0edf72eb3" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2880,8 +3426,8 @@ msgid "" msgstr "" "Tecla para ativar/desativar a atualização da câmera. Usado somente para " "desenvolvimento\n" -"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" -"01735e3da1b0edf72eb3" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2924,6 +3470,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para ativar/desativar a exibição do bate-papo.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2945,10 +3502,31 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para pular. \n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "Tecla usada para descer/esgueirar" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Esparsamento de lagos no gerador de mundo plano" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Threshold dos lagos no gerador de mundo plano" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "Linguagem" @@ -2957,6 +3535,11 @@ msgid "Large cave depth" msgstr "Profundidade de cavernas grandes" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Tecla do console" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "Coisas relacionadas a Lava" @@ -3026,6 +3609,13 @@ msgstr "Limite de filas emerge para gerar" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -3109,6 +3699,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "Faz o DirectX trabalhar com LuaJIT. Desative se causa problemas." #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "Diretório do mapa" @@ -3124,8 +3718,8 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" -"Atributos para o gerador de mapas especÃfico para o gerador de mundo Valleys." -"\n" +"Atributos para o gerador de mapas especÃfico para o gerador de mundo " +"Valleys.\n" "'altitude_chill' faz elevações mais altas mais geladas, o que pode causar " "problemas em biomas.\n" "'humid_rivers' modifica a humidade ao redor de rios e em ares que a água " @@ -3151,10 +3745,26 @@ msgstr "" "Flags começando com \"no\" são usadas para desabilitá-las explicitamente." #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Atributos de geração de mapas especÃficos para o gerador de mundo v7.\n" +"A flag'ridges' controla os rios.\n" +"Flags que não estão especificadas na string da flag não são modificadas por " +"padrão.\n" +"Flags começando com \"no\" são usadas para desabilitá-las explicitamente." + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3167,9 +3777,11 @@ msgstr "" "Flags começando com \"no\" são usadas para desabilitá-las explicitamente." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3193,24 +3805,21 @@ msgid "Mapblock limit" msgstr "Limite de mapblock" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "Tempo limite de descarregamento do mapblock" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Vales do Mapgen" +#, fuzzy +msgid "Mapblock mesh generation delay" +msgstr "Limite de geração de mapa" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "Parâmetros de ruÃdo para o calor nos biomas" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "Parâmetros de ruÃdo de mistura de umidades nos biomas" +msgid "Mapblock unload timeout" +msgstr "Tempo limite de descarregamento do mapblock" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "Parâmetros de ruÃdo para umidade nos biomas" +msgid "Mapgen Valleys" +msgstr "Vales do Mapgen" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3225,122 +3834,15 @@ msgid "Mapgen flat" msgstr "Gerador de mundo plano" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Largura das cavernas no gerador de mundo plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "Parâmetros de ruido \"cave 1\" do gerador de mundo plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "Parâmetros de ruido \"cave2\" do gerador de mundo plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" -"Parâmetros de ruÃdo da profundidade de preenchimento plano do gerador de " -"mundo plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" +#, fuzzy +msgid "Mapgen flat specific flags" msgstr "Flags do gerador de mundo plano" #: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "NÃvel do terreno para o gerador de mundo plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "Esparsamento das colinas no gerador de mundo plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "Threshold das colinas no gerador de mundo plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "Esparsamento de lagos no gerador de mundo plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "Threshold dos lagos no gerador de mundo plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "Largura das cavernas grandes no gerador de mundo plano" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "Parâmetros de ruido de terreno do gerador de mundo plano" - -#: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "Gerador de mundo fractal" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "Largura das cavernas do gerador de mundo fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "Parâmetros de ruido \"cave1\" do gerador de mundo fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "Parâmetro de ruido do fractal do cave2 do gerador de mundo" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" -"Parâmetros de ruido da profundidade de preenchimento do gerador de mundo " -"fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "Fractal do gerador de mundo fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "Iterações gerador de mundo fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "Componente W do gerador de mundo fractal julia" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "Componente X do gerador de mundo fractal julia" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "Componente Y do gerador de mundo fractal julia" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "Componente Z do gerador de mundo fractal julia" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "Espacamento do gerador de mundo fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "Escala do gerador de mundo fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "Parâmetros de ruido do leito oceânico do gerador de mundo fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "Componente W da fatia do gerador de mundo fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "Parâmetros de mistura de ruido do gerador de mundo \"heat\"" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Nome do gerador de mundo" @@ -3349,148 +3851,29 @@ msgid "Mapgen v5" msgstr "Gerador de mundo v5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "Largura das cavernas no gerador de mundo v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "Parâmetros de ruido cave1 do gerador de mundo v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "Parâmetros de ruido cave2 do gerador de mundo v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "Parâmetros do fator de ruido do gerador de mundo v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" -"Parâmetros de ruido da profundidade de preenchimento do gerador de mundo v5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "Parâmetros de ruido de altura do gerador de mundo v5" +#, fuzzy +msgid "Mapgen v5 specific flags" +msgstr "Flags do gerador de mundo v6" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "Gerador de mundo v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "Parâmetros de ruido das macieiras no gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "Frequência de praia do Mapgen v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "Parâmetros de ruido das praias no gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "Parâmetros de ruido de bioma do gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "Parâmetros de ruido de caverna do gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "Frequência de deserto do gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" +#, fuzzy +msgid "Mapgen v6 specific flags" msgstr "Flags do gerador de mundo v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "Parâmetros de ruido de seleção de altura do gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "Parâmetros de ruido de umidade do gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "Parâmetros de ruido de lama do gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "Parâmetros de ruido de inclinação do gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "Parâmetros de ruido de altitude do terreno do gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "Parâmetros de ruido base do terreno do gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "Parâmetros de ruido das árvores no gerador de mundo v6" - -#: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "Gerador de mundo v7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "Largura das cavernas no gerador de mundo v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "Parâmetros de ruido cave1 do gerador de mundo v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "Parâmetros de ruido cave2 do gerador de mundo v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" -"Parâmetros de ruido da profundidade de preenchimento do gerador de mundo v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" +#, fuzzy +msgid "Mapgen v7 specific flags" msgstr "Flags do gerador de mundo v7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "Parâmetros de ruido da seleção de altura do gerador de mundo v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "Parâmetros ruido da altura de montagem do gerador de mundo v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "Parâmetros de ruido das montanha do gerador de mundo v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "Parâmetros de ruido de cume do gerador de mundo v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "Parâmetros de ruido de cume de água do gerador de mundo v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "Parâmetros de ruido de altitude do terreno do gerador de mundo v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "Parâmetros de ruido base do terreno do gerador de mundo v7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "Parâmetros de ruido de persistencia do terreno do gerador de mundo v7" - -#: src/settings_translation_file.cpp msgid "Massive cave depth" msgstr "Profundidade de caverna enorme" @@ -3674,6 +4057,10 @@ msgid "Mipmapping" msgstr "Mipmapping (filtro)" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "URL de detalhes da Modstore" @@ -3694,6 +4081,15 @@ msgid "Monospace font size" msgstr "Tamanho da fonte monoespaçada" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mountain height noise" +msgstr "Parâmetros ruido da altura de montagem do gerador de mundo v7" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "Sensibilidade do mouse" @@ -3702,6 +4098,10 @@ msgid "Mouse sensitivity multiplier." msgstr "Multiplicador de sensibilidade do mouse." #: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." @@ -3710,12 +4110,9 @@ msgstr "" "Por exemplo: 0 para não ver balançando; 1.0 para normal; 2.0 para duplo." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" -"Multiplicador para sacudir a exibição.\n" -"Por exemplo: 0 para não ver balançando; 1.0 para normal; 2.0 para duplo." +#, fuzzy +msgid "Mute key" +msgstr "press. uma tecla" #: src/settings_translation_file.cpp msgid "" @@ -3732,8 +4129,8 @@ msgid "" "When starting from the main menu, this is overridden." msgstr "" "Nome do jogador.\n" -"Quando executando um servidor, os clientes com este nome são administradores." -"\n" +"Quando executando um servidor, os clientes com este nome são " +"administradores.\n" "Quando iniciado pelo menu principal, este é substituido." #: src/settings_translation_file.cpp @@ -3776,11 +4173,6 @@ msgid "NodeTimer interval" msgstr "Intervalo de NodeTimer" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" -"Parâmetros de ruido para a API de temperatura, umidade e mistura de bioma." - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "Ruidos" @@ -3826,6 +4218,14 @@ msgid "Number of parallax occlusion iterations." msgstr "Número de iterações de oclusão de paralaxe." #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "Viés geral do efeito de oclusão de paralaxe, geralmente de escala/2." @@ -3866,6 +4266,12 @@ msgid "Path to save screenshots at." msgstr "Caminho para onde salvar screenshots." #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" "Caminho para o diretório de texturas. Todas as texturas são pesquisadas " @@ -3971,6 +4377,15 @@ msgid "Report path" msgstr "Diretorio de reporte" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ridge noise" +msgstr "Ruido do Rio" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Tecla direita" @@ -4003,6 +4418,10 @@ msgid "Round minimap" msgstr "Minimapa redondo" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "Salvar o mapa recebido pelo cliente no disco." @@ -4011,7 +4430,10 @@ msgid "Saving map received from server" msgstr "Salvado mapa recebido do servidor" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -4022,7 +4444,7 @@ msgstr "" "Escala de GUI por um valor especificado pelo usuário.\n" "Use um filtro nearest-neighbor-anti-alias para escala do GUI.\n" "Isso irá suavizar algumas das arestas e misturar pixels \n" -"quando a escalado baixo, ao custo de borrar alguns pixels de borda \n" +"quando a escala é reduzida, ao custo de borrar alguns pixels da borda \n" "quando as imagens são dimensionadas em tamanhos não-inteiros." #: src/settings_translation_file.cpp @@ -4060,6 +4482,15 @@ msgstr "" "Use 0 para qualidade padrão." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "RuÃdo nas cavernas #1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "Segurança" @@ -4104,6 +4535,10 @@ msgid "Server port" msgstr "Porta do servidor" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL da lista de servidores" @@ -4144,16 +4579,27 @@ msgstr "" "Requer sombreadores seres ativados." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Sombreadores" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" "Sombreadores permitem efeitos visuais avançados e podem aumentar a " "performance em algumas placas de vÃdeo.\n" "Só funcionam com o backend de vÃdeo OpenGL." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow limit" +msgstr "Limite de mapblock" + +#: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." msgstr "Forma do minimapa. Ativado = redondo, Desativado = quadrado." @@ -4178,10 +4624,29 @@ msgstr "" "mapblocks (16 nodes)." #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "Inclinação e preenchimento trabalham juntos para modificar as alturas" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "Iluminação suave" @@ -4217,8 +4682,8 @@ msgid "" "(obviously, remote_media should end with a slash).\n" "Files that are not present will be fetched the usual way." msgstr "" -"Especifica a URL no qual os clientes buscam a mÃdia ao em vez de usar o UDP." -"\n" +"Especifica a URL no qual os clientes buscam a mÃdia ao em vez de usar o " +"UDP.\n" "$filename deve ser acessÃvel a partir de $remote_media$filename via cURL \n" "(obviamente, remote_media deve terminar com uma barra \"/\").\n" "Arquivos que não estão presentes serão obtidos da maneira usual por UDP." @@ -4228,6 +4693,14 @@ msgid "Static spawnpoint" msgstr "Ponto de spawn estático" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "Intensidade de normalmaps gerados." @@ -4248,10 +4721,33 @@ msgid "Synchronous SQLite" msgstr "SQLite sÃncrono" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "Altura do terreno" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain base noise" +msgstr "Altura do terreno" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain higher noise" +msgstr "Altura do terreno" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain noise" +msgstr "Altura do terreno" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4272,6 +4768,10 @@ msgstr "" "Ajuste no sentido 0,0 para uma proporção maior." #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "Diretorio da textura" @@ -4292,14 +4792,18 @@ msgid "The depth of dirt or other filler" msgstr "A profundidade de terra ou outro enchimento" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." msgstr "" "O caminho de arquivo relativo ao sua pasta do mundo no qual as analises " "serão salvas.\n" #: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp msgid "The network interface that the server listens on." msgstr "A interface de rede no qual o servidor escuta (aguarda conexão)." @@ -4344,8 +4848,8 @@ msgid "" "capacity until an attempt is made to decrease its size by dumping old queue\n" "items. A value of 0 disables the functionality." msgstr "" -"O tempo (em segundos) que a fila de lÃquidos pode crescer além da capacidade " -"\n" +"O tempo (em segundos) que a fila de lÃquidos pode crescer além da " +"capacidade \n" "de processamento até que é feita uma tentativa para diminuir o seu tamanho " "pelo despejo \n" "de antigas filas de itens. Um valor 0 desativa a funcionalidade." @@ -4367,6 +4871,10 @@ msgstr "" "direito do mouse." #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "Esta fonte será usada para determinados idiomas." @@ -4417,6 +4925,10 @@ msgid "Tooltip delay" msgstr "Atraso de dica de ferramenta" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Filtragem tri-linear" @@ -4435,10 +4947,28 @@ msgid "Trusted mods" msgstr "Modulos confiáveis" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "URL para a lista de servidores exibida na guia Multiplayer." #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "Distância de transferência do jogador ilimitada" @@ -4505,6 +5035,43 @@ msgid "Valleys C Flags" msgstr "Flags C de vales" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "Controla o esparsamento/altura das colinas." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "Sincronização vertical da tela." @@ -4513,13 +5080,13 @@ msgid "Video driver" msgstr "Driver de vÃdeo" #: src/settings_translation_file.cpp -msgid "View bobbing" +#, fuzzy +msgid "View bobbing factor" msgstr "Visualização de balanço" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +#, fuzzy +msgid "View distance in nodes." msgstr "" "Distância de visão (em nós).\n" "Minimo = 20" @@ -4533,6 +5100,10 @@ msgid "View range increase key" msgstr "Tecla de aumento do intervalo de exibição" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "Intervalo de visualização" @@ -4635,29 +5206,12 @@ msgstr "" "de nearest-neighbor para preservar os pixels nÃtidos. Isto define o tamanho\n" "mÃnimo da textura para as texturas melhoradas; valores mais altos parecem\n" "mais nÃtidas, mas requerem mais memória. Poências de 2 são recomendadas.\n" -"Essa configuração superior a 1 não pode ter um efeito visÃvel, a menos que a " -"\n" +"Essa configuração superior a 1 não pode ter um efeito visÃvel, a menos que " +"a \n" "filtragem bilineares/trilinear/anisotrópica estejam habilitadas." #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" -"Limite de geração de mapa.\n" -"Note:\n" -"- Limitado a 31000 (valores superiores não têm efeito)\n" -"- O gerador funciona em grupos de 80x80x80 cubos (5x5x5 MapBlocks)\n" -"- Esses grupos têm um deslocamento de -32, -32 nodes em relação à " -"origem.\n" -"- Apenas grupos dentro do limite definido map_gerenation_limit são gerados" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" "Se forem utilizadas fontes freetype, requer suporte a freetype para ser " @@ -4725,6 +5279,13 @@ msgstr "Largura das linhas do bloco de seleção em torno de nodes." #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4740,6 +5301,43 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "Y de limite superior de grandes números pseudoaleatórios de cavernas." #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "block send optimize distance" +msgstr "Distância máxima de envio de bloco" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "Tempo limite de download de arquivo via cURL" @@ -4751,6 +5349,253 @@ msgstr "limite paralelo de cURL" msgid "cURL timeout" msgstr "Tempo limite de cURL" +#~ msgid "Hide mp content" +#~ msgstr "Ocultar conteúdo PMs" + +#~ msgid "Start Game" +#~ msgstr "Iniciar o jogo" + +#~ msgid "Attn" +#~ msgstr "ATTN" + +#~ msgid "Capital" +#~ msgstr "Caps Lock" + +#~ msgid "Comma" +#~ msgstr "VÃrgula" + +#~ msgid "CrSel" +#~ msgstr "CrSel (tecla)" + +#~ msgid "ExSel" +#~ msgstr "ExSel (tecla)" + +#~ msgid "Final" +#~ msgstr "Final (tecla)" + +#~ msgid "Junja" +#~ msgstr "Junja (tecla)" + +#~ msgid "Kana" +#~ msgstr "Kana (tecla)" + +#~ msgid "Kanji" +#~ msgstr "Kanji (tecla)" + +#~ msgid "Minus" +#~ msgstr "Menos" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Ponto" + +#~ msgid "Plus" +#~ msgstr "Mais" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Controla o tamanho dos desertos e das praias no Mapgen v6.\n" +#~ "Quando \"snowbiomes\" (bioma de neve) está habilitado 'mgv6_freq_desert' " +#~ "é ignorado." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Determina a forma do terreno\n" +#~ "Os 3 números entre '[' e ']' controla a escala do\n" +#~ "terreno, os 3 números devem ser idênticos." + +#~ msgid "Mapgen biome heat noise parameters" +#~ msgstr "Parâmetros de ruÃdo para o calor nos biomas" + +#~ msgid "Mapgen biome humidity blend noise parameters" +#~ msgstr "Parâmetros de ruÃdo de mistura de umidades nos biomas" + +#~ msgid "Mapgen biome humidity noise parameters" +#~ msgstr "Parâmetros de ruÃdo para umidade nos biomas" + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Largura das cavernas no gerador de mundo plano" + +#~ msgid "Mapgen flat cave1 noise parameters" +#~ msgstr "Parâmetros de ruido \"cave 1\" do gerador de mundo plano" + +#~ msgid "Mapgen flat cave2 noise parameters" +#~ msgstr "Parâmetros de ruido \"cave2\" do gerador de mundo plano" + +#~ msgid "Mapgen flat filler depth noise parameters" +#~ msgstr "" +#~ "Parâmetros de ruÃdo da profundidade de preenchimento plano do gerador de " +#~ "mundo plano" + +#~ msgid "Mapgen flat large cave depth" +#~ msgstr "Largura das cavernas grandes no gerador de mundo plano" + +#~ msgid "Mapgen flat terrain noise parameters" +#~ msgstr "Parâmetros de ruido de terreno do gerador de mundo plano" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Largura das cavernas do gerador de mundo fractal" + +#~ msgid "Mapgen fractal cave1 noise parameters" +#~ msgstr "Parâmetros de ruido \"cave1\" do gerador de mundo fractal" + +#~ msgid "Mapgen fractal cave2 noise parameters" +#~ msgstr "Parâmetro de ruido do fractal do cave2 do gerador de mundo" + +#~ msgid "Mapgen fractal filler depth noise parameters" +#~ msgstr "" +#~ "Parâmetros de ruido da profundidade de preenchimento do gerador de mundo " +#~ "fractal" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Fractal do gerador de mundo fractal" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Iterações gerador de mundo fractal" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "Componente W do gerador de mundo fractal julia" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "Componente X do gerador de mundo fractal julia" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "Componente Y do gerador de mundo fractal julia" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "Componente Z do gerador de mundo fractal julia" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "Espacamento do gerador de mundo fractal" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Escala do gerador de mundo fractal" + +#~ msgid "Mapgen fractal seabed noise parameters" +#~ msgstr "Parâmetros de ruido do leito oceânico do gerador de mundo fractal" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Componente W da fatia do gerador de mundo fractal" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Largura das cavernas no gerador de mundo v5" + +#~ msgid "Mapgen v5 cave1 noise parameters" +#~ msgstr "Parâmetros de ruido cave1 do gerador de mundo v5" + +#~ msgid "Mapgen v5 cave2 noise parameters" +#~ msgstr "Parâmetros de ruido cave2 do gerador de mundo v5" + +#~ msgid "Mapgen v5 factor noise parameters" +#~ msgstr "Parâmetros do fator de ruido do gerador de mundo v5" + +#~ msgid "Mapgen v5 filler depth noise parameters" +#~ msgstr "" +#~ "Parâmetros de ruido da profundidade de preenchimento do gerador de mundo " +#~ "v5" + +#~ msgid "Mapgen v5 height noise parameters" +#~ msgstr "Parâmetros de ruido de altura do gerador de mundo v5" + +#~ msgid "Mapgen v6 apple trees noise parameters" +#~ msgstr "Parâmetros de ruido das macieiras no gerador de mundo v6" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "Frequência de praia do Mapgen v6" + +#~ msgid "Mapgen v6 beach noise parameters" +#~ msgstr "Parâmetros de ruido das praias no gerador de mundo v6" + +#~ msgid "Mapgen v6 biome noise parameters" +#~ msgstr "Parâmetros de ruido de bioma do gerador de mundo v6" + +#~ msgid "Mapgen v6 cave noise parameters" +#~ msgstr "Parâmetros de ruido de caverna do gerador de mundo v6" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "Frequência de deserto do gerador de mundo v6" + +#~ msgid "Mapgen v6 mud noise parameters" +#~ msgstr "Parâmetros de ruido de lama do gerador de mundo v6" + +#~ msgid "Mapgen v6 steepness noise parameters" +#~ msgstr "Parâmetros de ruido de inclinação do gerador de mundo v6" + +#~ msgid "Mapgen v6 terrain altitude noise parameters" +#~ msgstr "Parâmetros de ruido de altitude do terreno do gerador de mundo v6" + +#~ msgid "Mapgen v6 terrain base noise parameters" +#~ msgstr "Parâmetros de ruido base do terreno do gerador de mundo v6" + +#~ msgid "Mapgen v6 trees noise parameters" +#~ msgstr "Parâmetros de ruido das árvores no gerador de mundo v6" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Largura das cavernas no gerador de mundo v7" + +#~ msgid "Mapgen v7 cave1 noise parameters" +#~ msgstr "Parâmetros de ruido cave1 do gerador de mundo v7" + +#~ msgid "Mapgen v7 cave2 noise parameters" +#~ msgstr "Parâmetros de ruido cave2 do gerador de mundo v7" + +#~ msgid "Mapgen v7 filler depth noise parameters" +#~ msgstr "" +#~ "Parâmetros de ruido da profundidade de preenchimento do gerador de mundo " +#~ "v7" + +#~ msgid "Mapgen v7 height select noise parameters" +#~ msgstr "Parâmetros de ruido da seleção de altura do gerador de mundo v7" + +#~ msgid "Mapgen v7 mountain noise parameters" +#~ msgstr "Parâmetros de ruido das montanha do gerador de mundo v7" + +#~ msgid "Mapgen v7 ridge noise parameters" +#~ msgstr "Parâmetros de ruido de cume do gerador de mundo v7" + +#~ msgid "Mapgen v7 ridge water noise parameters" +#~ msgstr "Parâmetros de ruido de cume de água do gerador de mundo v7" + +#~ msgid "Mapgen v7 terrain altitude noise parameters" +#~ msgstr "Parâmetros de ruido de altitude do terreno do gerador de mundo v7" + +#~ msgid "Mapgen v7 terrain base noise parameters" +#~ msgstr "Parâmetros de ruido base do terreno do gerador de mundo v7" + +#~ msgid "Mapgen v7 terrain persistation noise parameters" +#~ msgstr "" +#~ "Parâmetros de ruido de persistencia do terreno do gerador de mundo v7" + +#~ msgid "" +#~ "Noise parameters for biome API temperature, humidity and biome blend." +#~ msgstr "" +#~ "Parâmetros de ruido para a API de temperatura, umidade e mistura de bioma." + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "Limite de geração de mapa.\n" +#~ "Note:\n" +#~ "- Limitado a 31000 (valores superiores não têm efeito)\n" +#~ "- O gerador funciona em grupos de 80x80x80 cubos (5x5x5 MapBlocks)\n" +#~ "- Esses grupos têm um deslocamento de -32, -32 nodes em relação à " +#~ "origem.\n" +#~ "- Apenas grupos dentro do limite definido map_gerenation_limit são " +#~ "gerados" + #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "" #~ "Dados detalhados do perfil do mod . Útil para desenvolvedores de mods." @@ -4812,9 +5657,6 @@ msgstr "Tempo limite de cURL" #~ msgid "If enabled, " #~ msgstr "habilitado" -#~ msgid "Game Name" -#~ msgstr "Nome do jogo" - #~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\"" #~ msgstr "Gamemgr: Não foi possÃvel copiar o mod \"$1\" para o jogo \"$2\"" @@ -4869,9 +5711,6 @@ msgstr "Tempo limite de cURL" #~ msgid "Add mod:" #~ msgstr "Adicionar módulo:" -#~ msgid "Local install" -#~ msgstr "Instalação local" - #~ msgid "" #~ "Warning: Some mods are not configured yet.\n" #~ "They will be enabled by default when you save the configuration. " diff --git a/po/ro/minetest.po b/po/ro/minetest.po index a9efb035f..42f597b1e 100644 --- a/po/ro/minetest.po +++ b/po/ro/minetest.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: 2016-03-17 15:28+0000\n" "Last-Translator: Lordmusic Player <lordmusicplro1@gmail.com>\n" "Language-Team: Romanian <https://hosted.weblate.org/projects/minetest/" @@ -20,6 +20,14 @@ msgstr "" "20)) ? 1 : 2;\n" "X-Generator: Weblate 2.5\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Reînviere" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Ai murit." + #: builtin/fstk/ui.lua #, fuzzy msgid "An error occured in a Lua script, such as a mod:" @@ -79,12 +87,13 @@ msgstr "" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Anulează" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "DependinÈ›e:" #: builtin/mainmenu/dlg_config_world.lua @@ -92,6 +101,11 @@ msgid "Disable MP" msgstr "Dezactivează MP" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Dezactivează MP" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Activează MP" @@ -106,17 +120,13 @@ msgid "" msgstr "" #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Ascunde Joc" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Ascunde conÈ›inutul mp" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -179,8 +189,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "EÈ™ti sigur că vrei să È™tergi \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Șterge" @@ -196,7 +205,7 @@ msgstr "Modmgr: Pacht de mod invalid \"$1\"" msgid "Delete World \"$1\"?" msgstr "Ștergi lumea \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Acceptă" @@ -276,6 +285,11 @@ msgstr "" msgid "Restore Default" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy msgid "Select path" @@ -286,11 +300,11 @@ msgid "Show technical names" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +msgid "The value must be at least $1." msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +msgid "The value must not be larger than $1." msgstr "" #: builtin/mainmenu/modmgr.lua @@ -320,6 +334,10 @@ msgstr "" "Instalare Mod: nu se poate găsi nume de folder potrivit pentru pachetul de " "mod $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "" @@ -341,10 +359,6 @@ msgid "Rating" msgstr "Notă" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "" - -#: builtin/mainmenu/store.lua #, fuzzy msgid "Shortname:" msgstr "Numele lumii" @@ -382,6 +396,71 @@ msgstr "FoÈ™ti contribuitori" msgid "Previous Core Developers" msgstr "Dezvoltatori de bază" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Configurează" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Modul Creativ" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Activează Daune" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Ascunde Joc" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Server" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Instalare locală" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Nume/Parolă" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Nou" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "No world created or selected!" +msgstr "Jocul nu are nume, sau nu ai selectat un joc" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "ÃŽncepe jocul" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Selectează lumea:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Port server" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Moduri Instalate:" @@ -391,6 +470,10 @@ msgid "Mod information:" msgstr "InformaÈ›ii mod:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Nici o descriere de mod disponibilă" @@ -410,103 +493,52 @@ msgstr "DezinstalaÅ£i modul selectat" msgid "Uninstall selected modpack" msgstr "DezinstalaÅ£i Pachetul de moduri selectat" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Address / Port" msgstr "Adresă/Port" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Client" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Conectează" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Creative mode" msgstr "Modul Creativ" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Damage enabled" msgstr "activat" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Del. Favorite" msgstr "Preferate:" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Favorite" msgstr "Preferate:" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy msgid "Name / Password" msgstr "Nume/Parolă" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "PvP enabled" -msgstr "activat" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" msgstr "" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Configurează" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Modul Creativ" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Activează Daune" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Nume/Parolă" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Nou" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#, fuzzy -msgid "No world created or selected!" -msgstr "Jocul nu are nume, sau nu ai selectat un joc" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Public" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Selectează lumea:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Server" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Port server" - -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "ÃŽncepe jocul" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#, fuzzy +msgid "PvP enabled" +msgstr "activat" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -540,6 +572,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Singleplayer" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Bilinear Filter" msgstr "Filtrare Biliniară" @@ -629,6 +665,11 @@ msgid "Reset singleplayer world" msgstr "Singleplayer" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "PrintScreen" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Setări" @@ -702,14 +743,6 @@ msgstr "Meniul Principal" msgid "Start Singleplayer" msgstr "Singleplayer" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Joacă" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Singleplayer" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Nici o informaÈ›ie disponibilă" @@ -775,6 +808,10 @@ msgid "Player name too long." msgstr "" #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "" @@ -792,6 +829,43 @@ msgstr "" #: src/game.cpp #, fuzzy +msgid "- Address: " +msgstr "Adresă/Port" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Modul Creativ" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Activează Daune" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +msgid "- Port: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Public" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Server" + +#: src/game.cpp +#, fuzzy msgid "Change Keys" msgstr "Modifică tastele" @@ -808,27 +882,22 @@ msgid "Continue" msgstr "Continuă" #: src/game.cpp -msgid "Creating client..." -msgstr "Se creează clientul..." - -#: src/game.cpp -#, fuzzy -msgid "Creating server..." -msgstr "Se crează serverul..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Controale prestabilite:\n" "- WASD: miÈ™care\n" @@ -843,6 +912,15 @@ msgstr "" "- T: chat\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Se creează clientul..." + +#: src/game.cpp +#, fuzzy +msgid "Creating server..." +msgstr "Se crează serverul..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -867,6 +945,20 @@ msgid "Exit to OS" msgstr "IeÈ™i din joc" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Numele jocului" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Se crează serverul..." + +#: src/game.cpp msgid "Item definitions..." msgstr "DefiniÈ›iile obiectelor..." @@ -887,12 +979,20 @@ msgid "Node definitions..." msgstr "DefiniÈ›iile Blocurilor..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Se rezolvă adresa..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Reînviere" +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Se rezolvă adresa..." #: src/game.cpp #, fuzzy @@ -900,12 +1000,25 @@ msgid "Shutting down..." msgstr "Se închide..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Singleplayer" + +#: src/game.cpp msgid "Sound Volume" msgstr "Volum Sunet" #: src/game.cpp -msgid "You died." -msgstr "Ai murit." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -940,6 +1053,10 @@ msgid "Console" msgstr "Consloă" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Apasă de 2 ori \"sari\" pentru a zbura" @@ -952,6 +1069,11 @@ msgid "Forward" msgstr "ÃŽnainte" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Volum Sunet" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Inventar" @@ -972,6 +1094,24 @@ msgstr "" msgid "Left" msgstr "Stânga" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Comandă" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Următorul" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Salvează logurile" @@ -1050,38 +1190,22 @@ msgid "Apps" msgstr "AplicaÈ›ii" #: src/keycode.cpp -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" msgstr "ÃŽnapoi" #: src/keycode.cpp -msgid "Capital" -msgstr "Capital" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Șterge" #: src/keycode.cpp -msgid "Comma" -msgstr "Virgulă" - -#: src/keycode.cpp msgid "Control" msgstr "Control" #: src/keycode.cpp -msgid "Convert" -msgstr "Convert" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Jos" @@ -1090,26 +1214,15 @@ msgid "End" msgstr "End" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Ștergere OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Escape" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Execută" #: src/keycode.cpp -msgid "Final" -msgstr "Final" - -#: src/keycode.cpp msgid "Help" msgstr "Ajutor" @@ -1118,20 +1231,33 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +#, fuzzy +msgid "IME Accept" +msgstr "Acceptă" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Convert" +msgstr "Convert" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +#, fuzzy +msgid "IME Escape" +msgstr "Escape" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Mode Change" +msgstr "Schimbă modul" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +#, fuzzy +msgid "IME Nonconvert" +msgstr "Nonconvert" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1162,22 +1288,10 @@ msgid "Middle Button" msgstr "Rotiță" #: src/keycode.cpp -msgid "Minus" -msgstr "Minus" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Schimbă modul" - -#: src/keycode.cpp msgid "Next" msgstr "Următorul" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nonconvert" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1194,6 +1308,11 @@ msgid "Numpad -" msgstr "Numpad -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Numpad *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Numpad /" @@ -1242,20 +1361,12 @@ msgid "OEM Clear" msgstr "Curățare OEM" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Pauză" #: src/keycode.cpp -msgid "Period" -msgstr "Punct" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Plus" +msgid "Play" +msgstr "Joacă" #: src/keycode.cpp msgid "Print" @@ -1354,6 +1465,20 @@ msgid "3D mode" msgstr "" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1415,6 +1540,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1422,7 +1551,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" @@ -1447,6 +1577,12 @@ msgid "Amplifies the valleys" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Anisotropic filtering" msgstr "Filtru Anizotropic" @@ -1463,6 +1599,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" @@ -1471,6 +1611,19 @@ msgid "Ask to reconnect after crash" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "" @@ -1496,6 +1649,14 @@ msgid "Basic Privileges" msgstr "" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Bilinear filtering" msgstr "Filtrare Biliniară" @@ -1506,6 +1667,14 @@ msgid "Bind address" msgstr "Se rezolvă adresa..." #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" @@ -1535,6 +1704,10 @@ msgid "Camera update toggle key" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "" @@ -1547,6 +1720,31 @@ msgid "Cave width" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Mapgen" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1607,10 +1805,19 @@ msgid "Clean transparent textures" msgstr "" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Client" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Client" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "" @@ -1683,6 +1890,11 @@ msgstr "Consloă" #: src/settings_translation_file.cpp #, fuzzy +msgid "Console height" +msgstr "Consloă" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Console key" msgstr "Consloă" @@ -1707,17 +1919,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp @@ -1741,6 +1953,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Creează" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" @@ -1778,6 +1995,10 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "" @@ -1816,6 +2037,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1826,6 +2082,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1856,17 +2122,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" #: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Activează tot" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Disable anticheat" msgstr "Activează particulele" @@ -1914,11 +2188,25 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Enable VBO" msgstr "Activează MP" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Enable mod security" msgstr "Repozitoriu Online de moduri" @@ -1955,6 +2243,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2000,6 +2298,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2022,7 +2324,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2093,6 +2399,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2110,10 +2420,34 @@ msgid "Filtering" msgstr "Filtru Anizotropic" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "" @@ -2126,6 +2460,10 @@ msgid "Fog" msgstr "" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -2163,6 +2501,14 @@ msgid "Forward key" msgstr "ÃŽnainte" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2242,10 +2588,19 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Ground level" +msgstr "Mapgen" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "HTTP Mods" msgstr "Moduri" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2267,22 +2622,57 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Windows Dreapta" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Mapgen" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Mapgen" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2304,6 +2694,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2329,6 +2731,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2361,6 +2772,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2389,6 +2804,15 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Consloă" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2431,6 +2855,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Inventar" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2452,12 +2881,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2495,6 +2936,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Jump key" msgstr "Sari" @@ -2512,6 +2969,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2526,6 +2990,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2568,6 +3039,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2582,6 +3060,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2603,6 +3088,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2703,6 +3202,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2716,10 +3222,27 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Mapgen" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Mapgen" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2728,6 +3251,11 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Consloă" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2784,6 +3312,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2858,6 +3393,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2885,9 +3424,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2896,7 +3444,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2915,25 +3464,21 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen Valleys" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen Valleys" +msgstr "Mapgen" #: src/settings_translation_file.cpp #, fuzzy @@ -2952,130 +3497,16 @@ msgstr "Mapgen" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen flat cave width" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat flags" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat ground level" +msgid "Mapgen flat specific flags" msgstr "Mapgen" #: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake steepness" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake threshold" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp #, fuzzy msgid "Mapgen fractal" msgstr "Mapgen" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen fractal cave width" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal fractal" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal iterations" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal offset" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal scale" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal slice w" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen name" msgstr "Mapgen" @@ -3086,89 +3517,18 @@ msgstr "Mapgen" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v5 cave width" +msgid "Mapgen v5 specific flags" msgstr "Mapgen" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp #, fuzzy msgid "Mapgen v6" msgstr "Mapgen" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" +#, fuzzy +msgid "Mapgen v6 specific flags" +msgstr "Mapgen" #: src/settings_translation_file.cpp #, fuzzy @@ -3177,58 +3537,10 @@ msgstr "Mapgen" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v7 cave width" +msgid "Mapgen v7 specific flags" msgstr "Mapgen" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Massive cave depth" msgstr "" @@ -3394,6 +3706,10 @@ msgid "Mipmapping" msgstr "Mip Mapping" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3414,6 +3730,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3422,18 +3746,21 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "apasă o tastă" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3482,10 +3809,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3522,6 +3845,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3562,6 +3893,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3657,6 +3994,14 @@ msgid "Report path" msgstr "Selectează" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Right key" msgstr "Meniu Drepata" @@ -3690,6 +4035,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3698,6 +4047,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3741,6 +4094,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3791,6 +4152,10 @@ msgid "Server port" msgstr "Port server" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Serverlist URL" msgstr "Listă de servere publică" @@ -3825,10 +4190,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Umbră" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3854,10 +4228,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Smooth lighting" msgstr "Lumină mai bună" @@ -3898,6 +4291,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -3918,10 +4319,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3936,6 +4357,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Texture path" msgstr "Pachete de tetură" @@ -3956,8 +4381,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -4008,6 +4436,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -4050,6 +4482,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Trilinear filtering" msgstr "Filtrare Triliniară" @@ -4066,10 +4502,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4135,6 +4589,42 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4143,13 +4633,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4161,6 +4649,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4251,16 +4743,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4311,6 +4793,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4324,6 +4813,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4335,6 +4860,84 @@ msgstr "" msgid "cURL timeout" msgstr "" +#~ msgid "Hide mp content" +#~ msgstr "Ascunde conÈ›inutul mp" + +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "Capital" + +#~ msgid "Comma" +#~ msgstr "Virgulă" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Final" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Minus" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Punct" + +#~ msgid "Plus" +#~ msgstr "Plus" + +#, fuzzy +#~ msgid "Mapgen flat cave width" +#~ msgstr "Mapgen" + +#, fuzzy +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Mapgen" + +#, fuzzy +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Mapgen" + +#, fuzzy +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Mapgen" + +#, fuzzy +#~ msgid "Mapgen fractal offset" +#~ msgstr "Mapgen" + +#, fuzzy +#~ msgid "Mapgen fractal scale" +#~ msgstr "Mapgen" + +#, fuzzy +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Mapgen" + +#, fuzzy +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Mapgen" + +#, fuzzy +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Mapgen" + #, fuzzy #~ msgid "Useful for mod developers." #~ msgstr "Dezvoltatori de bază" @@ -4353,9 +4956,6 @@ msgstr "" #~ msgid "If enabled, " #~ msgstr "activat" -#~ msgid "Game Name" -#~ msgstr "Numele jocului" - #~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\"" #~ msgstr "Gamemgr: Nu se poate copia modul \"$1\" în jocul \"$2\"" @@ -4410,9 +5010,6 @@ msgstr "" #~ msgid "Add mod:" #~ msgstr "AdăugaÅ£i mod:" -#~ msgid "Local install" -#~ msgstr "Instalare locală" - #~ msgid "Left click: Move all items, Right click: Move single item" #~ msgstr "" #~ "Click stânga: Mută toate obiectele, Click dreapta: Mută un singur obiect" diff --git a/po/ru/minetest.po b/po/ru/minetest.po index e5b806432..bcda8395c 100644 --- a/po/ru/minetest.po +++ b/po/ru/minetest.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-12-19 10:06+0000\n" -"Last-Translator: Nikolay <nikolay0054@factmodule.ru>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-06-02 19:42+0000\n" +"Last-Translator: weqqr <weqqr@opmbx.org>\n" "Language-Team: Russian " "<https://hosted.weblate.org/projects/minetest/minetest/ru/>\n" "Language: ru\n" @@ -18,7 +18,15 @@ msgstr "" "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 2.10\n" +"X-Generator: Weblate 2.15-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "ВозродитьÑÑ" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Ð’Ñ‹ умерли." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -77,19 +85,23 @@ msgstr "Мы поддерживаем верÑии протоколов межд #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Отменить" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" -msgstr "ЗавиÑит от:" +msgid "Dependencies:" +msgstr "ЗавиÑимоÑти:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable MP" msgstr "Отключить мультиплеер" #: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Отключить вÑе" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Включить мультиплеер" @@ -102,22 +114,17 @@ msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "chararacters [a-z0-9_] are allowed." msgstr "" -"Ошибка при включении мода \"$1\", поÑкольку он Ñодержит недопуÑтимые " -"Ñимволы. ДопуÑкаетÑÑ Ð¸Ñпользование Ñтрочных букв латинÑкого алфавита, цифр, " -"и знака подчёркиваниÑ." - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Скрыть игру" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Скрыть Ñодержимое модпака" +"Ðе удалоÑÑŒ включить мод \"$1\", так как он Ñодержит недопуÑтимые Ñимволы. " +"Разрешены только Ñледующие Ñимволы: [a-z0-9_]." #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Мод:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "ÐеобÑзательные завиÑимоÑти:" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -161,7 +168,7 @@ msgstr "Ðе задано Ð¸Ð¼Ñ Ð¼Ð¸Ñ€Ð° или не выбрана игра" #: builtin/mainmenu/dlg_create_world.lua msgid "Seed" -msgstr "Сид" +msgstr "Зерно" #: builtin/mainmenu/dlg_create_world.lua msgid "Warning: The minimal development test is meant for developers." @@ -182,8 +189,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Уверены, что хотите удалить \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Удалить" @@ -199,7 +205,7 @@ msgstr "Modmgr: неправильный путь к \"$1\"" msgid "Delete World \"$1\"?" msgstr "Удалить мир \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "ПринÑть" @@ -217,7 +223,7 @@ msgstr "(ОтÑутÑтвует опиÑание наÑтройки)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" -msgstr "< Ðазад к Ñтранице ÐаÑтроек" +msgstr "< Ðазад к Ñтранице наÑтроек" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Browse" @@ -229,7 +235,7 @@ msgstr "Отключено" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Edit" -msgstr "Редактировать" +msgstr "Править" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Enabled" @@ -277,7 +283,12 @@ msgstr "Возможные значениÑ: " #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Restore Default" -msgstr "ВоÑÑтановить по умолчанию" +msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð¾ умолчанию" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "ПоиÑк" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" @@ -288,12 +299,12 @@ msgid "Show technical names" msgstr "Отобразить техничеÑкие названиÑ" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." -msgstr "Значение должно быть больше, чем $1." +msgid "The value must be at least $1." +msgstr "Значение должно быть больше или равно $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." -msgstr "Значение должно быть меньше, чем $1." +msgid "The value must not be larger than $1." +msgstr "Значение не должно быть больше, чем $1." #: builtin/mainmenu/modmgr.lua msgid "" @@ -320,6 +331,10 @@ msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" "УÑтановка мода: невозможно найти подходÑщее Ð¸Ð¼Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ð¸ Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¿Ð°ÐºÐ° $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "Моды игры" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Закрыть хранилище" @@ -341,10 +356,6 @@ msgid "Rating" msgstr "Рейтинг" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "ПоиÑк" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Краткое имÑ:" @@ -380,6 +391,66 @@ msgstr "Контрибьюторы в отÑтавке" msgid "Previous Core Developers" msgstr "Разработчики в отÑтавке" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "Публичный Ñервер" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "ÐдреÑ" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "ÐаÑтроить" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Режим творчеÑтва" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Включить урон" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "Играть (хоÑÑ‚)" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "ЗапуÑтить Ñервер" + +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" +msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð¸Ð³Ñ€Ð°" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Ð˜Ð¼Ñ / Пароль" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Ðовый" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Мир не Ñоздан или не выбран!" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Играть" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Порт" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Выберите мир:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Порт Ñервера" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "УÑтановленные моды:" @@ -389,6 +460,10 @@ msgid "Mod information:" msgstr "ОпиÑание мода:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "Ðет завиÑимоÑтей." + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "ОпиÑание мода недоÑтупно" @@ -408,95 +483,45 @@ msgstr "Удалить выбранный мод" msgid "Uninstall selected modpack" msgstr "Удалить выбранный мод-пак" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "ÐÐ´Ñ€ÐµÑ / Порт" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Клиент" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "ПодключитьÑÑ" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Режим творчеÑтва" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" -msgstr "Ущерб включен" +msgstr "Урон включен" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Удалить фаворит" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "фаворит" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Ð˜Ð¼Ñ / Пароль" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP разрешён" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "Пинг" -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "ÐдреÑ" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "Играть онлайн" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "ÐаÑтроить" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Режим творчеÑтва" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Включить Урон" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Ð˜Ð¼Ñ / Пароль" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Ðовый" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Ðе выбран мир!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Порт" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Публичный" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Выберите мир:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Сервер" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Порт Ñервера" - -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Ðачать игру" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP разрешён" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -516,17 +541,21 @@ msgstr "8x" #: builtin/mainmenu/tab_settings.lua msgid "Advanced Settings" -msgstr "раÑширенные наÑтройки" +msgstr "РаÑширенные наÑтройки" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" -msgstr "Сглаживание:" +msgstr "ÐнтиалиаÑинг:" #: builtin/mainmenu/tab_settings.lua msgid "Are you sure to reset your singleplayer world?" msgstr "Уверены, что хотите ÑброÑить мир одиночной игры?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "ÐвтоматичеÑки ÑохранÑть размер окна" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Ð‘Ð¸Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ" @@ -567,14 +596,12 @@ msgid "No Mipmap" msgstr "Без Мипмаппинга" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Node Highlighting" msgstr "ПодÑветка нод" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Node Outlining" -msgstr "ПодÑветка нод" +msgstr "Обводка нод" #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua msgid "None" @@ -582,7 +609,7 @@ msgstr "Ðичего" #: builtin/mainmenu/tab_settings.lua msgid "Normal Mapping" -msgstr "Mip-текÑтурирование" +msgstr "Карты нормалей" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" @@ -605,6 +632,10 @@ msgid "Reset singleplayer world" msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¾Ð´Ð¸Ð½Ð¾Ñ‡Ð½Ð¾Ð¹ игры" #: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Ðкран:" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "ÐаÑтройки" @@ -629,9 +660,8 @@ msgid "To enable shaders the OpenGL driver needs to be used." msgstr "Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑˆÐµÐ¹Ð´ÐµÑ€Ð¾Ð² необходим драйвер OpenGL." #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -#, fuzzy msgid "Tone Mapping" -msgstr "Mip-текÑтурирование (Мип-маппинг)" +msgstr "Тональное отображение" #: builtin/mainmenu/tab_settings.lua msgid "Touchthreshold (px)" @@ -669,14 +699,6 @@ msgstr "Главное меню" msgid "Start Singleplayer" msgstr "Ðачать одиночную игру" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Играть" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "ÐžÐ´Ð¸Ð½Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð³Ñ€Ð°" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "ОпиÑание отÑутÑтвует" @@ -738,13 +760,16 @@ msgid "Player name too long." msgstr "Ð˜Ð¼Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ° Ñлишком длинное." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "ПожалуйÑта, выберите имÑ!" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "По Ñтому пути мира нет: " #: src/fontengine.cpp -#, fuzzy msgid "needs_fallback_font" -msgstr "no" +msgstr "needs_fallback_font" #: src/game.cpp msgid "" @@ -755,6 +780,38 @@ msgstr "" "ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð² debug.txt." #: src/game.cpp +msgid "- Address: " +msgstr "- ÐдреÑ: " + +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "- Режим творчеÑтва: " + +#: src/game.cpp +msgid "- Damage: " +msgstr "- Урон: " + +#: src/game.cpp +msgid "- Mode: " +msgstr "- Режим: " + +#: src/game.cpp +msgid "- Port: " +msgstr "- Порт: " + +#: src/game.cpp +msgid "- Public: " +msgstr "- Публичный: " + +#: src/game.cpp +msgid "- PvP: " +msgstr "- PvP: " + +#: src/game.cpp +msgid "- Server Name: " +msgstr "- Ð˜Ð¼Ñ Ñервера: " + +#: src/game.cpp msgid "Change Keys" msgstr "Смена управлениÑ" @@ -771,38 +828,45 @@ msgid "Continue" msgstr "Продолжить" #: src/game.cpp -msgid "Creating client..." -msgstr "Создание клиента..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Создание Ñервера..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" -msgstr "" -"Управление по умолчанию:\n" -"- WASD: движение\n" -"- Пробел: прыжок/вверх\n" -"- Shift: краÑтьÑÑ/вниз\n" -"- Q: броÑить предмет\n" -"- I: инвентарь\n" +"- %s: chat\n" +msgstr "" +"Управление:\n" +"- %s: двигатьÑÑ Ð²Ð¿ÐµÑ€Ñ‘Ð´\n" +"- %s: двигатьÑÑ Ð½Ð°Ð·Ð°Ð´\n" +"- %s: двигатьÑÑ Ð²Ð»ÐµÐ²Ð¾\n" +"- %s: двигатьÑÑ Ð²Ð¿Ñ€Ð°Ð²Ð¾\n" +"- %s: прыжок/подъём\n" +"- %s: краÑтьÑÑ/ÑпуÑтитьÑÑ\n" +"- %s: броÑить предмет\n" +"- %s: инвентарь\n" "- Мышка: поворот\n" "- ЛКМ: копать/удар\n" "- ПКМ: поÑтавить/иÑпользовать\n" "- КолеÑико мыши: выбор предмета\n" -"- T: чат\n" +"- %s: чат\n" + +#: src/game.cpp +msgid "Creating client..." +msgstr "Создание клиента..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Создание Ñервера..." #: src/game.cpp msgid "" @@ -842,6 +906,18 @@ msgid "Exit to OS" msgstr "Выход в ОС" #: src/game.cpp +msgid "Game info:" +msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ игре:" + +#: src/game.cpp +msgid "Game paused" +msgstr "Игра приоÑтановлена" + +#: src/game.cpp +msgid "Hosting server" +msgstr "Локальный Ñервер" + +#: src/game.cpp msgid "Item definitions..." msgstr "ОпиÑÐ°Ð½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¾Ð²..." @@ -862,24 +938,45 @@ msgid "Node definitions..." msgstr "ОпиÑÐ°Ð½Ð¸Ñ Ð½Ð¾Ð´..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Получение адреÑа..." +msgid "Off" +msgstr "Выкл." #: src/game.cpp -msgid "Respawn" -msgstr "ВозродитьÑÑ" +msgid "On" +msgstr "Вкл." + +#: src/game.cpp +msgid "Remote server" +msgstr "Удаленный Ñервер" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Получение адреÑа..." #: src/game.cpp msgid "Shutting down..." msgstr "Завершение..." #: src/game.cpp +msgid "Singleplayer" +msgstr "ÐžÐ´Ð¸Ð½Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð³Ñ€Ð°" + +#: src/game.cpp msgid "Sound Volume" msgstr "ГромкоÑть звука" #: src/game.cpp -msgid "You died." -msgstr "Ð’Ñ‹ умерли." +#, c-format +msgid "Volume changed to %d%%" +msgstr "ГромкоÑть изменена на %d%%" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "ГромкоÑть изменена на 0%" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "ГромкоÑть изменена на 100%" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -914,6 +1011,10 @@ msgid "Console" msgstr "КонÑоль" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Уменьш. громкоÑть" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Двойной прыжок = летать" @@ -926,6 +1027,10 @@ msgid "Forward" msgstr "Вперед" #: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "Увелич. громкоÑть" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Инвентарь" @@ -947,6 +1052,22 @@ msgstr "" msgid "Left" msgstr "Влево" +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Выключить звук" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "Следующий предмет" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "Предыдущий предмет" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Печать Ñтеков" @@ -1024,15 +1145,11 @@ msgid "Apps" msgstr "ПриложениÑ" #: src/keycode.cpp -msgid "Attn" -msgstr "Внимание" - -#: src/keycode.cpp msgid "Back" msgstr "Ðазад" #: src/keycode.cpp -msgid "Capital" +msgid "Caps Lock" msgstr "Caps Lock" #: src/keycode.cpp @@ -1040,22 +1157,10 @@ msgid "Clear" msgstr "ОчиÑтить" #: src/keycode.cpp -msgid "Comma" -msgstr "ЗапÑтаÑ" - -#: src/keycode.cpp msgid "Control" msgstr "Ctrl" #: src/keycode.cpp -msgid "Convert" -msgstr "Преобразовать" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Вниз" @@ -1064,26 +1169,14 @@ msgid "End" msgstr "End" #: src/keycode.cpp -msgid "Erase OEF" -msgstr "Стереть ОÐС" - -#: src/keycode.cpp -msgid "Escape" -msgstr "Escape" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" +msgid "Erase EOF" +msgstr "Стереть EOF" #: src/keycode.cpp msgid "Execute" msgstr "Выполнить" #: src/keycode.cpp -msgid "Final" -msgstr "Конец" - -#: src/keycode.cpp msgid "Help" msgstr "Справка" @@ -1092,20 +1185,28 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +msgid "IME Accept" +msgstr "IME Accept" + +#: src/keycode.cpp +msgid "IME Convert" +msgstr "IME Convert" + +#: src/keycode.cpp +msgid "IME Escape" +msgstr "IME Escape" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +msgid "IME Mode Change" +msgstr "IME Mode Change" #: src/keycode.cpp -msgid "Kana" -msgstr "Кана" +msgid "IME Nonconvert" +msgstr "IME Nonconvert" #: src/keycode.cpp -msgid "Kanji" -msgstr "Кандзи" +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1136,22 +1237,10 @@ msgid "Middle Button" msgstr "СреднÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ°" #: src/keycode.cpp -msgid "Minus" -msgstr "МинуÑ" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Mode Change" - -#: src/keycode.cpp msgid "Next" msgstr "Next" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Ðе преобразовано" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1168,6 +1257,10 @@ msgid "Numpad -" msgstr "Доп. клав. -" #: src/keycode.cpp +msgid "Numpad ." +msgstr "Цифр. клав. '.'" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Доп. клав. /" @@ -1216,20 +1309,12 @@ msgid "OEM Clear" msgstr "ОчиÑтить OEM" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Пауза" #: src/keycode.cpp -msgid "Period" -msgstr "Период" - -#: src/keycode.cpp -msgid "Plus" -msgstr "ПлюÑ" +msgid "Play" +msgstr "Играть" #: src/keycode.cpp msgid "Print" @@ -1311,6 +1396,12 @@ msgid "" "sets.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" +"Смещение (X, Y, Z) фрактала от центра мира в единицах «маÑштаба».\n" +"ИÑпользуетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð·Ð¾Ð½Ñ‹ Ð²Ð¾Ð·Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ð»Ð¸Ð¶Ðµ к (0, 0).\n" +"Значение по умолчанию подходит Ð´Ð»Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтв Мандельброта, Ð´Ð»Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтв Жюлиа " +"его нужно отредактировать.\n" +"Диапазон примерно от -2 до 2. Умножьте на «маÑштаб», чтобы получить Ñмещение " +"в узлах." #: src/settings_translation_file.cpp msgid "" @@ -1329,7 +1420,22 @@ msgid "3D mode" msgstr "3D режим" #: src/settings_translation_file.cpp -#, fuzzy +msgid "3D noise defining giant caverns." +msgstr "3D-шум, определÑющий огромные пещеры." + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" +"3D-шум, определÑющий Ñтруктуру гор и их выÑоту.\n" +"Также определÑет Ñтруктуру гор на парÑщих оÑтровах." + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "3D-шум, определÑющий Ñтруктуру Ñтен речного каньона." + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1347,16 +1453,16 @@ msgstr "" "- interlaced: четные/нечетные линии отображают два разных кадра Ð´Ð»Ñ " "Ñкранов поддерживающих полÑризацию.\n" "- topbottom: Разделение Ñкрана низ/верх.\n" -"- sidebyside: Разделение Ñкрана право/лево." +"- sidebyside: Разделение Ñкрана право/лево.\n" +"- pageflip: Ð§ÐµÑ‚Ñ‹Ñ€Ñ‘Ñ…ÐºÑ€Ð°Ñ‚Ð½Ð°Ñ Ð±ÑƒÑ„ÐµÑ€Ð¸Ð·Ð°Ñ†Ð¸Ñ (QuadBuffer)." #: src/settings_translation_file.cpp msgid "" "A chosen map seed for a new map, leave empty for random.\n" "Will be overridden when creating a new world in the main menu." msgstr "" -"Выбранный Ñид Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ карты, оÑтавьте значение пуÑтым Ð´Ð»Ñ Ñлучайной " -"генерации.\n" -"Будет отменено при Ñоздании нового мира, в главном меню." +"Выбранное зерно Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ карты, оÑтавьте пуÑтым Ð´Ð»Ñ Ñлучайного.\n" +"Будет переопределено при Ñоздании нового мира в главном меню." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." @@ -1375,19 +1481,16 @@ msgid "Acceleration in air" msgstr "УÑкорение в воздухе" #: src/settings_translation_file.cpp -#, fuzzy msgid "Active Block Management interval" -msgstr "ДальноÑть взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð±Ð»Ð¾ÐºÐ°Ð¼Ð¸" +msgstr "Интервал ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ блоком" #: src/settings_translation_file.cpp -#, fuzzy msgid "Active Block Modifier interval" -msgstr "ДальноÑть взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð±Ð»Ð¾ÐºÐ°Ð¼Ð¸" +msgstr "Интервал модификатора активного блока" #: src/settings_translation_file.cpp -#, fuzzy msgid "Active Block Modifiers" -msgstr "ДальноÑть взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð±Ð»Ð¾ÐºÐ°Ð¼Ð¸" +msgstr "Модификаторы активных блоков" #: src/settings_translation_file.cpp msgid "Active block range" @@ -1408,6 +1511,10 @@ msgstr "" "ПРИМЕЧÐÐИЕ: Ñто поле адреÑа перезапишет Ñту наÑтройку в главном меню." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "ДобавлÑет чаÑтицы при рытье узла." + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1417,11 +1524,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" -"Отрегулируйте гамма кодировку Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ† оÑвещениÑ. Более низкие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ " -"Ñрче.\n" +"Регулирует гамма-кодировку таблиц оÑвещениÑ. Более выÑокие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñрче.\n" "Ðтот параметр предназначен только Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° и игнорируетÑÑ Ñервером." #: src/settings_translation_file.cpp @@ -1430,7 +1537,7 @@ msgstr "Дополнительно" #: src/settings_translation_file.cpp msgid "Altitude Chill" -msgstr "" +msgstr "Ð’Ñ‹Ñота нивального поÑÑа" #: src/settings_translation_file.cpp msgid "Always fly and fast" @@ -1442,7 +1549,15 @@ msgstr "Гамма Ambient occlusion" #: src/settings_translation_file.cpp msgid "Amplifies the valleys" +msgstr "УÑиливает долины" + +#: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." msgstr "" +"Только ÑиÑтемы Android: ПопытатьÑÑ Ñоздать текÑтуры Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð¸Ð· мешей,\n" +"когда поддерживаемый рендерер не найден." #: src/settings_translation_file.cpp msgid "Anisotropic filtering" @@ -1463,15 +1578,39 @@ msgstr "" "servers.minetest.net." #: src/settings_translation_file.cpp -#, fuzzy +msgid "Apple trees noise" +msgstr "Шум Ñблонь" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." -msgstr "Приблизительный (X, Y, Z) маÑштаб рекурÑивных в узлах." +msgstr "Приблизительный (X,Y,Z) маÑштаб фрактала в узлах." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле диÑконнекта" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" +"Ðа Ñтом раÑÑтоÑнии Ñервер будет агреÑÑивно оптимизировать то, какие блоки " +"будут\n" +"отправлены клиентам. Малые значениÑ, возможно, увеличат производительноÑть " +"за Ñчет\n" +"видимых глюков отриÑовки (некоторые блоки не будут отриÑовыватьÑÑ Ð¿Ð¾Ð´ водой\n" +"и в пещерах, а иногда и на Ñуше). УÑтановка Ñтого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ, чем " +"max_block_send_distance\n" +"отключает оптимизацию. УказываетÑÑ Ð² блоках (16 узлов)" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "ÐвтоматичеÑки добавлÑть в ÑпиÑок Ñерверов." @@ -1480,9 +1619,8 @@ msgid "Autorun key" msgstr "Кнопка автобега" #: src/settings_translation_file.cpp -#, fuzzy msgid "Backward key" -msgstr "клавиша обратно" +msgstr "Клавиша назад" #: src/settings_translation_file.cpp msgid "Base terrain height" @@ -1493,11 +1631,18 @@ msgid "Basic" msgstr "Базовый" #: src/settings_translation_file.cpp -#, fuzzy msgid "Basic Privileges" msgstr "Стандартные права" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "Шум плÑжей" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "Порог шума плÑжей" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Ð‘Ð¸Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ" @@ -1506,6 +1651,14 @@ msgid "Bind address" msgstr "ÐÐ´Ñ€ÐµÑ Ð±Ð¸Ð½Ð´Ð°" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "Параметры температуры и влажноÑти Ð´Ð»Ñ API биомов" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "Шум биомов" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "Биты на пикÑель (глубина цвета) в полноÑкранном режиме." @@ -1526,7 +1679,6 @@ msgid "Camera smoothing" msgstr "Сглаживание камеры" #: src/settings_translation_file.cpp -#, fuzzy msgid "Camera smoothing in cinematic mode" msgstr "Сглаживание камеры в кинематографичеÑком режиме" @@ -1535,6 +1687,10 @@ msgid "Camera update toggle key" msgstr "Клавиша Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹" #: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "Шум пещеры" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "Шум пещеры #1" @@ -1543,9 +1699,32 @@ msgid "Cave noise #2" msgstr "Шум пещеры #2" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cave width" -msgstr "Ширина Ñкрана" +msgstr "Ширина пещеры" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "Шум пещеры #1" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "Шум пещеры #2" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "Предел пещеры" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "Шум пещеры" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "КонуÑноÑть пещер" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "Порог пещеры" #: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" @@ -1560,9 +1739,8 @@ msgid "Chat toggle key" msgstr "Кнопка Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð°" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chatcommands" -msgstr "Команда" +msgstr "Команды в чате" #: src/settings_translation_file.cpp msgid "" @@ -1586,6 +1764,25 @@ msgid "" "17 = 4D \"Mandelbulb\" mandelbrot set.\n" "18 = 4D \"Mandelbulb\" julia set." msgstr "" +"Выбор из 18 фракталов из 9 формул.\n" +"1 = 4D \"Круглое\" множеÑтво Мандельброта.\n" +"2 = 4D \"Круглое\" множеÑтво Жюлиа.\n" +"3 = 4D \"Квадратное\" множеÑтво Мандельброта.\n" +"4 = 4D \"Квадратное\" множеÑтво Жюлиа.\n" +"5 = 4D \"Mandy Cousin\" множеÑтво Мандельброта.\n" +"6 = 4D \"Mandy Cousin\" множеÑтво Жюлиа.\n" +"7 = 4D \"Variation\" множеÑтво Мандельброта.\n" +"8 = 4D \"Variation\" множеÑтво Жюлиа.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" множеÑтво Мандельброта.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" множеÑтво Жюлиа.\n" +"11 = 3D \"Christmas Tree\" множеÑтво Мандельброта.\n" +"12 = 3D \"Christmas Tree\" множеÑтво Жюлиа.\n" +"13 = 3D \"Mandelbulb\" множеÑтво Мандельброта.\n" +"14 = 3D \"Mandelbulb\" множеÑтво Жюлиа.\n" +"15 = 3D \"Cosine Mandelbulb\" множеÑтво Мандельброта.\n" +"16 = 3D \"Cosine Mandelbulb\" множеÑтво Жюлиа.\n" +"17 = 4D \"Mandelbulb\" множеÑтво Мандельброта.\n" +"18 = 4D \"Mandelbulb\" множеÑтво Жюлиа." #: src/settings_translation_file.cpp msgid "Chunk size" @@ -1604,10 +1801,18 @@ msgid "Clean transparent textures" msgstr "очиÑтить прозрачные Ñтруктуры" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Клиент" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Клиент и Сервер" #: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "Моддинг клиента" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "СкороÑть подъема" @@ -1636,22 +1841,20 @@ msgid "Colored fog" msgstr "Цветной туман" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Comma-separated list of mods that are allowed to access HTTP APIs, which\n" "allow them to upload and download data to/from the internet." msgstr "" -"СпиÑок доверенных модов, через запÑтую, которым разрешён доÑтуп к HTTP API, " -"что позволÑет им отправлÑть и принимать данные в/из Ñети Интернет." +"СпиÑок доверенных модов через запÑтую, которым разрешён доÑтуп к HTTP API, " +"что позволÑет им отправлÑть и принимать данные через Интернет." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Comma-separated list of trusted mods that are allowed to access insecure\n" "functions even when mod security is on (via request_insecure_environment())." msgstr "" -"СпиÑок доверенных модов, через запÑтую, которым разрешён доÑтуп к " -"небезопаÑным функциÑм, даже в безопаÑном режиме (Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " +"СпиÑок доверенных модов через запÑтую, которым разрешён доÑтуп к " +"небезопаÑным функциÑм даже когда включена защита модов (через " "request_insecure_environment())." #: src/settings_translation_file.cpp @@ -1679,6 +1882,10 @@ msgid "Console color" msgstr "Цвет в конÑоли" #: src/settings_translation_file.cpp +msgid "Console height" +msgstr "Ð’Ñ‹Ñота конÑоли" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Кнопка вызова конÑоли" @@ -1688,7 +1895,7 @@ msgstr "ÐÐµÐ¿Ñ€ÐµÑ€Ñ‹Ð²Ð½Ð°Ñ Ñ…Ð¾Ð´ÑŒÐ±Ð°" #: src/settings_translation_file.cpp msgid "Continuous forward movement (only used for testing)." -msgstr "" +msgstr "ПоÑтоÑнное движение вперёд (иÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ñ‚ÐµÑтированиÑ)." #: src/settings_translation_file.cpp msgid "Controls" @@ -1705,24 +1912,25 @@ msgstr "" "менÑетÑÑ." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Задает размеры пуÑтыней и плÑжей.\n" -"Когда включены Ñнежные биомы, 'mgv6_freq_desert' игнорируетÑÑ." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." -msgstr "" +msgstr "Регулирует крутизну и глубину впадин в озёрах." #: src/settings_translation_file.cpp msgid "Controls steepness/height of hills." +msgstr "Регулирует крутизну и выÑоту холмов." + +#: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" +"Контролирует плотноÑть горной меÑтноÑти парÑщих оÑтровов.\n" +"ЯвлÑетÑÑ Ñмещением, добавлÑемым к значению шума 'np_mountain'." #: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "" +"Регулирует ширину туннелей, меньшие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñоздают более широкие туннели." #: src/settings_translation_file.cpp msgid "Crash message" @@ -1733,21 +1941,28 @@ msgid "" "Creates unpredictable lava features in caves.\n" "These can make mining difficult. Zero disables them. (0-10)" msgstr "" +"Создаёт непредÑказуемую лаву в пещерах.\n" +"Она может затруднить добычу. Ðоль отключает Ñто. (0-10)" #: src/settings_translation_file.cpp msgid "" "Creates unpredictable water features in caves.\n" "These can make mining difficult. Zero disables them. (0-10)" msgstr "" +"Создаёт непредÑказуемую воду в пещерах.\n" +"Она может затруднить добычу. Ðоль отключает Ñто. (0-10)" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "ТворчеÑкий" #: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "ПрозрачноÑть перекреÑтиÑ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "ПрозрачноÑть перекреÑÑ‚Ð¸Ñ (от 0 (прозрачно) до 255 (непрозрачно))." +msgstr "ПрозрачноÑть прицела (от 0 (прозрачно) до 255 (непрозрачно))." #: src/settings_translation_file.cpp msgid "Crosshair color" @@ -1778,6 +1993,10 @@ msgid "Debug log level" msgstr "Отладочный уровень" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "Клавиша ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾Ñти" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Шаг выделенного Ñервера" @@ -1794,6 +2013,8 @@ msgid "" "Default game when creating a new world.\n" "This will be overridden when creating a world from the main menu." msgstr "" +"Игра по умолчанию при Ñоздании нового мира.\n" +"Будет переопределена при Ñоздании мира из главного меню." #: src/settings_translation_file.cpp msgid "Default password" @@ -1805,7 +2026,7 @@ msgstr "Стандартные права" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "Формат отчёта по умолчанию" #: src/settings_translation_file.cpp msgid "" @@ -1816,35 +2037,90 @@ msgstr "" "Работает только на Ñборках Ñ cURL." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "ОпределÑет облаÑти 'terrain_higher' (меÑтноÑть на вершинах утёÑов)." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" +"ОпределÑет облаÑти гладкой поверхноÑти на парÑщих оÑтровах.\n" +"Гладкие парÑщие оÑтрова поÑвлÑÑŽÑ‚ÑÑ, когда шум больше нолÑ." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "ОпределÑет облаÑти возвышений поверхноÑти и влиÑет на крутизну Ñкал." + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "ОпределÑет облаÑти, где у деревьев еÑть Ñблоки." + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "ОпределÑет облаÑти Ñ Ð¿ÐµÑчаными плÑжами." + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" +"ОпределÑет полный размер пещер, меньшие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñоздают большие пещеры." + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "ОпределÑет крупномаÑштабную Ñтруктуру каналов рек." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "ОпределÑет раÑположение и поверхноÑть дополнительных холмов и озёр." + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." msgstr "" +"ОпределÑет шаг выборки текÑтуры.\n" +"Более выÑокое значение приводит к более гладким картам нормалей." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" +"ОпределÑет макÑимальное раÑÑтоÑние Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ° в блоках (0 = " +"неограниченное)." #: src/settings_translation_file.cpp -msgid "Delay in sending blocks after building" +msgid "Defines tree areas and tree density." +msgstr "ОпределÑет облаÑти и плотноÑть деревьев." + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." msgstr "" +"Задержка между обновлением мешей на клиенте в миллиÑекундах. Увеличение " +"Ñтого значениÑ\n" +"замедлит темп Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼ÐµÑˆÐµÐ¹, тем Ñамым ÑƒÐ¼ÐµÐ½ÑŒÑˆÐ°Ñ ÐºÐ¾Ð»ÐµÐ±Ð°Ð½Ð¸Ñ FPS на " +"медленных клиентах." + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "Задержка отправки блоков поÑле ÑтроительÑтва" #: src/settings_translation_file.cpp msgid "Delay showing tooltips, stated in milliseconds." msgstr "Задержка показа подÑказок, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð² миллиÑекундах." #: src/settings_translation_file.cpp -#, fuzzy msgid "Deprecated Lua API handling" -msgstr "УÑтаревшее Lua API управление" +msgstr "Обработка уÑтаревшего Lua API" #: src/settings_translation_file.cpp msgid "Depth below which you'll find large caves." -msgstr "" +msgstr "Глубина, ниже которой вÑтречаютÑÑ ÐºÑ€ÑƒÐ¿Ð½Ñ‹Ðµ пещеры." #: src/settings_translation_file.cpp msgid "Depth below which you'll find massive caves." -msgstr "" +msgstr "Глубина, ниже которой вÑтречаютÑÑ Ð¾Ð³Ñ€Ð¾Ð¼Ð½Ñ‹Ðµ пещеры." #: src/settings_translation_file.cpp msgid "Descending speed" @@ -1859,16 +2135,24 @@ msgstr "" "Ñерверов." #: src/settings_translation_file.cpp -#, fuzzy -msgid "Desynchronize block animation" -msgstr "РаÑÑинхронизировать анимацию блоков" +msgid "Desert noise threshold" +msgstr "Порог шума пуÑтынь" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" +"ПуÑтыни поÑвлÑÑŽÑ‚ÑÑ, когда np_biome превышает Ñто значение.\n" +"Ðто игнорируетÑÑ, когда включена Ð½Ð¾Ð²Ð°Ñ ÑиÑтема биомов." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "РаÑÑинхронизировать анимацию блоков" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "ЧаÑтицы при рытье" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1876,7 +2160,7 @@ msgstr "Отключить анти-чит" #: src/settings_translation_file.cpp msgid "Disable escape sequences" -msgstr "" +msgstr "Отключить escape-поÑледовательноÑти" #: src/settings_translation_file.cpp msgid "" @@ -1885,6 +2169,10 @@ msgid "" "disable\n" "the escape sequences generated by mods." msgstr "" +"Отключить escape-поÑледовательноÑти, например, цвет в чате.\n" +"ИÑпользуйте Ñто, еÑли хотите запуÑтить Ñервер Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°Ð¼Ð¸ верÑии ниже 0.4." +"14\n" +"и отключить escape-поÑледовательноÑти, генерируемые модами." #: src/settings_translation_file.cpp msgid "Disallow empty passwords" @@ -1912,12 +2200,27 @@ msgstr "Дамп отладочной информации генератора #: src/settings_translation_file.cpp msgid "Enable Joysticks" +msgstr "Включить джойÑтики" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." msgstr "" +"Включить поддержку Lua-моддинга на клиенте.\n" +"Ðта поддержка ÑвлÑетÑÑ ÑкÑпериментальной и API может изменитьÑÑ." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable VBO" -msgstr "Включить мультиплеер" +msgstr "Включить VBO" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Включить окно конÑоли" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "Включить творчеÑкий режим Ð´Ð»Ñ Ð²Ð½Ð¾Ð²ÑŒ Ñозданных карт." #: src/settings_translation_file.cpp msgid "Enable mod security" @@ -1929,13 +2232,15 @@ msgstr "Включает получение игроками урона и их #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." -msgstr "" +msgstr "Включить Ñлучайный ввод (иÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ñ‚ÐµÑтированиÑ)." #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." msgstr "" +"Включить мÑгкое оÑвещение Ñ Ð¿Ñ€Ð¾Ñтым Ambient Occlusion.\n" +"Отключите Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ выÑокой ÑкороÑти или другого внешнего вида." #: src/settings_translation_file.cpp msgid "" @@ -1945,6 +2250,11 @@ msgid "" "to new servers, but they may not support all new features that you are " "expecting." msgstr "" +"Включите, чтобы запретить подключение Ñтарых клиентов.\n" +"Старые клиенты ÑовмеÑтимы в том ÑмыÑле, что они не будут Ñбоить при " +"подключении\n" +"к новым Ñерверам, однако они могут не поддерживать вÑех новых функций, " +"которые вы ожидаете." #: src/settings_translation_file.cpp msgid "" @@ -1953,6 +2263,23 @@ msgid "" "textures)\n" "when connecting to the server." msgstr "" +"Включить иÑпользование удалённого медиаÑервера (еÑли предоÑтавлÑетÑÑ " +"Ñервером).\n" +"Удалённые Ñервера позволÑÑŽÑ‚ намного быÑтрее Ñкачивать медиафайлы (напр. " +"текÑтуры)\n" +"во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу." + +#: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "Включить покачивание камеры" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Включить покачивание камеры и уÑтановить его значение.\n" +"Ðапример: 0 отключает покачивание, 1.0 Ð´Ð»Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð³Ð¾, 2.0 Ð´Ð»Ñ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð³Ð¾." #: src/settings_translation_file.cpp msgid "" @@ -1960,9 +2287,11 @@ msgid "" "to IPv6 clients, depending on system configuration.\n" "Ignored if bind_address is set." msgstr "" +"Включить/отключить запуÑк IPv6-Ñервера. Сервер IPv6 может быть\n" +"ограничен IPv6-клиентами в завиÑимоÑти от конфигурации ÑиÑтемы.\n" +"ИгнорируетÑÑ, еÑли задан bind_address." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enables animation of inventory items." msgstr "Включить анимацию предметов в инвентаре." @@ -1973,15 +2302,17 @@ msgid "" "or need to be auto-generated.\n" "Requires shaders to be enabled." msgstr "" +"Включает бампмаппинг Ð´Ð»Ñ Ñ‚ÐµÐºÑтур. Карты нормалей должны быть предоÑтавлены\n" +"пакетом текÑтур или Ñгенерированы автоматичеÑки.\n" +"Требует, чтобы шейдеры были включены." #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." -msgstr "" +msgstr "Включает кÑширование повёрнутых мешей." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enables filmic tone mapping" -msgstr "Включить мини-карту." +msgstr "Включить кинематографичеÑкое тональное отображение" #: src/settings_translation_file.cpp msgid "Enables minimap." @@ -1992,59 +2323,68 @@ msgid "" "Enables on the fly normalmap generation (Emboss effect).\n" "Requires bumpmapping to be enabled." msgstr "" +"Включает генерацию карт нормалей \"на лету\" (Ñффект тиÑнениÑ).\n" +"Требует, чтобы бампмаппинг был включен." #: src/settings_translation_file.cpp msgid "" "Enables parallax occlusion mapping.\n" "Requires shaders to be enabled." msgstr "" +"Включает Parallax Occlusion.\n" +"Требует, чтобы шейдеры были включены." + +#: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "Включает покачивание камеры при ходьбе." #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" -msgstr "" +msgstr "Интервал печати данных Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð²Ð¸Ð¶ÐºÐ°" #: src/settings_translation_file.cpp msgid "Entity methods" -msgstr "" +msgstr "Методы ÑущноÑтей" #: src/settings_translation_file.cpp msgid "" "Experimental option, might cause visible spaces between blocks\n" "when set to higher number than 0." msgstr "" +"ÐкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ, может привеÑти к видимым зазорам\n" +"между блоками, когда значение больше, чем 0." #: src/settings_translation_file.cpp msgid "FPS in pause menu" msgstr "FPS во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°ÑƒÐ·Ñ‹" #: src/settings_translation_file.cpp -#, fuzzy msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" -msgstr "" +msgid "Factor noise" +msgstr "КоÑффициент шума" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "КоÑффициент Ð¿Ð¾ÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ падении" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font" -msgstr "Fallback шрифт" +msgstr "Резервный шрифт" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font shadow" -msgstr "Fallback тень шрифта" +msgstr "Тень резервного шрифта" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font shadow alpha" -msgstr "Fallback прозрачноÑть тени шрифта" +msgstr "ПрозрачноÑть тени резервного шрифта" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font size" -msgstr "Fallback размер шрифта" +msgstr "Размер резервного шрифта" #: src/settings_translation_file.cpp msgid "Fast key" @@ -2063,12 +2403,11 @@ msgid "Fast movement" msgstr "БыÑтрое перемещение" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Fast movement (via use key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"БыÑтрое перемещение (Ñ Ð¸Ñпользованием клавиши).\n" +"БыÑтрое перемещение (Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ клавиши ИÑпользовать).\n" "Ðто требует привилегию \"fast\" на Ñервере." #: src/settings_translation_file.cpp @@ -2076,38 +2415,40 @@ msgid "Field of view" msgstr "Поле зрениÑ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Field of view for zoom" -msgstr "Поле зрениÑ" +msgstr "Поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð² режиме увеличениÑ" #: src/settings_translation_file.cpp msgid "Field of view in degrees." msgstr "Поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð² градуÑах." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Field of view while zooming in degrees.\n" "This requires the \"zoom\" privilege on the server." msgstr "" -"БыÑтрое перемещение (Ñ Ð¸Ñпользованием клавиши).\n" -"Ðто требует привилегию \"fast\" на Ñервере." +"Поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð² режиме ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð² градуÑах.\n" +"Требует привилегию «zoom» на Ñервере." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "File in client/serverlist/ that contains your favorite servers displayed in " "the Multiplayer Tab." msgstr "" -"Файл, Ñодержащий ваши любимые Ñерверы, отображаемые на вкладке Multiplayer." +"Файл в директории client/serverlist/, Ñодержащий ваши любимые Ñерверы, " +"отображаемые на вкладке Multiplayer." #: src/settings_translation_file.cpp msgid "Filler Depth" -msgstr "" +msgstr "Глубина наполнителÑ" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "Шум глубины наполнителÑ" #: src/settings_translation_file.cpp msgid "Filmic tone mapping" -msgstr "" +msgstr "КинематографичеÑкое тональное отображение" #: src/settings_translation_file.cpp msgid "" @@ -2116,17 +2457,44 @@ msgid "" "light edge to transparent textures. Apply this filter to clean that up\n" "at texture load time." msgstr "" +"Отфильтрованные текÑтуры могут Ñмешивать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ RGB Ñ Ð¿Ð¾Ð»Ð½Ð¾Ñтью\n" +"прозрачными ÑоÑедними, которые оптимизаторы PNG обычно отбраÑывают.\n" +"Иногда Ñто может привеÑти к тёмным или Ñветлым краÑм полупрозрачных\n" +"текÑтур. Примените Ñтот фильтр, чтобы иÑправить текÑтуру во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸." #: src/settings_translation_file.cpp msgid "Filtering" msgstr "ФильтрациÑ" #: src/settings_translation_file.cpp -#, fuzzy +msgid "First of 2 3D noises that together define tunnels." +msgstr "Первый из двух 3D-шумов, которые вмеÑте определÑÑŽÑ‚ туннели." + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "ФикÑированное зерно мира" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "Шум базовой выÑоты парÑщих оÑтровов" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "Базовый шум парÑщих оÑтровов" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "Уровень парÑщих оÑтровов" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "ПлотноÑть гор на парÑщих оÑтровах" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "Ð’Ñ‹Ñота гор на парÑщих оÑтровах" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Кнопка полёта" @@ -2139,6 +2507,10 @@ msgid "Fog" msgstr "Туман" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "Ðачало тумана" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Клавиша Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ‚ÑƒÐ¼Ð°Ð½Ð°" @@ -2176,6 +2548,14 @@ msgid "Forward key" msgstr "Клавиша вперёд" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "Тип фрактала" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "ЧаÑть видимого раÑÑтоÑниÑ, на которой начинает поÑвлÑтьÑÑ Ñ‚ÑƒÐ¼Ð°Ð½" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "FreeType шрифты" @@ -2184,16 +2564,18 @@ msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " "nodes)." msgstr "" +"ÐаÑколько далеко генерируютÑÑ Ð±Ð»Ð¾ÐºÐ¸ Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð². УказываетÑÑ Ð² блоках (16 " +"узлов)." #: src/settings_translation_file.cpp msgid "" "From how far blocks are sent to clients, stated in mapblocks (16 nodes)." -msgstr "" +msgstr "С какого раÑÑтоÑÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸ отправлÑÑŽÑ‚ÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°Ð¼, в блоках (16 узлов)." #: src/settings_translation_file.cpp msgid "" "From how far clients know about objects, stated in mapblocks (16 nodes)." -msgstr "" +msgstr "С какого раÑÑтоÑÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ñ‹ узнают об объектах, в блоках (16 узлов)." #: src/settings_translation_file.cpp msgid "Full screen" @@ -2201,7 +2583,7 @@ msgstr "Полный Ñкран" #: src/settings_translation_file.cpp msgid "Full screen BPP" -msgstr "" +msgstr "Глубина цвета в полноÑкранном режиме" #: src/settings_translation_file.cpp msgid "Fullscreen mode." @@ -2225,7 +2607,7 @@ msgstr "Гамма" #: src/settings_translation_file.cpp msgid "General" -msgstr "" +msgstr "Общие" #: src/settings_translation_file.cpp msgid "Generate normalmaps" @@ -2233,10 +2615,9 @@ msgstr "Генерировать карты нормалей" #: src/settings_translation_file.cpp msgid "Global callbacks" -msgstr "" +msgstr "Глобальные обратные вызовы" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" @@ -2245,16 +2626,12 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" -"Параметры глобального генератора карты.\n" -"Ð’ генераторе карт v6 флаг 'decorations' управлÑет вÑем оформлением за " -"иÑключением деревьев\n" -" и junglegras(травы джунглей?), в оÑтальных генераторах Ñтот флаг управлÑет " -"вÑем оформлением.\n" -"Стандартные флаги, уÑтановленные в engine(инÑтрументе?) Ñледующие: caves, " -"light, decorations\n" -"Строка флагов изменÑет Ñтандартные наÑтройки engine(инÑтрумента?).\n" -"Флаги, не указанные в Ñтроке флагов, по умолчанию не изменÑÑŽÑ‚ÑÑ.\n" -"Флаги, начинающиеÑÑ Ñ 'no' иÑпользуютÑÑ Ð´Ð»Ñ Ð¸Ñ… Ñвного отключениÑ." +"Глобальные атрибуты генерации карты.\n" +"Ð’ генераторе карты верÑии 6 флаг 'decorations' не контролирует деревьÑ\n" +"и траву в джунглÑÑ…, в оÑтальных генераторах Ñтот флаг контролирует вÑе " +"декорации.\n" +"Флаги, не указанные в Ñтроке флагов, оÑтаютÑÑ Ð² значении по умолчанию.\n" +"Флаги Ñ Ð¿Ñ€Ð¸Ñтавкой 'no' отключают декорации." #: src/settings_translation_file.cpp msgid "Graphics" @@ -2265,9 +2642,16 @@ msgid "Gravity" msgstr "ГравитациÑ" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Ground level" +msgstr "Уровень земли" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" -msgstr "Моды" +msgstr "HTTP-моды" + +#: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "КоÑффициент маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ HUD" #: src/settings_translation_file.cpp msgid "HUD toggle key" @@ -2296,55 +2680,98 @@ msgid "" "call).\n" "* Instrument the sampler being used to update the statistics." msgstr "" +"Профилировать Ñам профилировщик:\n" +"* ЗамерÑть пуÑтую функцию.\n" +"Ðто оценит накладные раÑходы, добавлÑемые замерами (+1 вызов функции).\n" +"* ЗамерÑть ÑÑмплер, иÑпользуемый Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑтатиÑтики." + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "Шум ÑÐ¼ÐµÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐ¿Ð»Ð¾Ñ‚Ñ‹" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "Шум теплоты" #: src/settings_translation_file.cpp -#, fuzzy msgid "Height component of the initial window size." -msgstr "Ð’Ñ‹Ñота Ñодержимого (отноÑительно?) иÑходного размера окна" +msgstr "Ð’Ñ‹Ñота окна при запуÑке." + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "Шум выÑоты" #: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "Ð’Ñ‹Ñота, на которой поÑвлÑÑŽÑ‚ÑÑ Ð¾Ð±Ð»Ð°ÐºÐ°." #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "Шум выбора выÑоты" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "Ð’Ñ‹Ñокоточный FPU" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "Крутизна холмов" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "Порог холмов" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "ДомашнÑÑ Ñтраница Ñервера, Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÐ¼Ð°Ñ Ð² ÑпиÑке Ñерверов." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "Следующий предмет в хотбаре" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "Предыдущий предмет в хотбаре" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Глубина рек" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "How large area of blocks are subject to the active block stuff, stated in " "mapblocks (16 nodes).\n" "In active blocks objects are loaded and ABMs run." msgstr "" -"Размер площади из блоков, ÑоÑтавлÑющей активный блок, раÑположенный в " -"mapblocks (16 nodes).↵\n" -"Ð’ активных блоках объекты загружаютÑÑ Ð¸ ABMs запуÑкаетÑÑ." +"ÐаÑколько Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ Ð¾Ð±Ð»Ð°Ñть подлежит обработке активных блоков, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð² " +"блоках (16 узлов).↵\n" +"Ð’ активных блоках загружаютÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ñ‹ и работают модификаторы блоков." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "How much the server will wait before unloading unused mapblocks.\n" "Higher value is smoother, but will use more RAM." msgstr "" -"Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñервера до выгрузки неиÑпользуемых mapblocks.\n" +"Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñервера до выгрузки неиÑпользуемых блоков.\n" "Ð’Ñ‹Ñокие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ плавные, но иÑпользуют больше RAM." #: src/settings_translation_file.cpp -#, fuzzy msgid "How wide to make rivers" -msgstr "УÑтановка ширины рек" +msgstr "ÐаÑколько широкими делать реки" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "Шум ÑÐ¼ÐµÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð»Ð°Ð¶Ð½Ð¾Ñти" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "Шум влажноÑти" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð²Ð»Ð°Ð¶Ð½Ð¾Ñти в биомах." #: src/settings_translation_file.cpp -#, fuzzy msgid "IPv6" msgstr "IPv6" @@ -2357,7 +2784,6 @@ msgid "IPv6 support." msgstr "IPv6 поддержка." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If FPS would go higher than this, limit it by sleeping\n" "to not waste CPU power for no benefit." @@ -2366,35 +2792,45 @@ msgstr "" "чтобы не тратить мощноÑть процеÑÑора впуÑтую." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If disabled \"use\" key is used to fly fast if both fly and fast mode are " "enabled." msgstr "" -"ЕÑли выключено, кнопка \"use\"(\"иÑпользовать\"?) иÑпользуетÑÑ Ð´Ð»Ñ Ð±Ñ‹Ñтрого " -"полёта, еÑли одновременно включены быÑтрый режим и режим полёта." +"ЕÑли выключено, кнопка \"ИÑпользовать\" иÑпользуетÑÑ Ð´Ð»Ñ Ð±Ñ‹Ñтрого полёта, " +"еÑли одновременно включены быÑтрый режим и режим полёта." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" +"ЕÑли включено, то Ñервер будет выполнÑть отÑечение блоков, оÑновываÑÑÑŒ\n" +"на положении глаз игрока. Ðто может уменьшить количеÑтво переÑылаемых\n" +"блоков на 50-80%. Клиент не будет получать большую чаÑть невидимых\n" +"блоков, поÑтому режим noclip Ñтанет менее полезным." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." msgstr "" -"ЕÑли включено одновременно Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð¾Ð¼ полёта, игрок может летать через " -"твердые nodes(узлы?вершины?). Ðто требует привилегий \"noclip\" на Ñервере." +"ЕÑли включено одновременно Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð¾Ð¼ полёта, игрок Ñможет летать через " +"твёрдые узлы.\n" +"Требует наличие привилегии «noclip» на Ñервере." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If enabled, \"use\" key instead of \"sneak\" key is used for climbing down " "and descending." msgstr "" -"ЕÑли включено, клавиша \"use\"(\"иÑпользовать\"?) вмеÑто \"sneak" -"\"(\"подкраÑтьÑÑ\"?) будет иÑпользоватьÑÑ Ð´Ð»Ñ climbing down and descending." +"ЕÑли включено, то Ð´Ð»Ñ ÑпуÑка будет иÑпользоватьÑÑ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° «ИÑпользовать», а " +"не «КраÑтьÑÑ»." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If enabled, actions are recorded for rollback.\n" "This option is only read when server starts." @@ -2403,17 +2839,16 @@ msgstr "" "Ðтот параметр ÑчитываетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при запуÑке Ñервера." #: src/settings_translation_file.cpp -#, fuzzy msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "" -"ЕÑли включено, отключаетÑÑ prevention(предупреждение?предотвращение?) " -"читерÑтва в мультиплеере." +msgstr "ЕÑли включено, отключаетÑÑ Ð·Ð°Ñ‰Ð¸Ñ‚Ð° от читерÑтва в Ñетевой игре." #: src/settings_translation_file.cpp msgid "" "If enabled, invalid world data won't cause the server to shut down.\n" "Only enable this if you know what you are doing." msgstr "" +"ЕÑли включено, то Ñервер не выключитÑÑ Ð¸Ð·-за повреждённых данных о мире.\n" +"Включайте только в том Ñлучае, еÑли знаете, что делаете." #: src/settings_translation_file.cpp msgid "If enabled, new players cannot join with an empty password." @@ -2421,6 +2856,11 @@ msgstr "" "ЕÑли включено, то новые игроки не Ñмогут подключатьÑÑ Ñ Ð¿ÑƒÑтым паролем." #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" +"ЕÑли включено, то показывать Ñообщение о ÑтатуÑе Ñервера при подключении." + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2434,7 +2874,6 @@ msgid "If this is set, players will always (re)spawn at the given position." msgstr "ЕÑли уÑтановлено, то игроки будут (ре)ÑпавнитьÑÑ Ð² указанной позиции." #: src/settings_translation_file.cpp -#, fuzzy msgid "Ignore world errors" msgstr "Игнорировать ошибки мира" @@ -2451,38 +2890,50 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Цвет фона внутриигровой конÑоли (R, G, B)." #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "Ð’Ñ‹Ñота внутриигрового чата, между 0.1 (10%) и 1.0 (100%)." + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "Клавиша ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾Ñти" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" msgstr "" +"ЗамерÑть вÑтроенные функции.\n" +"Обычно Ñто нужно тем, кто пишет код Ð´Ð»Ñ Ð´Ð²Ð¸Ð¶ÐºÐ°" #: src/settings_translation_file.cpp msgid "Instrument chatcommands on registration." -msgstr "" +msgstr "ЗамерÑть региÑтрируемые команды в чате." #: src/settings_translation_file.cpp msgid "" "Instrument global callback functions on registration.\n" "(anything you pass to a minetest.register_*() function)" msgstr "" +"ЗамерÑть глобальные обратные вызовы\n" +"(вÑÑ‘, что вы передаёте в функции вида minetest.register_*())" #: src/settings_translation_file.cpp msgid "" "Instrument the action function of Active Block Modifiers on registration." -msgstr "" +msgstr "ЗамерÑть дейÑтвие функции модификаторов активных блоков." #: src/settings_translation_file.cpp msgid "" "Instrument the action function of Loading Block Modifiers on registration." -msgstr "" +msgstr "ЗамерÑть дейÑтвие функции модификатора загружающихÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð²." #: src/settings_translation_file.cpp msgid "Instrument the methods of entities on registration." -msgstr "" +msgstr "ЗамерÑть методы ÑущноÑтей." #: src/settings_translation_file.cpp msgid "Instrumentation" -msgstr "" +msgstr "Замеры" #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." @@ -2493,8 +2944,12 @@ msgid "Interval of sending time of day to clients." msgstr "Интервал отправки клиентам Ñведений о времени днÑ." #: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "Хак Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñми в инвентаре" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" -msgstr "" +msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¾Ð² в инвентаре" #: src/settings_translation_file.cpp msgid "Inventory key" @@ -2513,20 +2968,32 @@ msgid "Item entity TTL" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ выброшенной вещи" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "Итерации" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" +"КоличеÑтво итераций рекурÑивной функции.\n" +"Контролирует количеÑтво мелких деталей." + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "Идентификатор джойÑтика" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "Тип джойÑтика" #: src/settings_translation_file.cpp -#, fuzzy msgid "Joystick button repetition interval" -msgstr "Интервал повторного клика правой кнопкой." +msgstr "Интервал повторного клика кнопкой джойÑтика" #: src/settings_translation_file.cpp -#, fuzzy msgid "Joystick frustum sensitivity" -msgstr "ЧувÑтвительноÑть мыши" +msgstr "ЧувÑтвительноÑть джойÑтика" #: src/settings_translation_file.cpp msgid "" @@ -2535,6 +3002,10 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" +"Только множеÑтво Жюлиа: Компонент W гиперкомплекÑной конÑтанты, определÑющий " +"форму фрактала Жюлиа.\n" +"Ðе влиÑет на 3D-фракталы.\n" +"Диапазон примерно от -2 до 2." #: src/settings_translation_file.cpp msgid "" @@ -2542,6 +3013,9 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Только множеÑтво Жюлиа: Компонент X гиперкомплекÑной конÑтанты, определÑющей " +"форму фрактала.\n" +"Диапазон примерно от -2 до 2." #: src/settings_translation_file.cpp msgid "" @@ -2549,6 +3023,9 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Только множеÑтво Жюлиа: Компонент Y гиперкомплекÑной конÑтанты, определÑющей " +"форму фрактала.\n" +"Диапазон примерно от -2 до 2." #: src/settings_translation_file.cpp msgid "" @@ -2556,6 +3033,25 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Только множеÑтво Жюлиа: Компонент Z гиперкомплекÑной конÑтанты, определÑющей " +"форму фрактала.\n" +"Диапазон примерно от -2 до 2." + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "Жюлиа w" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "Жюлиа x" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "Жюлиа y" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "Жюлиа z" #: src/settings_translation_file.cpp msgid "Jump key" @@ -2566,15 +3062,24 @@ msgid "Jumping speed" msgstr "СкороÑть прыжков" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for decreasing the viewing range.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Клавиша Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð¾Ð½Ñ‹ видимоÑти.\n" -"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr." +"Клавиша ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð´Ð¸Ñтанции видимоÑти.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавиша ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾Ñти.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2587,15 +3092,24 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for increasing the viewing range.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Клавиша Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð¾Ð½Ñ‹ видимоÑти.\n" -"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr." +"Клавиша ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¸Ñтанции видимоÑти.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавиша ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾Ñти.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2608,15 +3122,14 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for moving fast in fast mode.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Клавиша Ð´Ð»Ñ Ð±Ñ‹Ñтрого перемещениÑ.\n" -"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" +"Клавиша, Ð²ÐºÐ»ÑŽÑ‡Ð°ÑŽÑ‰Ð°Ñ Ñ€ÐµÐ¶Ð¸Ð¼ быÑтрого перемещениÑ.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2660,6 +3173,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавиша Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð·Ð²ÑƒÐºÐ° в игре.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2680,6 +3203,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавиша Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¾ÐºÐ½Ð° чата Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° локальных команд.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2704,6 +3237,29 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавиша Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ отладочных Ñтеков. ИÑпользуетÑÑ Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавиша выбора Ñледующего предмета в хотбаре.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавиша выбора предыдущего предмета в хотбаре.\n" +"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319" +"01735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2740,15 +3296,14 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling autorun.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Клавиша Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° быÑтрого перемещениÑ.\n" -"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" +"Клавиша Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° поÑтоÑнной ходьбы.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2801,15 +3356,14 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the camera update. Only used for development\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Клавиша Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð²Ð»ÐµÐ²Ð¾.\n" -"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" +"Клавиша Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¹ камеры. ИÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2853,10 +3407,24 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавиша Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð³Ð¾ чата.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавиша Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ°. ИÑпользуетÑÑ Ð´Ð»Ñ " +"разработки.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2869,8 +3437,26 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -msgid "Key use for climbing/descending" +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавиша режима увеличениÑ.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735" +"e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "Key use for climbing/descending" +msgstr "Клавиша Ð´Ð»Ñ Ð¿Ð¾Ð´ÑŠÐµÐ¼Ð°/ÑпуÑка" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "Крутизна озёр" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "Порог озёр" #: src/settings_translation_file.cpp msgid "Language" @@ -2878,11 +3464,15 @@ msgstr "Язык" #: src/settings_translation_file.cpp msgid "Large cave depth" -msgstr "" +msgstr "Глубина больших пещер" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "Кнопка вызова конÑоли" #: src/settings_translation_file.cpp msgid "Lava Features" -msgstr "" +msgstr "Лава" #: src/settings_translation_file.cpp msgid "Leaves style" @@ -2910,14 +3500,16 @@ msgid "" "Length of a server tick and the interval at which objects are generally " "updated over network." msgstr "" +"Длина Ñерверного тика и интервал, на котором объекты, как правило, " +"обновлÑÑŽÑ‚ÑÑ Ð¿Ð¾ Ñети." #: src/settings_translation_file.cpp msgid "Length of time between ABM execution cycles" -msgstr "" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ циклами Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð¾Ð² активных блоков" #: src/settings_translation_file.cpp msgid "Length of time between NodeTimer execution cycles" -msgstr "" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ циклами Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð¹Ð¼ÐµÑ€Ð¾Ð² узлов" #: src/settings_translation_file.cpp msgid "" @@ -2930,14 +3522,32 @@ msgid "" "- info\n" "- verbose" msgstr "" +"Уровень логов Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи в debug.txt:\n" +"- <nothing> (нет логов)\n" +"- none (ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÐµÐ· уровнÑ)\n" +"- error (ошибки)\n" +"- warning (предупреждениÑ)\n" +"- action (дейÑтвиÑ)\n" +"- info (информациÑ)\n" +"- verbose (подробноÑти)" #: src/settings_translation_file.cpp msgid "Limit of emerge queues on disk" -msgstr "" +msgstr "Ограничение очередей emerge на диÑке" #: src/settings_translation_file.cpp msgid "Limit of emerge queues to generate" +msgstr "Ограничение очередей emerge Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸" + +#: src/settings_translation_file.cpp +msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." msgstr "" +"Предел генерации карты, в узлах, во вÑех шеÑти направлениÑÑ… от (0, 0, 0).\n" +"ГенерируютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ блоки, которые умещаютÑÑ Ð² заданном пределе полноÑтью.\n" +"Значение ÑохранÑетÑÑ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ мира." #: src/settings_translation_file.cpp msgid "" @@ -2947,26 +3557,31 @@ msgid "" "- Downloads performed by main menu (e.g. mod manager).\n" "Only has an effect if compiled with cURL." msgstr "" +"Ограничивает количеÑтво параллельных HTTP-запроÑов. ВлиÑет на:\n" +"- Загрузку медиаданных, еÑли Ñервер иÑпользует параметр remote_media.\n" +"- Загрузку ÑпиÑка Ñерверов и их анонÑирование.\n" +"- Загрузки, выполнÑемые в главном меню (например, в менеджере модов).\n" +"ДейÑтвует только при компилÑции Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ð¾Ð¹ поддержкой cURL." #: src/settings_translation_file.cpp msgid "Liquid fluidity" -msgstr "" +msgstr "ТекучеÑть жидкоÑти" #: src/settings_translation_file.cpp msgid "Liquid fluidity smoothing" -msgstr "" +msgstr "Сглаживание текучеÑти жидкоÑтей" #: src/settings_translation_file.cpp msgid "Liquid loop max" -msgstr "" +msgstr "МакÑимальное количеÑтво зацикленных жидкоÑтей" #: src/settings_translation_file.cpp msgid "Liquid queue purge time" -msgstr "" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‡Ð¸Ñтки очереди жидкоÑтей" #: src/settings_translation_file.cpp msgid "Liquid sink" -msgstr "" +msgstr "Утекание воды" #: src/settings_translation_file.cpp msgid "Liquid update interval in seconds." @@ -2974,11 +3589,11 @@ msgstr "Интервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñтей в Ñекунд #: src/settings_translation_file.cpp msgid "Liquid update tick" -msgstr "" +msgstr "Интервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñтей" #: src/settings_translation_file.cpp msgid "Load the game profiler" -msgstr "" +msgstr "Загружать профилировщик игры" #: src/settings_translation_file.cpp msgid "" @@ -2986,15 +3601,17 @@ msgid "" "Provides a /profiler command to access the compiled profile.\n" "Useful for mod developers and server operators." msgstr "" +"Загружать профилировщик игры Ð´Ð»Ñ ÑÐ¾Ð±Ð¸Ñ€Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ð¸Ñ€ÑƒÑŽÑ‰ÐµÐ¹ информации.\n" +"ПредоÑтавлÑет команду /profiler Ð´Ð»Ñ Ð´Ð¾Ñтупа к Ñкомпилированному профилю.\n" +"Полезно Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð² модов и операторов Ñервера." #: src/settings_translation_file.cpp -#, fuzzy msgid "Loading Block Modifiers" -msgstr "ДальноÑть взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð±Ð»Ð¾ÐºÐ°Ð¼Ð¸" +msgstr "Модификаторы загружающихÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð²" #: src/settings_translation_file.cpp msgid "Main menu game manager" -msgstr "" +msgstr "Менеджер игр в главном меню" #: src/settings_translation_file.cpp msgid "Main menu mod manager" @@ -3013,13 +3630,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" +"ЗаÑтавлÑет DirectX работать Ñ LuaJIT. Отключите, еÑли Ñто вызывает проблемы." + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "Сделать вÑе жидкоÑти непрозрачными" #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Каталог ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ñ€Ñ‚" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Valleys.\n" "'altitude_chill' makes higher elevations colder, which may cause biome " @@ -3031,19 +3652,16 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" -"Параметры глобального генератора карты.\n" -"Ð’ генераторе карт v6 флаг 'decorations' управлÑет вÑем оформлением за " -"иÑключением деревьев\n" -" и junglegras(травы джунглей?), в оÑтальных генераторах Ñтот флаг управлÑет " -"вÑем оформлением.\n" -"Стандартные флаги, уÑтановленные в engine(инÑтрументе?) Ñледующие: caves, " -"light, decorations\n" -"Строка флагов изменÑет Ñтандартные наÑтройки engine(инÑтрумента?).\n" -"Флаги, не указанные в Ñтроке флагов, по умолчанию не изменÑÑŽÑ‚ÑÑ.\n" -"Флаги, начинающиеÑÑ Ñ 'no' иÑпользуютÑÑ Ð´Ð»Ñ Ð¸Ñ… Ñвного отключениÑ." +"Ðтрибуты генерации карты, отноÑÑщиеÑÑ Ðº Valleys.\n" +"'altitude_chill' делает выÑоты холоднее, что может привеÑти к проблемам Ñ " +"биомами.\n" +"'humid_rivers' изменÑет влажноÑть вокруг рек, и в облаÑÑ‚ÑÑ…, где ÑкапливаетÑÑ " +"вода,\n" +"он может вмешиватьÑÑ Ð² тонко наÑтроенные биомы.\n" +"Флаги, не указанные в Ñтроке флагов, оÑтаютÑÑ Ð² значении по умолчанию.\n" +"Флаги Ñ Ð¿Ñ€Ð¸Ñтавкой 'no' Ñвно отключают их." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen flat.\n" "Occasional lakes and hills can be added to the flat world.\n" @@ -3051,61 +3669,57 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" -"Параметры глобального генератора карты.\n" -"Ð’ генераторе карт v6 флаг 'decorations' управлÑет вÑем оформлением за " -"иÑключением деревьев\n" -" и junglegras(травы джунглей?), в оÑтальных генераторах Ñтот флаг управлÑет " -"вÑем оформлением.\n" -"Стандартные флаги, уÑтановленные в engine(инÑтрументе?) Ñледующие: caves, " -"light, decorations\n" -"Строка флагов изменÑет Ñтандартные наÑтройки engine(инÑтрумента?).\n" -"Флаги, не указанные в Ñтроке флагов, по умолчанию не изменÑÑŽÑ‚ÑÑ.\n" -"Флаги, начинающиеÑÑ Ñ 'no' иÑпользуютÑÑ Ð´Ð»Ñ Ð¸Ñ… Ñвного отключениÑ." +"Ðтрибуты генерации карты, отноÑÑщиеÑÑ Ðº генератору плоÑкой карты.\n" +"Случайные озёра и холмы могут быть добавлены в плоÑкий мир.\n" +"Флаги, не указанные в Ñтроке флагов, оÑтаютÑÑ Ð² значении по умолчанию.\n" +"Флаги Ñ Ð¿Ñ€Ð¸Ñтавкой 'no' Ñвно отключают их." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Ðтрибуты генерации карты, отноÑÑщиеÑÑ Ðº генератору карты верÑии 5.\n" +"Флаги, не указанные в Ñтроке флагов, оÑтаютÑÑ Ð² значении по умолчанию.\n" +"Флаги Ñ Ð¿Ñ€Ð¸Ñтавкой 'no' Ñвно отключают их." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" -"Параметры глобального генератора карты.\n" -"Ð’ генераторе карт v6 флаг 'decorations' управлÑет вÑем оформлением за " -"иÑключением деревьев\n" -" и junglegras(травы джунглей?), в оÑтальных генераторах Ñтот флаг управлÑет " -"вÑем оформлением.\n" -"Стандартные флаги, уÑтановленные в engine(инÑтрументе?) Ñледующие: caves, " -"light, decorations\n" -"Строка флагов изменÑет Ñтандартные наÑтройки engine(инÑтрумента?).\n" -"Флаги, не указанные в Ñтроке флагов, по умолчанию не изменÑÑŽÑ‚ÑÑ.\n" -"Флаги, начинающиеÑÑ Ñ 'no' иÑпользуютÑÑ Ð´Ð»Ñ Ð¸Ñ… Ñвного отключениÑ." +"Ðтрибуты генерации карты, отноÑÑщиеÑÑ Ðº генератору карты верÑии 6.\n" +"Флаг 'snowbiomes' включает новую ÑиÑтему биомов.\n" +"Когда включена Ð½Ð¾Ð²Ð°Ñ ÑиÑтема биомов, джунгли включаютÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки\n" +"и флаг 'jungles' игнорируетÑÑ.\n" +"Флаги, не указанные в Ñтроке флагов, оÑтаютÑÑ Ð² значении по умолчанию.\n" +"Флаги Ñ Ð¿Ñ€Ð¸Ñтавкой 'no' Ñвно отключают их." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" -"Параметры глобального генератора карты.\n" -"Ð’ генераторе карт v6 флаг 'decorations' управлÑет вÑем оформлением за " -"иÑключением деревьев\n" -" и junglegras(травы джунглей?), в оÑтальных генераторах Ñтот флаг управлÑет " -"вÑем оформлением.\n" -"Стандартные флаги, уÑтановленные в engine(инÑтрументе?) Ñледующие: caves, " -"light, decorations\n" -"Строка флагов изменÑет Ñтандартные наÑтройки engine(инÑтрумента?).\n" -"Флаги, не указанные в Ñтроке флагов, по умолчанию не изменÑÑŽÑ‚ÑÑ.\n" -"Флаги, начинающиеÑÑ Ñ 'no' иÑпользуютÑÑ Ð´Ð»Ñ Ð¸Ñ… Ñвного отключениÑ." +"Ðтрибуты генерации карты, отноÑÑщиеÑÑ Ðº генератору карты верÑии 7.\n" +"Флаг 'ridges' включает реки.\n" +"ПарÑщие оÑтрова ÑвлÑÑŽÑ‚ÑÑ ÑкÑпериментальными и могут изменÑтьÑÑ.\n" +"Флаги, не указанные в Ñтроке флагов, оÑтаютÑÑ Ð² значении по умолчанию.\n" +"Флаги Ñ Ð¿Ñ€Ð¸Ñтавкой 'no' Ñвно отключают их." #: src/settings_translation_file.cpp msgid "Map generation limit" -msgstr "" +msgstr "Предел генерации карты" #: src/settings_translation_file.cpp msgid "Map save interval" @@ -3113,28 +3727,23 @@ msgstr "Интервал ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ñ€Ñ‚Ñ‹" #: src/settings_translation_file.cpp msgid "Mapblock limit" -msgstr "" +msgstr "Предел блока" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "" +msgid "Mapblock mesh generation delay" +msgstr "Задержка в генерации мешей блоков" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen Valleys" -msgstr "Ðазвание генератора карты" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "Размер кÑша блоков в генераторе мешей в МБ" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "" +msgid "Mapblock unload timeout" +msgstr "Таймаут выгрузки блоков" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +msgid "Mapgen Valleys" +msgstr "Генератор карты Valleys" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3145,133 +3754,16 @@ msgid "Mapgen flags" msgstr "Флаги генератора карты" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen flat" -msgstr "Флаги генератора карты" +msgstr "Генератор плоÑкой карты" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat cave width" -msgstr "Флаги генератора карты" +msgid "Mapgen flat specific flags" +msgstr "Флаги генератора плоÑкой карты" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat flags" -msgstr "Флаги генератора карты" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat ground level" -msgstr "Флаги генератора карты" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake steepness" -msgstr "Повторение параллакÑа" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake threshold" -msgstr "Флаги генератора карты" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen fractal" -msgstr "Флаги генератора карты" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal cave width" -msgstr "Флаги генератора карты" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal fractal" -msgstr "Флаги генератора карты" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal iterations" -msgstr "Повторение параллакÑа" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal offset" -msgstr "Флаги генератора карты" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal scale" -msgstr "Флаги генератора карты" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal slice w" -msgstr "Флаги генератора карты" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" +msgstr "Генератор фрактальной карты" #: src/settings_translation_file.cpp msgid "Mapgen name" @@ -3282,178 +3774,56 @@ msgid "Mapgen v5" msgstr "Генератор карты верÑии 5" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen v5 cave width" -msgstr "Генератор карты верÑии 5" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" +msgid "Mapgen v5 specific flags" +msgstr "Флаги генератора карты верÑии 5" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "Генератор карты верÑии 6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" +msgid "Mapgen v6 specific flags" +msgstr "Флаги генератора карты верÑии 6" #: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "Генератор карты верÑии 7" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen v7 cave width" -msgstr "Генератор карты верÑии 7" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" +msgid "Mapgen v7 specific flags" +msgstr "Флаги генератора карты верÑии 7" #: src/settings_translation_file.cpp msgid "Massive cave depth" -msgstr "" +msgstr "Глубина огромных пещер" #: src/settings_translation_file.cpp msgid "Massive cave noise" -msgstr "" +msgstr "Шум огромных пещер" #: src/settings_translation_file.cpp msgid "Massive caves form here." -msgstr "" +msgstr "Огромные пещеры образуютÑÑ Ð·Ð´ÐµÑÑŒ." #: src/settings_translation_file.cpp msgid "Max block generate distance" -msgstr "" +msgstr "МакÑимальное раÑÑтоÑние генерации блоков" #: src/settings_translation_file.cpp msgid "Max block send distance" -msgstr "" +msgstr "МакÑимальное раÑÑтоÑние отправки блоков" #: src/settings_translation_file.cpp msgid "Max liquids processed per step." -msgstr "" +msgstr "МакÑимальное количеÑтво обработанных жидкоÑтей за шаг." #: src/settings_translation_file.cpp msgid "Max. clearobjects extra blocks" -msgstr "" +msgstr "КоличеÑтво дополнительно загружаемых блоков clearobjects" #: src/settings_translation_file.cpp msgid "Max. packets per iteration" -msgstr "" +msgstr "МакÑимальное количеÑтво пакетов за итерацию" #: src/settings_translation_file.cpp msgid "Maximum FPS" @@ -3465,7 +3835,7 @@ msgstr "МакÑимальный FPS в режиме паузы." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" -msgstr "" +msgstr "МакÑимальное количеÑтво принудительно загруженных блоков" #: src/settings_translation_file.cpp msgid "Maximum hotbar width" @@ -3473,38 +3843,45 @@ msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° хотбара" #: src/settings_translation_file.cpp msgid "Maximum number of blocks that are simultaneously sent in total." -msgstr "" +msgstr "МакÑимальное количеÑтво одновременно отправлÑемых блоков." #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum number of blocks that are simultaneously sent per client." msgstr "КоличеÑтво блоков, передаваемых одновременно Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клиента." #: src/settings_translation_file.cpp msgid "Maximum number of blocks that can be queued for loading." msgstr "" +"МакÑимальное количеÑтво блоков, которые могут быть помещены в очередь Ð´Ð»Ñ " +"загрузки." #: src/settings_translation_file.cpp msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "Set to blank for an appropriate amount to be chosen automatically." msgstr "" +"МакÑимальное количеÑтво блоков в очереди на генерацию. ОÑтавьте пуÑтым Ð´Ð»Ñ " +"автоматичеÑкого выбора подходÑщего значениÑ." #: src/settings_translation_file.cpp msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "Set to blank for an appropriate amount to be chosen automatically." msgstr "" +"МакÑимальное количеÑтво блоков в очереди на загрузку из файла. ОÑтавьте " +"пуÑтым Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого выбора подходÑщего значениÑ." #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." -msgstr "" +msgstr "МакÑимальное количеÑтво принудительно загруженных блоков." #: src/settings_translation_file.cpp msgid "" "Maximum number of mapblocks for client to be kept in memory.\n" "Set to -1 for unlimited amount." msgstr "" +"МакÑимальное количеÑтво блоков в памÑти клиента.\n" +"УÑтановите в -1 Ð´Ð»Ñ Ð±ÐµÑконечного количеÑтва." #: src/settings_translation_file.cpp msgid "" @@ -3512,36 +3889,44 @@ msgid "" "try reducing it, but don't reduce it to a number below double of targeted\n" "client number." msgstr "" +"МакÑимальное количеÑтво пакетов, отправлÑемых за шаг. ЕÑли у Ð²Ð°Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾Ðµ " +"подключение,\n" +"попробуйте уменьшить его, но не уÑтанавливайте ниже Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°, " +"умноженного на два." #: src/settings_translation_file.cpp msgid "Maximum number of players that can connect simultaneously." -msgstr "" +msgstr "МакÑимальное количеÑтво одновременно подключающихÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð²." #: src/settings_translation_file.cpp msgid "Maximum number of statically stored objects in a block." -msgstr "" +msgstr "МакÑимальное количеÑтво ÑтатичеÑки хранимых объектов в блоке." #: src/settings_translation_file.cpp msgid "Maximum objects per block" -msgstr "" +msgstr "МакÑимальное количеÑтво объектов на блок" #: src/settings_translation_file.cpp msgid "" "Maximum proportion of current window to be used for hotbar.\n" "Useful if there's something to be displayed right or left of hotbar." msgstr "" +"МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¾Ð»Ñ Ð¾ÐºÐ½Ð°, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ñ…Ð¾Ñ‚Ð±Ð°Ñ€Ð°.\n" +"Полезно, еÑли что-то будет отображатьÑÑ Ñправа или Ñлева от него." #: src/settings_translation_file.cpp msgid "Maximum simultaneous block sends per client" -msgstr "" +msgstr "МакÑимальное количеÑтво одновременных отправлений блоков на клиент" #: src/settings_translation_file.cpp msgid "Maximum simultaneous block sends total" -msgstr "" +msgstr "МакÑимальное количеÑтво одновременных отправлений блоков в общем" #: src/settings_translation_file.cpp msgid "Maximum time in ms a file download (e.g. a mod download) may take." msgstr "" +"МакÑимум времени (в миллиÑекундах), которое может занÑть загрузка (например, " +"мода)." #: src/settings_translation_file.cpp msgid "Maximum users" @@ -3553,21 +3938,19 @@ msgstr "Меню" #: src/settings_translation_file.cpp msgid "Mesh cache" -msgstr "" +msgstr "КÑш мешей" #: src/settings_translation_file.cpp -#, fuzzy msgid "Message of the day" -msgstr "Фраза днÑ" +msgstr "Сообщение днÑ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Message of the day displayed to players connecting." -msgstr "Фраза Ð´Ð½Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÐ¼Ð°Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ð²ÑˆÐ¸Ð¼ÑÑ Ð¸Ð³Ñ€Ð¾ÐºÐ°Ð¼." +msgstr "Сообщение, отображаемое подключившимÑÑ Ð¸Ð³Ñ€Ð¾ÐºÐ°Ð¼." #: src/settings_translation_file.cpp msgid "Method used to highlight selected object." -msgstr "" +msgstr "Метод подÑветки выделенного объекта." #: src/settings_translation_file.cpp msgid "Minimap" @@ -3578,41 +3961,51 @@ msgid "Minimap key" msgstr "Клавиша Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð¸Ð½Ð¸ÐºÐ°Ñ€Ñ‚Ñ‹" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimap scan height" msgstr "Ð’Ñ‹Ñота ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¸Ð½Ð¸ÐºÐ°Ñ€Ñ‚Ñ‹" #: src/settings_translation_file.cpp msgid "Minimum texture size for filters" -msgstr "" +msgstr "Минимальный размер текÑтуры Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð¾Ð²" #: src/settings_translation_file.cpp msgid "Mipmapping" msgstr "Mip-текÑтурирование (Мип-маппинг)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Modifies the size of the hudbar elements." +msgstr "ИзменÑет размер Ñлементов hudbar." + +#: src/settings_translation_file.cpp msgid "Modstore details URL" -msgstr "" +msgstr "URL информации о модах" #: src/settings_translation_file.cpp msgid "Modstore download URL" -msgstr "" +msgstr "URL Ð´Ð»Ñ ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð´Ð¾Ð²" #: src/settings_translation_file.cpp msgid "Modstore mods list URL" -msgstr "" +msgstr "URL ÑпиÑка модов" #: src/settings_translation_file.cpp -#, fuzzy msgid "Monospace font path" -msgstr "Путь моноширинного шрифта" +msgstr "Путь к моноширинному шрифту" #: src/settings_translation_file.cpp -#, fuzzy msgid "Monospace font size" msgstr "Размер моноширинного шрифта" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "Шум выÑоты гор" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "Шум гор" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "ЧувÑтвительноÑть мыши" @@ -3621,19 +4014,22 @@ msgid "Mouse sensitivity multiplier." msgstr "Множитель чувÑтвительноÑти мыши." #: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "Шум грÑзи" + +#: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" +"Множитель Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ падении.\n" +"Ðапример: 0 отключает покачивание; 1.0 Ð´Ð»Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð³Ð¾; 2.0 Ð´Ð»Ñ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð³Ð¾." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" +msgid "Mute key" +msgstr "Клавиша Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð·Ð²ÑƒÐºÐ°" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3669,17 +4065,14 @@ msgstr "" "Ðтот параметр будет переопределён, еÑли запуÑкать Ñервер Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ меню." #: src/settings_translation_file.cpp -#, fuzzy msgid "New users need to input this password." msgstr "Ðовым пользователÑм нужно вводить Ñтот пароль." #: src/settings_translation_file.cpp -#, fuzzy msgid "Noclip" msgstr "Отключить ÑтолкновениÑ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Noclip key" msgstr "Клавиша Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñтолкновений" @@ -3688,13 +4081,8 @@ msgid "Node highlighting" msgstr "ПодÑветка нод" #: src/settings_translation_file.cpp -#, fuzzy msgid "NodeTimer interval" -msgstr "Интервал отправки" - -#: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" +msgstr "Интервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÐ·Ð»Ð¾Ð²" #: src/settings_translation_file.cpp msgid "Noises" @@ -3702,15 +4090,15 @@ msgstr "Шумы" #: src/settings_translation_file.cpp msgid "Normalmaps sampling" -msgstr "" +msgstr "Выборка карт нормалей" #: src/settings_translation_file.cpp msgid "Normalmaps strength" -msgstr "" +msgstr "Сила карт нормалей" #: src/settings_translation_file.cpp msgid "Number of emerge threads" -msgstr "" +msgstr "КоличеÑтво emerge-потоков" #: src/settings_translation_file.cpp msgid "" @@ -3727,18 +4115,31 @@ msgid "" "This is a trade-off between sqlite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" +"КоличеÑтво дополнительных блоков, которые могут Ñразу быть загружены " +"/clearobjects.\n" +"Ðто компромиÑÑ Ð¼ÐµÐ¶Ð´Ñƒ накладными раÑходами на транзакции SQLite и " +"потреблением\n" +"памÑти (4096=100 MБ, как правило)." #: src/settings_translation_file.cpp msgid "Number of parallax occlusion iterations." -msgstr "" +msgstr "КоличеÑтво итераций Parallax Occlusion." + +#: src/settings_translation_file.cpp +msgid "Offset" +msgstr "Смещение" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "Ðепрозрачные жидкоÑти" #: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" +msgstr "Общее Ñмещение Ñффекта Parallax Occlusion, обычно маÑштаб/2." #: src/settings_translation_file.cpp msgid "Overall scale of parallax occlusion effect." -msgstr "" +msgstr "Общее Ñмещение Ñффекта Parallax Occlusion." #: src/settings_translation_file.cpp msgid "Parallax occlusion" @@ -3766,13 +4167,21 @@ msgstr "Сила параллакÑа" #: src/settings_translation_file.cpp msgid "Path to TrueTypeFont or bitmap." -msgstr "" +msgstr "Путь к шрифту TrueType или картинке Ñо шрифтом." #: src/settings_translation_file.cpp msgid "Path to save screenshots at." msgstr "Путь Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñкриншотов." #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" +"Путь к директории Ñ ÑˆÐµÐ¹Ð´ÐµÑ€Ð°Ð¼Ð¸. ЕÑли не задан, то будет иÑпользоватьÑÑ Ð¿ÑƒÑ‚ÑŒ " +"по умолчанию." + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" "Путь до каталога Ñ Ñ‚ÐµÐºÑтурами. Ð’Ñе текÑтуры в первую очередь берутÑÑ Ð¾Ñ‚ Ñюда." @@ -3795,7 +4204,7 @@ msgstr "Ð˜Ð¼Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ°" #: src/settings_translation_file.cpp msgid "Player transfer distance" -msgstr "" +msgstr "РаÑÑтоÑние передачи игрока" #: src/settings_translation_file.cpp msgid "Player versus Player" @@ -3821,22 +4230,24 @@ msgid "" "Print the engine's profiling data in regular intervals (in seconds). 0 = " "disable. Useful for developers." msgstr "" +"Печатать информацию о профилировании через заданные интервалы (в Ñекундах). " +"0 = отключить. Полезно Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð²." #: src/settings_translation_file.cpp msgid "Privileges that players with basic_privs can grant" -msgstr "" +msgstr "Привилегии, доÑтупные игрокам Ñ basic_privs" #: src/settings_translation_file.cpp msgid "Profiler" -msgstr "" +msgstr "Профилировщик" #: src/settings_translation_file.cpp msgid "Profiler toggle key" -msgstr "" +msgstr "Клавиша Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ°" #: src/settings_translation_file.cpp msgid "Profiling" -msgstr "" +msgstr "Профилирование" #: src/settings_translation_file.cpp msgid "" @@ -3847,10 +4258,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Raises terrain to make valleys around the rivers" -msgstr "" +msgstr "Поднимает меÑтноÑть, чтобы образовать долины вдоль рек" #: src/settings_translation_file.cpp -#, fuzzy msgid "Random input" msgstr "Случайный ввод" @@ -3860,14 +4270,13 @@ msgstr "Кнопка наÑтройки дальноÑти видимоÑти" #: src/settings_translation_file.cpp msgid "Remote media" -msgstr "" +msgstr "Удалённый медиаÑервер" #: src/settings_translation_file.cpp msgid "Remote port" msgstr "Удаленный порт" #: src/settings_translation_file.cpp -#, fuzzy msgid "Replaces the default main menu with a custom one." msgstr "ЗаменÑть главное меню на пользовательÑкое." @@ -3877,39 +4286,50 @@ msgid "Report path" msgstr "Путь к шрифту" #: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "Шум хребтов" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "Шум подводных хребтов" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° меню" #: src/settings_translation_file.cpp -#, fuzzy msgid "Rightclick repetition interval" -msgstr "Интервал повторного клика правой кнопкой." +msgstr "Интервал повторного клика правой кнопкой" #: src/settings_translation_file.cpp msgid "River Depth" -msgstr "" +msgstr "Глубина рек" #: src/settings_translation_file.cpp msgid "River Noise" -msgstr "" +msgstr "Шум рек" #: src/settings_translation_file.cpp msgid "River Size" -msgstr "" +msgstr "Размер рек" #: src/settings_translation_file.cpp msgid "River noise -- rivers occur close to zero" -msgstr "" +msgstr "Шум рек; реки вÑтречаютÑÑ Ð±Ð»Ð¸Ð¶Ðµ к нулю" #: src/settings_translation_file.cpp msgid "Rollback recording" -msgstr "" +msgstr "ЗапиÑÑŒ отката" #: src/settings_translation_file.cpp msgid "Round minimap" msgstr "ÐšÑ€ÑƒÐ³Ð»Ð°Ñ Ð¼Ð¸Ð½Ð¸ÐºÐ°Ñ€Ñ‚Ð°" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "ПеÑчаные плÑжи поÑвлÑÑŽÑ‚ÑÑ, когда np_beach превышает Ñто значение." + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "Сохранение карты, полученной от клиента на диÑк." @@ -3918,6 +4338,10 @@ msgid "Saving map received from server" msgstr "Сохранение карты, полученной Ñ Ñервера" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "МаÑштаб" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3925,6 +4349,12 @@ msgid "" "pixels when scaling down, at the cost of blurring some\n" "edge pixels when images are scaled by non-integer sizes." msgstr "" +"МаÑштабировать интерфейÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ пользователем значение.\n" +"ИÑпользовать метод ближайшего ÑоÑеда и антиалиаÑинг, чтобы маÑштабировать " +"интерфейÑ.\n" +"Ðто Ñгладит некоторые оÑтрые углы и Ñмешает пикÑели при уменьшении маÑштаба, " +"за Ñчет\n" +"Ñ€Ð°Ð·Ð¼Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¸ÐºÑелей на гранÑÑ… при маÑштабировании на нецелые размеры." #: src/settings_translation_file.cpp msgid "Screen height" @@ -3943,28 +4373,33 @@ msgid "Screenshot folder" msgstr "Каталог Ñо Ñкриншотами" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screenshot format" msgstr "Формат Ñкриншота" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screenshot quality" msgstr "КачеÑтво Ñкриншота" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Screenshot quality. Only used for JPEG format.\n" "1 means worst quality; 100 means best quality.\n" "Use 0 for default quality." msgstr "" "КачеÑтво Ñкриншота. ИÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ в формате JPEG.\n" -"1 означает плохое качеÑтво; 100 означает хорошее качеÑтво.\n" +"1 означает худшее качеÑтво; 100 означает лучшее качеÑтво.\n" "ИÑпользуйте 0 Ð´Ð»Ñ Ð½Ð°Ñтроек по умолчанию." #: src/settings_translation_file.cpp #, fuzzy +msgid "Seabed noise" +msgstr "Шум пещеры #1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "Второй из двух 3D-шумов, которые вмеÑте определÑÑŽÑ‚ туннели." + +#: src/settings_translation_file.cpp msgid "Security" msgstr "БезопаÑноÑть" @@ -3973,19 +4408,16 @@ msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Смотрите http://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp -#, fuzzy msgid "Selection box border color (R,G,B)." msgstr "Цвет рамки Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ (R, G, B)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Selection box color" msgstr "Цвет выделениÑ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Selection box width" -msgstr "Ширина рамки выделениÑ" +msgstr "Толщина рамки выделениÑ" #: src/settings_translation_file.cpp msgid "Server / Singleplayer" @@ -4012,6 +4444,10 @@ msgid "Server port" msgstr "Порт Ñервера" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "ОтÑечение невидимой геометрии на Ñтороне Ñервера" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "ÐÐ´Ñ€ÐµÑ ÑпиÑка Ñерверов" @@ -4020,51 +4456,54 @@ msgid "Serverlist file" msgstr "Файл ÑпиÑка Ñерверов" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set the language. Leave empty to use the system language.\n" "A restart is required after changing this." msgstr "" "УÑтановка Ñзыка. ОÑтавьте пуÑтым Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑиÑтемного Ñзыка.\n" -"Требует перезапуÑка поÑле уÑтановки." +"Требует перезапуÑка поÑле изменениÑ." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true enables waving leaves.\n" "Requires shaders to be enabled." msgstr "" "УÑтановка в true включает покачивание лиÑтвы.\n" -"Ðто требует включение шейдеров." +"Требует, чтобы шейдеры были включены." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true enables waving plants.\n" "Requires shaders to be enabled." msgstr "" "УÑтановка в true включает покачивание раÑтений.\n" -"Ðто требует включение шейдеров." +"Требует, чтобы шейдеры были включены." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true enables waving water.\n" "Requires shaders to be enabled." msgstr "" "УÑтановка в true включает волны на воде.\n" -"Ðто требует включение шейдеров." +"Требует, чтобы шейдеры были включены." + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "Путь к шейдерам" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" "Шейдеры позволÑÑŽÑ‚ иÑпользовать дополнительные визуальные Ñффекты и могут " "увеличить производительноÑть на некоторых видеокартах.\n" -"Они работают только Ñ Ð²Ð¸Ð´ÐµÐ¾ Ñерверной OpenGL." +"Они работают только Ñ Ð±Ñкендом OpenGL." + +#: src/settings_translation_file.cpp +msgid "Shadow limit" +msgstr "Лимит теней" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -4079,55 +4518,67 @@ msgid "Show entity selection boxes" msgstr "Показывать выделение Ñнтити" #: src/settings_translation_file.cpp -#, fuzzy msgid "Shutdown message" msgstr "Сообщение о выключении" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Size of chunks to be generated at once by mapgen, stated in mapblocks (16 " "nodes)." +msgstr "Размер чанка, генерируемого за один раз, указанный в блоках (16 узлов)." + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" +"Размер кÑша блоков в генераторе мешей. Увеличение Ñтого значениÑ\n" +"увеличит процент попаданий в кÑш, Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ðµ информации\n" +"из оÑновного потока игры, тем Ñамым ÑƒÐ¼ÐµÐ½ÑŒÑˆÐ°Ñ ÐºÐ¾Ð»ÐµÐ±Ð°Ð½Ð¸Ñ FPS." + +#: src/settings_translation_file.cpp +msgid "Slice w" msgstr "" -"Размер чанка, генерируемого за один раз, уÑтановленный в мапблоках (16 " -"кубиков)." #: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "Мелкие вариации влажноÑти Ð´Ð»Ñ ÑÐ¼ÐµÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð±Ð¸Ð¾Ð¼Ð¾Ð² на границах." + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "Мелкие вариации температуры Ð´Ð»Ñ ÑÐ¼ÐµÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð±Ð¸Ð¾Ð¼Ð¾Ð² на границах." + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "МÑгкое оÑвещение" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Smooths camera when looking around. Also called look or mouse smoothing.\n" "Useful for recording videos." msgstr "" -"Сглаживать Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹ при ходьбе и поворотах.\n" +"Сглаживать Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹ при её повороте. Также называетÑÑ Ñглаживанием " +"движений мыши.\n" "Ðто может быть полезно при запиÑи видео." #: src/settings_translation_file.cpp -#, fuzzy msgid "Smooths rotation of camera in cinematic mode. 0 to disable." -msgstr "" -"Плавное вращение камеры в кинематографичеÑком режиме. 0 Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ." +msgstr "Плавное вращение камеры в кинематографичеÑком режиме. 0 Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ." #: src/settings_translation_file.cpp -#, fuzzy msgid "Smooths rotation of camera. 0 to disable." msgstr "Плавное вращение камеры. 0 Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ." #: src/settings_translation_file.cpp -#, fuzzy msgid "Sneak key" msgstr "КраÑтьÑÑ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sound" msgstr "Звук" @@ -4145,22 +4596,28 @@ msgstr "" "Файлы, которых не будет, будут Ñкачены обычным путём." #: src/settings_translation_file.cpp -#, fuzzy msgid "Static spawnpoint" -msgstr "ПоÑтоÑнное меÑто Ñпавна" +msgstr "ПоÑтоÑÐ½Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° возрождениÑ" + +#: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "Сообщение ÑтатуÑа при подключении" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "Шум крутизны" #: src/settings_translation_file.cpp -#, fuzzy msgid "Strength of generated normalmaps." -msgstr "Генерировать карты нормалей" +msgstr "Сила Ñгенерированных карт нормалей." #: src/settings_translation_file.cpp msgid "Strength of parallax." -msgstr "" +msgstr "Сила параллакÑа." #: src/settings_translation_file.cpp msgid "Strict protocol checking" -msgstr "" +msgstr "Ð¡Ñ‚Ñ€Ð¾Ð³Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° протокола" #: src/settings_translation_file.cpp msgid "Support older servers" @@ -4168,13 +4625,33 @@ msgstr "Поддержка Ñтарых Ñерверов" #: src/settings_translation_file.cpp msgid "Synchronous SQLite" -msgstr "" +msgstr "Синхронный SQLite" + +#: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€ в биомах." #: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "Ð’Ñ‹Ñота меÑтноÑти" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "Базовый шум поверхноÑти" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "Шум выÑокой меÑтноÑти" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "Шум поверхноÑти" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4189,13 +4666,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Terrain persistence noise" +msgstr "Шум поÑтоÑнноÑти ландшафта" + +#: src/settings_translation_file.cpp msgid "Texture path" -msgstr "Пакеты текÑтур" +msgstr "Путь к текÑтурам" #: src/settings_translation_file.cpp msgid "The altitude at which temperature drops by 20C" -msgstr "" +msgstr "Ð’Ñ‹Ñота, на которой температура падает на 20 °C" #: src/settings_translation_file.cpp msgid "" @@ -4207,13 +4687,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "The depth of dirt or other filler" -msgstr "" +msgstr "Глубина земли или другого наполнителÑ" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." msgstr "" +"Путь к файлу отноÑительно пути к вашему миру, в который будут Ñохранены " +"профили." + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "Идентификатор иÑпользуемого джойÑтика" #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -4229,7 +4714,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "The rendering back-end for Irrlicht." -msgstr "" +msgstr "БÑкенд Irrlicht Ð´Ð»Ñ Ñ€ÐµÐ½Ð´ÐµÑ€Ð¸Ð½Ð³Ð°." #: src/settings_translation_file.cpp msgid "" @@ -4244,6 +4729,10 @@ msgid "" "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n" "set to the nearest valid value." msgstr "" +"Сила Ð·Ð°Ñ‚ÐµÐ½ÐµÐ½Ð¸Ñ Ambient Occlusion. Чем меньше, тем темнее,\n" +"и наоборот. Возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° - от 0.25 до 4.0\n" +"включительно. ЕÑли значение находитÑÑ Ð²Ð½Ðµ Ñтого диапазона,\n" +"то оно будет округлено до ближайшего корректного." #: src/settings_translation_file.cpp msgid "" @@ -4253,48 +4742,48 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The time in seconds it takes between repeated events\n" "when holding down a joystick button combination." -msgstr "Задержка в Ñекундах между кликами при зажатой правой кнопке мыши." +msgstr "" +"Ð’Ñ€ÐµÐ¼Ñ Ð² Ñекундах между повторÑющимиÑÑ ÑобытиÑми,\n" +"когда зажата ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº на джойÑтике." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The time in seconds it takes between repeated right clicks when holding the " "right mouse button." msgstr "Задержка в Ñекундах между кликами при зажатой правой кнопке мыши." #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "Тип джойÑтика" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "Ðтот шрифт будет иÑпользован Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ñзыков." #: src/settings_translation_file.cpp msgid "Time in between active block management cycles" -msgstr "" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ циклами ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼Ð¸ блоками" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Time in seconds for item entity (dropped items) to live.\n" "Setting it to -1 disables the feature." msgstr "" -"Ð’Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ выброшенных предметов.\n" +"Ð’Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ выброшенных предметов в Ñекундах.\n" "УÑтановите в -1 Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñтой функции." #: src/settings_translation_file.cpp -#, fuzzy msgid "Time send interval" -msgstr "Интервал отправки" +msgstr "Интервал отправки времени" #: src/settings_translation_file.cpp -#, fuzzy msgid "Time speed" msgstr "СкороÑть хода времени" #: src/settings_translation_file.cpp -#, fuzzy msgid "Timeout for client to remove unused map data from memory." msgstr "" "ВремÑ, поÑле которого клиент удалÑет из памÑти неиÑпользуемую информацию о " @@ -4307,24 +4796,28 @@ msgid "" "This determines how long they are slowed down after placing or removing a " "node." msgstr "" +"Чтобы уменьшить лаг, передача блоков замедлÑетÑÑ, когда игрок что-то Ñтроит." +"\n" +"Ðтот параметр определÑет, наÑколько она замедлÑетÑÑ Ð¿Ð¾Ñле Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ " +"ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑƒÐ·Ð»Ð°." #: src/settings_translation_file.cpp -#, fuzzy msgid "Toggle camera mode key" -msgstr "Клавиша Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° камеры." +msgstr "Клавиша Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° камеры" #: src/settings_translation_file.cpp -#, fuzzy msgid "Tooltip delay" -msgstr "Задержка подÑказки." +msgstr "Задержка подÑказки" + +#: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "Шум деревьев" #: src/settings_translation_file.cpp -#, fuzzy msgid "Trilinear filtering" msgstr "Ð¢Ñ€Ð¸Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "True = 256\n" "False = 128\n" @@ -4332,79 +4825,92 @@ msgid "" msgstr "" "True = 256\n" "False = 128\n" -"Полезно Ð´Ð»Ñ Ð¿Ð»Ð°Ð²Ð½Ð¾Ð¹ миникарты на медленных машинах." +"Полезно Ð´Ð»Ñ Ð¾Ð±ÐµÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð²Ð½Ð¾Ñти миникарты на медленных машинах." #: src/settings_translation_file.cpp -#, fuzzy msgid "Trusted mods" msgstr "Доверенные моды" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "Ð¢Ð¸Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота горной меÑтноÑти парÑщих оÑтровов." + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "URL ÑпиÑка Ñерверов, отображающийÑÑ Ð²Ð¾ вкладке Мультиплеер." #: src/settings_translation_file.cpp -msgid "Unlimited player transfer distance" +msgid "Undersampling" +msgstr "Undersampling" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." msgstr "" +"Undersampling похож на иÑпользование низкого Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñкрана, но он\n" +"применÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к игровому миру, оÑтавлÑÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð½ÐµÑ‚Ñ€Ð¾Ð½ÑƒÑ‚Ñ‹Ð¼.\n" +"Он должен дать ÑущеÑтвенное увеличение производительноÑти за Ñчёт менее " +"детального изображениÑ." + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "Ðеограниченное раÑÑтоÑние Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ°" #: src/settings_translation_file.cpp -#, fuzzy msgid "Unload unused server data" msgstr "Выгружать неиÑпользуемые Ñервером данные" #: src/settings_translation_file.cpp -#, fuzzy msgid "Use 3D cloud look instead of flat." msgstr "Объемные облака вмеÑто плоÑких." #: src/settings_translation_file.cpp -#, fuzzy msgid "Use a cloud animation for the main menu background." msgstr "Ðнимированные облака в главном меню." #: src/settings_translation_file.cpp -#, fuzzy msgid "Use anisotropic filtering when viewing at textures from an angle." -msgstr "ИÑпользовать анизатропную фильтрацию про взглÑде под углом." +msgstr "ИÑпользовать анизотропную фильтрацию про взглÑде на текÑтуры под углом." #: src/settings_translation_file.cpp -#, fuzzy msgid "Use bilinear filtering when scaling textures." msgstr "ИÑпользовать билинейную фильтрацию Ð´Ð»Ñ Ð¼Ð°ÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑтур." #: src/settings_translation_file.cpp -#, fuzzy msgid "Use key" -msgstr "нажмите клавишу" +msgstr "Клавиша ИÑпользовать" #: src/settings_translation_file.cpp -#, fuzzy msgid "Use mip mapping to scale textures. May slightly increase performance." msgstr "" -"ИÑпользовать мип-маппинг Ð´Ð»Ñ Ð¼Ð°ÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑтур. Может немного " -"увеличить производительноÑть." +"ИÑпользовать мипмаппинг Ð´Ð»Ñ Ð¼Ð°ÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑтур. Может немного увеличить " +"производительноÑть." #: src/settings_translation_file.cpp -#, fuzzy msgid "Use trilinear filtering when scaling textures." -msgstr "ИÑпользовать трилинейную фильтрацию Ð´Ð»Ñ Ð¼Ð°Ñштабировании текÑтур." +msgstr "ИÑпользовать трилинейную фильтрацию Ð´Ð»Ñ Ð¼Ð°ÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑтур." #: src/settings_translation_file.cpp -#, fuzzy msgid "V-Sync" -msgstr "V-Sync" +msgstr "Ð’ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑинхронизациÑ" #: src/settings_translation_file.cpp msgid "VBO" -msgstr "" +msgstr "VBO" #: src/settings_translation_file.cpp msgid "Valley Depth" -msgstr "" +msgstr "Глубина долин" #: src/settings_translation_file.cpp +#, fuzzy msgid "Valley Fill" -msgstr "" +msgstr "Заполнение долин" #: src/settings_translation_file.cpp msgid "Valley Profile" @@ -4412,53 +4918,88 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Valley Slope" -msgstr "" +msgstr "Уклон долин" #: src/settings_translation_file.cpp msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Vertical screen synchronization." -msgstr "Ð’ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑинхронизациÑ." +msgid "Variation of biome filler depth." +msgstr "Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ñ‹ Ð½Ð°Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»Ñ Ð±Ð¸Ð¾Ð¼Ð°." #: src/settings_translation_file.cpp -#, fuzzy -msgid "Video driver" -msgstr "Видео драйвер." +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" +"Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð²Ñ‹Ñоты холмов и глубин озёр на гладкой меÑтноÑти парÑщих оÑтровов." #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "Variation of maximum mountain height (in nodes)." +msgstr "Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð¼Ð°ÐºÑимальной выÑоты гор (в узлах)." + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва пещер." + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." msgstr "" +"Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð²ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ð¾Ñти.\n" +"ПоверхноÑть ÑтановитÑÑ Ð¿Ð¾Ñ‡Ñ‚Ð¸ плоÑкой, когда шум меньше -0.55." + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "Варьирует глубину поверхноÑтных узлов биома." #: src/settings_translation_file.cpp msgid "" -"View distance in nodes.\n" -"Min = 20" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." msgstr "" -"ДальноÑть отриÑовки в нодах.\n" -"Минимум = 20" +"Варьирует неровноÑть поверхноÑти.\n" +"ОпределÑет значение 'persistence' Ð´Ð»Ñ ÑˆÑƒÐ¼Ð¾Ð² terrain_base и terrain_alt." + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "Регулирует крутизну утёÑов." + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "Ð’ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑинхронизациÑ." + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "Видеодрайвер" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "КоÑффициент покачиваниÑ" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "ДальноÑть отриÑовки в узлах." #: src/settings_translation_file.cpp -#, fuzzy msgid "View range decrease key" -msgstr "Клавиша ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ диапазона." +msgstr "Клавиша ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ диапазона" #: src/settings_translation_file.cpp -#, fuzzy msgid "View range increase key" -msgstr "Клавиша ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ диапазона." +msgstr "Клавиша ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ диапазона" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "Клавиша режима увеличениÑ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Viewing range" -msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° дальноÑти отриÑовки." +msgstr "ДиÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ð¾Ñ‚Ñ€Ð¸Ñовки" #: src/settings_translation_file.cpp -#, fuzzy msgid "Volume" -msgstr "ГромкоÑть звука" +msgstr "ГромкоÑть" #: src/settings_translation_file.cpp msgid "" @@ -4473,9 +5014,8 @@ msgid "Walking speed" msgstr "СкороÑть ходьбы" #: src/settings_translation_file.cpp -#, fuzzy msgid "Water Features" -msgstr "ТекÑтуры предметов..." +msgstr "" #: src/settings_translation_file.cpp msgid "Water level" @@ -4486,17 +5026,14 @@ msgid "Water surface level of the world." msgstr "Уровень поверхноÑти воды мира." #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving Nodes" -msgstr "Покачивание лиÑтвы" +msgstr "Покачивание узлов" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving leaves" msgstr "Покачивание лиÑтвы" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving plants" msgstr "Покачивание раÑтений" @@ -4544,47 +5081,36 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." -msgstr "" +msgstr "РаÑÑинхронизировать ли анимацию текÑтур узлов в блоке." #: src/settings_translation_file.cpp msgid "" "Whether players are shown to clients without any range limit.\n" "Deprecated, use the setting player_transfer_distance instead." msgstr "" +"ПоказываютÑÑ Ð»Ð¸ клиентам игроки без Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ€Ð°ÑÑтоÑниÑ.\n" +"УÑтарело, иÑпользуйте параметр player_transfer_distance." #: src/settings_translation_file.cpp -#, fuzzy msgid "Whether to allow players to damage and kill each other." -msgstr "Разрешить игрокам ÑражатьÑÑ Ð´Ñ€ÑƒÐ³ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼." +msgstr "Разрешено ли игрокам наноÑить урон и убивать друг друга." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Whether to ask clients to reconnect after a (Lua) crash.\n" "Set this to true if your server is set up to restart automatically." msgstr "" -"Опрашивать клиентов Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле падениÑ.\n" -"УÑтановите Ñто еÑли ваш Ñервер наÑтроен на автоматичеÑкий перезапуÑк." +"ПроÑить ли клиентов переподключитьÑÑ Ð¿Ð¾Ñле ÑÐ±Ð¾Ñ Lua.\n" +"УÑтановите Ñто, еÑли ваш Ñервер наÑтроен на автоматичеÑкий перезапуÑк." #: src/settings_translation_file.cpp -#, fuzzy msgid "Whether to fog out the end of the visible area." -msgstr "Туман на границе видимого проÑтранÑтва." +msgstr "Затуманивать ли конец видимой облаÑти." #: src/settings_translation_file.cpp #, fuzzy @@ -4605,9 +5131,15 @@ msgid "Width component of the initial window size." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Width of the selectionbox's lines around nodes." -msgstr "Ширина обводки выбранных блоков." +msgstr "Толщина обводки выделенных узлов." + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -4624,18 +5156,141 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" -msgstr "cURL тайм-аут загрузки файла" +msgstr "Таймаут загрузки файла Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ cURL" #: src/settings_translation_file.cpp msgid "cURL parallel limit" -msgstr "" +msgstr "Лимит одновременных Ñоединений cURL" #: src/settings_translation_file.cpp msgid "cURL timeout" msgstr "cURL тайм-аут" +#~ msgid "Hide mp content" +#~ msgstr "Скрыть Ñодержимое модпака" + +#~ msgid "Start Game" +#~ msgstr "Ðачать игру" + +#~ msgid "Attn" +#~ msgstr "Внимание" + +#~ msgid "Capital" +#~ msgstr "Caps Lock" + +#~ msgid "Comma" +#~ msgstr "ЗапÑтаÑ" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Конец" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Кана" + +#~ msgid "Kanji" +#~ msgstr "Кандзи" + +#~ msgid "Minus" +#~ msgstr "МинуÑ" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Период" + +#~ msgid "Plus" +#~ msgstr "ПлюÑ" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Задает размеры пуÑтыней и плÑжей.\n" +#~ "Когда включены Ñнежные биомы, 'mgv6_freq_desert' игнорируетÑÑ." + +#, fuzzy +#~ msgid "Mapgen flat cave width" +#~ msgstr "Флаги генератора карты" + +#, fuzzy +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Флаги генератора карты" + +#, fuzzy +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Флаги генератора карты" + +#, fuzzy +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Повторение параллакÑа" + +#, fuzzy +#~ msgid "Mapgen fractal offset" +#~ msgstr "Флаги генератора карты" + +#, fuzzy +#~ msgid "Mapgen fractal scale" +#~ msgstr "Флаги генератора карты" + +#, fuzzy +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Флаги генератора карты" + +#, fuzzy +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Генератор карты верÑии 5" + +#, fuzzy +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Генератор карты верÑии 7" + #, fuzzy #~ msgid "" #~ "How many blocks are flying in the wire simultaneously for the whole " @@ -4667,15 +5322,9 @@ msgstr "cURL тайм-аут" #~ msgid "If enabled, " #~ msgstr "ЕÑли включено " -#~ msgid "Rendering:" -#~ msgstr "Рендеринг:" - #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "ПерезапуÑтите Minetest Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹" -#~ msgid "Game Name" -#~ msgstr "Ðазвание" - #~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\"" #~ msgstr "Gamemgr: Ðе могу Ñкопировать мод \"$1\" в игру \"$2\"" @@ -4730,9 +5379,6 @@ msgstr "cURL тайм-аут" #~ msgid "Add mod:" #~ msgstr "Добавить мод:" -#~ msgid "Local install" -#~ msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑƒÑтановка" - #~ msgid "" #~ "Warning: Some mods are not configured yet.\n" #~ "They will be enabled by default when you save the configuration. " diff --git a/po/sl/minetest.po b/po/sl/minetest.po new file mode 100644 index 000000000..1f7e81f93 --- /dev/null +++ b/po/sl/minetest.po @@ -0,0 +1,4684 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: minetest\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-06-02 20:32+0000\n" +"Last-Translator: praprot <pumpkin650@gmail.com>\n" +"Language-Team: Slovenian " +"<https://hosted.weblate.org/projects/minetest/minetest/sl/>\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 2.15-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Vstani od mrtvih" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Mrtev si." + +#: builtin/fstk/ui.lua +msgid "The server has requested a reconnect:" +msgstr "Server zahteva ponovno povezavo:" + +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "Glavni meni" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "Ponovna povezava" + +#: builtin/fstk/ui.lua +msgid "An error occured in a Lua script, such as a mod:" +msgstr "Napaka v Lua kodi:" + +#: builtin/fstk/ui.lua +msgid "An error occured:" +msgstr "PriÅ¡lo je do napake:" + +#: builtin/fstk/ui.lua builtin/mainmenu/store.lua +msgid "Ok" +msgstr "Ok" + +#: builtin/mainmenu/common.lua src/game.cpp +msgid "Loading..." +msgstr "Pripravljam..." + +#: builtin/mainmenu/common.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Ponovno poskusi omogoÄiti javen seznam serverjev in preveri svojo internetno " +"povezavo." + +#: builtin/mainmenu/common.lua +msgid "Server supports protocol versions between $1 and $2. " +msgstr "Server podpira protokolske verzije med $1 in $2. " + +#: builtin/mainmenu/common.lua +msgid "Server enforces protocol version $1. " +msgstr "Server prisiljuje protokol verzije $1. " + +#: builtin/mainmenu/common.lua +msgid "We support protocol versions between version $1 and $2." +msgstr "Mi podpiramo protokol verzije med $1 and $2." + +#: builtin/mainmenu/common.lua +msgid "We only support protocol version $1." +msgstr "Mi podpiramo samo protokol verzije $1." + +#: builtin/mainmenu/common.lua +msgid "Protocol version mismatch. " +msgstr "Verzija protokola se ne ujema. " + +#: builtin/mainmenu/dlg_config_world.lua +msgid "World:" +msgstr "Svet:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Mod:" +msgstr "Mod:" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Dependencies:" +msgstr "Odvisnosti:" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "Možnostne odvisnosti:" + +#: builtin/mainmenu/dlg_config_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp +msgid "Save" +msgstr "Shrani" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp +msgid "Cancel" +msgstr "PrekliÄi" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable MP" +msgstr "OnemogoÄi MP" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable MP" +msgstr "OmogoÄi MP" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "enabled" +msgstr "omogoÄeno" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "OnemogoÄi vse" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable all" +msgstr "OmogoÄi vse" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "" +"Failed to enable mod \"$1\" as it contains disallowed characters. Only " +"chararacters [a-z0-9_] are allowed." +msgstr "" +"NeuspeÅ¡na inÅ¡talacija \"$1\" vsebuje nedovoljene znake. Samo ti [a-z0-9_] " +"znaki so dovoljeni." + +#: builtin/mainmenu/dlg_create_world.lua +msgid "World name" +msgstr "Ime sveta" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Seed" +msgstr "Seme" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "Oblika sveta" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Game" +msgstr "Igra" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "Ustvari" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "You have no subgames installed." +msgstr "Igre manjkajo." + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Download one from minetest.net" +msgstr "Prenesi jih na minetest.net/customize" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Warning: The minimal development test is meant for developers." +msgstr "Opozorilo: Minimalni razvijaski test je namenjen razvijalcem." + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Download a subgame, such as minetest_game, from minetest.net" +msgstr "Prenesi igro, kot je minetest_game, na minetest.net" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "A world named \"$1\" already exists" +msgstr "Svet \"$1\" že obstaja" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "No worldname given or no game selected" +msgstr "Igra in ime sveta nista izbrana" + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Are you sure you want to delete \"$1\"?" +msgstr "Si prepriÄan, da želiÅ¡ zbrisati \"$1\"?" + +#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua +#: builtin/mainmenu/tab_local.lua src/keycode.cpp +msgid "Delete" +msgstr "ZbriÅ¡i" + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Modmgr: failed to delete \"$1\"" +msgstr "Modmgr: neuspeÅ¡en izbris \"$1\"" + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Modmgr: invalid modpath \"$1\"" +msgstr "Modmgr: napaÄna pot do \"$1\"" + +#: builtin/mainmenu/dlg_delete_world.lua +msgid "Delete World \"$1\"?" +msgstr "ZbriÅ¡i Svet \"$1\"?" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "Preimenuj Modpack:" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Accept" +msgstr "Potrdi" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Games" +msgstr "Igre" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua +msgid "Mods" +msgstr "Modifikacije" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "(No description of setting given)" +msgstr "(ni opisa izbrane nastavitve)" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a comma seperated list of flags." +msgstr "Prosim vstavi vejico loÄen seznam zastav." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Possible values are: " +msgstr "Možne vrednosti so: " + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "" +"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " +"<octaves>, <persistence>" +msgstr "" +"Format <odmik>, <velikost>, (<pomnožiX>, <pomnožiY>, <pomnožiZ>), <seme>, " +"<oktave>, <vztrajnost>" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Optionally the lacunarity can be appended with a leading comma." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Format is 3 numbers separated by commas and inside brackets." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Disabled" +msgstr "OnemogoÄeno" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "OmogoÄeno" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Browse" +msgstr "Brskaj" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid integer." +msgstr "Prosim vnesi veljavno celo Å¡tevilo." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "Vrednost mora biti vsaj $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "Vrednost ne sme biti veÄja od $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "Prosim vpiÅ¡i veljavno Å¡tevilko." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "\"$1\" is not a valid flag." +msgstr "\"$1\"ni veljavna zastava." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select path" +msgstr "Izberi pot" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "IÅ¡Äi" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "< Back to Settings page" +msgstr "< Nazaj do Nastavitev" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "Uredi" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "Obnovi privzete nastavitve" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Show technical names" +msgstr "Prikaži tehniÄna imena" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: file: \"$1\"" +msgstr "InÅ¡taliraj Mod: datoteka: \"$1\"" + +#: builtin/mainmenu/modmgr.lua +msgid "" +"\n" +"Install Mod: unsupported filetype \"$1\" or broken archive" +msgstr "" +"\n" +"InÅ¡taliraj modifikacijo: nepodprti tip datoteke \"$1\" ali pokvarjen arhiv" + +#: builtin/mainmenu/modmgr.lua +msgid "Failed to install $1 to $2" +msgstr "Neuspeh pri inÅ¡talaciji $1 do $2" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: unable to find suitable foldername for modpack $1" +msgstr "" +"InÅ¡talacija modifikacije: ne najdem ustrezne ime mape za paket modifikacij $1" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: unable to find real modname for: $1" +msgstr "InÅ¡taliraj modifikacijo: ne najdem pravega imena za modifikacijo $1" + +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "Modifikacija podiger" + +#: builtin/mainmenu/store.lua +msgid "Unsorted" +msgstr "NerazvrÅ¡Äeno" + +#: builtin/mainmenu/store.lua +msgid "Downloading $1, please wait..." +msgstr "PrenaÅ¡am $1, prosim poÄakaj..." + +#: builtin/mainmenu/store.lua +msgid "Successfully installed:" +msgstr "UspeÅ¡na inÅ¡talacija:" + +#: builtin/mainmenu/store.lua +msgid "Shortname:" +msgstr "Kratkoime:" + +#: builtin/mainmenu/store.lua +msgid "Rating" +msgstr "Ocena" + +#: builtin/mainmenu/store.lua +msgid "re-Install" +msgstr "re-inÅ¡talacija" + +#: builtin/mainmenu/store.lua +msgid "Install" +msgstr "InÅ¡talacija" + +#: builtin/mainmenu/store.lua +msgid "Close store" +msgstr "Zapri trgovino" + +#: builtin/mainmenu/store.lua +msgid "Page $1 of $2" +msgstr "Stran $1 od $2" + +#: builtin/mainmenu/tab_credits.lua +msgid "Credits" +msgstr "Krediti" + +#: builtin/mainmenu/tab_credits.lua +msgid "Core Developers" +msgstr "Glavni Razvijalci" + +#: builtin/mainmenu/tab_credits.lua +msgid "Active Contributors" +msgstr "Aktivni prostovoljci" + +#: builtin/mainmenu/tab_credits.lua +msgid "Previous Core Developers" +msgstr "PrejÅ¡ni glavni razvajalci" + +#: builtin/mainmenu/tab_credits.lua +msgid "Previous Contributors" +msgstr "PrejÅ¡ni prostovoljci" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Novo" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Nastavi" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Izberi svet:" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Ustvarjalni naÄin" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "OmogoÄi Å¡kodo" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "Objavi strežnik" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Ime/Geslo" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Vezani naslov" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Igraj" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Svet ni narejen niti izbran!" + +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" +msgstr "Lokalna igra" + +#: builtin/mainmenu/tab_mods.lua +msgid "Installed Mods:" +msgstr "InÅ¡talirane modifikacije:" + +#: builtin/mainmenu/tab_mods.lua +msgid "No mod description available" +msgstr "Modifikacija nima opisa" + +#: builtin/mainmenu/tab_mods.lua +msgid "Mod information:" +msgstr "Informacije o modifikaciji:" + +#: builtin/mainmenu/tab_mods.lua +msgid "Rename" +msgstr "Preimenuj" + +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected modpack" +msgstr "Odstrani izbrani paket modifikacij" + +#: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "Ni odvisnosti." + +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected mod" +msgstr "Odstrani izbrano modifikacijo" + +#: builtin/mainmenu/tab_mods.lua +msgid "Select Mod File:" +msgstr "Izberi datoteko modifikacije:" + +#: builtin/mainmenu/tab_online.lua +msgid "Address / Port" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Name / Password" +msgstr "Ime / Geslo" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Connect" +msgstr "Poveži" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Del. Favorite" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Favorite" +msgstr "Priljubljeno" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative mode" +msgstr "Ustvarjalni naÄin" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Damage enabled" +msgstr "Å koda omogoÄeno" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP omogoÄeno" + +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "Igraj preko spleta" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "Preprosti listi" + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua +msgid "None" +msgstr "Noben" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "Brez filtra" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "2x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "4x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "8x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Are you sure to reset your singleplayer world?" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Yes" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "3D Clouds" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Antialiasing:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Reset singleplayer world" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Change keys" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Advanced Settings" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Touchthreshold (px)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bump Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Normal Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Parallax Occlusion" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Water" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Plants" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "To enable shaders the OpenGL driver needs to be used." +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Settings" +msgstr "" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Start Singleplayer" +msgstr "" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Config mods" +msgstr "" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Main" +msgstr "" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "Select texture pack:" +msgstr "" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "No information available" +msgstr "" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "Texturepacks" +msgstr "" + +#: src/client.cpp +msgid "Connection timed out." +msgstr "" + +#: src/client.cpp +msgid "Loading textures..." +msgstr "" + +#: src/client.cpp +msgid "Rebuilding shaders..." +msgstr "" + +#: src/client.cpp +msgid "Initializing nodes..." +msgstr "" + +#: src/client.cpp +msgid "Initializing nodes" +msgstr "" + +#: src/client.cpp +msgid "Done!" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Main Menu" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Connection error (timed out?)" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Provided world path doesn't exist: " +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Could not find or load game \"" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Invalid gamespec." +msgstr "" + +#: src/fontengine.cpp +msgid "needs_fallback_font" +msgstr "" + +#: src/game.cpp +msgid "Shutting down..." +msgstr "" + +#: src/game.cpp +msgid "Creating server..." +msgstr "" + +#: src/game.cpp +msgid "Creating client..." +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "" + +#: src/game.cpp +msgid "Connecting to server..." +msgstr "" + +#: src/game.cpp +msgid "Item definitions..." +msgstr "" + +#: src/game.cpp +msgid "Node definitions..." +msgstr "" + +#: src/game.cpp +msgid "Media..." +msgstr "" + +#: src/game.cpp +msgid "KiB/s" +msgstr "" + +#: src/game.cpp +msgid "MiB/s" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp src/guiFormSpecMenu.cpp +msgid "ok" +msgstr "" + +#: src/game.cpp +msgid "" +"Default Controls:\n" +"No menu visible:\n" +"- single tap: button activate\n" +"- double tap: place/use\n" +"- slide finger: look around\n" +"Menu/Inventory visible:\n" +"- double tap (outside):\n" +" -->close\n" +"- touch stack, touch slot:\n" +" --> move stack\n" +"- touch&drag, tap 2nd finger\n" +" --> place single item to slot\n" +msgstr "" + +#: src/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse left: dig/punch\n" +"- Mouse right: place/use\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" +msgstr "" + +#: src/game.cpp +msgid "Continue" +msgstr "" + +#: src/game.cpp +msgid "Change Password" +msgstr "" + +#: src/game.cpp +msgid "Game paused" +msgstr "" + +#: src/game.cpp +msgid "Sound Volume" +msgstr "" + +#: src/game.cpp +msgid "Change Keys" +msgstr "" + +#: src/game.cpp +msgid "Exit to Menu" +msgstr "" + +#: src/game.cpp +msgid "Exit to OS" +msgstr "" + +#: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "- Address: " +msgstr "" + +#: src/game.cpp +msgid "Hosting server" +msgstr "" + +#: src/game.cpp +msgid "- Port: " +msgstr "" + +#: src/game.cpp +msgid "Singleplayer" +msgstr "" + +#: src/game.cpp +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Off" +msgstr "" + +#: src/game.cpp +msgid "- Damage: " +msgstr "" + +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +msgid "- Public: " +msgstr "" + +#: src/game.cpp +msgid "- Server Name: " +msgstr "" + +#: src/game.cpp +msgid "" +"\n" +"Check debug.txt for details." +msgstr "" + +#: src/guiFormSpecMenu.cpp +msgid "Proceed" +msgstr "" + +#: src/guiFormSpecMenu.cpp +msgid "Enter " +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "\"Use\" = climb down" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Backward" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Left" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Right" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Use" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Chat" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Command" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle Cinematic" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Print stacks" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Zoom" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Old Password" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "New Password" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Change" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + +#: src/guiVolumeChange.cpp +msgid "Sound Volume: " +msgstr "" + +#: src/guiVolumeChange.cpp +msgid "Exit" +msgstr "" + +#: src/keycode.cpp +msgid "Left Button" +msgstr "" + +#: src/keycode.cpp +msgid "Right Button" +msgstr "" + +#: src/keycode.cpp +msgid "Middle Button" +msgstr "" + +#: src/keycode.cpp +msgid "X Button 1" +msgstr "" + +#: src/keycode.cpp +msgid "X Button 2" +msgstr "" + +#: src/keycode.cpp +msgid "Back" +msgstr "" + +#: src/keycode.cpp +msgid "Tab" +msgstr "" + +#: src/keycode.cpp +msgid "Clear" +msgstr "" + +#: src/keycode.cpp +msgid "Return" +msgstr "" + +#: src/keycode.cpp +msgid "Shift" +msgstr "" + +#: src/keycode.cpp +msgid "Control" +msgstr "" + +#: src/keycode.cpp +msgid "Menu" +msgstr "" + +#: src/keycode.cpp +msgid "Pause" +msgstr "" + +#: src/keycode.cpp +msgid "Caps Lock" +msgstr "" + +#: src/keycode.cpp +msgid "Space" +msgstr "" + +#: src/keycode.cpp +msgid "Prior" +msgstr "" + +#: src/keycode.cpp +msgid "Next" +msgstr "" + +#: src/keycode.cpp +msgid "End" +msgstr "" + +#: src/keycode.cpp +msgid "Home" +msgstr "" + +#: src/keycode.cpp +msgid "Up" +msgstr "" + +#: src/keycode.cpp +msgid "Down" +msgstr "" + +#: src/keycode.cpp +msgid "Select" +msgstr "" + +#: src/keycode.cpp +msgid "Print" +msgstr "" + +#: src/keycode.cpp +msgid "Execute" +msgstr "" + +#: src/keycode.cpp +msgid "Snapshot" +msgstr "" + +#: src/keycode.cpp +msgid "Insert" +msgstr "" + +#: src/keycode.cpp +msgid "Help" +msgstr "" + +#: src/keycode.cpp +msgid "Left Windows" +msgstr "" + +#: src/keycode.cpp +msgid "Right Windows" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 0" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 1" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 2" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 3" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 4" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 5" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 6" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 7" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 8" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 9" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad *" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad +" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad ." +msgstr "" + +#: src/keycode.cpp +msgid "Numpad -" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad /" +msgstr "" + +#: src/keycode.cpp +msgid "Num Lock" +msgstr "" + +#: src/keycode.cpp +msgid "Scroll Lock" +msgstr "" + +#: src/keycode.cpp +msgid "Left Shift" +msgstr "" + +#: src/keycode.cpp +msgid "Right Shift" +msgstr "" + +#: src/keycode.cpp +msgid "Left Control" +msgstr "" + +#: src/keycode.cpp +msgid "Right Control" +msgstr "" + +#: src/keycode.cpp +msgid "Left Menu" +msgstr "" + +#: src/keycode.cpp +msgid "Right Menu" +msgstr "" + +#: src/keycode.cpp +msgid "IME Escape" +msgstr "" + +#: src/keycode.cpp +msgid "IME Convert" +msgstr "" + +#: src/keycode.cpp +msgid "IME Nonconvert" +msgstr "" + +#: src/keycode.cpp +msgid "IME Accept" +msgstr "" + +#: src/keycode.cpp +msgid "IME Mode Change" +msgstr "" + +#: src/keycode.cpp +msgid "Apps" +msgstr "" + +#: src/keycode.cpp +msgid "Sleep" +msgstr "" + +#: src/keycode.cpp +msgid "Erase EOF" +msgstr "" + +#: src/keycode.cpp +msgid "Play" +msgstr "" + +#: src/keycode.cpp +msgid "OEM Clear" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Player is able to fly without being affected by gravity.\n" +"This requires the \"fly\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Fast movement (via use key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Key use for climbing/descending" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, \"use\" key instead of \"sneak\" key is used for climbing down " +"and descending." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Always fly and fast" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If disabled \"use\" key is used to fly fast if both fly and fast mode are " +"enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rightclick repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated right clicks when holding the " +"right mouse button." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward movement (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable Joysticks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"ingame view frustum around." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Right key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autorun key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autorun.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for printing debug stacks. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Network" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Port to connect to (UDP).\n" +"Note that the port field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Support older servers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to support older servers before protocol version 25.\n" +"Enable if you want to connect to 0.4.12 servers and before.\n" +"Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n" +"Disabling this option will protect your password better." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Serverlist URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Serverlist file" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Graphics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-Game" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "VBO" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable VBO" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mipmapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use mip mapping to scale textures. May slightly increase performance." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Anisotropic filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use trilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Filtered textures can blend RGB values with fully-transparent neighbors,\n" +"which PNG optimizers usually discard, sometimes resulting in a dark or\n" +"light edge to transparent textures. Apply this filter to clean that up\n" +"at texture load time." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum texture size for filters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" +"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" +"enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Experimental option, might cause visible spaces between blocks\n" +"when set to higher number than 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shaders allow advanced visual effects and may increase performance on some " +"video cards.\n" +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables filmic tone mapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bumpmapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables bumpmapping for textures. Normalmaps need to be supplied by the " +"texture pack\n" +"or need to be auto-generated.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Generate normalmaps" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables on the fly normalmap generation (Emboss effect).\n" +"Requires bumpmapping to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Normalmaps strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of generated normalmaps." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Normalmaps sampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines sampling step of texture.\n" +"A higher value results in smoother normal maps." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables parallax occlusion mapping.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"0 = parallax occlusion with slope information (faster).\n" +"1 = relief mapping (slower, more accurate)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of parallax." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of parallax occlusion iterations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion Scale" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Overall scale of parallax occlusion effect." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion bias" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving water.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water length" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving plants.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If FPS would go higher than this, limit it by sleeping\n" +"to not waste CPU power for no benefit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS in pause menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height component of the initial window size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Full screen BPP" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "V-Sync" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view for zoom" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Field of view while zooming in degrees.\n" +"This requires the \"zoom\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" +"This setting is for the client only and is ignored by the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The rendering back-end for Irrlicht." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cloud height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height on which clouds are appearing." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Multiplier for fall bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D support.\n" +"Currently supported:\n" +"- none: no 3d output.\n" +"- anaglyph: cyan/magenta color 3d.\n" +"- interlaced: odd/even line based polarisation screen support.\n" +"- topbottom: split screen top/bottom.\n" +"- sidebyside: split screen side by side.\n" +"- pageflip: quadbuffer based 3d." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box border color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width of the selectionbox's lines around nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum proportion of current window to be used for hotbar.\n" +"Useful if there's something to be displayed right or left of hotbar." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Useable to make minimap smoother on slower machines." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n" +"set to the nearest valid value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Menus" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Scale gui by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter txr2img" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Freetype fonts" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether freetype fonts are used, requires freetype support to be compiled in." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to TrueTypeFont or bitmap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow offset, if 0 then shadow will not be drawn." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "This font will be used for certain languages." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to save screenshots at." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of mapblocks for client to be kept in memory.\n" +"Set to -1 for unlimited amount." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to show the client debug info (has the same effect as hitting F5)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server / Singleplayer" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Description of server, to be displayed when players join and in the " +"serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Domain name of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automaticaly report to the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Announce to this serverlist.\n" +"If you want to announce your ipv6 address, use serverlist_url = v6.servers." +"minetest.net." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disable escape sequences" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Disable escape sequences, e.g. chat coloring.\n" +"Use this if you want to run a server with pre-0.4.14 clients and you want to " +"disable\n" +"the escape sequences generated by mods." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Network port to listen (UDP).\n" +"This value will be overridden when starting from the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable to disallow old clients from connecting.\n" +"Older clients are compatible in the sense that they will not crash when " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" +"to IPv6 clients, depending on system configuration.\n" +"Ignored if bind_address is set." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that are simultaneously sent per client." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends total" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that are simultaneously sent in total." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Default game when creating a new world.\n" +"This will be overridden when creating a world from the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can connect simultaneously." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"World directory (everything in the world is stored here).\n" +"Not needed if starting from the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"A chosen map seed for a new map, leave empty for random.\n" +"Will be overridden when creating a new world in the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "New users need to input this password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The privileges that new users automatically get.\n" +"See /privs in game for a full list on your server and mod configuration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic Privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether players are shown to clients without any range limit.\n" +"Deprecated, use the setting player_transfer_distance instead." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player versus Player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If enabled, new players cannot join with an empty password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rollback recording" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, actions are recorded for rollback.\n" +"This option is only read when server starts." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server crashes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ask to reconnect after crash" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to ask clients to reconnect after a (Lua) crash.\n" +"Set this to true if your server is set up to restart automatically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How large area of blocks are subject to the active block stuff, stated in " +"mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Interval of sending time of day to clients." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays " +"unchanged." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Interval of saving important changes in the world, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration in air" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crouch speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Climbing speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Descending speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid sink" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gravity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated lua api calls:\n" +"- legacy: (try to) mimic old behaviour (default for release).\n" +"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of extra blocks that can be loaded by /clearobjects at once.\n" +"This is a trade-off between sqlite transaction overhead and\n" +"memory consumption (4096=100MB, as a rule of thumb)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How much the server will wait before unloading unused mapblocks.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over network." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Management interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time in between active block management cycles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifier interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Length of time between ABM execution cycles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Length of time between NodeTimer execution cycles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, invalid world data won't cause the server to shut down.\n" +"Only enable this if you know what you are doing." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Global map generation attributes.\n" +"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" +"and junglegrass, in all other mapgens this flag controls all decorations.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of chunks to be generated at once by mapgen, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug infos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Absolute limit of emerge queues" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Limit of emerge queues on disk" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks to be queued that are to be loaded from file.\n" +"Set to blank for an appropriate amount to be chosen automatically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Limit of emerge queues to generate" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks to be queued that are to be generated.\n" +"Set to blank for an appropriate amount to be chosen automatically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use. Make this field blank, or increase this " +"number\n" +"to use multiple threads. On multiprocessor systems, this will improve mapgen " +"speed greatly\n" +"at the cost of slightly buggy caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v5" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v5 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls width of tunnels, a smaller value creates wider tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v6 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v7" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v7 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen flat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen flat specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen flat.\n" +"Occasional lakes and hills can be added to the flat world.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large pseudorandom caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/depth of lake depressions." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen fractal" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Choice of 18 fractals from 9 formulas.\n" +"1 = 4D \"Roundy\" mandelbrot set.\n" +"2 = 4D \"Roundy\" julia set.\n" +"3 = 4D \"Squarry\" mandelbrot set.\n" +"4 = 4D \"Squarry\" julia set.\n" +"5 = 4D \"Mandy Cousin\" mandelbrot set.\n" +"6 = 4D \"Mandy Cousin\" julia set.\n" +"7 = 4D \"Variation\" mandelbrot set.\n" +"8 = 4D \"Variation\" julia set.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot set.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" julia set.\n" +"11 = 3D \"Christmas Tree\" mandelbrot set.\n" +"12 = 3D \"Christmas Tree\" julia set.\n" +"13 = 3D \"Mandelbulb\" mandelbrot set.\n" +"14 = 3D \"Mandelbulb\" julia set.\n" +"15 = 3D \"Cosine Mandelbulb\" mandelbrot set.\n" +"16 = 3D \"Cosine Mandelbulb\" julia set.\n" +"17 = 4D \"Mandelbulb\" mandelbrot set.\n" +"18 = 4D \"Mandelbulb\" julia set." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Controls the amount of fine detail." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Approximate (X,Y,Z) scale of fractal in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n" +"Used to move a suitable spawn area of low land close to (0, 0).\n" +"The default is suitable for mandelbrot sets, it needs to be edited for julia " +"sets.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"W co-ordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: X component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: Y component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: Z component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: W component of hypercomplex constant determining julia " +"shape.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valleys C Flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill' makes higher elevations colder, which may cause biome " +"issues.\n" +"'humid_rivers' modifies the humidity around rivers and in areas where water " +"would tend to pool,\n" +"it may interfere with delicately adjusted biomes.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Altitude Chill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The altitude at which temperature drops by 20C" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lava Features" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Creates unpredictable lava features in caves.\n" +"These can make mining difficult. Zero disables them. (0-10)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Massive cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find massive caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River Depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River Size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "How wide to make rivers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water Features" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Creates unpredictable water features in caves.\n" +"These can make mining difficult. Zero disables them. (0-10)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Caves and tunnels form at the intersection of the two noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler Depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The depth of dirt or other filler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Massive cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Massive caves form here." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River Noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River noise -- rivers occur close to zero" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain Height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base terrain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Fill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Profile" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amplifies the valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Slope" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of trusted mods that are allowed to access insecure\n" +"functions even when mod security is on (via request_insecure_environment())." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HTTP Mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of mods that are allowed to access HTTP APIs, which\n" +"allow them to upload and download data to/from the internet." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrumentation" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chatcommands" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument chatcommands on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Global callbacks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Builtin" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the language. Leave empty to use the system language.\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 support." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Default timeout for cURL, stated in milliseconds.\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL file download timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "High-precision FPU" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu game manager" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu mod manager" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modstore download URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modstore mods list URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modstore details URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds). 0 = " +"disable. Useful for developers." +msgstr "" diff --git a/po/sr_Cyrl/minetest.po b/po/sr_Cyrl/minetest.po index eea83a67c..8eef1ddf2 100644 --- a/po/sr_Cyrl/minetest.po +++ b/po/sr_Cyrl/minetest.po @@ -7,18 +7,26 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-07-13 09:50+0000\n" -"Last-Translator: lisacvuk <lisacvukhome@gmail.com>\n" -"Language-Team: Serbian (cyrillic) <https://hosted.weblate.org/projects/" -"minetest/minetest/sr_Cyrl/>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-06-02 14:47+0000\n" +"Last-Translator: Лазар Вукановић <gavranvukhome@gmail.com>\n" +"Language-Team: Serbian (cyrillic) " +"<https://hosted.weblate.org/projects/minetest/minetest/sr_Cyrl/>\n" "Language: sr_Cyrl\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 2.8-dev\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 2.15-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Врати Ñе у живот" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Умро/ла Ñи." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -78,12 +86,13 @@ msgstr "Ми подржавамо верзије протокола између #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Прекини" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "ЗавиÑи од:" #: builtin/mainmenu/dlg_config_world.lua @@ -91,6 +100,11 @@ msgid "Disable MP" msgstr "Онемогући мод-паковање" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Онемогући мод-паковање" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Омогући мод-паковање" @@ -107,17 +121,13 @@ msgstr "" "Ñимболи [a-z0-9_] Ñу дозвољени." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Сакриј игру" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Сакриј Ñадржину мод-паковања" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Мод:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -180,8 +190,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Да ли Ñте Ñигурни да желите да обришете \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Обриши" @@ -197,7 +206,7 @@ msgstr "Modmgr: локација мода \"$1\" није валидна" msgid "Delete World \"$1\"?" msgstr "Обриши Ñвет \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Прихвати" @@ -255,7 +264,7 @@ msgstr "Модови" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Optionally the lacunarity can be appended with a leading comma." -msgstr "" +msgstr "Опоцијоно, лацунарноÑÑ‚ Ñе може додати Ñа зарезом." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a comma seperated list of flags." @@ -277,6 +286,11 @@ msgstr "Могуће вредноÑти Ñу: " msgid "Restore Default" msgstr "Поврати уобичајено" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Тражи" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Одабери локацију" @@ -286,11 +300,13 @@ msgid "Show technical names" msgstr "Прикажи техничка имена" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "ВредноÑÑ‚ мора бити већа од $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "ВредноÑÑ‚ мора бити мања од $1." #: builtin/mainmenu/modmgr.lua @@ -319,6 +335,10 @@ msgstr "" "ИнÑталирај мод: не може Ñе пронаћи одговарајуће име за фаÑциклу мод-паковања " "$1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Затвори Ñкладиште" @@ -340,10 +360,6 @@ msgid "Rating" msgstr "Оцена" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Тражи" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Краће име:" @@ -379,6 +395,70 @@ msgstr "Предходни Ñарадници" msgid "Previous Core Developers" msgstr "Предходни главни развијачи" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Вежи адреÑу" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "ПодеÑи" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Слободни мод" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Омогући оштећење" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Сакриј игру" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Сервер" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Почни игру" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Име/Шифра" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Ðови" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Ðиједан Ñвет није направљен или изабран!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Почни игру" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Порт" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Одабери Ñвет:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "СерверÑки порт" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "ИнÑталирани модови:" @@ -388,6 +468,10 @@ msgid "Mod information:" msgstr "Информације о моду:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Ðије доÑтупан Ð¾Ð¿Ð¸Ñ Ð¼Ð¾Ð´Ð°" @@ -407,95 +491,45 @@ msgstr "Уклони изабрани мод" msgid "Uninstall selected modpack" msgstr "Уклони одабрано мод-паковање" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "ÐдреÑа / Порт" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Клијент" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Прикључи Ñе" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Слободни мод" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Оштећење омогућено" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Обриши Омиљени" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Омиљени" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Име / Шифра" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Туча омогућена" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Вежи адреÑу" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "ПодеÑи" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Слободни мод" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Омогући оштећење" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Име/Шифра" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Ðови" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Ðиједан Ñвет није направљен или изабран!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Порт" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Јавни" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Одабери Ñвет:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Сервер" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "СерверÑки порт" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Почни игру" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "Туча омогућена" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -526,6 +560,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Да ли Ñте Ñигурни да желите да реÑетујете ваш Ñвет?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Билинеарни филтер" @@ -602,6 +640,10 @@ msgid "Reset singleplayer world" msgstr "РеÑетуј Ñвет" #: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "ПоÑтавке" @@ -665,14 +707,6 @@ msgstr "Главно" msgid "Start Singleplayer" msgstr "Започни игру за једног играча" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Играј" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Један играч" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Ðема доÑтупних информација" @@ -735,12 +769,16 @@ msgid "Player name too long." msgstr "Име играча је предуачко." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Дата локација Ñвета не поÑтоји: " #: src/fontengine.cpp msgid "needs_fallback_font" -msgstr "" +msgstr "Потребан резервни фонт" #: src/game.cpp msgid "" @@ -751,6 +789,43 @@ msgstr "" "Проверите debug.txt за више детаља." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Вежи адреÑу" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Слободни мод" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Омогући оштећење" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Порт" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Јавни" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +msgid "- Server Name: " +msgstr "" + +#: src/game.cpp msgid "Change Keys" msgstr "ПодеÑи контроле" @@ -767,26 +842,22 @@ msgid "Continue" msgstr "ÐаÑтави" #: src/game.cpp -msgid "Creating client..." -msgstr "Правим клијента..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Правим Ñервер..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Уобичајене контроле:\n" "- WASD: кретање\n" @@ -801,6 +872,14 @@ msgstr "" "- T: причање\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Правим клијента..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Правим Ñервер..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -837,6 +916,20 @@ msgid "Exit to OS" msgstr "Изађи из програма" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Игре" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Правим Ñервер..." + +#: src/game.cpp msgid "Item definitions..." msgstr "Дефиниције предмета..." @@ -857,24 +950,45 @@ msgid "Node definitions..." msgstr "Дефиниције блокова..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Разлучујем адреÑу..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Врати Ñе у живот" +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Разлучујем адреÑу..." #: src/game.cpp msgid "Shutting down..." msgstr "ИÑкључивање..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Један играч" + +#: src/game.cpp msgid "Sound Volume" msgstr "Јачина звука" #: src/game.cpp -msgid "You died." -msgstr "Умро/ла Ñи." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -909,6 +1023,10 @@ msgid "Console" msgstr "Конзола" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Дупли Ñкок за летење" @@ -921,6 +1039,11 @@ msgid "Forward" msgstr "Ðапред" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Јачина звука" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Инвентар" @@ -942,6 +1065,24 @@ msgstr "" msgid "Left" msgstr "Лево" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Чат команде" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Следеће" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Прикажи stack-ове" @@ -1019,38 +1160,22 @@ msgid "Apps" msgstr "Ðпликације" #: src/keycode.cpp -msgid "Attn" -msgstr "Ðттн" - -#: src/keycode.cpp msgid "Back" msgstr "Ðазад" #: src/keycode.cpp -msgid "Capital" -msgstr "Главно" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "ОчиÑти" #: src/keycode.cpp -msgid "Comma" -msgstr "Зарез" - -#: src/keycode.cpp msgid "Control" msgstr "Контрола" #: src/keycode.cpp -msgid "Convert" -msgstr "Конвертуј" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "ЦрСел" - -#: src/keycode.cpp msgid "Down" msgstr "Доле" @@ -1059,26 +1184,15 @@ msgid "End" msgstr "Крај" #: src/keycode.cpp -msgid "Erase OEF" -msgstr "" - -#: src/keycode.cpp -msgid "Escape" -msgstr "Побегни" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "" +#, fuzzy +msgid "Erase EOF" +msgstr "БриÑање иÑкључено" #: src/keycode.cpp msgid "Execute" msgstr "Изврши" #: src/keycode.cpp -msgid "Final" -msgstr "Крајњи" - -#: src/keycode.cpp msgid "Help" msgstr "Помоћ" @@ -1087,20 +1201,33 @@ msgid "Home" msgstr "Кућа" #: src/keycode.cpp -msgid "Insert" -msgstr "Убаци" +#, fuzzy +msgid "IME Accept" +msgstr "Прихвати" #: src/keycode.cpp -msgid "Junja" -msgstr "" +#, fuzzy +msgid "IME Convert" +msgstr "Конвертуј" #: src/keycode.cpp -msgid "Kana" -msgstr "" +#, fuzzy +msgid "IME Escape" +msgstr "Побегни" #: src/keycode.cpp -msgid "Kanji" -msgstr "" +#, fuzzy +msgid "IME Mode Change" +msgstr "Промена мода" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "Ðе конвертуј" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Убаци" #: src/keycode.cpp msgid "Left Button" @@ -1131,22 +1258,10 @@ msgid "Middle Button" msgstr "Средње дугме" #: src/keycode.cpp -msgid "Minus" -msgstr "МинуÑ" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Промена мода" - -#: src/keycode.cpp msgid "Next" msgstr "Следеће" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Ðе конвертуј" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Закључавање нумеричке таÑтатуре" @@ -1163,6 +1278,11 @@ msgid "Numpad -" msgstr "Ðумеричка таÑтатура -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Ðумеричка таÑтатура *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Ðумеричка таÑтатура /" @@ -1211,20 +1331,12 @@ msgid "OEM Clear" msgstr "ОЕМ очиÑти" #: src/keycode.cpp -msgid "PA1" -msgstr "" - -#: src/keycode.cpp msgid "Pause" msgstr "ЗауÑтави" #: src/keycode.cpp -msgid "Period" -msgstr "Тачка" - -#: src/keycode.cpp -msgid "Plus" -msgstr "ПлуÑ" +msgid "Play" +msgstr "Играј" #: src/keycode.cpp msgid "Print" @@ -1276,7 +1388,7 @@ msgstr "Спавај" #: src/keycode.cpp msgid "Snapshot" -msgstr "" +msgstr "Сачувана Ñлика" #: src/keycode.cpp msgid "Space" @@ -1318,13 +1430,29 @@ msgid "" "0 = parallax occlusion with slope information (faster).\n" "1 = relief mapping (slower, more accurate)." msgstr "" +"0 = parallax occlusion Ñа информацијама о нагибима (брже)\n" +"1 = мапирање рељефа (Ñпорије, прецизније)." #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "" +msgstr "Тродимензионални облаци" #: src/settings_translation_file.cpp msgid "3D mode" +msgstr "Тродимензионални мод" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." msgstr "" #: src/settings_translation_file.cpp @@ -1338,48 +1466,58 @@ msgid "" "- sidebyside: split screen side by side.\n" "- pageflip: quadbuffer based 3d." msgstr "" +"3D подршка.\n" +"Тренутно подржано:\n" +"- none: Ðикакав тродимензионални излаз\n" +"- anaglyph: Цијан/Магента боја 3D\n" +"- interlaced: Парна/Ðепарна линија базирана поларизација\n" +"- topbottom: Подели екран горе/доле.\n" +"- sidebyside: Лево/ДеÑно подела екрана.\n" +"- pageflip: Четвородупли буфер 3D." #: src/settings_translation_file.cpp msgid "" "A chosen map seed for a new map, leave empty for random.\n" "Will be overridden when creating a new world in the main menu." msgstr "" +"Изабрано Ñеме за нову мапу, оÑтавите празно за наÑумично.\n" +"Биће препиÑано када Ñе прави нови Ñвет у менију." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." -msgstr "" +msgstr "Порука приказана Ñвим играчима када Ñе Ñервер обори." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" +msgstr "Порука приказана Ñвим играчима када Ñе Ñервер иÑкључи." #: src/settings_translation_file.cpp msgid "Absolute limit of emerge queues" -msgstr "" +msgstr "ÐбÑолутни лимит emerge токова." #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "Убрзање у ваздуху" #: src/settings_translation_file.cpp msgid "Active Block Management interval" -msgstr "" +msgstr "Интервал менаџмента активног блока" #: src/settings_translation_file.cpp msgid "Active Block Modifier interval" -msgstr "" +msgstr "Интервал модификатора активног блока" #: src/settings_translation_file.cpp msgid "Active Block Modifiers" -msgstr "" +msgstr "Модификатори активног блока" #: src/settings_translation_file.cpp msgid "Active block range" -msgstr "" +msgstr "Даљина активног блока" #: src/settings_translation_file.cpp msgid "Active object send range" -msgstr "" +msgstr "Даљина Ñлања активног блока" #: src/settings_translation_file.cpp msgid "" @@ -1387,22 +1525,34 @@ msgid "" "Leave this blank to start a local server.\n" "Note that the address field in the main menu overrides this setting." msgstr "" +"ÐдреÑа за конекцију.\n" +"ОÑтавите ово празно за локални Ñервер.\n" +"Пазите да поље за адреÑу у менију препиÑује ово подешавање." + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "Додаје чеÑтице када Ñе блок иÑкопа." #: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "" +"ПодеÑи dpi конфигурацију за твој екран (Ñамо за оне који ниÑу X11/Android) " +"нпр. за 4k екране." #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" +"ПодеÑи оÑветљење унутар игре. Веће вредноÑти Ñу Ñветлије.\n" +"Ово подешавање је Ñамо за клијента, Ñервер га игнорише." #: src/settings_translation_file.cpp msgid "Advanced" -msgstr "" +msgstr "Ðапредно" #: src/settings_translation_file.cpp msgid "Altitude Chill" @@ -1410,7 +1560,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Always fly and fast" -msgstr "" +msgstr "Увек летење и брзина" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" @@ -1421,12 +1571,20 @@ msgid "Amplifies the valleys" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" +"Само за Ðндроид ÑиÑтеме: Покушава да направи текÑтуру у инвентару из модела\n" +"када није пронађен ниједан подржани драјвер." + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "" #: src/settings_translation_file.cpp msgid "Announce server" -msgstr "" +msgstr "Јавни Ñервер" #: src/settings_translation_file.cpp msgid "" @@ -1434,26 +1592,55 @@ msgid "" "If you want to announce your ipv6 address, use serverlist_url = v6.servers." "minetest.net." msgstr "" +"Пријави овој Ñервер-лиÑти.\n" +"Ðко желите да пријавите вашу ipv6 адреÑу, кориÑтите serverlist_url = " +"v6.servers.minetest.net." + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "ÐаÑумично Ñеме за генериÑање јабукових дрвећа" #: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." -msgstr "" +msgstr "Приближна величина (X,Y,Z) фрактала у блоковима." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" +msgstr "Питај за реконекцију поÑле пада" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" msgstr "" +"При овој раздаљини Ñервер ће агреÑивно оптимизовати који блокови Ñе шаљу " +"клијенту\n" +"Мање вредноÑти ће потенцијално пролично побољшати преформанÑе, по цену " +"видљивих грешака на приказаној Ñлици.\n" +"(неки блокови Ñе неће приказивати под водом и у пећинама, као ни понеки на " +"земљи)\n" +"ПоÑтављање овога на вредноÑÑ‚ већу од max_block_send_distance иÑкључује ову " +"оптимизацију.\n" +"ПоÑтављено у мапа-блоковима (16 блокова)" #: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." -msgstr "" +msgstr "ÐутоматÑки пријави Ñервер-лиÑти." #: src/settings_translation_file.cpp msgid "Autorun key" -msgstr "" +msgstr "Кључ за аутоматÑко трчање" #: src/settings_translation_file.cpp msgid "Backward key" -msgstr "" +msgstr "Кључ за назад" #: src/settings_translation_file.cpp msgid "Base terrain height" @@ -1461,23 +1648,39 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Basic" -msgstr "" +msgstr "ОÑновно" #: src/settings_translation_file.cpp msgid "Basic Privileges" -msgstr "" +msgstr "ОÑновне привилегије" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "Семе за плаже" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "Граница Ñемена за плаже" #: src/settings_translation_file.cpp msgid "Bilinear filtering" -msgstr "" +msgstr "Билинеарно филтрирање" #: src/settings_translation_file.cpp msgid "Bind address" -msgstr "" +msgstr "Вежи адреÑу" + +#: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "Параметри Ñемена температуре и влажноÑти API-ја за биоме" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "Семе биома" #: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" +msgstr "Битови по пикÑелу (или дубина боје) у моду целог екрана." #: src/settings_translation_file.cpp msgid "Build inside player" @@ -1485,52 +1688,79 @@ msgstr "Градња унутар играча" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "Уграђено" #: src/settings_translation_file.cpp msgid "Bumpmapping" -msgstr "" +msgstr "Рељефна тектура" #: src/settings_translation_file.cpp msgid "Camera smoothing" -msgstr "" +msgstr "Изглађивање камере" #: src/settings_translation_file.cpp msgid "Camera smoothing in cinematic mode" -msgstr "" +msgstr "Изглађивање камере у ÑинематÑком моду" #: src/settings_translation_file.cpp msgid "Camera update toggle key" -msgstr "" +msgstr "Кључ за укључивање/иÑкључивање оÑвежавања камере" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "Семе пећина" #: src/settings_translation_file.cpp msgid "Cave noise #1" -msgstr "" +msgstr "Семе пећина #1" #: src/settings_translation_file.cpp msgid "Cave noise #2" -msgstr "" +msgstr "Семе пећина #2" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "" +msgstr "Ширина пећина" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "Cave1 Ñеме" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "Cave2 Ñеме" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "Граница пећина" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "Семе пећина" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "ÐšÐ¾Ð½ÑƒÑ Ð¿ÐµÑ›Ð¸Ð½Ðµ" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "Граница пећине" #: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" -msgstr "" +msgstr "Пећине и тунели Ñе формирају при укрштању два Ñемена" #: src/settings_translation_file.cpp msgid "Chat key" -msgstr "" +msgstr "Кључ за чет" #: src/settings_translation_file.cpp msgid "Chat toggle key" -msgstr "" +msgstr "Кључ за укључивање чета" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chatcommands" -msgstr "Команда" +msgstr "Чат команде" #: src/settings_translation_file.cpp msgid "" @@ -1554,102 +1784,140 @@ msgid "" "17 = 4D \"Mandelbulb\" mandelbrot set.\n" "18 = 4D \"Mandelbulb\" julia set." msgstr "" +"Избор 18 фрактала из 9 формула.\n" +"1 = 4Д \"ОкруглаÑти\" манделбротов Ñкуп.\n" +"2 = 4Д \"ОкруглаÑти\" жулијин Ñкуп.\n" +"3 = 4Д \"КоцкаÑти\" манделбротов Ñкуп.\n" +"4 = 4Д \"КоцкаÑти\" жулијин Ñкуп.\n" +"5 = 4Д \"Mandy Cousin\" манделбротов Ñкуп.\n" +"6 = 4Д \"Mandy Cousin\" жулијин Ñкуп.\n" +"7 = 4Д \"Варијација\" манделбротов Ñкуп.\n" +"8 = 4Д \"Варијација\" жулијин Ñкуп.\n" +"9 = 3Д \"Mandelbrot/Mandelbar\" манделбротов Ñкуп.\n" +"10 = 3Д \"Mandelbrot/Mandelbar\" жулијин Ñкуп.\n" +"11 = 3Д \"Ðовогодишње Дрво\" манделбротоб Ñкуп.\n" +"12 = 3Д \"Ðовогодишње Дрво\" жулијин Ñкуп.\n" +"13 = 3Д \"Mandelbulb\" манделбротов Ñкуп.\n" +"14 = 3Д \"Mandelbulb\" жулијин Ñкуп.\n" +"15 = 3Д \"КоÑинуÑни Mandelbulb\" манделбротов Ñкуп.\n" +"16 = 3Д \"КоÑинуÑни Mandelbulb\" жулијин Ñкуп.\n" +"17 = 4Д \"Mandelbulb\" манделбротов Ñкуп.\n" +"18 = 4Д \"Mandelbulb\" жулијин Ñкуп." #: src/settings_translation_file.cpp msgid "Chunk size" -msgstr "" +msgstr "Величина комада" #: src/settings_translation_file.cpp msgid "Cinematic mode" -msgstr "" +msgstr "СинематÑки мод" #: src/settings_translation_file.cpp msgid "Cinematic mode key" -msgstr "" +msgstr "Кључ за ÑинематÑки мод" #: src/settings_translation_file.cpp msgid "Clean transparent textures" -msgstr "" +msgstr "ОчиÑти провидне трекÑтуре" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "Клијент" #: src/settings_translation_file.cpp msgid "Client and Server" -msgstr "" +msgstr "Клијент и Сервер" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "Модификовање клијента" #: src/settings_translation_file.cpp msgid "Climbing speed" -msgstr "" +msgstr "Брзина уÑпона" #: src/settings_translation_file.cpp msgid "Cloud height" -msgstr "" +msgstr "ВиÑина облака" #: src/settings_translation_file.cpp msgid "Cloud radius" -msgstr "" +msgstr "Величина облака" #: src/settings_translation_file.cpp msgid "Clouds" -msgstr "" +msgstr "Облаци" #: src/settings_translation_file.cpp msgid "Clouds are a client side effect." -msgstr "" +msgstr "Облаци Ñу ефекат од Ñтране клијента." #: src/settings_translation_file.cpp msgid "Clouds in menu" -msgstr "" +msgstr "Облаци у менију" #: src/settings_translation_file.cpp msgid "Colored fog" -msgstr "" +msgstr "Обојена магла" #: src/settings_translation_file.cpp msgid "" "Comma-separated list of mods that are allowed to access HTTP APIs, which\n" "allow them to upload and download data to/from the internet." msgstr "" +"Зарезом одвојена лиÑта модова којима је дозвољено да приÑтупе HTTP API-јима, " +"који\n" +"им дозвољавају да узимају и шаљу податке од/према интернету." #: src/settings_translation_file.cpp msgid "" "Comma-separated list of trusted mods that are allowed to access insecure\n" "functions even when mod security is on (via request_insecure_environment())." msgstr "" +"Зарезом одвојена лиÑта поверених модова којима је дозвољено да приÑтупе " +"неÑигурним\n" +"функцијама чак и када је ÑигурноÑÑ‚ модова укључена (путем " +"request_insecure_environment())." #: src/settings_translation_file.cpp msgid "Command key" -msgstr "" +msgstr "Кључ за команду" #: src/settings_translation_file.cpp msgid "Connect glass" -msgstr "" +msgstr "Споји Ñтакло" #: src/settings_translation_file.cpp msgid "Connect to external media server" -msgstr "" +msgstr "Споји Ñа Ñпољашњим медија Ñервером" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." -msgstr "" +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 "ВиÑина конзоле" #: src/settings_translation_file.cpp msgid "Console key" -msgstr "" +msgstr "Кључ за конзолу" #: src/settings_translation_file.cpp msgid "Continuous forward" -msgstr "" +msgstr "Ðепрекидно напред" #: src/settings_translation_file.cpp msgid "Continuous forward movement (only used for testing)." -msgstr "" +msgstr "Ðепрекидно кретање унапред (кориÑти Ñе Ñамо за теÑтирање)." #: src/settings_translation_file.cpp msgid "Controls" @@ -1661,106 +1929,125 @@ msgid "" "Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays " "unchanged." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" +"Контролна дужина трајања даноноћног циклуÑа.\n" +"Примери: 72 = 20 минута, 360 = 4 минута, 1 = 24 Ñата, 0 = дан/ноћ/штагод " +"оÑтаје непромењено." #: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." -msgstr "" +msgstr "Контролише Ñтрмину/дубину језерÑких депреÑија." #: src/settings_translation_file.cpp msgid "Controls steepness/height of hills." +msgstr "Контролише Ñтрмину/виÑину брда." + +#: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" +"Контролише гуÑтину планинÑког терена на лебдећим оÑтрвима.\n" +"Као одÑтупање Ñе додаје на вредноÑÑ‚ 'np_mountain' Ñемена." #: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." -msgstr "" +msgstr "Контролише ширину тунела, мања вредноÑÑ‚ Ñтвара шире тунеле." #: src/settings_translation_file.cpp msgid "Crash message" -msgstr "" +msgstr "Порука поÑле пада" #: src/settings_translation_file.cpp msgid "" "Creates unpredictable lava features in caves.\n" "These can make mining difficult. Zero disables them. (0-10)" msgstr "" +"Ствара непредвидиве шеме лаве у пећинама.\n" +"Ове могу чинити копање тежим. Ðула их онемогућава. (0-10)" #: src/settings_translation_file.cpp msgid "" "Creates unpredictable water features in caves.\n" "These can make mining difficult. Zero disables them. (0-10)" msgstr "" +"Ствара непредвидиве шеме воде у пећинама.\n" +"Ове могу чинити копање тежим. Ðула их онемогућава. (0-10)" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "Креативни мод" #: src/settings_translation_file.cpp msgid "Crosshair alpha" -msgstr "" +msgstr "ПровидноÑÑ‚ нишана" #: src/settings_translation_file.cpp msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "" +msgstr "ПровидноÑÑ‚ нишана (видљивоÑÑ‚, између 0 и 255)." #: src/settings_translation_file.cpp msgid "Crosshair color" -msgstr "" +msgstr "Боја нишана" #: src/settings_translation_file.cpp msgid "Crosshair color (R,G,B)." -msgstr "" +msgstr "Боја нишана (R,G,B)." #: src/settings_translation_file.cpp msgid "Crouch speed" -msgstr "" +msgstr "Брзина при чучању" #: src/settings_translation_file.cpp msgid "DPI" -msgstr "" +msgstr "DPI" #: src/settings_translation_file.cpp msgid "Damage" -msgstr "" +msgstr "Штета" #: src/settings_translation_file.cpp msgid "Debug info toggle key" -msgstr "" +msgstr "Кључ за укључивање debug информација" #: src/settings_translation_file.cpp msgid "Debug log level" +msgstr "Ðиво запиÑивања у debug" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" msgstr "" #: src/settings_translation_file.cpp msgid "Dedicated server step" -msgstr "" +msgstr "Корак на поÑвећеном Ñерверу" #: src/settings_translation_file.cpp msgid "Default acceleration" -msgstr "" +msgstr "Уобичајено убрзање" #: src/settings_translation_file.cpp msgid "Default game" -msgstr "" +msgstr "Уобичајена игра" #: src/settings_translation_file.cpp msgid "" "Default game when creating a new world.\n" "This will be overridden when creating a world from the main menu." msgstr "" +"Уобичајена игра при Ñтварању новог Ñвета.\n" +"Ово Ñе може премоÑтити при Ñтварању новог Ñвета из главног менија." #: src/settings_translation_file.cpp msgid "Default password" -msgstr "" +msgstr "Уобичајена лозинка" #: src/settings_translation_file.cpp msgid "Default privileges" -msgstr "" +msgstr "Уобичајене привилегије" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "Уобичајен формат рапорта" #: src/settings_translation_file.cpp msgid "" @@ -1769,6 +2056,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1779,6 +2101,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1809,17 +2141,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" #: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "ЧеÑтице" + +#: src/settings_translation_file.cpp msgid "Disable anticheat" msgstr "" @@ -1864,10 +2204,24 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "" @@ -1903,6 +2257,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -1946,6 +2310,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -1968,7 +2336,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2022,13 +2394,12 @@ msgid "Field of view in degrees." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Field of view while zooming in degrees.\n" "This requires the \"zoom\" privilege on the server." msgstr "" -"Играч је у могућноÑти д лети без утицаја гравитације.\n" -"Ово захтева \"fly\" привилегију на Ñерверима." +"Видно поље за време увеличавања.\n" +"Ово захрева \"zoom\" привилегију на Ñерверу." #: src/settings_translation_file.cpp msgid "" @@ -2041,6 +2412,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2057,10 +2432,34 @@ msgid "Filtering" msgstr "" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "" @@ -2073,6 +2472,10 @@ msgid "Fog" msgstr "" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -2109,6 +2512,14 @@ msgid "Forward key" msgstr "" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2187,10 +2598,18 @@ msgid "Gravity" msgstr "" #: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2212,22 +2631,55 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "ДеÑни Windows" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2249,6 +2701,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2274,6 +2738,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2306,6 +2779,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2335,6 +2812,14 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2377,6 +2862,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Инвентар" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2397,12 +2887,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2440,6 +2942,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "" @@ -2456,6 +2974,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2470,6 +2995,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2512,6 +3044,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2526,6 +3065,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2547,6 +3093,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2647,6 +3207,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2660,10 +3227,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "" @@ -2672,6 +3254,10 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2727,6 +3313,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2799,6 +3392,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2826,9 +3423,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2837,7 +3443,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2856,23 +3463,19 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" +msgid "Mapgen Valleys" msgstr "" #: src/settings_translation_file.cpp @@ -2888,51 +3491,7 @@ msgid "Mapgen flat" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" +msgid "Mapgen flat specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -2940,66 +3499,6 @@ msgid "Mapgen fractal" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "" @@ -3008,27 +3507,7 @@ msgid "Mapgen v5" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Mapgen v5 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3036,59 +3515,7 @@ msgid "Mapgen v6" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3096,55 +3523,7 @@ msgid "Mapgen v7" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3311,6 +3690,10 @@ msgid "Mipmapping" msgstr "" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3331,6 +3714,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3339,15 +3730,17 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mute key" msgstr "" #: src/settings_translation_file.cpp @@ -3399,10 +3792,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3439,6 +3828,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3479,6 +3876,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3570,9 +3973,16 @@ msgid "Replaces the default main menu with a custom one." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Report path" -msgstr "Одабери локацију" +msgstr "Одабери локацију за пријаве" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" #: src/settings_translation_file.cpp msgid "Right key" @@ -3607,6 +4017,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3615,6 +4029,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3655,6 +4073,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "" @@ -3699,6 +4125,10 @@ msgid "Server port" msgstr "" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "" @@ -3731,10 +4161,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Шејдери" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3760,10 +4199,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "" @@ -3802,6 +4260,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -3822,10 +4288,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3840,6 +4326,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "" @@ -3859,8 +4349,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -3911,6 +4404,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -3953,6 +4450,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "" @@ -3968,10 +4469,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4036,6 +4555,42 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4044,13 +4599,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4062,6 +4615,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4149,16 +4706,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4209,6 +4756,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4222,6 +4776,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4232,3 +4822,33 @@ msgstr "" #: src/settings_translation_file.cpp msgid "cURL timeout" msgstr "" + +#~ msgid "Hide mp content" +#~ msgstr "Сакриј Ñадржину мод-паковања" + +#~ msgid "Attn" +#~ msgstr "Ðттн" + +#~ msgid "Capital" +#~ msgstr "Главно" + +#~ msgid "Comma" +#~ msgstr "Зарез" + +#~ msgid "CrSel" +#~ msgstr "ЦрСел" + +#~ msgid "ExSel" +#~ msgstr "ЕхСел" + +#~ msgid "Final" +#~ msgstr "Крајњи" + +#~ msgid "Minus" +#~ msgstr "МинуÑ" + +#~ msgid "Period" +#~ msgstr "Тачка" + +#~ msgid "Plus" +#~ msgstr "ПлуÑ" diff --git a/po/sv/minetest.po b/po/sv/minetest.po new file mode 100644 index 000000000..bdca445a0 --- /dev/null +++ b/po/sv/minetest.po @@ -0,0 +1,4702 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: minetest\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-21 17:39+0200\n" +"PO-Revision-Date: 2017-05-31 07:56+0000\n" +"Last-Translator: texmex <josefsahlberg+minetest@gmail.com>\n" +"Language-Team: Swedish " +"<https://hosted.weblate.org/projects/minetest/minetest/sv/>\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.14.1\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Du dog." + +#: builtin/fstk/ui.lua +msgid "An error occured in a Lua script, such as a mod:" +msgstr "Ett fel uppstod i ett Lua-skript, sÃ¥som en mod:" + +#: builtin/fstk/ui.lua +msgid "An error occured:" +msgstr "Ett fel uppstod:" + +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "Huvudmeny" + +#: builtin/fstk/ui.lua builtin/mainmenu/store.lua +msgid "Ok" +msgstr "Ok" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "Ã…teranslut" + +#: builtin/fstk/ui.lua +msgid "The server has requested a reconnect:" +msgstr "Servern har begärt en Ã¥teranslutning:" + +#: builtin/mainmenu/common.lua src/game.cpp +msgid "Loading..." +msgstr "Laddar..." + +#: builtin/mainmenu/common.lua +msgid "Protocol version mismatch. " +msgstr "Protokollversionen matchar ej. " + +#: builtin/mainmenu/common.lua +msgid "Server enforces protocol version $1. " +msgstr "Servern tvingar protokollversion $1." + +#: builtin/mainmenu/common.lua +msgid "Server supports protocol versions between $1 and $2. " +msgstr "Servern stöder protokollversioner mellan $1 och $2. " + +#: builtin/mainmenu/common.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Försök Ã¥teraktivera allmän serverlista och kolla din internetanslutning." + +#: builtin/mainmenu/common.lua +msgid "We only support protocol version $1." +msgstr "Vi stöder endast protokollversion $1." + +#: builtin/mainmenu/common.lua +msgid "We support protocol versions between version $1 and $2." +msgstr "Vi stöder protokollversioner mellan version $1 och $2." + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp +msgid "Cancel" +msgstr "Avbryt" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +#, fuzzy +msgid "Dependencies:" +msgstr "Kräver:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable MP" +msgstr "Avaktivera flera spelare" + +#: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Avaktivera flera spelare" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable MP" +msgstr "Aktivera flera spelare" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable all" +msgstr "Aktivera alla" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "" +"Failed to enable mod \"$1\" as it contains disallowed characters. Only " +"chararacters [a-z0-9_] are allowed." +msgstr "" +"Misslyckades aktivera mod \"$1\" eftersom det innehÃ¥ller otillÃ¥tna tecken. " +"Endast tecknen [a-z0-9_] är tillÃ¥tna." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Mod:" +msgstr "Mod:" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "Stödjer:" + +#: builtin/mainmenu/dlg_config_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp +msgid "Save" +msgstr "Spara" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "World:" +msgstr "Värld:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "enabled" +msgstr "aktiverad" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "A world named \"$1\" already exists" +msgstr "En värld med namnet \"$1\" finns redan" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "Skapa" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Download a subgame, such as minetest_game, from minetest.net" +msgstr "Ladda ner ett underspel, sÃ¥som minetest_game, frÃ¥n minetest.net" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Download one from minetest.net" +msgstr "Ladda ner ett frÃ¥n minetest.net" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Game" +msgstr "Spel" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "Kartgenerator" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "No worldname given or no game selected" +msgstr "Inget världnamn angett eller inget spel valt" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Seed" +msgstr "Frö" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Warning: The minimal development test is meant for developers." +msgstr "Varning: Minimala utvecklingstestet är endast avsett för utvecklare." + +#: builtin/mainmenu/dlg_create_world.lua +msgid "World name" +msgstr "Världnamn" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "You have no subgames installed." +msgstr "Du har inga underspel installerade." + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Are you sure you want to delete \"$1\"?" +msgstr "Är du säker pÃ¥ att du vill radera \"$1\"?" + +#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua +#: builtin/mainmenu/tab_local.lua src/keycode.cpp +msgid "Delete" +msgstr "Radera" + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Modmgr: failed to delete \"$1\"" +msgstr "Modhanterare: misslyckades radera \"$1\"" + +#: builtin/mainmenu/dlg_delete_mod.lua +msgid "Modmgr: invalid modpath \"$1\"" +msgstr "Modhanterare: ogiltig modsökväg \"$1\"" + +#: builtin/mainmenu/dlg_delete_world.lua +msgid "Delete World \"$1\"?" +msgstr "Radera värld \"$1\"?" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Accept" +msgstr "Acceptera" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "Döp om modpaket:" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "\"$1\" is not a valid flag." +msgstr "\"$1\" är inte en giltig flagga." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "(No description of setting given)" +msgstr "(Ingen beskrivning av inställning angiven)" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "< Back to Settings page" +msgstr "< Tillbaka till inställningssidan" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Browse" +msgstr "Bläddra" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Disabled" +msgstr "Avaktiverad" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "Redigera" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "Aktiverad" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Format is 3 numbers separated by commas and inside brackets." +msgstr "Formatet är tre nummer separerade med komma och inom paranteser." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "" +"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " +"<octaves>, <persistence>" +msgstr "" +"Format: <förskjutning>, <skala>, (<spridningX>, <spridningY>, <spridningZ>), " +"<frö>, <oktaver>, <framhärdande>" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Games" +msgstr "Spel" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua +msgid "Mods" +msgstr "Moddar" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Optionally the lacunarity can be appended with a leading comma." +msgstr "TakförhÃ¥llandet kan eventuellt läggas till med ett främre kommatecken." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a comma seperated list of flags." +msgstr "Var vänlig ange ett kommaseparerad lista med flaggor." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid integer." +msgstr "Var vänligen ange ett giltigt heltal." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "Var vänligen ange ett giltigt nummer." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Possible values are: " +msgstr "Möjliga värden är: " + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "Ã…terställ standard" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Sök" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select path" +msgstr "Välj sökväg" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Show technical names" +msgstr "Visa tekniska namn" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "The value must be at least $1." +msgstr "Värdet mÃ¥ste vara högre än $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "The value must not be larger than $1." +msgstr "Värdet mÃ¥ste vara lägre än $1." + +#: builtin/mainmenu/modmgr.lua +msgid "" +"\n" +"Install Mod: unsupported filetype \"$1\" or broken archive" +msgstr "" +"\n" +"Modinstallation: ej stöd filtyp \"$1\" eller trasigt arkiv" + +#: builtin/mainmenu/modmgr.lua +msgid "Failed to install $1 to $2" +msgstr "Misslyckades installera $1 till $2" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: file: \"$1\"" +msgstr "Modinstallation: fil: \"$1\"" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: unable to find real modname for: $1" +msgstr "Modinstallation: lyckas ej hitta riktiga modnamnet för: $1" + +#: builtin/mainmenu/modmgr.lua +msgid "Install Mod: unable to find suitable foldername for modpack $1" +msgstr "Modinstallation: lyckas ej hitta lämpligt mappnamn för modpaket $1" + +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + +#: builtin/mainmenu/store.lua +msgid "Close store" +msgstr "" + +#: builtin/mainmenu/store.lua +msgid "Downloading $1, please wait..." +msgstr "Laddar ner $1, var vänligen vänta..." + +#: builtin/mainmenu/store.lua +msgid "Install" +msgstr "Installera" + +#: builtin/mainmenu/store.lua +msgid "Page $1 of $2" +msgstr "Sida $1 av $2" + +#: builtin/mainmenu/store.lua +msgid "Rating" +msgstr "Omdöme" + +#: builtin/mainmenu/store.lua +msgid "Shortname:" +msgstr "Kort namn:" + +#: builtin/mainmenu/store.lua +msgid "Successfully installed:" +msgstr "Lyckades installera:" + +#: builtin/mainmenu/store.lua +msgid "Unsorted" +msgstr "Osorterat" + +#: builtin/mainmenu/store.lua +msgid "re-Install" +msgstr "Ominstallera" + +#: builtin/mainmenu/tab_credits.lua +msgid "Active Contributors" +msgstr "Aktiva bidragsgivare" + +#: builtin/mainmenu/tab_credits.lua +msgid "Core Developers" +msgstr "Kärnutvecklare" + +#: builtin/mainmenu/tab_credits.lua +msgid "Credits" +msgstr "Medverkande" + +#: builtin/mainmenu/tab_credits.lua +msgid "Previous Contributors" +msgstr "Före detta bidragsgivare" + +#: builtin/mainmenu/tab_credits.lua +msgid "Previous Core Developers" +msgstr "Före detta kärnutvecklare" + +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Bindningsadress" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Konfigurera" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Kreativt läge" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Aktivera skada" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Göm spel" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Server" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Starta spel" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Namn/Lösenord" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Ny" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Ingen värld skapad eller vald!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Starta spel" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Port" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Välj värd:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Serverport" + +#: builtin/mainmenu/tab_mods.lua +msgid "Installed Mods:" +msgstr "Installerade moddar:" + +#: builtin/mainmenu/tab_mods.lua +msgid "Mod information:" +msgstr "Modinformation:" + +#: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua +msgid "No mod description available" +msgstr "Ingen modbeskrivning tillgänglig" + +#: builtin/mainmenu/tab_mods.lua +msgid "Rename" +msgstr "Döp om" + +#: builtin/mainmenu/tab_mods.lua +msgid "Select Mod File:" +msgstr "Välj modfil:" + +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected mod" +msgstr "Avinstallera vald mod" + +#: builtin/mainmenu/tab_mods.lua +msgid "Uninstall selected modpack" +msgstr "Avinstallera valt modpaket" + +#: builtin/mainmenu/tab_online.lua +msgid "Address / Port" +msgstr "Adress / Port" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Connect" +msgstr "Anslut" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative mode" +msgstr "Kreativt läge" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Damage enabled" +msgstr "Skada aktiverad" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Del. Favorite" +msgstr "Radera favoritmarkering" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Favorite" +msgstr "Favoritmarkera" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Name / Password" +msgstr "Namn / Lösenord" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "Spela online" + +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP aktiverat" + +#: builtin/mainmenu/tab_settings.lua +msgid "2x" +msgstr "2x" + +#: builtin/mainmenu/tab_settings.lua +msgid "3D Clouds" +msgstr "3D-moln" + +#: builtin/mainmenu/tab_settings.lua +msgid "4x" +msgstr "4x" + +#: builtin/mainmenu/tab_settings.lua +msgid "8x" +msgstr "8x" + +#: builtin/mainmenu/tab_settings.lua +msgid "Advanced Settings" +msgstr "Avancerade inställningar" + +#: builtin/mainmenu/tab_settings.lua +msgid "Antialiasing:" +msgstr "Kantutjämning:" + +#: builtin/mainmenu/tab_settings.lua +msgid "Are you sure to reset your singleplayer world?" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bilinear Filter" +msgstr "Bilinjärt filter" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bump Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Change keys" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "Snygga löv" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No" +msgstr "Nej" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "Inget filter" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "Nodframlyft" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "Nodlinjering" + +#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua +msgid "None" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Normal Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "Ogenomskinliga löv" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "Ogenomskinligt vatten" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Parallax Occlusion" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Reset singleplayer world" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Settings" +msgstr "Inställningar" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "Enkla löv" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "To enable shaders the OpenGL driver needs to be used." +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Touchthreshold (px)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "Trilinjärt filter" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Plants" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Water" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Yes" +msgstr "" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Config mods" +msgstr "" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Main" +msgstr "" + +#: builtin/mainmenu/tab_simple_main.lua +msgid "Start Singleplayer" +msgstr "" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "No information available" +msgstr "" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "Select texture pack:" +msgstr "" + +#: builtin/mainmenu/tab_texturepacks.lua +msgid "Texturepacks" +msgstr "" + +#: src/client.cpp +msgid "Connection timed out." +msgstr "" + +#: src/client.cpp +msgid "Done!" +msgstr "" + +#: src/client.cpp +msgid "Initializing nodes" +msgstr "" + +#: src/client.cpp +msgid "Initializing nodes..." +msgstr "" + +#: src/client.cpp +msgid "Loading textures..." +msgstr "" + +#: src/client.cpp +msgid "Rebuilding shaders..." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Connection error (timed out?)" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Could not find or load game \"" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Invalid gamespec." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Main Menu" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Provided world path doesn't exist: " +msgstr "" + +#: src/fontengine.cpp +msgid "needs_fallback_font" +msgstr "" + +#: src/game.cpp +msgid "" +"\n" +"Check debug.txt for details." +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Bindningsadress" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Kreativt läge" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Aktivera skada" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Port" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Allmän" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +msgid "- Server Name: " +msgstr "" + +#: src/game.cpp +msgid "Change Keys" +msgstr "" + +#: src/game.cpp +msgid "Change Password" +msgstr "" + +#: src/game.cpp +msgid "Connecting to server..." +msgstr "" + +#: src/game.cpp +msgid "Continue" +msgstr "" + +#: src/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse left: dig/punch\n" +"- Mouse right: place/use\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" +msgstr "" + +#: src/game.cpp +msgid "Creating client..." +msgstr "" + +#: src/game.cpp +msgid "Creating server..." +msgstr "" + +#: src/game.cpp +msgid "" +"Default Controls:\n" +"No menu visible:\n" +"- single tap: button activate\n" +"- double tap: place/use\n" +"- slide finger: look around\n" +"Menu/Inventory visible:\n" +"- double tap (outside):\n" +" -->close\n" +"- touch stack, touch slot:\n" +" --> move stack\n" +"- touch&drag, tap 2nd finger\n" +" --> place single item to slot\n" +msgstr "" + +#: src/game.cpp +msgid "Exit to Menu" +msgstr "" + +#: src/game.cpp +msgid "Exit to OS" +msgstr "" + +#: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Spel" + +#: src/game.cpp +msgid "Hosting server" +msgstr "" + +#: src/game.cpp +msgid "Item definitions..." +msgstr "" + +#: src/game.cpp +msgid "KiB/s" +msgstr "" + +#: src/game.cpp +msgid "Media..." +msgstr "" + +#: src/game.cpp +msgid "MiB/s" +msgstr "" + +#: src/game.cpp +msgid "Node definitions..." +msgstr "" + +#: src/game.cpp +msgid "Off" +msgstr "" + +#: src/game.cpp +msgid "On" +msgstr "" + +#: src/game.cpp +msgid "Remote server" +msgstr "" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "" + +#: src/game.cpp +msgid "Shutting down..." +msgstr "" + +#: src/game.cpp +msgid "Singleplayer" +msgstr "" + +#: src/game.cpp +msgid "Sound Volume" +msgstr "" + +#: src/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" + +#: src/game.cpp src/guiFormSpecMenu.cpp +msgid "ok" +msgstr "" + +#: src/guiFormSpecMenu.cpp +msgid "Enter " +msgstr "" + +#: src/guiFormSpecMenu.cpp +msgid "Proceed" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "\"Use\" = climb down" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Backward" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Chat" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Command" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Left" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Print stacks" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Right" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle Cinematic" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "Use" +msgstr "" + +#: src/guiKeyChangeMenu.cpp src/keycode.cpp +msgid "Zoom" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Change" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "New Password" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Old Password" +msgstr "" + +#: src/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + +#: src/guiVolumeChange.cpp +msgid "Exit" +msgstr "" + +#: src/guiVolumeChange.cpp +msgid "Sound Volume: " +msgstr "" + +#: src/keycode.cpp +msgid "Apps" +msgstr "" + +#: src/keycode.cpp +msgid "Back" +msgstr "" + +#: src/keycode.cpp +msgid "Caps Lock" +msgstr "" + +#: src/keycode.cpp +msgid "Clear" +msgstr "" + +#: src/keycode.cpp +msgid "Control" +msgstr "" + +#: src/keycode.cpp +msgid "Down" +msgstr "" + +#: src/keycode.cpp +msgid "End" +msgstr "" + +#: src/keycode.cpp +msgid "Erase EOF" +msgstr "" + +#: src/keycode.cpp +msgid "Execute" +msgstr "" + +#: src/keycode.cpp +msgid "Help" +msgstr "" + +#: src/keycode.cpp +msgid "Home" +msgstr "" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Accept" +msgstr "Acceptera" + +#: src/keycode.cpp +msgid "IME Convert" +msgstr "" + +#: src/keycode.cpp +msgid "IME Escape" +msgstr "" + +#: src/keycode.cpp +msgid "IME Mode Change" +msgstr "" + +#: src/keycode.cpp +msgid "IME Nonconvert" +msgstr "" + +#: src/keycode.cpp +msgid "Insert" +msgstr "" + +#: src/keycode.cpp +msgid "Left Button" +msgstr "" + +#: src/keycode.cpp +msgid "Left Control" +msgstr "" + +#: src/keycode.cpp +msgid "Left Menu" +msgstr "" + +#: src/keycode.cpp +msgid "Left Shift" +msgstr "" + +#: src/keycode.cpp +msgid "Left Windows" +msgstr "" + +#: src/keycode.cpp +msgid "Menu" +msgstr "" + +#: src/keycode.cpp +msgid "Middle Button" +msgstr "" + +#: src/keycode.cpp +msgid "Next" +msgstr "" + +#: src/keycode.cpp +msgid "Num Lock" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad *" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad +" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad -" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad ." +msgstr "" + +#: src/keycode.cpp +msgid "Numpad /" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 0" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 1" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 2" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 3" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 4" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 5" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 6" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 7" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 8" +msgstr "" + +#: src/keycode.cpp +msgid "Numpad 9" +msgstr "" + +#: src/keycode.cpp +msgid "OEM Clear" +msgstr "" + +#: src/keycode.cpp +msgid "Pause" +msgstr "" + +#: src/keycode.cpp +msgid "Play" +msgstr "" + +#: src/keycode.cpp +msgid "Print" +msgstr "" + +#: src/keycode.cpp +msgid "Prior" +msgstr "" + +#: src/keycode.cpp +msgid "Return" +msgstr "" + +#: src/keycode.cpp +msgid "Right Button" +msgstr "" + +#: src/keycode.cpp +msgid "Right Control" +msgstr "" + +#: src/keycode.cpp +msgid "Right Menu" +msgstr "" + +#: src/keycode.cpp +msgid "Right Shift" +msgstr "" + +#: src/keycode.cpp +msgid "Right Windows" +msgstr "" + +#: src/keycode.cpp +msgid "Scroll Lock" +msgstr "" + +#: src/keycode.cpp +msgid "Select" +msgstr "" + +#: src/keycode.cpp +msgid "Shift" +msgstr "" + +#: src/keycode.cpp +msgid "Sleep" +msgstr "" + +#: src/keycode.cpp +msgid "Snapshot" +msgstr "" + +#: src/keycode.cpp +msgid "Space" +msgstr "" + +#: src/keycode.cpp +msgid "Tab" +msgstr "" + +#: src/keycode.cpp +msgid "Up" +msgstr "" + +#: src/keycode.cpp +msgid "X Button 1" +msgstr "" + +#: src/keycode.cpp +msgid "X Button 2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n" +"Used to move a suitable spawn area of low land close to (0, 0).\n" +"The default is suitable for mandelbrot sets, it needs to be edited for julia " +"sets.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"0 = parallax occlusion with slope information (faster).\n" +"1 = relief mapping (slower, more accurate)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D support.\n" +"Currently supported:\n" +"- none: no 3d output.\n" +"- anaglyph: cyan/magenta color 3d.\n" +"- interlaced: odd/even line based polarisation screen support.\n" +"- topbottom: split screen top/bottom.\n" +"- sidebyside: split screen side by side.\n" +"- pageflip: quadbuffer based 3d." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"A chosen map seed for a new map, leave empty for random.\n" +"Will be overridden when creating a new world in the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server crashes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Absolute limit of emerge queues" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration in air" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Management interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifier interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" +"This setting is for the client only and is ignored by the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Altitude Chill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Always fly and fast" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amplifies the valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Anisotropic filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Announce to this serverlist.\n" +"If you want to announce your ipv6 address, use serverlist_url = v6.servers." +"minetest.net." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Approximate (X,Y,Z) scale of fractal in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ask to reconnect after crash" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automaticaly report to the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autorun key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base terrain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic Privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Builtin" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bumpmapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Caves and tunnels form at the intersection of the two noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chatcommands" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Choice of 18 fractals from 9 formulas.\n" +"1 = 4D \"Roundy\" mandelbrot set.\n" +"2 = 4D \"Roundy\" julia set.\n" +"3 = 4D \"Squarry\" mandelbrot set.\n" +"4 = 4D \"Squarry\" julia set.\n" +"5 = 4D \"Mandy Cousin\" mandelbrot set.\n" +"6 = 4D \"Mandy Cousin\" julia set.\n" +"7 = 4D \"Variation\" mandelbrot set.\n" +"8 = 4D \"Variation\" julia set.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot set.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" julia set.\n" +"11 = 3D \"Christmas Tree\" mandelbrot set.\n" +"12 = 3D \"Christmas Tree\" julia set.\n" +"13 = 3D \"Mandelbulb\" mandelbrot set.\n" +"14 = 3D \"Mandelbulb\" julia set.\n" +"15 = 3D \"Cosine Mandelbulb\" mandelbrot set.\n" +"16 = 3D \"Cosine Mandelbulb\" julia set.\n" +"17 = 4D \"Mandelbulb\" mandelbrot set.\n" +"18 = 4D \"Mandelbulb\" julia set." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "Klient" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Klient" + +#: src/settings_translation_file.cpp +msgid "Climbing speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cloud height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of mods that are allowed to access HTTP APIs, which\n" +"allow them to upload and download data to/from the internet." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of trusted mods that are allowed to access insecure\n" +"functions even when mod security is on (via request_insecure_environment())." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward movement (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays " +"unchanged." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/depth of lake depressions." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Controls width of tunnels, a smaller value creates wider tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Creates unpredictable lava features in caves.\n" +"These can make mining difficult. Zero disables them. (0-10)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Creates unpredictable water features in caves.\n" +"These can make mining difficult. Zero disables them. (0-10)" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Skapa" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crouch speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Default game when creating a new world.\n" +"This will be overridden when creating a world from the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Default timeout for cURL, stated in milliseconds.\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines sampling step of texture.\n" +"A higher value results in smoother normal maps." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find massive caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Descending speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Description of server, to be displayed when players join and in the " +"serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disable escape sequences" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Disable escape sequences, e.g. chat coloring.\n" +"Use this if you want to run a server with pre-0.4.14 clients and you want to " +"disable\n" +"the escape sequences generated by mods." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Domain name of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug infos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable Joysticks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable VBO" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable to disallow old clients from connecting.\n" +"Older clients are compatible in the sense that they will not crash when " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" +"to IPv6 clients, depending on system configuration.\n" +"Ignored if bind_address is set." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables bumpmapping for textures. Normalmaps need to be supplied by the " +"texture pack\n" +"or need to be auto-generated.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables filmic tone mapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables on the fly normalmap generation (Emboss effect).\n" +"Requires bumpmapping to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables parallax occlusion mapping.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Experimental option, might cause visible spaces between blocks\n" +"when set to higher number than 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS in pause menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Fast movement (via use key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view for zoom" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Field of view while zooming in degrees.\n" +"This requires the \"zoom\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler Depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Filtered textures can blend RGB values with fully-transparent neighbors,\n" +"which PNG optimizers usually discard, sometimes resulting in a dark or\n" +"light edge to transparent textures. Apply this filter to clean that up\n" +"at texture load time." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow offset, if 0 then shadow will not be drawn." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Freetype fonts" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Full screen BPP" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter txr2img" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Generate normalmaps" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Global callbacks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Global map generation attributes.\n" +"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" +"and junglegrass, in all other mapgens this flag controls all decorations.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Graphics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gravity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HTTP Mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated lua api calls:\n" +"- legacy: (try to) mimic old behaviour (default for release).\n" +"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height component of the initial window size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height on which clouds are appearing." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "High-precision FPU" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How large area of blocks are subject to the active block stuff, stated in " +"mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How much the server will wait before unloading unused mapblocks.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "How wide to make rivers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 support." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If FPS would go higher than this, limit it by sleeping\n" +"to not waste CPU power for no benefit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If disabled \"use\" key is used to fly fast if both fly and fast mode are " +"enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, \"use\" key instead of \"sneak\" key is used for climbing down " +"and descending." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, actions are recorded for rollback.\n" +"This option is only read when server starts." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, invalid world data won't cause the server to shut down.\n" +"Only enable this if you know what you are doing." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If enabled, new players cannot join with an empty password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-Game" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument chatcommands on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrumentation" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Interval of saving important changes in the world, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Interval of sending time of day to clients." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Controls the amount of fine detail." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: W component of hypercomplex constant determining julia " +"shape.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: X component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: Y component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only: Z component of hypercomplex constant determining julia " +"shape.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for printing debug stacks. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autorun.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Key use for climbing/descending" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lava Features" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over network." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Length of time between ABM execution cycles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Length of time between NodeTimer execution cycles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Limit of emerge queues on disk" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Limit of emerge queues to generate" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid sink" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu game manager" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu mod manager" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill' makes higher elevations colder, which may cause biome " +"issues.\n" +"'humid_rivers' modifies the humidity around rivers and in areas where water " +"would tend to pool,\n" +"it may interfere with delicately adjusted biomes.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen flat.\n" +"Occasional lakes and hills can be added to the flat world.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen flat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen flat specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen fractal" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v5" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v5 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v6 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v7" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen v7 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Massive cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Massive cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Massive caves form here." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that are simultaneously sent in total." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that are simultaneously sent per client." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks to be queued that are to be generated.\n" +"Set to blank for an appropriate amount to be chosen automatically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks to be queued that are to be loaded from file.\n" +"Set to blank for an appropriate amount to be chosen automatically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of mapblocks for client to be kept in memory.\n" +"Set to -1 for unlimited amount." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can connect simultaneously." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum proportion of current window to be used for hotbar.\n" +"Useful if there's something to be displayed right or left of hotbar." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends total" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Menus" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum texture size for filters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mipmapping" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modstore details URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modstore download URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modstore mods list URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Multiplier for fall bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Network" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Network port to listen (UDP).\n" +"This value will be overridden when starting from the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "New users need to input this password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Normalmaps sampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Normalmaps strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use. Make this field blank, or increase this " +"number\n" +"to use multiple threads. On multiprocessor systems, this will improve mapgen " +"speed greatly\n" +"at the cost of slightly buggy caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of extra blocks that can be loaded by /clearobjects at once.\n" +"This is a trade-off between sqlite transaction overhead and\n" +"memory consumption (4096=100MB, as a rule of thumb)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of parallax occlusion iterations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Overall scale of parallax occlusion effect." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion Scale" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion bias" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Parallax occlusion strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to TrueTypeFont or bitmap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to save screenshots at." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Player is able to fly without being affected by gravity.\n" +"This requires the \"fly\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player versus Player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Port to connect to (UDP).\n" +"Note that the port field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds). 0 = " +"disable. Useful for developers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Right key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rightclick repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River Depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River Noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River Size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River noise -- rivers occur close to zero" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rollback recording" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Scale gui by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box border color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server / Singleplayer" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Serverlist URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Serverlist file" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the language. Leave empty to use the system language.\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving plants.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true enables waving water.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Välj sökväg" + +#: src/settings_translation_file.cpp +msgid "" +"Shaders allow advanced visual effects and may increase performance on some " +"video cards.\n" +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of chunks to be generated at once by mapgen, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of generated normalmaps." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of parallax." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Support older servers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain Height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The altitude at which temperature drops by 20C" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The depth of dirt or other filler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The privileges that new users automatically get.\n" +"See /privs in game for a full list on your server and mod configuration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The rendering back-end for Irrlicht." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"ingame view frustum around." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n" +"set to the nearest valid value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated right clicks when holding the " +"right mouse button." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "This font will be used for certain languages." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time in between active block management cycles" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Useable to make minimap smoother on slower machines." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use mip mapping to scale textures. May slightly increase performance." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use trilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "V-Sync" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "VBO" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Fill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Profile" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley Slope" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valleys C Flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"W co-ordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water Features" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water length" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving water speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" +"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" +"enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether freetype fonts are used, requires freetype support to be compiled in." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether players are shown to clients without any range limit.\n" +"Deprecated, use the setting player_transfer_distance instead." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to ask clients to reconnect after a (Lua) crash.\n" +"Set this to true if your server is set up to restart automatically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to show the client debug info (has the same effect as hitting F5)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to support older servers before protocol version 25.\n" +"Enable if you want to connect to 0.4.12 servers and before.\n" +"Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n" +"Disabling this option will protect your password better." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width of the selectionbox's lines around nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"World directory (everything in the world is stored here).\n" +"Not needed if starting from the main menu." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large pseudorandom caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL file download timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL timeout" +msgstr "" + +#~ msgid "Hide mp content" +#~ msgstr "Göm flerspelarinnehÃ¥ll" diff --git a/po/sw/minetest.po b/po/sw/minetest.po index abf0da24d..4b42e800c 100644 --- a/po/sw/minetest.po +++ b/po/sw/minetest.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Minetest Translate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: 2016-10-03 05:13+0000\n" "Last-Translator: Eidy <JulianBiddle@practicalcybernetics.com>\n" "Language-Team: Swahili <https://hosted.weblate.org/projects/minetest/" @@ -14,6 +14,14 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 2.9-dev\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Respawn" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Alikufa." + #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" msgstr "Kosa limetokea katika hati Lua, kama vile Moduli na:" @@ -70,12 +78,13 @@ msgstr "Tunaunga mkono matoleo ya itifaki kati ya toleo la $1 na $2." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "Katisha" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "Inategemea:" #: builtin/mainmenu/dlg_config_world.lua @@ -83,6 +92,11 @@ msgid "Disable MP" msgstr "Lemaza MP" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "Lemaza MP" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Wezesha MP" @@ -99,17 +113,13 @@ msgstr "" "chararacters [a-z0-9_] wanaruhusiwa." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Ficha mchezo" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Ficha maudhui ya mbunge" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Moduli:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -172,8 +182,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Una uhakika unataka kufuta \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Futa" @@ -189,7 +198,7 @@ msgstr "Modmgr: batili modpath \"$1\"" msgid "Delete World \"$1\"?" msgstr "Futa ulimwengu \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Kukubali" @@ -267,6 +276,11 @@ msgstr "Thamani inayofaa ni:" msgid "Restore Default" msgstr "Rejesha chaguo-msingi" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Utafutaji" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Teua njia" @@ -276,11 +290,13 @@ msgid "Show technical names" msgstr "Onyesha majina ya kiufundi" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "Thamani lazima iwe kubwa kuliko $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "Thamani lazima iwe chini kuliko $1." #: builtin/mainmenu/modmgr.lua @@ -308,6 +324,10 @@ msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "" "Sakinisha Moduli: haiwezi kupata foldername ya kufaa kwa ajili ya modpack $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Duka la karibu" @@ -329,10 +349,6 @@ msgid "Rating" msgstr "Makadirio" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Utafutaji" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Shortname:" @@ -368,6 +384,71 @@ msgstr "Wachangiaji wa awali" msgid "Previous Core Developers" msgstr "Awali msingi watengenezaji" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "Kutangaza seva" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Kumfunga anwani" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Sanidi" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Hali ya ubunifu" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Wezesha uharibifu" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "Ficha mchezo" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "Seva" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "Anzisha mchezo" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Jina/nenosiri" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Mpya" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Duniani hakuna kuundwa au kuteuliwa!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "Jina la mchezaji" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Bandari" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Teua ulimwengu:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Kituo tarishi cha seva" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Mods zilizosakinishwa:" @@ -377,6 +458,10 @@ msgid "Mod information:" msgstr "Taarifa Moduli:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "Hakuna maelezo Moduli inapatikana" @@ -396,95 +481,46 @@ msgstr "Sakinusha Moduli teuliwa" msgid "Uninstall selected modpack" msgstr "Sakinusha modpack teuliwa" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "Kushughulikia / bandari" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Mteja" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Kuunganisha" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "Hali ya ubunifu" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "Uharibifu kuwezeshwa" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Del. kipendwa" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Kipendwa" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Jina / nenosiri" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP kuwezeshwa" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Kumfunga anwani" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Sanidi" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Hali ya ubunifu" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Wezesha uharibifu" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Jina/nenosiri" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Mpya" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Duniani hakuna kuundwa au kuteuliwa!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Bandari" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Umma" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Teua ulimwengu:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Seva" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Kituo tarishi cha seva" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Play Online" +msgstr "Jina la mchezaji" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Anzisha mchezo" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "PvP kuwezeshwa" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -515,6 +551,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "Je, una hakika upya ulimwengu wako singleplayer?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Kichujio bilinear" @@ -591,6 +631,11 @@ msgid "Reset singleplayer world" msgstr "Weka upya singleplayer ulimwengu" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "Screenshot" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "Vipimo vya" @@ -654,14 +699,6 @@ msgstr "Kuu" msgid "Start Singleplayer" msgstr "Kuanza Singleplayer" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Kucheza" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Singleplayer" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Hakuna taarifa zilizopo" @@ -724,6 +761,10 @@ msgid "Player name too long." msgstr "Mchezaji jina refu." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Njia ya dunia iliyotolewa haipo:" @@ -740,6 +781,44 @@ msgstr "" "Angalia debug.txt kwa maelezo." #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "Kumfunga anwani" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "Hali ya ubunifu" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "Uharibifu" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "Bandari" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "Umma" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "Jina la seva" + +#: src/game.cpp msgid "Change Keys" msgstr "Badilisha funguo" @@ -756,26 +835,22 @@ msgid "Continue" msgstr "Kuendelea" #: src/game.cpp -msgid "Creating client..." -msgstr "Inaunda mteja..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Inaunda seva..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Vidhibiti vya chaguo-msingi:\n" "-WASD: hoja\n" @@ -790,6 +865,14 @@ msgstr "" "- T: mazungumzo\n" #: src/game.cpp +msgid "Creating client..." +msgstr "Inaunda mteja..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Inaunda seva..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -824,6 +907,20 @@ msgid "Exit to OS" msgstr "Toka kwa OS" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "Michezo" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "Inaunda seva..." + +#: src/game.cpp msgid "Item definitions..." msgstr "Fasili ya kipengele..." @@ -844,24 +941,46 @@ msgid "Node definitions..." msgstr "Fundo Fasili..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Kusuluhisha anwani..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "Respawn" +msgid "On" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "Bandari ya mbali" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Kusuluhisha anwani..." #: src/game.cpp msgid "Shutting down..." msgstr "Inazima..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Singleplayer" + +#: src/game.cpp msgid "Sound Volume" msgstr "Kiwango cha sauti" #: src/game.cpp -msgid "You died." -msgstr "Alikufa." +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -896,6 +1015,10 @@ msgid "Console" msgstr "Kiweko" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "Mara mbili bomba \"Ruka\" hadi Togo kuruka" @@ -908,6 +1031,11 @@ msgid "Forward" msgstr "Mbele" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "Kiwango cha sauti" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Hesabu" @@ -927,6 +1055,24 @@ msgstr "Keybindings. (Kama Menyu hii screws, Ondoa vitu kutoka minetest.conf)" msgid "Left" msgstr "Kushoto" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "Amri majadiliano" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "Ijayo" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Chapisha mipororo" @@ -1004,38 +1150,22 @@ msgid "Apps" msgstr "Programu" #: src/keycode.cpp -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" msgstr "Nyuma" #: src/keycode.cpp -msgid "Capital" -msgstr "Mji mkuu" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Wazi" #: src/keycode.cpp -msgid "Comma" -msgstr "Mkato" - -#: src/keycode.cpp msgid "Control" msgstr "Udhibiti" #: src/keycode.cpp -msgid "Convert" -msgstr "Geuza" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "Chini" @@ -1044,26 +1174,15 @@ msgid "End" msgstr "Mwisho" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Futa OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Kutoroka" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "Kutekeleza" #: src/keycode.cpp -msgid "Final" -msgstr "Mwisho" - -#: src/keycode.cpp msgid "Help" msgstr "Msaada" @@ -1072,20 +1191,33 @@ msgid "Home" msgstr "Nyumbani" #: src/keycode.cpp -msgid "Insert" -msgstr "Chomeka" +#, fuzzy +msgid "IME Accept" +msgstr "Kukubali" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Convert" +msgstr "Geuza" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +#, fuzzy +msgid "IME Escape" +msgstr "Kutoroka" #: src/keycode.cpp -msgid "Kanji" -msgstr "KanJi" +#, fuzzy +msgid "IME Mode Change" +msgstr "Mabadiliko ya hali ya" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "Nonconvert" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Chomeka" #: src/keycode.cpp msgid "Left Button" @@ -1116,22 +1248,10 @@ msgid "Middle Button" msgstr "Kitufe kati" #: src/keycode.cpp -msgid "Minus" -msgstr "Alama ya kutoa" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Mabadiliko ya hali ya" - -#: src/keycode.cpp msgid "Next" msgstr "Ijayo" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "Nonconvert" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1148,6 +1268,11 @@ msgid "Numpad -" msgstr "Numpad-" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "Kinanda *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "Kinanda /" @@ -1196,20 +1321,12 @@ msgid "OEM Clear" msgstr "Wazi ya OEM" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "Sitisha" #: src/keycode.cpp -msgid "Period" -msgstr "Kipindi cha" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Plus" +msgid "Play" +msgstr "Kucheza" #: src/keycode.cpp msgid "Print" @@ -1316,6 +1433,20 @@ msgid "3D mode" msgstr "Hali ya 3D" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1390,6 +1521,10 @@ msgstr "" "Kumbuka kwamba uga wa anwani katika Menyu kuu Puuza kipimo hiki." #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1398,8 +1533,10 @@ msgstr "" "mfano kwa 4 k skrini." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "Rekebisha simbiko gamma kwa majedwali mwanga. Idadi ya chini ni mkali.\n" @@ -1426,6 +1563,12 @@ msgid "Amplifies the valleys" msgstr "Inaangazia mabonde" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Uchujaji wa anisotropic" @@ -1444,6 +1587,10 @@ msgstr "" "servers.minetest.net." #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "Kukadiria (X, Y, Z) kipimo cha fractal katika fundo." @@ -1452,6 +1599,19 @@ msgid "Ask to reconnect after crash" msgstr "Uliza kuunganisha baada ya ajali" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "Automaticaly ripoti ya serverlist." @@ -1476,6 +1636,14 @@ msgid "Basic Privileges" msgstr "Haki za msingi" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Uchujaji wa bilinear" @@ -1484,6 +1652,16 @@ msgid "Bind address" msgstr "Kumfunga anwani" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome API temperature and humidity noise parameters" +msgstr "Mwandishi ramani v6 unyevu kelele vigezo" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome noise" +msgstr "Kelele za mto" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" "Biti kwa pikseli (a.k.a rangi kina) katika hali-tumizi ya skrini nzima." @@ -1513,6 +1691,11 @@ msgid "Camera update toggle key" msgstr "Kibonye guro Usasishaji wa kamera" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "Pango kelele #1" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "Pango kelele #1" @@ -1525,6 +1708,35 @@ msgid "Cave width" msgstr "Pango upana" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "Pango kelele #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "Pango kelele #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "Pango upana" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "Pango kelele #1" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Kilele cha mlima gorofa Mwandishi ramani" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "Fomu ya mapango na vichuguu katika makutano ya kila mbili" @@ -1599,10 +1811,19 @@ msgid "Clean transparent textures" msgstr "Unamu angavu safi" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Mteja" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Mteja na seva" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "Mteja" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Kasi ya upandaji" @@ -1672,6 +1893,11 @@ msgid "Console color" msgstr "Rangi ya Kiweko" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "Muhimu ya Kiweko" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "Muhimu ya Kiweko" @@ -1698,14 +1924,6 @@ msgstr "" "unchanged." #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"Vidhibiti ukubwa wa majangwa na fukwe katika Mwandishi ramani v6.\n" -"Wakati snowbiomes vimewezeshwa 'mgv6_freq_desert' ni kupuuzwa." - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "Udhibiti mwinuko/kina cha ziwa depressions." @@ -1714,6 +1932,12 @@ msgid "Controls steepness/height of hills." msgstr "Udhibiti mwinuko/urefu wa milima." #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "Vidhibiti vya upana wa vichuguu, thamani ndogo huunda vichuguu pana." @@ -1738,6 +1962,11 @@ msgstr "" "Haya kufanya madini vigumu. Sifuri Hulemaza yao. (0-10)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "Kuunda" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "Crosshair Alfa" @@ -1774,6 +2003,11 @@ msgid "Debug log level" msgstr "Rekebisha kiwango cha logi" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "HUD kibonye" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "Hatua ya seva ya kujitolea" @@ -1815,6 +2049,41 @@ msgstr "" "Tu ina athari kama alikusanya na Mkunjo." #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1828,6 +2097,16 @@ msgstr "" "Inafasili umbali wa uhamisho wa mchezaji maximal katika vitalu (0 = ukomo)." #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "Kuchelewa katika kutuma vitalu baada ya jengo" @@ -1860,17 +2139,23 @@ msgstr "" "ya." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "Desynchronize umbo la uhuishaji" +msgid "Desert noise threshold" +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"Huamua umbo wa ardhi.\n" -"Namba 3 katika mabano kudhibiti ukubwa wa ardhi, namba 3 lazima kufanana." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Desynchronize umbo la uhuishaji" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "Chembe" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1920,10 +2205,24 @@ msgid "Enable Joysticks" msgstr "Wezesha vifimbocheza" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "Wezesha VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "Kuwezesha usalama Moduli" @@ -1968,6 +2267,20 @@ msgstr "" "wakati wa kuunganisha kwenye seva." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Enable view bobbing" +msgstr "Mwoneko kando" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Mengi kwa ajili ya Mwoneko kando.\n" +"Kwa mfano: 0 kwa ajili ya Mwoneko hakuna kando; 1.0 kwa ajili ya kawaida; " +"2.0 kwa mara mbili." + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2021,6 +2334,10 @@ msgstr "" "Inahitaji shaders kwa kuwezeshwa." #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Injini ubainishaji wa data ya uchapaji nafasi" @@ -2045,7 +2362,12 @@ msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Fall bobbing factor" msgstr "Kuanguka bobbing" #: src/settings_translation_file.cpp @@ -2121,6 +2443,11 @@ msgid "Filler Depth" msgstr "Kina ya Filler" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Filler depth noise" +msgstr "Kina ya Filler" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "Ramani ya toni filmic" @@ -2141,10 +2468,35 @@ msgid "Filtering" msgstr "Uchujaji" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "Mbegu ya ramani fasta" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Floatland level" +msgstr "Kiwango cha maji" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "Kuruka ufunguo" @@ -2157,6 +2509,10 @@ msgid "Fog" msgstr "Ukungu" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Kibonye guro wa ukungu" @@ -2193,6 +2549,14 @@ msgid "Forward key" msgstr "Ufunguo wa mbele" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "Fonti Freetype" @@ -2284,10 +2648,19 @@ msgid "Gravity" msgstr "Mvutano" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "Mwandishi ramani gorofa ngazi ya chini" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "HTTP Mods" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "HUD kibonye" @@ -2319,22 +2692,60 @@ msgstr "" "* Chombo sampler kutumika ili kusasisha takwimu." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat blend noise" +msgstr "Mwandishi ramani joto mchanganyiko kelele vigezo" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "Pango kelele #1" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "Kijenzi cha urefu wa ukubwa cha kidirisha awali." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "Windows kulia" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "Urefu ambayo mawingu ni kuonekana." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height select noise" +msgstr "Mwandishi ramani v6 urefu Teua vigezo kelele" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "FPU kuu-usahihi" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Mwandishi ramani gorofa kilima mwinuko" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Kilele cha mlima gorofa Mwandishi ramani" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Homepage ya seva, kuonyeshwa katika serverlist ya." #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "Kina jinsi kufanya mito" @@ -2361,6 +2772,18 @@ msgid "How wide to make rivers" msgstr "Upana gani kufanya mito" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2390,6 +2813,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2431,6 +2863,11 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "Ikiwa imewezeshwa, wachezaji wapya haiwezi kujiunga na nywila wazi." #: src/settings_translation_file.cpp +#, fuzzy +msgid "If enabled, show the server status message on player connection." +msgstr "Ujumbe wa siku ya kuonyeshwa kwa wachezaji kuunganisha." + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2463,6 +2900,18 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Mazungumzo katika mchezo console mandharinyuma rangi (R, G, B)." #: src/settings_translation_file.cpp +#, fuzzy +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" +"Mazungumzo katika mchezo console mandharinyuma Alfa (opaqueness kati ya 0 na " +"255)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "Muhimu ya Kiweko" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2510,6 +2959,11 @@ msgid "Interval of sending time of day to clients." msgstr "Muda wa kutuma wakati wa siku kwa wateja." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "Ufunguo wa hesabu" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "Hesabu vitu uhuishaji" @@ -2530,6 +2984,11 @@ msgid "Item entity TTL" msgstr "Kipengee chombo TTL" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Iterations" +msgstr "Instrumentation" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." @@ -2538,6 +2997,14 @@ msgstr "" "Udhibiti kiasi cha undani faini." #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "Kifimbocheza kitufe marudio nafasi" @@ -2584,6 +3051,22 @@ msgstr "" "Masafa ya takribani-2 hadi 2." #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Ufunguo wa kuruka" @@ -2602,6 +3085,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Muhimu kwa ajili ya kupunguza kiwango cha kuonyesha.\n" +"Ona http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2622,6 +3116,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Muhimu kwa ajili ya kuongeza kiwango cha kuonyesha.\n" +"Ona http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2682,6 +3187,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Muhimu kwa ajili ya kuruka.\n" +"Ona http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2702,6 +3218,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Muhimu kwa ajili ya kufungua dirisha la soga kuchapa amri.\n" +"Ona http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2733,6 +3260,28 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Muhimu kwa ajili ya kufungua hesabu.\n" +"Ona http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Muhimu kwa ajili ya kufungua hesabu.\n" +"Ona http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " @@ -2877,6 +3426,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Muhimu kwa ajili ya toggling onyesho la kuzungumza.\n" +"Ona http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2898,10 +3458,31 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Muhimu kwa ajili ya kuruka.\n" +"Ona http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "Matumizi muhimu kwa ajili ya kupanda/kushuka" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Mwandishi ramani ziwa gorofa mwinuko" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Mwandishi ramani ziwa gorofa kizingiti" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "Lugha" @@ -2910,6 +3491,11 @@ msgid "Large cave depth" msgstr "Kina ya pango kubwa" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "Muhimu ya Kiweko" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "Lava vipengele" @@ -2972,6 +3558,13 @@ msgstr "Kikomo ya foleni emerge kuzalisha" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -3054,6 +3647,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "Hufanya DirectX kazi na LuaJIT. Lemaza ikiwa husababisha matatizo." #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "Orodha ya ramani" @@ -3094,10 +3691,26 @@ msgstr "" "Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao." #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Ramani kizazi sifa maalum kwa Mwandishi ramani v7.\n" +"Bendera ya 'matuta' udhibiti mito.\n" +"Bendera ambayo haijabainishwa katika Tungo ya bendera ni hayakubadilishwa " +"kutoka chaguo-msingi.\n" +"Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao." + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3110,9 +3723,11 @@ msgstr "" "Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3136,24 +3751,21 @@ msgid "Mapblock limit" msgstr "Kikomo cha Mapblock" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "Mkatiko Muda Mapblock wakipakua" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Mwandishi ramani mabonde" +#, fuzzy +msgid "Mapblock mesh generation delay" +msgstr "Kikomo cha kizazi cha ramani" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "Mwandishi ramani biome joto kelele vigezo" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "Mwandishi ramani biome unyevu mchanganyiko kelele vigezo" +msgid "Mapblock unload timeout" +msgstr "Mkatiko Muda Mapblock wakipakua" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "Mwandishi ramani biome unyevu kelele vigezo" +msgid "Mapgen Valleys" +msgstr "Mwandishi ramani mabonde" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3168,118 +3780,15 @@ msgid "Mapgen flat" msgstr "Mwandishi ramani gorofa" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Mwandishi ramani pango gorofa upana" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "Mwandishi ramani cave1 za gorofa kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "Mwandishi ramani cave2 za gorofa kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "Filler wa gorofa ya Mwandishi ramani kina kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" +#, fuzzy +msgid "Mapgen flat specific flags" msgstr "Mwandishi ramani gorofa bendera" #: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "Mwandishi ramani gorofa ngazi ya chini" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "Mwandishi ramani gorofa kilima mwinuko" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "Kilele cha mlima gorofa Mwandishi ramani" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "Mwandishi ramani ziwa gorofa mwinuko" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "Mwandishi ramani ziwa gorofa kizingiti" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "Mwandishi ramani pango kubwa gorofa kina" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "Mwandishi ramani ardhi tambarare kelele vigezo" - -#: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "Fractal ya Mwandishi ramani" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "Mwandishi ramani fractal pango upana" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "Mwandishi ramani fractal cave1 kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "Mwandishi ramani fractal cave2 kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "Mwandishi ramani fractal filler kina kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "Mwandishi ramani fractal fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "Mwandishi ramani fractal Marudiorudio" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "Mwandishi ramani fractal julia w" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "Mwandishi ramani fractal julia x" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "Mwandishi ramani fractal julia y" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "Mwandishi ramani fractal julia z" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "Mwandishi ramani fractal Sawazisha" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "Mwandishi ramani fractal kipimo" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "Mwandishi ramani fractal seabed kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "Mwandishi ramani fractal kisu w" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "Mwandishi ramani joto mchanganyiko kelele vigezo" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Mwandishi ramani jina" @@ -3288,146 +3797,29 @@ msgid "Mapgen v5" msgstr "Mwandishi ramani v5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "Mwandishi ramani v5 pango upana" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "Mwandishi ramani v5 cave1 kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "Mwandishi ramani v5 cave2 kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "Mwandishi ramani v5 sababu kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "Mwandishi ramani v5 filler kina kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "Mwandishi ramani v5 urefu kelele vigezo" +#, fuzzy +msgid "Mapgen v5 specific flags" +msgstr "Mwandishi ramani v6 bendera" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "Mwandishi ramani v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "Mwandishi ramani v6 apple miti kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "Mwandishi ramani v6 pwani marudio" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "Mwandishi ramani v6 pwani kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "Mwandishi ramani v6 biome kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "Mwandishi ramani v6 pango kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "Mwandishi ramani v6 jangwa marudio" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" +#, fuzzy +msgid "Mapgen v6 specific flags" msgstr "Mwandishi ramani v6 bendera" #: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "Mwandishi ramani v6 urefu Teua vigezo kelele" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "Mwandishi ramani v6 unyevu kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "Mwandishi ramani v6 matope kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "Mwandishi ramani v6 mwinuko kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "Mwinuko wa ardhi ya Mwandishi ramani v6 kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "Mwandishi ramani v6 ardhi kelele msingi vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "Mwandishi ramani v6 miti kelele vigezo" - -#: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "Mwandishi ramani v7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "Mwandishi ramani v7 pango upana" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "Mwandishi ramani v7 cave1 kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "Mwandishi ramani v7 cave2 kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "Mwandishi ramani v7 filler kina kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" +#, fuzzy +msgid "Mapgen v7 specific flags" msgstr "Mwandishi ramani v7 bendera" #: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "Mwandishi ramani v7 urefu Teua vigezo kelele" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "Mwandishi ramani v7 mlima urefu kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "Mwandishi ramani v7 mlima kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "Mwandishi ramani v7 tuta kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "Mwandishi ramani v7 tuta maji kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "Mwandishi ramani v7 ardhi mwinuko kelele vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "Mwandishi ramani v7 ardhi kelele msingi vigezo" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "Mwandishi ramani v7 ardhi persistation kelele vigezo" - -#: src/settings_translation_file.cpp msgid "Massive cave depth" msgstr "Kina ya pango mkubwa" @@ -3606,6 +3998,10 @@ msgid "Mipmapping" msgstr "Mipmapping" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "Modstore maelezo URL" @@ -3626,6 +4022,15 @@ msgid "Monospace font size" msgstr "Ukubwa wa fonti wa Monospace" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mountain height noise" +msgstr "Mwandishi ramani v7 mlima urefu kelele vigezo" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "Unyeti wa kipanya" @@ -3634,6 +4039,10 @@ msgid "Mouse sensitivity multiplier." msgstr "Mengi ya unyeti wa kipanya." #: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." @@ -3643,13 +4052,9 @@ msgstr "" "2.0 kwa mara mbili." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" -"Mengi kwa ajili ya Mwoneko kando.\n" -"Kwa mfano: 0 kwa ajili ya Mwoneko hakuna kando; 1.0 kwa ajili ya kawaida; " -"2.0 kwa mara mbili." +#, fuzzy +msgid "Mute key" +msgstr "Ufunguo wa matumizi" #: src/settings_translation_file.cpp msgid "" @@ -3708,10 +4113,6 @@ msgid "NodeTimer interval" msgstr "Nafasi ya NodeTimer" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "Kelele vigezo vya biome API joto, unyevu na biome mchanganyiko." - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "Kila" @@ -3754,6 +4155,14 @@ msgid "Number of parallax occlusion iterations." msgstr "Idadi ya parallax occlusion Marudiorudio." #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "Upendeleo wa jumla wa parallax occlusion athari, kawaida kipimo/2." @@ -3794,6 +4203,12 @@ msgid "Path to save screenshots at." msgstr "Njia ya kuokoa viwambo katika." #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "Njia ya orodha ya unamu. Unamu wote vinatafutizwa kwanza kutoka hapa." @@ -3896,6 +4311,15 @@ msgid "Report path" msgstr "Njia ya ripoti" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ridge noise" +msgstr "Kelele za mto" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "Ufunguo sahihi" @@ -3928,6 +4352,10 @@ msgid "Round minimap" msgstr "Ramani pande zote" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "Hifadhi ramani kupokelewa na mteja kwenye diski." @@ -3936,6 +4364,10 @@ msgid "Saving map received from server" msgstr "Ramani kuokoa kupokea kutoka seva" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3984,6 +4416,15 @@ msgstr "" "Tumia 0 kwa ubora wa chaguo-msingi." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "Pango kelele #1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "Usalama" @@ -4028,6 +4469,10 @@ msgid "Server port" msgstr "Kituo tarishi cha seva" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL ya Serverlist" @@ -4068,16 +4513,27 @@ msgstr "" "Inahitaji shaders kwa kuwezeshwa." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "Shaders" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" "Shaders kuruhusu athari pevu onekana na inaweza kuongeza utendaji wa baadhi " "ya kadi ya video.\n" "Kazi yako tu na OpenGL video backend." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow limit" +msgstr "Kikomo cha Mapblock" + +#: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." msgstr "Sura ya minimap ya. Kuwezeshwa = pande zote, walemavu = mraba." @@ -4102,10 +4558,29 @@ msgstr "" "mapblocks (fundo 16)." #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "Mteremko na Jaza kazi pamoja kurekebisha urefu" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "Taa laini" @@ -4152,6 +4627,14 @@ msgid "Static spawnpoint" msgstr "Spawnpoint tuli" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "Nguvu ya normalmaps inayozalishwa." @@ -4172,10 +4655,33 @@ msgid "Synchronous SQLite" msgstr "SQLite Uvingirizi" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "Urefu wa ardhi" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain base noise" +msgstr "Urefu wa ardhi" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain higher noise" +msgstr "Urefu wa ardhi" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain noise" +msgstr "Urefu wa ardhi" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4196,6 +4702,10 @@ msgstr "" "Rekebisha kuelekea 0.0 kwa sehemu kubwa." #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "Njia ya unamu" @@ -4216,13 +4726,17 @@ msgid "The depth of dirt or other filler" msgstr "Kina cha uchafu au filler nyingine" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." msgstr "" "Kijia cha faili jamaa yako worldpath ambayo maumbo utaakibishwa kwenye.\n" #: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp msgid "The network interface that the server listens on." msgstr "Interface mtandao kwamba seva husikiliza juu." @@ -4284,6 +4798,10 @@ msgstr "" "wakati wa kufanya kitufe cha kulia." #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "Fonti hii itatumika kwa lugha fulani." @@ -4333,6 +4851,10 @@ msgid "Tooltip delay" msgstr "Kidokezozana kuchelewa" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Uchujaji wa trilinear" @@ -4350,11 +4872,29 @@ msgid "Trusted mods" msgstr "Mods aminifu" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" "URL kwenye orodha ya seva iliyoonyeshwa katika kichupo cha Multiplayer." #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "Umbali wa uhamisho wa mchezaji ukomo" @@ -4421,6 +4961,43 @@ msgid "Valleys C Flags" msgstr "Bendera ya mabonde C" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "Udhibiti mwinuko/urefu wa milima." + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "Ulandanishi wa kiwamba wima." @@ -4429,13 +5006,13 @@ msgid "Video driver" msgstr "Kiendeshaji video" #: src/settings_translation_file.cpp -msgid "View bobbing" +#, fuzzy +msgid "View bobbing factor" msgstr "Mwoneko kando" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +#, fuzzy +msgid "View distance in nodes." msgstr "" "Onyesha umbali katika fundo.\n" "Min = 20" @@ -4449,6 +5026,10 @@ msgid "View range increase key" msgstr "Mwoneko masafa ongezeko muhimu" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "Kuonyesha masafa" @@ -4554,21 +5135,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" -"Ambapo jenereta ramani hukomesha.\n" -"Tafadhali kumbuka: - mdogo kwa 31000 (kipimo hapo juu ina athari) - jenereta " -"ramani kazi katika makundi ya 80 x 80 x 80 fundo (5 x 5 x 5 MapBlocks).\n" -"-Vikundi hivyo kuwa nje ya uwekaji wa-32,-32 fundo kutoka asili.\n" -"-Tu vikundi vilivyo ndani ya map_generation_limit ni yanayotokana" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" "Kama freetype fonti hutumiwa, inahitaji msaada wa freetype kuwa alikusanya " @@ -4630,6 +5196,13 @@ msgstr "Upana wa mistari ya selectionbox karibu fundo." #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4645,6 +5218,43 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "Y ya upper kikomo ya kubwa pseudorandom cellars." #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "block send optimize distance" +msgstr "Umbo la Max Tuma umbali" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "cURL muda wa upakuzi wa faili" @@ -4655,3 +5265,233 @@ msgstr "cURL kikomo sambamba" #: src/settings_translation_file.cpp msgid "cURL timeout" msgstr "muda wa kuisha wa cURL" + +#~ msgid "Hide mp content" +#~ msgstr "Ficha maudhui ya mbunge" + +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "Mji mkuu" + +#~ msgid "Comma" +#~ msgstr "Mkato" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Mwisho" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "KanJi" + +#~ msgid "Minus" +#~ msgstr "Alama ya kutoa" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Kipindi cha" + +#~ msgid "Plus" +#~ msgstr "Plus" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Vidhibiti ukubwa wa majangwa na fukwe katika Mwandishi ramani v6.\n" +#~ "Wakati snowbiomes vimewezeshwa 'mgv6_freq_desert' ni kupuuzwa." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Huamua umbo wa ardhi.\n" +#~ "Namba 3 katika mabano kudhibiti ukubwa wa ardhi, namba 3 lazima kufanana." + +#~ msgid "Mapgen biome heat noise parameters" +#~ msgstr "Mwandishi ramani biome joto kelele vigezo" + +#~ msgid "Mapgen biome humidity blend noise parameters" +#~ msgstr "Mwandishi ramani biome unyevu mchanganyiko kelele vigezo" + +#~ msgid "Mapgen biome humidity noise parameters" +#~ msgstr "Mwandishi ramani biome unyevu kelele vigezo" + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Mwandishi ramani pango gorofa upana" + +#~ msgid "Mapgen flat cave1 noise parameters" +#~ msgstr "Mwandishi ramani cave1 za gorofa kelele vigezo" + +#~ msgid "Mapgen flat cave2 noise parameters" +#~ msgstr "Mwandishi ramani cave2 za gorofa kelele vigezo" + +#~ msgid "Mapgen flat filler depth noise parameters" +#~ msgstr "Filler wa gorofa ya Mwandishi ramani kina kelele vigezo" + +#~ msgid "Mapgen flat large cave depth" +#~ msgstr "Mwandishi ramani pango kubwa gorofa kina" + +#~ msgid "Mapgen flat terrain noise parameters" +#~ msgstr "Mwandishi ramani ardhi tambarare kelele vigezo" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Mwandishi ramani fractal pango upana" + +#~ msgid "Mapgen fractal cave1 noise parameters" +#~ msgstr "Mwandishi ramani fractal cave1 kelele vigezo" + +#~ msgid "Mapgen fractal cave2 noise parameters" +#~ msgstr "Mwandishi ramani fractal cave2 kelele vigezo" + +#~ msgid "Mapgen fractal filler depth noise parameters" +#~ msgstr "Mwandishi ramani fractal filler kina kelele vigezo" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Mwandishi ramani fractal fractal" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Mwandishi ramani fractal Marudiorudio" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "Mwandishi ramani fractal julia w" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "Mwandishi ramani fractal julia x" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "Mwandishi ramani fractal julia y" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "Mwandishi ramani fractal julia z" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "Mwandishi ramani fractal Sawazisha" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Mwandishi ramani fractal kipimo" + +#~ msgid "Mapgen fractal seabed noise parameters" +#~ msgstr "Mwandishi ramani fractal seabed kelele vigezo" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Mwandishi ramani fractal kisu w" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Mwandishi ramani v5 pango upana" + +#~ msgid "Mapgen v5 cave1 noise parameters" +#~ msgstr "Mwandishi ramani v5 cave1 kelele vigezo" + +#~ msgid "Mapgen v5 cave2 noise parameters" +#~ msgstr "Mwandishi ramani v5 cave2 kelele vigezo" + +#~ msgid "Mapgen v5 factor noise parameters" +#~ msgstr "Mwandishi ramani v5 sababu kelele vigezo" + +#~ msgid "Mapgen v5 filler depth noise parameters" +#~ msgstr "Mwandishi ramani v5 filler kina kelele vigezo" + +#~ msgid "Mapgen v5 height noise parameters" +#~ msgstr "Mwandishi ramani v5 urefu kelele vigezo" + +#~ msgid "Mapgen v6 apple trees noise parameters" +#~ msgstr "Mwandishi ramani v6 apple miti kelele vigezo" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "Mwandishi ramani v6 pwani marudio" + +#~ msgid "Mapgen v6 beach noise parameters" +#~ msgstr "Mwandishi ramani v6 pwani kelele vigezo" + +#~ msgid "Mapgen v6 biome noise parameters" +#~ msgstr "Mwandishi ramani v6 biome kelele vigezo" + +#~ msgid "Mapgen v6 cave noise parameters" +#~ msgstr "Mwandishi ramani v6 pango kelele vigezo" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "Mwandishi ramani v6 jangwa marudio" + +#~ msgid "Mapgen v6 mud noise parameters" +#~ msgstr "Mwandishi ramani v6 matope kelele vigezo" + +#~ msgid "Mapgen v6 steepness noise parameters" +#~ msgstr "Mwandishi ramani v6 mwinuko kelele vigezo" + +#~ msgid "Mapgen v6 terrain altitude noise parameters" +#~ msgstr "Mwinuko wa ardhi ya Mwandishi ramani v6 kelele vigezo" + +#~ msgid "Mapgen v6 terrain base noise parameters" +#~ msgstr "Mwandishi ramani v6 ardhi kelele msingi vigezo" + +#~ msgid "Mapgen v6 trees noise parameters" +#~ msgstr "Mwandishi ramani v6 miti kelele vigezo" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Mwandishi ramani v7 pango upana" + +#~ msgid "Mapgen v7 cave1 noise parameters" +#~ msgstr "Mwandishi ramani v7 cave1 kelele vigezo" + +#~ msgid "Mapgen v7 cave2 noise parameters" +#~ msgstr "Mwandishi ramani v7 cave2 kelele vigezo" + +#~ msgid "Mapgen v7 filler depth noise parameters" +#~ msgstr "Mwandishi ramani v7 filler kina kelele vigezo" + +#~ msgid "Mapgen v7 height select noise parameters" +#~ msgstr "Mwandishi ramani v7 urefu Teua vigezo kelele" + +#~ msgid "Mapgen v7 mountain noise parameters" +#~ msgstr "Mwandishi ramani v7 mlima kelele vigezo" + +#~ msgid "Mapgen v7 ridge noise parameters" +#~ msgstr "Mwandishi ramani v7 tuta kelele vigezo" + +#~ msgid "Mapgen v7 ridge water noise parameters" +#~ msgstr "Mwandishi ramani v7 tuta maji kelele vigezo" + +#~ msgid "Mapgen v7 terrain altitude noise parameters" +#~ msgstr "Mwandishi ramani v7 ardhi mwinuko kelele vigezo" + +#~ msgid "Mapgen v7 terrain base noise parameters" +#~ msgstr "Mwandishi ramani v7 ardhi kelele msingi vigezo" + +#~ msgid "Mapgen v7 terrain persistation noise parameters" +#~ msgstr "Mwandishi ramani v7 ardhi persistation kelele vigezo" + +#~ msgid "" +#~ "Noise parameters for biome API temperature, humidity and biome blend." +#~ msgstr "Kelele vigezo vya biome API joto, unyevu na biome mchanganyiko." + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "Ambapo jenereta ramani hukomesha.\n" +#~ "Tafadhali kumbuka: - mdogo kwa 31000 (kipimo hapo juu ina athari) - " +#~ "jenereta ramani kazi katika makundi ya 80 x 80 x 80 fundo (5 x 5 x 5 " +#~ "MapBlocks).\n" +#~ "-Vikundi hivyo kuwa nje ya uwekaji wa-32,-32 fundo kutoka asili.\n" +#~ "-Tu vikundi vilivyo ndani ya map_generation_limit ni yanayotokana" diff --git a/po/tr/minetest.po b/po/tr/minetest.po index 5348a0590..a69e60062 100644 --- a/po/tr/minetest.po +++ b/po/tr/minetest.po @@ -6,32 +6,39 @@ msgid "" msgstr "" "Project-Id-Version: 0.1.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2015-10-27 16:46+0200\n" -"Last-Translator: PilzAdam <PilzAdam@minetest.net>\n" -"Language-Team: Turkish <https://hosted.weblate.org/projects/minetest/" -"minetest/tr/>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-06-03 13:27+0000\n" +"Last-Translator: monolifed <monolifed@gmail.com>\n" +"Language-Team: Turkish " +"<https://hosted.weblate.org/projects/minetest/minetest/tr/>\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 2.5-dev\n" +"X-Generator: Weblate 2.15-dev\n" "X-Poedit-Language: Turkish\n" "X-Poedit-Basepath: \n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "Yeniden Canlan" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Öldün." + #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" -msgstr "Lua scriptte bir hata meydana geldi:" +msgstr "Lua betiÄŸinde, mod gibi, bir hata meydana geldi:" #: builtin/fstk/ui.lua msgid "An error occured:" msgstr "Bir hata oluÅŸtu:" #: builtin/fstk/ui.lua -#, fuzzy msgid "Main menu" -msgstr "Ana menu" +msgstr "Ana menü" #: builtin/fstk/ui.lua builtin/mainmenu/store.lua msgid "Ok" @@ -64,8 +71,8 @@ msgstr "Bu sunucu $1 ve $2 arası tüm protokol sürümlerini destekler. " #: builtin/mainmenu/common.lua msgid "Try reenabling public serverlist and check your internet connection." msgstr "" -"Sunucu listesini tekrar etkinleÅŸtirmeyi deneyin ve internet baÄŸlantınızı " -"kontrol edin." +"Açık sunucu listesini tekrar etkinleÅŸtirmeyi deneyin ve internet " +"baÄŸlantınızı doÄŸrulayın." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -79,21 +86,25 @@ msgstr "Yalnızca $1 ve $2 arası protokol sürümleri desteklenmektedir." #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" -msgstr "Vazgeç" +msgstr "İptal" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" -msgstr "Bağımlılıklar :" +msgid "Dependencies:" +msgstr "Bağımlılıklar:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable MP" -msgstr "Paketi Kapat" +msgstr "MP Devre Dışı" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Tümü devre dışı" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" -msgstr "Paketi Aç" +msgstr "MP Etkin" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" @@ -104,20 +115,16 @@ msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "chararacters [a-z0-9_] are allowed." msgstr "" -"Geçersiz karakterler içerdiÄŸi için \"$1\" modu etkinleÅŸtirilemiyor. İzin " -"verilen karakterler [a-z0-9_]." - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Oyunu Gizle" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Detayları gizle" +"Geçersiz karakterler içerdiÄŸi için \"$1\" modu etkinleÅŸtirilemedi. Sadece [a-" +"z0-9_] karakterlerine izin verilir." #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" -msgstr "Eklnt:" +msgstr "Mod:" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "İsteÄŸe baÄŸlı bağımlılıklar:" #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp @@ -130,11 +137,11 @@ msgstr "Dünya:" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" -msgstr "EtkinleÅŸtirildi" +msgstr "etkin" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr " \"$1\" isimli dünya zaten var" +msgstr "\"$1\" adlı dünya zaten var" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" @@ -142,11 +149,11 @@ msgstr "OluÅŸtur" #: builtin/mainmenu/dlg_create_world.lua msgid "Download a subgame, such as minetest_game, from minetest.net" -msgstr "Minetest.net adresinden bir oyun modu indirin" +msgstr "minetest.net adresinden, minetest_game gibi, bir alt oyun indirin" #: builtin/mainmenu/dlg_create_world.lua msgid "Download one from minetest.net" -msgstr "Minetest.net adresinden indirin" +msgstr "minetest.net adresinden indirin" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Game" @@ -158,15 +165,15 @@ msgstr "Mapgen" #: builtin/mainmenu/dlg_create_world.lua msgid "No worldname given or no game selected" -msgstr "Dünya seçilmedi ya da adlandırılmadı" +msgstr "Dünya adı verilmedi ya da oyun seçilmedi" #: builtin/mainmenu/dlg_create_world.lua msgid "Seed" -msgstr "Çekirdek" +msgstr "Tohum" #: builtin/mainmenu/dlg_create_world.lua msgid "Warning: The minimal development test is meant for developers." -msgstr "Uyarı : Minimal Development Test geliÅŸtiriciler içindir." +msgstr "Uyarı : Minimal geliÅŸtirici testi geliÅŸtiriciler içindir." #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -174,57 +181,56 @@ msgstr "Dünya adı" #: builtin/mainmenu/dlg_create_world.lua msgid "You have no subgames installed." -msgstr "Ek bir oyun modu yüklü deÄŸil." +msgstr "Kurulu alt oyununuz yok." #: builtin/mainmenu/dlg_delete_mod.lua msgid "Are you sure you want to delete \"$1\"?" -msgstr " \"$1\" 'i silmek istediÄŸinizden emin misiniz ?" +msgstr "\"$1\" 'i silmek istediÄŸinizden emin misiniz?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Sil" #: builtin/mainmenu/dlg_delete_mod.lua msgid "Modmgr: failed to delete \"$1\"" -msgstr "Modmgr:\"$1\" dosyası silerken hata" +msgstr "Modmgr: \"$1\" dosyası silinemedi" #: builtin/mainmenu/dlg_delete_mod.lua msgid "Modmgr: invalid modpath \"$1\"" -msgstr "Modmgr: \"$1\" eklenti konumu yanlış" +msgstr "Modmgr: \"$1\" mod konumu geçersiz" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" -msgstr " \"$1\" dünyasını sil ?" +msgstr "\"$1\" dünyasını sil?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Kabul et" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "Eklenti paketini yeniden adlandır :" +msgstr "Mod paketini yeniden adlandır:" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "\"$1\" is not a valid flag." -msgstr "" +msgstr "\"$1\" geçerli bir bayrak deÄŸil." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" -msgstr "(Açıklama bilgisi verilmedi)" +msgstr "(Ayarın verilen açıklaması yok)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" -msgstr "" +msgstr "< Ayarlar sayfasına geri dön" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Browse" -msgstr "Seç" +msgstr "Gözat" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Disabled" -msgstr "Paketi Kapat" +msgstr "Devre dışı" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Edit" @@ -232,66 +238,72 @@ msgstr "Düzenle" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Enabled" -msgstr "EtkinleÅŸtirildi" +msgstr "Etkin" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Format is 3 numbers separated by commas and inside brackets." -msgstr "" +msgstr "Ayraç içinde ve virgülle ayrılmış 3 sayı biçimindedir." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "" "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " "<octaves>, <persistence>" msgstr "" +"Biçim: <kaydırma>, <boyut>, (<yayılmaX>, <yayılmaY>, <yayılmaZ>), <tohum>, " +"<oktav>, <kalıcılık>" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" -msgstr "Oyun" +msgstr "Oyunlar" #: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua msgid "Mods" -msgstr "Eklentiler" +msgstr "Modlar" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Optionally the lacunarity can be appended with a leading comma." -msgstr "" +msgstr "İstenirse lakuraniti öne gelen virgülle eklenebilir." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a comma seperated list of flags." -msgstr "" +msgstr "Lütfen virgülle ayrılmış bir bayrak listesi girin." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." -msgstr "" +msgstr "Lütfen geçerli bir tamsayı girin." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid number." -msgstr "" +msgstr "Lütfen geçerli bir sayı girin." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Possible values are: " -msgstr "" +msgstr "Olası deÄŸerler: " #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Restore Default" -msgstr "" +msgstr "Varsayılanı Geri Yükle" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Ara" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Select path" -msgstr "Seç" +msgstr "Konumu seçin" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Show technical names" -msgstr "" +msgstr "Teknik adları göster" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." -msgstr "" +msgid "The value must be at least $1." +msgstr "DeÄŸer en az $1 olmalı." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." -msgstr "" +msgid "The value must not be larger than $1." +msgstr "DeÄŸer $1'den büyük olmamalı." #: builtin/mainmenu/modmgr.lua msgid "" @@ -299,23 +311,27 @@ msgid "" "Install Mod: unsupported filetype \"$1\" or broken archive" msgstr "" "\n" -"Eklenti yükle: Desteklenmeyen dosya uzantısı \"$1\" veya bozuk dosya" +"Mod Kur: Desteklenmeyen dosya türü \"$1\" veya bozuk arÅŸiv" #: builtin/mainmenu/modmgr.lua msgid "Failed to install $1 to $2" -msgstr " $1 arası $2 yükleme baÅŸarısız" +msgstr "$1'den $2'ye kurma baÅŸarısız" #: builtin/mainmenu/modmgr.lua msgid "Install Mod: file: \"$1\"" -msgstr "Eklenti yükle: Dosya: \"$1\"" +msgstr "Mod Kur: dosya: \"$1\"" #: builtin/mainmenu/modmgr.lua msgid "Install Mod: unable to find real modname for: $1" -msgstr "Eklenti yükle: $1 için eklenti adı bulunamadı" +msgstr "Mod Kur: $1 için gerçek mod adı bulunamadı" #: builtin/mainmenu/modmgr.lua msgid "Install Mod: unable to find suitable foldername for modpack $1" -msgstr "Eklenti yükle:$1 eklenti paketi için uygun bir klasör adı bulunamadı" +msgstr "Mod Kur:$1 mod paketi için uygun bir klasör adı bulunamadı" + +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "Alt Oyun Modları" #: builtin/mainmenu/store.lua msgid "Close store" @@ -323,47 +339,43 @@ msgstr "MaÄŸazayı kapat" #: builtin/mainmenu/store.lua msgid "Downloading $1, please wait..." -msgstr " $1, indiriliyor, lütfen bekleyin" +msgstr "$1 indiriliyor, lütfen bekleyin..." #: builtin/mainmenu/store.lua msgid "Install" -msgstr "Yükle" +msgstr "Kur" #: builtin/mainmenu/store.lua msgid "Page $1 of $2" -msgstr "$2 sayfadan $1 'cisi" +msgstr "$2 sayfadan $1" #: builtin/mainmenu/store.lua msgid "Rating" -msgstr "Oylama" - -#: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Ara" +msgstr "Rating" #: builtin/mainmenu/store.lua msgid "Shortname:" -msgstr "Takma ad :" +msgstr "Kısa ad:" #: builtin/mainmenu/store.lua msgid "Successfully installed:" -msgstr "Yükleme baÅŸarılı :" +msgstr "BaÅŸarıyla kuruldu:" #: builtin/mainmenu/store.lua msgid "Unsorted" -msgstr "Sıralanmamış" +msgstr "Sırasız" #: builtin/mainmenu/store.lua msgid "re-Install" -msgstr "yeniden yükle" +msgstr "yeniden kur" #: builtin/mainmenu/tab_credits.lua msgid "Active Contributors" -msgstr "Aktif katkı saÄŸlayanlar" +msgstr "Etkin Katkıda Bulunanlar" #: builtin/mainmenu/tab_credits.lua msgid "Core Developers" -msgstr "Ana geliÅŸtiriciler" +msgstr "Çekirdek GeliÅŸtiriciler" #: builtin/mainmenu/tab_credits.lua msgid "Credits" @@ -371,248 +383,255 @@ msgstr "Hakkında" #: builtin/mainmenu/tab_credits.lua msgid "Previous Contributors" -msgstr "Katkı saÄŸlayanlar" +msgstr "Önceki Katkıda Bulunanlar" #: builtin/mainmenu/tab_credits.lua msgid "Previous Core Developers" -msgstr "İlk geliÅŸtiriciler" +msgstr "Önceki Çekirdek GeliÅŸtiriciler" + +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "Sunucuyu Duyur" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "BaÄŸlı Adres" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Yapılandır" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "Yaratıcı Kip" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "Hasar Etkin" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "Oyun Barındır" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "Sunucu Barındır" + +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" +msgstr "Yerel Oyun" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Ad/Åžifre" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Yeni" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Dünya seçilmedi ya da oluÅŸturulmadı!" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Oyunu Oyna" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Port" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Dünya Seç:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Sunucu Portu" #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" -msgstr "Yüklenen eklentiler :" +msgstr "Kurulu Modlar:" #: builtin/mainmenu/tab_mods.lua msgid "Mod information:" -msgstr "Eklenti bilgileri:" +msgstr "Mod bilgileri:" + +#: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "Bağımlılık yok." #: builtin/mainmenu/tab_mods.lua msgid "No mod description available" -msgstr "Eklenti bilgisi yok" +msgstr "Bulunan mod açıklaması yok" #: builtin/mainmenu/tab_mods.lua msgid "Rename" -msgstr "Adlandır" +msgstr "Yeniden adlandır" #: builtin/mainmenu/tab_mods.lua msgid "Select Mod File:" -msgstr "Eklenti seç :" +msgstr "Mod Dosyası Seç:" #: builtin/mainmenu/tab_mods.lua msgid "Uninstall selected mod" -msgstr "Seçili eklentiyi sil" +msgstr "Seçili Modu Kaldır" #: builtin/mainmenu/tab_mods.lua msgid "Uninstall selected modpack" -msgstr "Seçilen eklenti paketini sil" +msgstr "Seçili Mod Paketini Kaldır" -#: builtin/mainmenu/tab_multiplayer.lua -#, fuzzy +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" -msgstr "Adres / Port :" +msgstr "Adres / Port" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Çevirimiçi Oyna" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "BaÄŸlan" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" -msgstr "Yaratıcı mod" +msgstr "Yaratıcı kip" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" -msgstr "Hasar alma etkin" +msgstr "Hasar etkin" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" -msgstr "" +msgstr "Favoriyi Sil" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" -msgstr "" +msgstr "Favori" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" -msgstr "Kullanıcı Adı / Åžifre :" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Mücadele modu" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Adresi doÄŸrula" +msgstr "Ad / Åžifre" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Ayarla" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "Ping" -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "Yaratıcı Mod" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "Hasarı etkinleÅŸtir" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "Çevrim İçi Oyna" -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Kullanıcı adı/Åžifre" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Yeni" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#, fuzzy -msgid "No world created or selected!" -msgstr "Dünya seçilmedi ya da adlandırılmadı" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Port" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Herkese Açık" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Dünya seç :" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Sunucu Kur" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Sunucu portu" - -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Oyunu BaÅŸlat" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "SavaÅŸ etkin" #: builtin/mainmenu/tab_settings.lua msgid "2x" -msgstr "" +msgstr "2x" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "3D Clouds" -msgstr "3 boyutlu bulutlar" +msgstr "3D Bulutlar" #: builtin/mainmenu/tab_settings.lua msgid "4x" -msgstr "" +msgstr "4x" #: builtin/mainmenu/tab_settings.lua msgid "8x" -msgstr "" +msgstr "8x" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Advanced Settings" -msgstr "Ayarlar" +msgstr "GeliÅŸmiÅŸ Ayarlar" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" -msgstr "" +msgstr "DüzgünleÅŸtirme:" #: builtin/mainmenu/tab_settings.lua msgid "Are you sure to reset your singleplayer world?" -msgstr "Tek kiÅŸilik dünyayı sıfırlamak istediÄŸinizden emin misiniz ?" +msgstr "Tek oyunculu dünyayı sıfırlamak istediÄŸinizden emin misiniz ?" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "Ekran boyutunu hatırla" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" -msgstr "İki yönlü süzme" +msgstr "Bilineer Filtre" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Bump Mapping" -msgstr "Engebeler" +msgstr "Tümsek EÅŸleme" #: builtin/mainmenu/tab_settings.lua msgid "Change keys" msgstr "TuÅŸları deÄŸiÅŸtir" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Connected Glass" -msgstr "İçiçe geçmiÅŸ cam" +msgstr "BitiÅŸik Cam" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Fancy Leaves" -msgstr "Şık aÄŸaçlar" +msgstr "Şık Yapraklar" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" -msgstr "Mipmap" +msgstr "Mip eÅŸleme" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Mipmap + Aniso. Filter" -msgstr "Mipmap Aniso. Süzgeci" +msgstr "Mip eÅŸleme + Aniso. Filtre" #: builtin/mainmenu/tab_settings.lua msgid "No" msgstr "Hayır" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "No Filter" -msgstr "Süzme yok" +msgstr "Filtre yok" #: builtin/mainmenu/tab_settings.lua msgid "No Mipmap" -msgstr "Mipmap kapalı" +msgstr "Mip eÅŸleme yok" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Node Highlighting" -msgstr "Nesne seçme göstergesi" +msgstr "Nod Vurgulama" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Node Outlining" -msgstr "Nesne seçme göstergesi" +msgstr "Nod Anahatlama" #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua msgid "None" -msgstr "" +msgstr "Yok" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Normal Mapping" -msgstr "Mip-Mapping" +msgstr "Dikey EÅŸleme" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Opaque Leaves" -msgstr "Åžeffaf su" +msgstr "Opak Yapraklar" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Water" -msgstr "Åžeffaf su" +msgstr "Opak Su" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Parallax Occlusion" -msgstr "Parallax Occlusion" +msgstr "Paralaks Oklüzyon" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Particles" -msgstr "Hepsini etkinleÅŸtir" +msgstr "Parçacıklar" #: builtin/mainmenu/tab_settings.lua msgid "Reset singleplayer world" -msgstr "Tek kiÅŸilik oyunu sıfırlayın" +msgstr "Tek oyunculu dünyayı sıfırla" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Ekran:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" @@ -620,17 +639,15 @@ msgstr "Ayarlar" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" -msgstr "Shaders" +msgstr "Gölgelemeler" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Simple Leaves" -msgstr "Dalgalanan Yapraklar" +msgstr "Basit Yapraklar" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Smooth Lighting" -msgstr "Pürüzsüz ışıklandırma" +msgstr "YumuÅŸak Aydınlatma" #: builtin/mainmenu/tab_settings.lua msgid "Texturing:" @@ -638,33 +655,29 @@ msgstr "Doku:" #: builtin/mainmenu/tab_settings.lua msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "OpenGL sürücüleri seçilmeden Shader etkinleÅŸtirilemez." +msgstr "OpenGL sürücüleri seçilmeden gölgelemeler etkinleÅŸtirilemez." #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -#, fuzzy msgid "Tone Mapping" -msgstr "Mip-Mapping" +msgstr "Ton EÅŸleme" #: builtin/mainmenu/tab_settings.lua msgid "Touchthreshold (px)" -msgstr "Touchthreshold (px)" +msgstr "DokunuÅŸ eÅŸiÄŸi (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" -msgstr "Üç yönlü süzme" +msgstr "Trilineer Filtre" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Waving Leaves" msgstr "Dalgalanan Yapraklar" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Waving Plants" msgstr "Dalgalanan Bitkiler" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Waving Water" msgstr "Dalgalanan Su" @@ -674,7 +687,7 @@ msgstr "Evet" #: builtin/mainmenu/tab_simple_main.lua msgid "Config mods" -msgstr "Eklentileri ayarla" +msgstr "Modları yapılandır" #: builtin/mainmenu/tab_simple_main.lua msgid "Main" @@ -682,45 +695,35 @@ msgstr "Ana" #: builtin/mainmenu/tab_simple_main.lua msgid "Start Singleplayer" -msgstr "Tek kiÅŸilik oyunu baÅŸlat" - -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Oyna" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Tek KiÅŸilik" +msgstr "Tek oyunculu baÅŸlat" #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" -msgstr "Bilgi yok" +msgstr "Bulunan bilgi yok" #: builtin/mainmenu/tab_texturepacks.lua msgid "Select texture pack:" -msgstr "Doku paketi seç :" +msgstr "Doku paketi seç:" #: builtin/mainmenu/tab_texturepacks.lua msgid "Texturepacks" -msgstr "Doku paketi" +msgstr "Doku paketleri" #: src/client.cpp -#, fuzzy msgid "Connection timed out." -msgstr "BaÄŸlantı hatası ( Zaman aşımı ? )" +msgstr "BaÄŸlantı zaman aşımına uÄŸradı." #: src/client.cpp msgid "Done!" msgstr "Tamam!" #: src/client.cpp -#, fuzzy msgid "Initializing nodes" -msgstr "Nesneler yükleniyor..." +msgstr "Nodlar baÅŸlatılıyor" #: src/client.cpp msgid "Initializing nodes..." -msgstr "Nesneler yükleniyor..." +msgstr "Nodlar baÅŸlatılıyor..." #: src/client.cpp msgid "Loading textures..." @@ -728,15 +731,15 @@ msgstr "Dokular yükleniyor..." #: src/client.cpp msgid "Rebuilding shaders..." -msgstr "Shader inÅŸa ediliyor..." +msgstr "Gölgelemeler yeniden oluÅŸturuluyor..." #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" -msgstr "BaÄŸlantı hatası ( Zaman aşımı ? )" +msgstr "BaÄŸlantı hatası (zaman aşımı?)" #: src/client/clientlauncher.cpp msgid "Could not find or load game \"" -msgstr "Oyun yüklenemiyor \"" +msgstr "Oyun bulunamıyor veya yüklenemiyor \"" #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -744,23 +747,27 @@ msgstr "Geçersiz oyun özellikleri." #: src/client/clientlauncher.cpp msgid "Main Menu" -msgstr "Ana menu" +msgstr "Ana Menü" #: src/client/clientlauncher.cpp msgid "No world selected and no address provided. Nothing to do." -msgstr "Dünya veya adres seçilmedi." +msgstr "Dünya seçilmedi veya adres yok. Yapılacak bir ÅŸey yok." #: src/client/clientlauncher.cpp msgid "Player name too long." msgstr "Kullanıcı adı çok uzun." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Lütfen bir ad seçin!" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " -msgstr "Belirtilen dünya konumu yok:" +msgstr "Belirtilen dünya konumu yok: " #: src/fontengine.cpp msgid "needs_fallback_font" -msgstr "no" +msgstr "needs_fallback_font" #: src/game.cpp msgid "" @@ -768,7 +775,39 @@ msgid "" "Check debug.txt for details." msgstr "" "\n" -"Hata ayrıntıları için debug.txt dosyasını inceleyin." +"Hata ayrıntıları için debug.txt dosyasına bakın." + +#: src/game.cpp +msgid "- Address: " +msgstr "- Adres: " + +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "- Yaratıcı Kip: " + +#: src/game.cpp +msgid "- Damage: " +msgstr "- Hasar: " + +#: src/game.cpp +msgid "- Mode: " +msgstr "- Kip: " + +#: src/game.cpp +msgid "- Port: " +msgstr "- Port: " + +#: src/game.cpp +msgid "- Public: " +msgstr "- Herkes: " + +#: src/game.cpp +msgid "- PvP: " +msgstr "- SavaÅŸ: " + +#: src/game.cpp +msgid "- Server Name: " +msgstr "- Sunucu Adı: " #: src/game.cpp msgid "Change Keys" @@ -787,6 +826,39 @@ msgid "Continue" msgstr "Devam et" #: src/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse left: dig/punch\n" +"- Mouse right: place/use\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" +msgstr "" +"Kontroller:\n" +"- %s: ileri hareket\n" +"- %s: geri hareket\n" +"- %s: sola hareket\n" +"- %s: saÄŸa hareket\n" +"- %s: zıpla/tırman\n" +"- %s: sız/aÅŸağı in\n" +"- %s: öğeyi at\n" +"- %s: envanter\n" +"- Fare: dön/bak\n" +"- Sol fare: kaz/vur\n" +"- SaÄŸ fare: yerleÅŸtir/kullan\n" +"- Fare tekerleÄŸi: öğe seç\n" +"- %s: sohbet\n" + +#: src/game.cpp msgid "Creating client..." msgstr "İstemci oluÅŸturuluyor..." @@ -797,32 +869,6 @@ msgstr "Sunucu oluÅŸturuluyor..." #: src/game.cpp msgid "" "Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" -"- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" -"- Mouse wheel: select item\n" -"- T: chat\n" -msgstr "" -"Varsayılanlar Kontroller:\n" -"- WASD: Hareket et\n" -"- BoÅŸluk: Zıpla/Tırman\n" -"- Shift: Sessiz yürü/AÅŸağı in\n" -"- Q: Elindekini bırak\n" -"- I: Envanter\n" -"- Fare: Dön/Bak\n" -"- Sol fare: Kaz/Vur\n" -"- SaÄŸ fare: YerleÅŸtir/Kullan\n" -"- Fare tekerleÄŸi: Araç seç\n" -"- T: Sohbet\n" - -#: src/game.cpp -msgid "" -"Default Controls:\n" "No menu visible:\n" "- single tap: button activate\n" "- double tap: place/use\n" @@ -837,64 +883,97 @@ msgid "" msgstr "" "Varsayılan Kontroller:\n" "Tüm menüler gizli:\n" -"- Tek tık: tuÅŸ etkin\n" -"- Çift tık: yerleÅŸtir/kullan\n" -"- Parmağı kaydır: etrafa bak\n" -"Menu/Encanter görünür:\n" +"- tek tık: tuÅŸ etkin\n" +"- çift tık: yerleÅŸtir/kullan\n" +"- parmağı kaydır: etrafa bak\n" +"Menü/Envanter görünür:\n" "- çift tık (dışarda):\n" " -->kapat\n" -"- touch stack, touch slot:\n" -" --> move stack\n" -"- tut&bırak, iki parmağı kullan\n" -" --> slotuna bir item bırak\n" +"- yığına dokun, bölmeye dokun:\n" +" --> yığını taşı\n" +"- dokun&sürükle, iki parmakla dokun\n" +" --> bölmeye tek bir öğe yerleÅŸtir\n" #: src/game.cpp msgid "Exit to Menu" -msgstr "Menüye dön" +msgstr "Menüye Çık" #: src/game.cpp msgid "Exit to OS" msgstr "Oyundan Çık" #: src/game.cpp +msgid "Game info:" +msgstr "Oyun Bilgisi:" + +#: src/game.cpp +msgid "Game paused" +msgstr "Oyun duraklatıldı" + +#: src/game.cpp +msgid "Hosting server" +msgstr "Sunucu barındırılıyor" + +#: src/game.cpp msgid "Item definitions..." -msgstr "Nesne tanımlamaları..." +msgstr "Öğe tanımları..." #: src/game.cpp msgid "KiB/s" -msgstr "" +msgstr "KiB/s" #: src/game.cpp msgid "Media..." -msgstr "Media..." +msgstr "Medya..." #: src/game.cpp msgid "MiB/s" -msgstr "" +msgstr "MiB/s" #: src/game.cpp msgid "Node definitions..." -msgstr "Blok tanımlamaları..." +msgstr "Nod tanımları..." #: src/game.cpp -msgid "Resolving address..." -msgstr "Adres çözümleniyor..." +msgid "Off" +msgstr "Kapalı" #: src/game.cpp -msgid "Respawn" -msgstr "Yeniden Canlan" +msgid "On" +msgstr "Açık" + +#: src/game.cpp +msgid "Remote server" +msgstr "Uzak sunucu" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "Adres çözümleniyor..." #: src/game.cpp msgid "Shutting down..." msgstr "Kapatılıyor..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Tek oyunculu" + +#: src/game.cpp msgid "Sound Volume" -msgstr "Ses yüksekliÄŸi :" +msgstr "Ses Seviyesi" #: src/game.cpp -msgid "You died." -msgstr "Geberdin." +#, c-format +msgid "Volume changed to %d%%" +msgstr "Ses %d/100'e deÄŸiÅŸti" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "Ses 0/100'e deÄŸiÅŸti" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "Ses 100/100'e deÄŸiÅŸti" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -902,15 +981,15 @@ msgstr "tamam" #: src/guiFormSpecMenu.cpp msgid "Enter " -msgstr "Entrer " +msgstr "Gir " #: src/guiFormSpecMenu.cpp msgid "Proceed" -msgstr "Uygula" +msgstr "İlerle" #: src/guiKeyChangeMenu.cpp msgid "\"Use\" = climb down" -msgstr "\"Kullan TuÅŸu\" = AÅŸağı in" +msgstr "\"Kullan\" = AÅŸağı in" #: src/guiKeyChangeMenu.cpp msgid "Backward" @@ -918,7 +997,7 @@ msgstr "Geri" #: src/guiKeyChangeMenu.cpp msgid "Chat" -msgstr "KonuÅŸma" +msgstr "Sohbet" #: src/guiKeyChangeMenu.cpp msgid "Command" @@ -929,18 +1008,26 @@ msgid "Console" msgstr "Konsol" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Sesi azalt" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" -msgstr "Çift zıplayarak uçma modunu aç/kapa" +msgstr "\"zıpla\" ya çift dokunarak uçmayı aç/kapa" #: src/guiKeyChangeMenu.cpp msgid "Drop" -msgstr "Bırak" +msgstr "At" #: src/guiKeyChangeMenu.cpp msgid "Forward" msgstr "İleri" #: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "Sesi arttır" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "Envanter" @@ -954,15 +1041,31 @@ msgstr "TuÅŸ zaten kullanımda" #: src/guiKeyChangeMenu.cpp msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "TuÅŸ ayaları. ( OlaÄŸandışı durumlarda minetest.conf 'u düzenleyin )" +msgstr "TuÅŸ ayaları. (EÄŸer bu menü çalışmaz ise, minetest.conf 'tan kaldırın)" #: src/guiKeyChangeMenu.cpp src/keycode.cpp msgid "Left" msgstr "Sol" +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "Yerel komut" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Sesi Kıs" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "Sonraki öğe" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "Önceki öğe" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" -msgstr "Yazdırma yığınları" +msgstr "Yığınları yazdır" #: src/guiKeyChangeMenu.cpp msgid "Range select" @@ -974,24 +1077,23 @@ msgstr "SaÄŸ" #: src/guiKeyChangeMenu.cpp msgid "Sneak" -msgstr "Sessiz Yürü" +msgstr "Sız" #: src/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle Cinematic" -msgstr "Hız modu aç/kapa" +msgstr "Sinematik Aç/Kapa" #: src/guiKeyChangeMenu.cpp msgid "Toggle fast" -msgstr "Hız modu aç/kapa" +msgstr "Hızlıyı aç/kapa" #: src/guiKeyChangeMenu.cpp msgid "Toggle fly" -msgstr "UçuÅŸ modu aç/kapa" +msgstr "Uçmayı aç/kapa" #: src/guiKeyChangeMenu.cpp msgid "Toggle noclip" -msgstr "Noclip aç/kapa" +msgstr "Hayalet aç/kapa" #: src/guiKeyChangeMenu.cpp msgid "Use" @@ -1011,19 +1113,19 @@ msgstr "DeÄŸiÅŸtir" #: src/guiPasswordChange.cpp msgid "Confirm Password" -msgstr "Åžifreyi doÄŸrulayın" +msgstr "Åžifreyi DoÄŸrulayın" #: src/guiPasswordChange.cpp msgid "New Password" -msgstr "Yeni ÅŸifre" +msgstr "Yeni Åžifre" #: src/guiPasswordChange.cpp msgid "Old Password" -msgstr "Eski ÅŸifre" +msgstr "Eski Åžifre" #: src/guiPasswordChange.cpp msgid "Passwords do not match!" -msgstr "Åžifreler uyuÅŸmuyor !" +msgstr "Åžifreler aynı deÄŸil!" #: src/guiVolumeChange.cpp msgid "Exit" @@ -1031,43 +1133,27 @@ msgstr "Çıkış" #: src/guiVolumeChange.cpp msgid "Sound Volume: " -msgstr "Ses yüksekliÄŸi :" +msgstr "Ses Seviyesi: " #: src/keycode.cpp msgid "Apps" msgstr "Uygulamalar" #: src/keycode.cpp -msgid "Attn" -msgstr "Dikkat" - -#: src/keycode.cpp msgid "Back" msgstr "Geri" #: src/keycode.cpp -msgid "Capital" -msgstr "Büyük" +msgid "Caps Lock" +msgstr "Caps Lock" #: src/keycode.cpp msgid "Clear" msgstr "Temizle" #: src/keycode.cpp -msgid "Comma" -msgstr "Virgul" - -#: src/keycode.cpp msgid "Control" -msgstr "Kontroller" - -#: src/keycode.cpp -msgid "Convert" -msgstr "Dönüştür" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" +msgstr "CTRL" #: src/keycode.cpp msgid "Down" @@ -1078,26 +1164,14 @@ msgid "End" msgstr "Son" #: src/keycode.cpp -msgid "Erase OEF" -msgstr "l'OEF 'i sil" - -#: src/keycode.cpp -msgid "Escape" -msgstr "Çıkış" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" +msgid "Erase EOF" +msgstr "EOF'yi Sil" #: src/keycode.cpp msgid "Execute" msgstr "Çalıştır" #: src/keycode.cpp -msgid "Final" -msgstr "BitiÅŸ" - -#: src/keycode.cpp msgid "Help" msgstr "Yardım" @@ -1106,24 +1180,32 @@ msgid "Home" msgstr "Ev" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +msgid "IME Accept" +msgstr "IME Kabul" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +msgid "IME Convert" +msgstr "IME Dönüştür" #: src/keycode.cpp -msgid "Kana" -msgstr "Kana" +msgid "IME Escape" +msgstr "IME Çıkış" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanji" +msgid "IME Mode Change" +msgstr "IME Kip DeÄŸiÅŸtir" + +#: src/keycode.cpp +msgid "IME Nonconvert" +msgstr "IME Dönüştürme" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Ekle" #: src/keycode.cpp msgid "Left Button" -msgstr "Sol tuÅŸu" +msgstr "Sol TuÅŸ" #: src/keycode.cpp msgid "Left Control" @@ -1131,7 +1213,7 @@ msgstr "Sol CTRL" #: src/keycode.cpp msgid "Left Menu" -msgstr "Sol Menu" +msgstr "Sol Menü" #: src/keycode.cpp msgid "Left Shift" @@ -1139,7 +1221,7 @@ msgstr "Sol Shift" #: src/keycode.cpp msgid "Left Windows" -msgstr "Sol Windows tuÅŸu" +msgstr "Sol Windows" #: src/keycode.cpp msgid "Menu" @@ -1150,20 +1232,8 @@ msgid "Middle Button" msgstr "Orta TuÅŸ" #: src/keycode.cpp -msgid "Minus" -msgstr "Eksi" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Mod deÄŸiÅŸtir" - -#: src/keycode.cpp msgid "Next" -msgstr "İleri" - -#: src/keycode.cpp -msgid "Nonconvert" -msgstr "Dönüştürme" +msgstr "Sonraki" #: src/keycode.cpp msgid "Num Lock" @@ -1171,79 +1241,75 @@ msgstr "Num Lock" #: src/keycode.cpp msgid "Numpad *" -msgstr "Numpad *" +msgstr "Sayısal TuÅŸ Takımı *" #: src/keycode.cpp msgid "Numpad +" -msgstr "Numpad +" +msgstr "Sayısal TuÅŸ Takımı +" #: src/keycode.cpp msgid "Numpad -" -msgstr "Numpad -" +msgstr "Sayısal TuÅŸ Takımı -" + +#: src/keycode.cpp +msgid "Numpad ." +msgstr "Sayısal TuÅŸ Takımı ." #: src/keycode.cpp msgid "Numpad /" -msgstr "Numpad /" +msgstr "Sayısal TuÅŸ Takımı /" #: src/keycode.cpp msgid "Numpad 0" -msgstr "Numpad 0" +msgstr "Sayısal TuÅŸ Takımı 0" #: src/keycode.cpp msgid "Numpad 1" -msgstr "Numpad 1" +msgstr "Sayısal TuÅŸ Takımı 1" #: src/keycode.cpp msgid "Numpad 2" -msgstr "Numpad 2" +msgstr "Sayısal TuÅŸ Takımı 2" #: src/keycode.cpp msgid "Numpad 3" -msgstr "Numpad 3" +msgstr "Sayısal TuÅŸ Takımı 3" #: src/keycode.cpp msgid "Numpad 4" -msgstr "Numpad 4" +msgstr "Sayısal TuÅŸ Takımı 4" #: src/keycode.cpp msgid "Numpad 5" -msgstr "Numpad 5" +msgstr "Sayısal TuÅŸ Takımı 5" #: src/keycode.cpp msgid "Numpad 6" -msgstr "Numpad 6" +msgstr "Sayısal TuÅŸ Takımı 6" #: src/keycode.cpp msgid "Numpad 7" -msgstr "Numpad 7" +msgstr "Sayısal TuÅŸ Takımı 7" #: src/keycode.cpp msgid "Numpad 8" -msgstr "Numpad 8" +msgstr "Sayısal TuÅŸ Takımı 8" #: src/keycode.cpp msgid "Numpad 9" -msgstr "Numpad 9" +msgstr "Sayısal TuÅŸ Takımı 9" #: src/keycode.cpp msgid "OEM Clear" msgstr "OEM Temizle" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" -msgstr "Beklet" +msgstr "Duraklat" #: src/keycode.cpp -msgid "Period" -msgstr "Dönem" - -#: src/keycode.cpp -msgid "Plus" -msgstr "Artı" +msgid "Play" +msgstr "Oyna" #: src/keycode.cpp msgid "Print" @@ -1251,7 +1317,7 @@ msgstr "Yazdır" #: src/keycode.cpp msgid "Prior" -msgstr "Öncelikli" +msgstr "Önceki" #: src/keycode.cpp msgid "Return" @@ -1259,7 +1325,7 @@ msgstr "Return" #: src/keycode.cpp msgid "Right Button" -msgstr "SaÄŸ tuÅŸ" +msgstr "SaÄŸ TuÅŸ" #: src/keycode.cpp msgid "Right Control" @@ -1267,7 +1333,7 @@ msgstr "SaÄŸ CTRL" #: src/keycode.cpp msgid "Right Menu" -msgstr "SaÄŸ Menu" +msgstr "SaÄŸ Menü" #: src/keycode.cpp msgid "Right Shift" @@ -1275,7 +1341,7 @@ msgstr "SaÄŸ Shift" #: src/keycode.cpp msgid "Right Windows" -msgstr "SaÄŸ Windows tuÅŸu" +msgstr "SaÄŸ Windows" #: src/keycode.cpp msgid "Scroll Lock" @@ -1291,7 +1357,7 @@ msgstr "Shift" #: src/keycode.cpp msgid "Sleep" -msgstr "Uyu" +msgstr "Uyku" #: src/keycode.cpp msgid "Snapshot" @@ -1311,11 +1377,11 @@ msgstr "Yukarı" #: src/keycode.cpp msgid "X Button 1" -msgstr "X Button 1" +msgstr "X Düğme 1" #: src/keycode.cpp msgid "X Button 2" -msgstr "X Button 2" +msgstr "X Düğme 2" #: src/settings_translation_file.cpp msgid "" @@ -1325,22 +1391,44 @@ msgid "" "sets.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" +"Fraktalın dünya merkezinden 'scale' birimi cinsinden (X,Y,Z) kaydırması.\n" +"Alçak karanın uygun canlanma alanını (0,0)'ın yakınına taşımak için " +"kullanılır.\n" +"Varsayılan mandelbrot setleri için uygundur, julia setleri için düzenlenmesi " +"gerekir.\n" +"Kabaca -2 ile 2 arası . Nodlardaki kaydırmalar için 'scale' ile çarpın." #: src/settings_translation_file.cpp msgid "" "0 = parallax occlusion with slope information (faster).\n" "1 = relief mapping (slower, more accurate)." msgstr "" +"0 = eÄŸim bilgili paralaks oklüzyon (daha hızlı).\n" +"1 = kabartma eÅŸleme (daha yavaÅŸ, daha doÄŸru)." #: src/settings_translation_file.cpp -#, fuzzy msgid "3D clouds" -msgstr "3 boyutlu bulutlar" +msgstr "3D bulutlar" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode" -msgstr "UçuÅŸ modu" +msgstr "3D kipi" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "Dev oyukları belirleyen 3D gürültü." + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" +"DaÄŸ yapısını ve yüksekliÄŸini belirleyen 3D gürültü.\n" +"Ayrıca yüzenkara daÄŸ arazi yapısını da belirler." + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "Nehir kanyon duvarlarının yapısını belirleyen 3D gürültü." #: src/settings_translation_file.cpp msgid "" @@ -1353,48 +1441,58 @@ msgid "" "- sidebyside: split screen side by side.\n" "- pageflip: quadbuffer based 3d." msgstr "" +"3D desteÄŸi.\n" +"Åžu an desteklenen:\n" +"- none: 3d çıkışı yok.\n" +"- anaglyph: cyan/magenta renkli 3d.\n" +"- interlaced: tek/çift çizgi tabanlı polarizasyon ekran desteÄŸi.\n" +"- topbottom: ayrık ekran üst/alt.\n" +"- sidebyside: ayrık ekran yan yana.\n" +"- pageflip: quadbuffer tabanlı 3d." #: src/settings_translation_file.cpp msgid "" "A chosen map seed for a new map, leave empty for random.\n" "Will be overridden when creating a new world in the main menu." msgstr "" +"Yeni bir harita için seçilmiÅŸ bir harita tohumu, rastgele için boÅŸ bırakın.\n" +"Ana menüden yeni bir dünya oluÅŸtururken geçersiz kılınır." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." -msgstr "" +msgstr "Sunucu çökerse tüm istemcilere görüntülenecek bir mesaj." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" +msgstr "Sunucu kapatıldığında tüm istemcilere görüntülenecek bir mesaj." #: src/settings_translation_file.cpp msgid "Absolute limit of emerge queues" -msgstr "" +msgstr "Emerge sıralarının mutlak sınırı" #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "Havada hızlanma" #: src/settings_translation_file.cpp msgid "Active Block Management interval" -msgstr "" +msgstr "Etkin Blok Yönetimi aralığı" #: src/settings_translation_file.cpp msgid "Active Block Modifier interval" -msgstr "" +msgstr "Etkin Blok DeÄŸiÅŸtirici aralığı" #: src/settings_translation_file.cpp msgid "Active Block Modifiers" -msgstr "" +msgstr "Etkin Blok DeÄŸiÅŸtiricileri" #: src/settings_translation_file.cpp msgid "Active block range" -msgstr "" +msgstr "Etkin blok uzaklığı" #: src/settings_translation_file.cpp msgid "Active object send range" -msgstr "" +msgstr "Etkin nesne gönderme uzaklığı" #: src/settings_translation_file.cpp msgid "" @@ -1402,47 +1500,67 @@ msgid "" "Leave this blank to start a local server.\n" "Note that the address field in the main menu overrides this setting." msgstr "" +"BaÄŸlanılacak adres.\n" +"Yerel bir sunucu baÅŸlatmak için bunu boÅŸ bırakın.\n" +"Ana menüdeki adres alanının bu ayarı geçersiz kılacağını unutmayın." + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "Nodları kazarken parçacıklar ekler." #: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "" +"Ekranınızın (sadece Android/X11 olmayan) dpi yapılandırmasını ayarlayın ör: " +"4k ekranlar için." #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" +"Işık tabloları için gama kodlamayı ayarlayın. Daha yüksek sayılar daha " +"aydınlıktır.\n" +"Bu ayar yalnızca istemci içindir ve sunucu tarafından yok sayılır." #: src/settings_translation_file.cpp msgid "Advanced" -msgstr "" +msgstr "GeliÅŸmiÅŸ" #: src/settings_translation_file.cpp msgid "Altitude Chill" -msgstr "" +msgstr "Yükseklik SoÄŸukluÄŸu" #: src/settings_translation_file.cpp msgid "Always fly and fast" -msgstr "" +msgstr "Daima uçma ve hızlı" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" -msgstr "" +msgstr "Ortam oklüzyon gama" #: src/settings_translation_file.cpp msgid "Amplifies the valleys" +msgstr "Vadiler güçlendirir" + +#: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." msgstr "" +"Sadece android sistemleri: Desteklenen bir iÅŸleyici bulunamadığında\n" +"envanter dokularını ızgaralardan oluÅŸturmayı dener." #: src/settings_translation_file.cpp -#, fuzzy msgid "Anisotropic filtering" -msgstr "EÅŸyönsüz süzme" +msgstr "Anisotropik filtreleme" #: src/settings_translation_file.cpp msgid "Announce server" -msgstr "" +msgstr "Sunucuyu duyur" #: src/settings_translation_file.cpp msgid "" @@ -1450,109 +1568,174 @@ msgid "" "If you want to announce your ipv6 address, use serverlist_url = v6.servers." "minetest.net." msgstr "" +"Bu sunucu listesine duyur.\n" +"EÄŸer ipv6 adresinizi duyurmak istiyorsanız, serverlist_url = v6.servers." +"minetest.net kullanın." + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "Elma aÄŸaçları gürültüsü" #: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." -msgstr "" +msgstr "Fraktalın nod cinsinde yaklaşık (X, Y, Z) boyutu." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" +msgstr "Çökmeden sonra yeniden baÄŸlanmak için sor" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" msgstr "" +"Bu uzaklıkta sunucu istemcilere gönderilecek blokların saldırganca " +"iyileÅŸtirecektir.\n" +"Küçük deÄŸerler potansiyel olarak görülebilir iÅŸleyici hataları pahasına " +"performansı oldukça iyileÅŸtirecektir.\n" +"(bazı bloklar su altında, maÄŸaralarda ve de bazen karada iÅŸlenmeyecek)\n" +"Bu deÄŸeri max_block_send_distance deÄŸerinden yükseÄŸe ayarlamak bu " +"iyileÅŸtirmeyi devre dışı kılar.\n" +"Harita blokları (16 nod) cinsinden" #: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." -msgstr "" +msgstr "Sunucu listesine kendiliÄŸinden bildir." #: src/settings_translation_file.cpp msgid "Autorun key" -msgstr "" +msgstr "KendiliÄŸinden koÅŸma tuÅŸu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Backward key" -msgstr "Geri" +msgstr "Geri tuÅŸu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Base terrain height" -msgstr "Dalgalanan Su" +msgstr "Taban arazi yüksekliÄŸi" #: src/settings_translation_file.cpp msgid "Basic" -msgstr "" +msgstr "Temel" #: src/settings_translation_file.cpp msgid "Basic Privileges" -msgstr "" +msgstr "Temel Ayrıcalıklar" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "Sahil gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "Sahil gürültü eÅŸiÄŸi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bilinear filtering" -msgstr "Çift yönlü süzme" +msgstr "Bilineer filtreleme" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bind address" -msgstr "Adresi doÄŸrula" +msgstr "BaÄŸlı adres" + +#: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "Biyom API sıcaklık ve nem gürültü parametreleri" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "Biyom Gürültüsü" #: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" +msgstr "Tam ekran kipinde piksel başına bit (renk derinliÄŸi)." #: src/settings_translation_file.cpp msgid "Build inside player" -msgstr "" +msgstr "Oyuncu içinde inÅŸa" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "YerleÅŸik" #: src/settings_translation_file.cpp msgid "Bumpmapping" -msgstr "Engebeler" +msgstr "Tümsek eÅŸleme" #: src/settings_translation_file.cpp msgid "Camera smoothing" -msgstr "" +msgstr "Kamera yumuÅŸatma" #: src/settings_translation_file.cpp msgid "Camera smoothing in cinematic mode" -msgstr "" +msgstr "Sinematik kipte kamera yumuÅŸatma" #: src/settings_translation_file.cpp msgid "Camera update toggle key" -msgstr "" +msgstr "Kamera güncelleme açma/kapama tuÅŸu" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "MaÄŸara gürültüsü" #: src/settings_translation_file.cpp msgid "Cave noise #1" -msgstr "" +msgstr "MaÄŸara gürültü #1" #: src/settings_translation_file.cpp msgid "Cave noise #2" -msgstr "" +msgstr "MaÄŸara gürültü #2" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "" +msgstr "MaÄŸara geniÅŸliÄŸi" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "MaÄŸara1 gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "MaÄŸara2 gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "Oyuk sınırı" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "Oyuk gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "Oyuk konikliÄŸi" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "Oyuk eÅŸiÄŸi" #: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" -msgstr "" +msgstr "MaÄŸaralar ve tüneller iki gürültünün kesiÅŸiminde oluÅŸur" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat key" -msgstr "TuÅŸları deÄŸiÅŸtir" +msgstr "Sohbet tuÅŸu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat toggle key" -msgstr "TuÅŸları deÄŸiÅŸtir" +msgstr "Sohbet açma/kapama tuÅŸu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chatcommands" -msgstr "Komut" +msgstr "Sohbet komutları" #: src/settings_translation_file.cpp msgid "" @@ -1576,115 +1759,141 @@ msgid "" "17 = 4D \"Mandelbulb\" mandelbrot set.\n" "18 = 4D \"Mandelbulb\" julia set." msgstr "" +"9 formülden seçilen 18 fraktal.\n" +"1 = 4D \"Roundy\" mandelbrot seti.\n" +"2 = 4D \"Roundy\" julia seti.\n" +"3 = 4D \"Squarry\" mandelbrot seti.\n" +"4 = 4D \"Squarry\" julia seti.\n" +"5 = 4D \"Mandy Cousin\" mandelbrot seti.\n" +"6 = 4D \"Mandy Cousin\" julia seti.\n" +"7 = 4D \"Variation\" mandelbrot seti.\n" +"8 = 4D \"Variation\" julia seti.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot seti.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" julia seti.\n" +"11 = 3D \"Christmas Tree\" mandelbrot seti.\n" +"12 = 3D \"Christmas Tree\" julia seti.\n" +"13 = 3D \"Mandelbulb\" mandelbrot seti.\n" +"14 = 3D \"Mandelbulb\" julia seti.\n" +"15 = 3D \"Cosine Mandelbulb\" mandelbrot seti.\n" +"16 = 3D \"Cosine Mandelbulb\" julia seti.\n" +"17 = 4D \"Mandelbulb\" mandelbrot seti.\n" +"18 = 4D \"Mandelbulb\" julia seti." #: src/settings_translation_file.cpp msgid "Chunk size" -msgstr "" +msgstr "Yığın boyutu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cinematic mode" -msgstr "Yaratıcı mod" +msgstr "Sinematik kip" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cinematic mode key" -msgstr "Yaratıcı mod" +msgstr "Sinematik kip tuÅŸu" #: src/settings_translation_file.cpp msgid "Clean transparent textures" -msgstr "" +msgstr "Saydam dokuları temizle" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "İstemci" #: src/settings_translation_file.cpp msgid "Client and Server" -msgstr "" +msgstr "İstemci ve Sunucu" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "İstemci modlama" #: src/settings_translation_file.cpp msgid "Climbing speed" -msgstr "" +msgstr "Tırmanma hızı" #: src/settings_translation_file.cpp msgid "Cloud height" -msgstr "" +msgstr "Bulut yüksekliÄŸi" #: src/settings_translation_file.cpp msgid "Cloud radius" -msgstr "" +msgstr "Bulut yarıçapı" #: src/settings_translation_file.cpp -#, fuzzy msgid "Clouds" -msgstr "3 boyutlu bulutlar" +msgstr "Bulutlar" #: src/settings_translation_file.cpp msgid "Clouds are a client side effect." -msgstr "" +msgstr "Bulutlar istemci tarafı bir efekttir." #: src/settings_translation_file.cpp -#, fuzzy msgid "Clouds in menu" -msgstr "Ana menu" +msgstr "Ana menüde bulutlar" #: src/settings_translation_file.cpp msgid "Colored fog" -msgstr "" +msgstr "Renkli sis" #: src/settings_translation_file.cpp msgid "" "Comma-separated list of mods that are allowed to access HTTP APIs, which\n" "allow them to upload and download data to/from the internet." msgstr "" +"Modların internet üstünden veri yüklemesine ve indirmesine izin veren HTTP " +"API'lerine,\n" +"eriÅŸim izni verilen modların virgülle ayrılmış listesi." #: src/settings_translation_file.cpp msgid "" "Comma-separated list of trusted mods that are allowed to access insecure\n" "functions even when mod security is on (via request_insecure_environment())." msgstr "" +"Mod güvenliÄŸi açık olsa bile (request_insecure_environment() ile) güvensiz\n" +"fonksiyonlara eriÅŸimine izin verilen güvenilen modların virgülle ayrılmış " +"listesi." #: src/settings_translation_file.cpp -#, fuzzy msgid "Command key" -msgstr "Komut" +msgstr "Komut tuÅŸu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Connect glass" -msgstr "İçiçe geçmiÅŸ cam" +msgstr "BitiÅŸik cam" #: src/settings_translation_file.cpp -#, fuzzy msgid "Connect to external media server" -msgstr "Sunucuya baÄŸlanılıyor..." +msgstr "Dış medya sunucusuna baÄŸlan" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." -msgstr "" +msgstr "Nod tarafından destekleniyorsa camı bitiÅŸtir." #: src/settings_translation_file.cpp -#, fuzzy msgid "Console alpha" -msgstr "Konsol" +msgstr "Konsol saydamlığı" #: src/settings_translation_file.cpp -#, fuzzy msgid "Console color" -msgstr "Konsol" +msgstr "Konsol rengi" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "Konsol yüksekliÄŸi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Console key" -msgstr "Konsol" +msgstr "Konsol tuÅŸu" #: src/settings_translation_file.cpp msgid "Continuous forward" -msgstr "" +msgstr "Sürekli ileri" #: src/settings_translation_file.cpp msgid "Continuous forward movement (only used for testing)." -msgstr "" +msgstr "Sürekli ileri hareket (sadece test için)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Controls" msgstr "Kontroller" @@ -1694,174 +1903,264 @@ msgid "" "Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays " "unchanged." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" +"Gündüz/gece döngüsü uzunluÄŸunu denetler.\n" +"Örnekler: 72 = 20dk, 360 = 4dk, 1 = 24saat, 0 = gündüz/gece/herÅŸey " +"deÄŸiÅŸmeden kalır." #: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." -msgstr "" +msgstr "Göl çöküklerinin diklik/çukurluÄŸunu denetler." #: src/settings_translation_file.cpp msgid "Controls steepness/height of hills." +msgstr "Tepelerin dikliÄŸini/yüksekliÄŸini denetler." + +#: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" +"Yüzenkara daÄŸ arazisinin yoÄŸunluÄŸunu denetler.\n" +"'np_mountain' gürültü deÄŸerine eklenen bir kaydırmadır." #: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "" +"Tünellerin geniÅŸliÄŸini denetler, daha küçük bir deÄŸer daha geniÅŸ tüneller " +"oluÅŸturur." #: src/settings_translation_file.cpp msgid "Crash message" -msgstr "" +msgstr "Çökme mesajı" #: src/settings_translation_file.cpp msgid "" "Creates unpredictable lava features in caves.\n" "These can make mining difficult. Zero disables them. (0-10)" msgstr "" +"MaÄŸaralarda öngörülemeyen lav özellikleri oluÅŸturur.\n" +"Bu madenciliÄŸi zorlaÅŸtırabilir. Sıfır devre dışı bırakır. (0-10)" #: src/settings_translation_file.cpp msgid "" "Creates unpredictable water features in caves.\n" "These can make mining difficult. Zero disables them. (0-10)" msgstr "" +"MaÄŸaralarda öngörülemeyen su özellikleri oluÅŸturur.\n" +"Bu madenciliÄŸi zorlaÅŸtırabilir. Sıfır devre dışı bırakır. (0-10)" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "Yaratıcı" #: src/settings_translation_file.cpp msgid "Crosshair alpha" -msgstr "" +msgstr "Artı saydamlığı" #: src/settings_translation_file.cpp msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "" +msgstr "Artı saydamlığı (solukluk, 0 ile 255 arasında)." #: src/settings_translation_file.cpp msgid "Crosshair color" -msgstr "" +msgstr "Artı rengi" #: src/settings_translation_file.cpp msgid "Crosshair color (R,G,B)." -msgstr "" +msgstr "Artı rengi (R,G,B)." #: src/settings_translation_file.cpp msgid "Crouch speed" -msgstr "" +msgstr "EÄŸilme hızı" #: src/settings_translation_file.cpp msgid "DPI" -msgstr "" +msgstr "DPI" #: src/settings_translation_file.cpp -#, fuzzy msgid "Damage" -msgstr "Hasarı etkinleÅŸtir" +msgstr "Hasar" #: src/settings_translation_file.cpp msgid "Debug info toggle key" -msgstr "" +msgstr "Hata ayıklama bilgisi açma/kapama tuÅŸu" #: src/settings_translation_file.cpp msgid "Debug log level" -msgstr "" +msgstr "Hata ayıklama günlük düzeyi" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "Ses azaltma tuÅŸu" #: src/settings_translation_file.cpp msgid "Dedicated server step" -msgstr "" +msgstr "Adanmış sunucu adımı" #: src/settings_translation_file.cpp msgid "Default acceleration" -msgstr "" +msgstr "Varsayılan hızlanma" #: src/settings_translation_file.cpp msgid "Default game" -msgstr "" +msgstr "Varsayılan oyun" #: src/settings_translation_file.cpp msgid "" "Default game when creating a new world.\n" "This will be overridden when creating a world from the main menu." msgstr "" +"Yeni bir dünya oluÅŸtururken varsayılan oyun.\n" +"Bu ana menüden bir dünya oluÅŸtururken geçersiz kılınır." #: src/settings_translation_file.cpp -#, fuzzy msgid "Default password" -msgstr "Yeni ÅŸifre" +msgstr "Varsayılan ÅŸifre" #: src/settings_translation_file.cpp msgid "Default privileges" -msgstr "" +msgstr "Varsayılan ayrıcalıklar" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "Varsayılan rapor biçimi" #: src/settings_translation_file.cpp msgid "" "Default timeout for cURL, stated in milliseconds.\n" "Only has an effect if compiled with cURL." msgstr "" +"CURL için varsayılan zaman aşımı, milisaniye cinsinden.\n" +"Sadece cURL ile derlenmiÅŸ ise bir etkisi vardır." + +#: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "'terrain_higher' ın alanlarını belirler (uçurum-tepesi arazi)." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" +"Yüzenkara düz arazilerin alanlarını belirler.\n" +"Gürültü > 0 iken düz yüzenkaralar oluÅŸur." + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" +"Daha yüksek (uçurum-tepesi) arazi alanlarını belirler ve uçurumların " +"dikliÄŸini etkiler." + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "AÄŸaçların elması olacağı alanları belirler." + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "Kumlu sahilleri olan alanları belirler." + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" +"Oyukların tam boyutunu belirler, daha küçük deÄŸerler daha büyük oyuklar " +"oluÅŸturur." + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "GeniÅŸ çaplı nehir kanal yapısını belirler." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "İsteÄŸe baÄŸlı tepelerin ve göllerin konumunu ve arazisini belirler." #: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." msgstr "" +"Dokuların örnekleme adımını tanımlar.\n" +"Daha yüksek deÄŸer daha yumuÅŸak dikey eÅŸleme verir." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" +"Maksimal oyuncu transfer uzaklığını bloklar cinsinden tanımlar (0 = " +"sınırsız)." #: src/settings_translation_file.cpp -msgid "Delay in sending blocks after building" +msgid "Defines tree areas and tree density." +msgstr "AÄŸaç alanlarını ve aÄŸaç yoÄŸunluÄŸunu belirler." + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." msgstr "" +"İstemcide ızgara güncellemeri arasındaki ms cinsinde gecikme. Bunu arttırmak " +"ızgara\n" +"güncelleme hızını yavaÅŸlatacaktır, bu yüzden yavaÅŸ istemcilerde kararsızlığı " +"azaltır." + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "Blokları inÅŸası sonrası göndermedeki gecikme" #: src/settings_translation_file.cpp msgid "Delay showing tooltips, stated in milliseconds." -msgstr "" +msgstr "Milisaniye cinsinden ipuçlarını gösterme gecikmesi." #: src/settings_translation_file.cpp msgid "Deprecated Lua API handling" -msgstr "" +msgstr "Kaldırılan Lua API iÅŸleme" #: src/settings_translation_file.cpp msgid "Depth below which you'll find large caves." -msgstr "" +msgstr "AÅŸağısında büyük maÄŸaralar bulabileceÄŸiniz derinlik." #: src/settings_translation_file.cpp msgid "Depth below which you'll find massive caves." -msgstr "" +msgstr "AÅŸağısında devasa maÄŸaralar bulabileceÄŸiniz derinlik." #: src/settings_translation_file.cpp msgid "Descending speed" -msgstr "" +msgstr "Düşme hızı" #: src/settings_translation_file.cpp msgid "" "Description of server, to be displayed when players join and in the " "serverlist." msgstr "" +"Oyuncular baÄŸlandığında ve sunucu listesinde görüntülenecek sunucu " +"açıklaması." #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "" +msgid "Desert noise threshold" +msgstr "Çöl gürültü eÅŸiÄŸi" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" +"np_biome bu deÄŸeri aÅŸtığında Çöller oluÅŸur.\n" +"Yeni biyom sistemi etkinken, bu yok sayılır." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Blok animasyonlarını eÅŸzamansız yap" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "Kazı parçacıkları" #: src/settings_translation_file.cpp -#, fuzzy msgid "Disable anticheat" -msgstr "Parçacıkları etkinleÅŸtir" +msgstr "Hile önleme devre dışı" #: src/settings_translation_file.cpp msgid "Disable escape sequences" -msgstr "" +msgstr "Çıkış dizilerini devre dışı bırak" #: src/settings_translation_file.cpp msgid "" @@ -1870,60 +2169,77 @@ msgid "" "disable\n" "the escape sequences generated by mods." msgstr "" +"Çıkış dizilerini devre dışı bırak, ör: sohbet renkleri.\n" +"Bu 0.4.14 öncesi istemciler ile bir sunucu çalıştırmak ve modlar tarafından " +"oluÅŸturulan çıkış dizilerini devre dışı bırakmak istiyorsanız bunu kullanın." #: src/settings_translation_file.cpp msgid "Disallow empty passwords" -msgstr "" +msgstr "BoÅŸ ÅŸifrelere izin verme" #: src/settings_translation_file.cpp msgid "Domain name of server, to be displayed in the serverlist." -msgstr "" +msgstr "Sunucu listesinde görüntülenecek sunucu alan adı." #: src/settings_translation_file.cpp -#, fuzzy msgid "Double tap jump for fly" -msgstr "Çift zıplayarak uçma modunu aç/kapa" +msgstr "Uçma için zıplamaya çift dokun" #: src/settings_translation_file.cpp -#, fuzzy msgid "Double-tapping the jump key toggles fly mode." -msgstr "Çift zıplayarak uçma modunu aç/kapa" +msgstr "Zıplama tuÅŸuna çift dokunmak uçma kipini açar/kapar." #: src/settings_translation_file.cpp msgid "Drop item key" -msgstr "" +msgstr "Öge atma tuÅŸu" #: src/settings_translation_file.cpp msgid "Dump the mapgen debug infos." -msgstr "" +msgstr "Mapgen hata ayıklama bilgisini dökümle." #: src/settings_translation_file.cpp msgid "Enable Joysticks" +msgstr "Joystick'leri etkinleÅŸtir" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." msgstr "" +"İstemcide Lua modlama desteÄŸini etkinleÅŸtir.\n" +"Bu destek deneyseldir ve API deÄŸiÅŸebilir." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable VBO" -msgstr "Paketi Aç" +msgstr "VBO'yu etkinleÅŸtir" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Konsol penceresini etkinleÅŸtir" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "Yeni oluÅŸturulan haritalar için yaratıcı kipi etkinleÅŸtir." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable mod security" -msgstr "Çevirimiçi eklenti deposu" +msgstr "Mod güvenliÄŸini etkinleÅŸtir" #: src/settings_translation_file.cpp msgid "Enable players getting damage and dying." -msgstr "" +msgstr "Oyuncuların hasar almasını ve ölmesini etkinleÅŸtir." #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." -msgstr "" +msgstr "Rastgele kullanıcı giriÅŸini etkinleÅŸtir (sadece test için)." #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." msgstr "" +"Basit ortam oklüzyon ile yumuÅŸak aydınlatmayı etkinleÅŸtirir.\n" +"Farklı görünüm veya hız için devre dışı bırakın." #: src/settings_translation_file.cpp msgid "" @@ -1933,6 +2249,9 @@ msgid "" "to new servers, but they may not support all new features that you are " "expecting." msgstr "" +"Eski istemcilerin baÄŸlanmasına izin vermemek için etkinleÅŸtirin.\n" +"Eski istemciler yeni sunuculara baÄŸlanırken çökmeyecek kadar uyumludur,\n" +"ancak beklediÄŸiniz tüm yeni özellikleri desteklemiyor olabilir." #: src/settings_translation_file.cpp msgid "" @@ -1941,6 +2260,21 @@ msgid "" "textures)\n" "when connecting to the server." msgstr "" +"(Sunucu tarafından saÄŸlanan) uzak medya sunucu kullanımını etkinleÅŸtirin.\n" +"Sunucuya baÄŸlanırken uzak sunucular medya (ör: dokular) indirmek için daha\n" +"hızlı bir yol sunar." + +#: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "Görünüm sallanmasını etkinleÅŸtir" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"Görüntü sallanması için çarpan.\n" +"ÖrneÄŸin: 0 ise görüntü sallanması yok; 1.0 ise normal; 2.0 ise çift." #: src/settings_translation_file.cpp msgid "" @@ -1948,10 +2282,13 @@ msgid "" "to IPv6 clients, depending on system configuration.\n" "Ignored if bind_address is set." msgstr "" +"IPv6 sunucu çalıştırmayı etkin/devre dışı kılar. Bir IPv6 sunucu,\n" +"sistem yapılandırmasına baÄŸlı olarak, IPv6 istemcilere kısıtlanabilir.\n" +"EÄŸer bind_address ayarlı ise yok sayılır." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." -msgstr "" +msgstr "Envanter öğelerinin animasyonunu etkinleÅŸtirir." #: src/settings_translation_file.cpp msgid "" @@ -1960,129 +2297,154 @@ msgid "" "or need to be auto-generated.\n" "Requires shaders to be enabled." msgstr "" +"Tümsek eÅŸlemeyi dokular için etkinleÅŸtirir. Dikey eÅŸlemelerin doku paketi " +"tarafından saÄŸlanması\n" +"veya kendiliÄŸinden oluÅŸturulması gerekir\n" +"Gölgelemelerin etkin olmasını gerektirir." #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." -msgstr "" +msgstr "Yüz yönü döndürülmüş kafeslerin önbelleklenmesini etkinleÅŸtirir." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enables filmic tone mapping" -msgstr "Hasarı etkinleÅŸtir" +msgstr "Filmsel ton eÅŸlemeyi etkinleÅŸtirir" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enables minimap." -msgstr "Hasarı etkinleÅŸtir" +msgstr "Mini haritayı etkinleÅŸtirir." #: src/settings_translation_file.cpp msgid "" "Enables on the fly normalmap generation (Emboss effect).\n" "Requires bumpmapping to be enabled." msgstr "" +"Çalışma anı dikey eÅŸleme oluÅŸturulmasını (kabartma efekti) etkinleÅŸtirir.\n" +"Tümsek eÅŸlemenin etkin olmasını gerektirir." #: src/settings_translation_file.cpp msgid "" "Enables parallax occlusion mapping.\n" "Requires shaders to be enabled." msgstr "" +"Paralaks oklüzyon eÅŸlemeyi etkinleÅŸtirir.\n" +"Gölgelemelerin etkin olmasını gerektirir." + +#: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "Yürürken görünüm sallanmasını etkinleÅŸtirir." #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" -msgstr "" +msgstr "Motor profilleme veri yazdırma aralığı" #: src/settings_translation_file.cpp msgid "Entity methods" -msgstr "" +msgstr "Varlık yöntemleri" #: src/settings_translation_file.cpp msgid "" "Experimental option, might cause visible spaces between blocks\n" "when set to higher number than 0." msgstr "" +"Deneysel seçenek, 0'dan daha büyük bir sayıya ayarlandığında\n" +"bloklar arasında görünür boÅŸluklara neden olabilir." #: src/settings_translation_file.cpp msgid "FPS in pause menu" -msgstr "" +msgstr "Duraklat menüsünde FPS" #: src/settings_translation_file.cpp msgid "FSAA" -msgstr "" +msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" -msgstr "" +msgid "Factor noise" +msgstr "Çarpan gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "Düşme sallanması çarpanı" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font" -msgstr "needs_fallback_font" +msgstr "Geri dönüş yazı tipi" #: src/settings_translation_file.cpp msgid "Fallback font shadow" -msgstr "" +msgstr "Geri dönüş yazı tipi gölgesi" #: src/settings_translation_file.cpp msgid "Fallback font shadow alpha" -msgstr "" +msgstr "Geri dönüş yazı tipi gölge saydamlığı" #: src/settings_translation_file.cpp msgid "Fallback font size" -msgstr "" +msgstr "Geri dönüş yazı tipi boyutu" #: src/settings_translation_file.cpp msgid "Fast key" -msgstr "" +msgstr "Hızlı tuÅŸu" #: src/settings_translation_file.cpp msgid "Fast mode acceleration" -msgstr "" +msgstr "Hızlı kip hızlanması" #: src/settings_translation_file.cpp msgid "Fast mode speed" -msgstr "" +msgstr "Hızlı kip hızı" #: src/settings_translation_file.cpp msgid "Fast movement" -msgstr "" +msgstr "Hızlı hareket" #: src/settings_translation_file.cpp msgid "" "Fast movement (via use key).\n" "This requires the \"fast\" privilege on the server." msgstr "" +"Hızlı hareket (kullan tuÅŸu ile).\n" +"Bu sunucu üzerinde \"fast\" ayrıcalığı gerektirir." #: src/settings_translation_file.cpp msgid "Field of view" -msgstr "" +msgstr "Görüş alanı" #: src/settings_translation_file.cpp msgid "Field of view for zoom" -msgstr "" +msgstr "YakınlaÅŸtırma için görüş alanı" #: src/settings_translation_file.cpp msgid "Field of view in degrees." -msgstr "" +msgstr "Derece cinsinden görüş alanı." #: src/settings_translation_file.cpp msgid "" "Field of view while zooming in degrees.\n" "This requires the \"zoom\" privilege on the server." msgstr "" +"YakınlaÅŸtırırken derece olarak görüş alanı.\n" +"Bu sunucu üzerinde \"zoom\" ayrıcalığı gerektirir." #: src/settings_translation_file.cpp msgid "" "File in client/serverlist/ that contains your favorite servers displayed in " "the Multiplayer Tab." msgstr "" +"İstemci/sunucu listesi/ içinde Multiplayer Sekmesinde görüntülenen favori " +"sunucuları içeren bir dosya." #: src/settings_translation_file.cpp msgid "Filler Depth" -msgstr "" +msgstr "Dolgu DerinliÄŸi" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "Dolgu derinlik gürültüsü" #: src/settings_translation_file.cpp msgid "Filmic tone mapping" -msgstr "" +msgstr "Filmsel ton eÅŸleme" #: src/settings_translation_file.cpp msgid "" @@ -2091,127 +2453,169 @@ msgid "" "light edge to transparent textures. Apply this filter to clean that up\n" "at texture load time." msgstr "" +"Filtre dokuları, genellikle PNG iyileÅŸtiricilerin dikkate almadığı, tamamen\n" +"ÅŸeffaf komÅŸuları ile RGB deÄŸerlerini kaynaÅŸtırabilir, bazen ÅŸeffaf " +"dokularda\n" +"karanlık veya aydınlık kenarlara neden olabilir. Bunu temizlemek için bu\n" +"filtreyi doku yükleme zamanında uygulayın." #: src/settings_translation_file.cpp -#, fuzzy msgid "Filtering" -msgstr "Süzme yok" +msgstr "Filtreleme" + +#: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "Birlikte tünelleri belirleyen 2 3D gürültüden ilki." #: src/settings_translation_file.cpp msgid "Fixed map seed" -msgstr "" +msgstr "Sabit harita tohumu" + +#: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "Yüzenkara taban yükseklik gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "Yüzenkara taban gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "Yüzenkara seviyesi" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "Yüzenkara daÄŸ yoÄŸunluÄŸu" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "Yüzenkara daÄŸ yüksekliÄŸi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fly key" -msgstr "UçuÅŸ modu" +msgstr "Uçma tuÅŸu" #: src/settings_translation_file.cpp msgid "Flying" -msgstr "" +msgstr "Uçma" #: src/settings_translation_file.cpp msgid "Fog" -msgstr "" +msgstr "Sis" + +#: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "Sis BaÅŸlangıcı" #: src/settings_translation_file.cpp msgid "Fog toggle key" -msgstr "" +msgstr "Sis açma/kapama tuÅŸu" #: src/settings_translation_file.cpp msgid "Font path" -msgstr "" +msgstr "Yazı tipi konumu" #: src/settings_translation_file.cpp msgid "Font shadow" -msgstr "" +msgstr "Yazı tipi gölgesi" #: src/settings_translation_file.cpp msgid "Font shadow alpha" -msgstr "" +msgstr "Yazı tipi gölge saydamlığı" #: src/settings_translation_file.cpp msgid "Font shadow alpha (opaqueness, between 0 and 255)." -msgstr "" +msgstr "Yazı tipi gölge saydamlığı (solukluk, 0 ve 255 arası)." #: src/settings_translation_file.cpp msgid "Font shadow offset, if 0 then shadow will not be drawn." -msgstr "" +msgstr "Yazı tipi gölge kayması, 0 ise gölge çizilmez." #: src/settings_translation_file.cpp msgid "Font size" -msgstr "" +msgstr "Yazı tipi boyutu" #: src/settings_translation_file.cpp msgid "Format of screenshots." -msgstr "" +msgstr "Ekran yakalama biçimi." #: src/settings_translation_file.cpp -#, fuzzy msgid "Forward key" -msgstr "İleri" +msgstr "İleri tuÅŸu" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "Fraktal türü" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "Sisin iÅŸlenmeye baÅŸlayacağı görünebilir uzaklığın kesiri" #: src/settings_translation_file.cpp msgid "Freetype fonts" -msgstr "" +msgstr "Freetype yazı tipleri" #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " "nodes)." msgstr "" +"Harita blokları (16 nod) cinsinden istemciler için blokların ne kadar " +"uzaklıktan oluÅŸturalacağı." #: src/settings_translation_file.cpp msgid "" "From how far blocks are sent to clients, stated in mapblocks (16 nodes)." msgstr "" +"Harita blokları (16 nod) cinsinden blokların ne kadar uzaklıktan istemciye " +"gönderileceÄŸi." #: src/settings_translation_file.cpp msgid "" "From how far clients know about objects, stated in mapblocks (16 nodes)." msgstr "" +"Harita blokları (16 nod) cinsinden istemcilerin ne kadar uzaklıktan " +"nesneleri bilecekleri." #: src/settings_translation_file.cpp msgid "Full screen" -msgstr "" +msgstr "Tam ekran" #: src/settings_translation_file.cpp msgid "Full screen BPP" -msgstr "" +msgstr "Tam ekran BPP" #: src/settings_translation_file.cpp msgid "Fullscreen mode." -msgstr "" +msgstr "Tam ekran kipi." #: src/settings_translation_file.cpp msgid "GUI scaling" -msgstr "" +msgstr "Arayüz boyutlandırma" #: src/settings_translation_file.cpp -#, fuzzy msgid "GUI scaling filter" -msgstr "Menü boyutları" +msgstr "Arayüz boyutlandırma filtresi" #: src/settings_translation_file.cpp msgid "GUI scaling filter txr2img" -msgstr "" +msgstr "Arayüz boyutlandırma filtresi txr2img" #: src/settings_translation_file.cpp msgid "Gamma" -msgstr "" +msgstr "Gama" #: src/settings_translation_file.cpp msgid "General" -msgstr "" +msgstr "Genel" #: src/settings_translation_file.cpp -#, fuzzy msgid "Generate normalmaps" -msgstr "Normal haritalar oluÅŸtur" +msgstr "Normal eÅŸlemeler oluÅŸtur" #: src/settings_translation_file.cpp msgid "Global callbacks" -msgstr "" +msgstr "Genel geri çaÄŸrılar" #: src/settings_translation_file.cpp msgid "" @@ -2222,23 +2626,37 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Global harita oluÅŸturma özellikleri.\n" +"Mapgen v6'da 'decorations' bayrağı aÄŸaçlar ve cangıl çimi hariç tüm " +"dekorasyonları\n" +"denetler, diÄŸer mapgenlerde bu bayrak tüm dekorasyonları denetler.\n" +"Bayrak karakter dizisinde belirtilmeyen bayraklar varsayılandan " +"deÄŸiÅŸtirilmez.\n" +"'no' ile baÅŸlayan bayraklar onları devre dışı bırakır." #: src/settings_translation_file.cpp msgid "Graphics" -msgstr "" +msgstr "Grafik" #: src/settings_translation_file.cpp msgid "Gravity" -msgstr "" +msgstr "Yerçekimi" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "Yer seviyesi" #: src/settings_translation_file.cpp -#, fuzzy msgid "HTTP Mods" -msgstr "Eklentiler" +msgstr "HTTP Modları" + +#: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "HUD boyut çarpanı" #: src/settings_translation_file.cpp msgid "HUD toggle key" -msgstr "" +msgstr "HUD açma/kapama tuÅŸu" #: src/settings_translation_file.cpp msgid "" @@ -2247,6 +2665,12 @@ msgid "" "- log: mimic and log backtrace of deprecated call (default for debug).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" +"Kullanım dışı lua API çaÄŸrılarının ele alınması:\n" +"- legacy: (eski) Eski davranış taklit etmeye çalışır (varsayılan).\n" +"- log: (günlük) kullanım dışı çaÄŸrıları taklit eder ve günlükler (hata " +"ayıklama için varsayılan).\n" +"- error: (hata) kullanım dışı çaÄŸrıların kullanımını iptal eder (mod " +"geliÅŸtiricileri için önerilen)." #: src/settings_translation_file.cpp msgid "" @@ -2256,26 +2680,62 @@ msgid "" "call).\n" "* Instrument the sampler being used to update the statistics." msgstr "" +"Profilleyicinin kendini belgelemesini saÄŸla\n" +"* boÅŸ bir fonksiyonu belgele\n" +"Bu belgelemenin eklediÄŸi (+1 donksiyon çaÄŸrısı) yükü tahmin eder.\n" +"* istatistikleri güncellemek için kullanılan örnekleyiciyi belgelendir." + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "Isı kaynaÅŸma gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "Isı gürültüsü" #: src/settings_translation_file.cpp msgid "Height component of the initial window size." -msgstr "" +msgstr "İlk pencere boyutunun yükseklik bileÅŸeni." + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "Yükseklik gürültüsü" #: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." -msgstr "" +msgstr "Bulutların ortaya çıkacağı yükseklik." + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "Yükseklik seçme gürültüsü" #: src/settings_translation_file.cpp msgid "High-precision FPU" -msgstr "" +msgstr "Yüksek hassasiyetli FPU" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "Tepe dikliÄŸi" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "Tepe eÅŸiÄŸi" #: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." -msgstr "" +msgstr "Sunucu listesinde görüntülenecek sunucunun ana sayfası ." + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "Hotbar sonraki tuÅŸu" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "Hotbar önceki tuÅŸu" #: src/settings_translation_file.cpp msgid "How deep to make rivers" -msgstr "" +msgstr "Nehirlerin ne kadar derin yapılacağı" #: src/settings_translation_file.cpp msgid "" @@ -2283,40 +2743,75 @@ msgid "" "mapblocks (16 nodes).\n" "In active blocks objects are loaded and ABMs run." msgstr "" +"Harita blokları (16 nod) cinsinden etkin blok durumuna gelen blok alanının " +"geniÅŸliÄŸi\n" +"Etkin bloklardaki nesneler yüklenir ve ABM çalışır." #: src/settings_translation_file.cpp msgid "" "How much the server will wait before unloading unused mapblocks.\n" "Higher value is smoother, but will use more RAM." msgstr "" +"Sunucunun kullanılmayan harita bloklarını boÅŸaltmadan önce ne kadar " +"bekleyeceÄŸi.\n" +"Daha yüksek deÄŸer daha düzgün olsa da daha çok RAM kullanır." #: src/settings_translation_file.cpp msgid "How wide to make rivers" -msgstr "" +msgstr "Nehirlerin ne kadar geniÅŸ yapılacağı" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "Nem kaynaÅŸma gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "Nem gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "Biyomlar için nem deÄŸiÅŸimi." #: src/settings_translation_file.cpp msgid "IPv6" -msgstr "" +msgstr "IPv6" #: src/settings_translation_file.cpp msgid "IPv6 server" -msgstr "" +msgstr "IPv6 sunucu" #: src/settings_translation_file.cpp msgid "IPv6 support." -msgstr "" +msgstr "IPv6 desteÄŸi." #: src/settings_translation_file.cpp msgid "" "If FPS would go higher than this, limit it by sleeping\n" "to not waste CPU power for no benefit." msgstr "" +"FPS bundan daha fazla yükselecekse, CPU gücünü boÅŸa tüketmemek için, uykuya " +"dalarak sınırla ." #: src/settings_translation_file.cpp msgid "" "If disabled \"use\" key is used to fly fast if both fly and fast mode are " "enabled." msgstr "" +"Devre dışı bırakılırsa \"kullan\" tuÅŸu, hem uçma hem de hızlı kipi etkin " +"ise, hızlı uçma için kullanılır." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" +"EtkinleÅŸtirilirse sunucu oyuncunun göz konumuna göre harita bloÄŸu\n" +"oklüzyon ayırma yapacaktır. Bu istemciye gönderilen block sayısını\n" +"%50-80 azaltabilir. İstemci artık en görünmeyenleri almayacağından\n" +"hayalet kipinin kullanışı azalacaktır." #: src/settings_translation_file.cpp msgid "" @@ -2324,32 +2819,45 @@ msgid "" "nodes.\n" "This requires the \"noclip\" privilege on the server." msgstr "" +"Uçma kipi ile birlikte etkinleÅŸtirilirse, oyuncu katı nodlardan uçarak " +"geçebilir.\n" +"Bu sunucuda \"noclip\" ayrıcalığı gerektirir." #: src/settings_translation_file.cpp msgid "" "If enabled, \"use\" key instead of \"sneak\" key is used for climbing down " "and descending." msgstr "" +"EtkinleÅŸtirilirse, \"sızma\" tuÅŸu yerine \"kullan\" tuÅŸu aÅŸağı tırmanma ve " +"alçalma için kullanılır." #: src/settings_translation_file.cpp msgid "" "If enabled, actions are recorded for rollback.\n" "This option is only read when server starts." msgstr "" +"EtkinleÅŸtirilirse, eylemler geri alma için kaydedilebilir.\n" +"Bu seçenek sadece sunucu yeniden baÅŸlatıldığında okunur." #: src/settings_translation_file.cpp msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "" +msgstr "EtkinleÅŸtirilirse, multiplayer'da hile önleme devre dışı bırakılır." #: src/settings_translation_file.cpp msgid "" "If enabled, invalid world data won't cause the server to shut down.\n" "Only enable this if you know what you are doing." msgstr "" +"EtkinleÅŸtirilirse, geçersiz dünya verisi sunucunun kapanmasına neden olmaz.\n" +"Sadece ne yaptığınızı biliyorsanız bunu etkinleÅŸtirin." #: src/settings_translation_file.cpp msgid "If enabled, new players cannot join with an empty password." -msgstr "" +msgstr "EtkinleÅŸtirilirse, yeni oyuncular boÅŸ bir ÅŸifre ile katılamaz." + +#: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "Etkinse, sunucu durum mesajını oyuncu baÄŸlanınca göster." #: src/settings_translation_file.cpp msgid "" @@ -2357,104 +2865,139 @@ msgid "" "you stand.\n" "This is helpful when working with nodeboxes in small areas." msgstr "" +"EtkinleÅŸtirilirse, bulunduÄŸunuz yerin konumuna (ayak + göz seviyesi) " +"blokları yerleÅŸtirebilirsiniz.\n" +"Küçük alanlarda nodkutuları ile çalışırken, bu yararlıdır." #: src/settings_translation_file.cpp msgid "If this is set, players will always (re)spawn at the given position." msgstr "" +"Bu ayarlanırsa, oyuncular her zaman verilen konumdan (yeniden) canlanacaktır." #: src/settings_translation_file.cpp msgid "Ignore world errors" -msgstr "" +msgstr "Dünya hatalarını yok say" #: src/settings_translation_file.cpp -#, fuzzy msgid "In-Game" -msgstr "Oyun" +msgstr "Oyun içi" #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" +"Oyun-içi sohbet konsolu arka plan saydamlığı (solukluk, 0 ile 255 arasında)." #: src/settings_translation_file.cpp msgid "In-game chat console background color (R,G,B)." -msgstr "" +msgstr "Oyun-içi sohbet konsolu arka plan rengi (R,G,B)." + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "Oyun-içi sohbet konsolu yüksekliÄŸi 0.1 (%10) ve 1.0 (%100) arası." + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "Ses arttırma tuÅŸu" #: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" msgstr "" +"YerleÅŸiÄŸi belgele.\n" +"Genellikle bu sadece çekirdek/yerleÅŸik katkıda bulunanlar için gereklidir" #: src/settings_translation_file.cpp msgid "Instrument chatcommands on registration." -msgstr "" +msgstr "Kayıt sırasında sohbet komutlarını belgele." #: src/settings_translation_file.cpp msgid "" "Instrument global callback functions on registration.\n" "(anything you pass to a minetest.register_*() function)" msgstr "" +"Kayıt sırasında global geri çaÄŸrı fonksiyonlarını belgele.\n" +"(minetest.register_*() fonksiyonuna gönderdiÄŸiniz herÅŸey)" #: src/settings_translation_file.cpp msgid "" "Instrument the action function of Active Block Modifiers on registration." msgstr "" +"Kayıt sırasında Etkin Blok DeÄŸiÅŸtiricilerin eylem fonksiyonlarını belgele." #: src/settings_translation_file.cpp msgid "" "Instrument the action function of Loading Block Modifiers on registration." msgstr "" +"Kayıt sırasında Yükleme Blok DeÄŸiÅŸtiricilerin eylem fonksiyonlarını belgele." #: src/settings_translation_file.cpp msgid "Instrument the methods of entities on registration." -msgstr "" +msgstr "Kayıt sırasında varlık yöntemlerini belgele." #: src/settings_translation_file.cpp msgid "Instrumentation" -msgstr "" +msgstr "Belgeleme" #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." -msgstr "" +msgstr "Dünyadaki önemli deÄŸiÅŸiklikleri kaydetme aralığı, saniye cinsinden." #: src/settings_translation_file.cpp msgid "Interval of sending time of day to clients." -msgstr "" +msgstr "Günün saatini istemcilere gönderme aralığı." + +#: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "Envanter resim hack'i" #: src/settings_translation_file.cpp msgid "Inventory items animations" -msgstr "" +msgstr "Envanter öğeleri animasyonu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Inventory key" -msgstr "Envanter" +msgstr "Envanter tuÅŸu" #: src/settings_translation_file.cpp msgid "Invert mouse" -msgstr "" +msgstr "Ters fare" #: src/settings_translation_file.cpp msgid "Invert vertical mouse movement." -msgstr "" +msgstr "Ters dikey fare hareketi." #: src/settings_translation_file.cpp msgid "Item entity TTL" -msgstr "" +msgstr "Öğe varlık TTL" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "Yinelemeler" #: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" +"Özyinelemeli fonksiyon yinelemelerini.\n" +"İnce detay miktarını denetler." + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "Joystick ID" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "Joystick Türü" #: src/settings_translation_file.cpp msgid "Joystick button repetition interval" -msgstr "" +msgstr "Joystick düğmesi tekrarlama aralığı" #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" -msgstr "" +msgstr "Joystick frustum duyarlılığı" #: src/settings_translation_file.cpp msgid "" @@ -2463,6 +3006,10 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" +"Sadece Julia set için: julia ÅŸeklini belirleyici hypercomplex sabitinin W " +"bileÅŸeni.\n" +"3D Fraktallar üzerinde etkisi yoktur.\n" +"Aralığı kabaca -2 ile 2." #: src/settings_translation_file.cpp msgid "" @@ -2470,6 +3017,9 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Sadece Julia set için: julia ÅŸeklini belirleyici hypercomplex sabitinin X " +"bileÅŸeni.\n" +"Aralığı kabaca -2 ile 2." #: src/settings_translation_file.cpp msgid "" @@ -2477,6 +3027,9 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Sadece Julia set için: julia ÅŸeklini belirleyici hypercomplex sabitinin Y " +"bileÅŸeni.\n" +"Aralığı kabaca -2 ile 2." #: src/settings_translation_file.cpp msgid "" @@ -2484,15 +3037,33 @@ msgid "" "shape.\n" "Range roughly -2 to 2." msgstr "" +"Sadece Julia set için: julia ÅŸeklini belirleyici hypercomplex sabitinin Z " +"bileÅŸeni.\n" +"Aralığı kabaca -2 ile 2." + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "Julia w" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "Julia x" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "Julia y" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "Julia z" #: src/settings_translation_file.cpp -#, fuzzy msgid "Jump key" -msgstr "Zıpla" +msgstr "Zıplama tuÅŸu" #: src/settings_translation_file.cpp msgid "Jumping speed" -msgstr "" +msgstr "Atlama hızı" #: src/settings_translation_file.cpp msgid "" @@ -2500,6 +3071,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Görüş uzaklığını azaltma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Ses azaltma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2507,6 +3091,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"O anki seçili öğeyi atma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2514,6 +3101,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Görüş uzaklığını arttırma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Ses arttırma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2521,6 +3121,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Zıplama tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2528,6 +3131,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Hızlı kipte hızlı hareket tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2535,6 +3141,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Oyuncuyu geriye hareket ettirme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2542,6 +3151,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Oyuncuyu ileriye hareket ettirme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2549,6 +3161,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Oyuncuyu sola hareket ettirme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2556,6 +3171,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Oyuncuyu saÄŸa hareket ettirme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Ses kısma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2563,6 +3191,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Sohbet konsolunu açma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2570,6 +3201,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Komut yazmak için sohbet penceresini açma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Yerel komutlar yazmak için sohbet penceresini açma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2577,6 +3221,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Sohbet penceresini açma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2584,6 +3231,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Envanteri açma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2591,6 +3241,29 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Hata ayıklama yığınlarını yazdırma tuÅŸu. GeliÅŸtirme için kullanılır.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Hotbar'da sonraki öğeyi seçme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Hotbar'da önceki öğeyi seçme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2600,6 +3273,11 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Sızma tuÅŸu.\n" +"Aynı zamanda aÅŸağı inmek ve, aux1_descends kapalı ise, suda alçalmak için " +"kullanılır.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2607,6 +3285,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Birinci ve üçüncü kiÅŸi kamerası arası geçiÅŸ tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2614,6 +3295,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Ekran yakalama tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2621,6 +3305,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"KendiliÄŸinden koÅŸma açma/kapama tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2628,6 +3315,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Sinematik kip açma/kapama tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2635,6 +3325,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Mini harita gösterme/gizleme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2642,6 +3335,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Hızlı kip açma/kapama tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2649,6 +3345,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Uçma açma/kapama tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2656,6 +3355,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Hayalet kip açma/kapama tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2663,6 +3365,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Kamera güncelleme açma/kapama tuÅŸu. Sadece geliÅŸtirme için kullanılır.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2670,6 +3375,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Hata ayıklama bilgisi gösterme/gizleme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2677,6 +3385,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"HUD gösterme/gizleme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2684,6 +3395,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Sohbet gösterme/gizleme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2691,6 +3405,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Sis gösterme/gizleme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Büyük sohbet konsolunu gösterme/gizleme tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2698,6 +3425,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Profilleyiciyi gösterme/gizleme tuÅŸu. GeliÅŸtirme için kullanılır.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -2705,26 +3435,51 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Sınırsız görüş uzaklığı açma/kapama tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -msgid "Key use for climbing/descending" +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Mümkün olduÄŸunda görünüm yakınlaÅŸtırmayı kullanma tuÅŸu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901" +"735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "Key use for climbing/descending" +msgstr "Tırmanma/alçalma için kullanılan tuÅŸ" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "Göl dikliÄŸi" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "Göl eÅŸiÄŸi" #: src/settings_translation_file.cpp msgid "Language" -msgstr "" +msgstr "Dil" #: src/settings_translation_file.cpp msgid "Large cave depth" -msgstr "" +msgstr "Büyük maÄŸara derinliÄŸi" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "Büyük sohbet konsolu tuÅŸu" #: src/settings_translation_file.cpp msgid "Lava Features" -msgstr "" +msgstr "Lav Özellikleri" #: src/settings_translation_file.cpp msgid "Leaves style" -msgstr "" +msgstr "Yaprak stili" #: src/settings_translation_file.cpp msgid "" @@ -2733,25 +3488,30 @@ msgid "" "- Simple: only outer faces, if defined special_tiles are used\n" "- Opaque: disable transparency" msgstr "" +"Yaprak stili:\n" +"- Fancy: tüm yüzler görünür\n" +"- Simple: sadece dış yüzler, tanımlı special_tiles kullanılıyorsa\n" +"- Opaque: saydamlık devre dışı" #: src/settings_translation_file.cpp -#, fuzzy msgid "Left key" -msgstr "Sol Menu" +msgstr "Sol tuÅŸ" #: src/settings_translation_file.cpp msgid "" "Length of a server tick and the interval at which objects are generally " "updated over network." msgstr "" +"Sunucunun tık uzunluÄŸu ve nesnelerin genellikle aÄŸ üzerinden güncelleneceÄŸi " +"aralık." #: src/settings_translation_file.cpp msgid "Length of time between ABM execution cycles" -msgstr "" +msgstr "ABM yürütme döngüleri arasındaki sürenin uzunluÄŸunu" #: src/settings_translation_file.cpp msgid "Length of time between NodeTimer execution cycles" -msgstr "" +msgstr "NodeTimer yürütme döngüleri arasındaki sürenin uzunluÄŸunu" #: src/settings_translation_file.cpp msgid "" @@ -2764,14 +3524,33 @@ msgid "" "- info\n" "- verbose" msgstr "" +"debug.txt'e yazılacak günlük düzeyi:\n" +"- <nothing> (günlük yok)\n" +"- none (düzeyi olmayan mesajlar)\n" +"- error (hata)\n" +"- warning (uyarı)\n" +"- action (eylem)\n" +"- info (bilgi)\n" +"- verbose (ayrıntılı)" #: src/settings_translation_file.cpp msgid "Limit of emerge queues on disk" -msgstr "" +msgstr "Diskte emerge sıralarının sınırı" #: src/settings_translation_file.cpp msgid "Limit of emerge queues to generate" +msgstr "OluÅŸturulacak emerge sıralarının sınırı" + +#: src/settings_translation_file.cpp +msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." msgstr "" +"Harita oluÅŸturmanın sınırı, nodlar cinsinden, (0, 0, 0)'dan tüm 6 doÄŸrultuda." +"\n" +"Sadece tamamen mapgen sınırı içindeki harita yığınları oluÅŸturulur.\n" +"DeÄŸer dünya-başına saklanır." #: src/settings_translation_file.cpp msgid "" @@ -2781,38 +3560,43 @@ msgid "" "- Downloads performed by main menu (e.g. mod manager).\n" "Only has an effect if compiled with cURL." msgstr "" +"Paralel HTTP isteklerinin sayısını sınırlar. EtkilediÄŸi:\n" +"- Medya alma, sunucu remote_media ayarını kullanıyorsa\n" +"- Sunucu listesi indirme ve sunucu duyurusu.\n" +"- Ana menü (ör: mod yöneticisi) tarafından uygulanan indirmeler.\n" +"Sadece cURL ile derlenmiÅŸ ise etkiye sahiptir." #: src/settings_translation_file.cpp msgid "Liquid fluidity" -msgstr "" +msgstr "Sıvı akışkanlığı" #: src/settings_translation_file.cpp msgid "Liquid fluidity smoothing" -msgstr "" +msgstr "Sıvı akışkanlığı yumuÅŸatma" #: src/settings_translation_file.cpp msgid "Liquid loop max" -msgstr "" +msgstr "Maksimum sıvı döngüsü" #: src/settings_translation_file.cpp msgid "Liquid queue purge time" -msgstr "" +msgstr "Sıvı sırası silme zamanı" #: src/settings_translation_file.cpp msgid "Liquid sink" -msgstr "" +msgstr "Sıvı inme" #: src/settings_translation_file.cpp msgid "Liquid update interval in seconds." -msgstr "" +msgstr "Saniye cinsinden sıvı güncelleme aralığı." #: src/settings_translation_file.cpp msgid "Liquid update tick" -msgstr "" +msgstr "Sıvı güncelleme tıkı" #: src/settings_translation_file.cpp msgid "Load the game profiler" -msgstr "" +msgstr "Oyun profilleyiciyi yükle" #: src/settings_translation_file.cpp msgid "" @@ -2820,37 +3604,46 @@ msgid "" "Provides a /profiler command to access the compiled profile.\n" "Useful for mod developers and server operators." msgstr "" +"Oyun profilleme verisi toplamak için oyun profilleyiciyi yükler.\n" +"DerlenmiÅŸ profile eriÅŸmek için /profiler komutu saÄŸlar.\n" +"Mod geliÅŸtiricileri ve sunucu operatörleri için yararlıdır." #: src/settings_translation_file.cpp msgid "Loading Block Modifiers" -msgstr "" +msgstr "Blok DeÄŸiÅŸtiriciler Yükleniyor" #: src/settings_translation_file.cpp msgid "Main menu game manager" -msgstr "" +msgstr "Ana menü oyun yöneticisi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Main menu mod manager" -msgstr "Ana menu" +msgstr "Ana menü mod yöneticisi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Main menu script" -msgstr "Ana menu" +msgstr "Ana menü betiÄŸi" #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" +"Sis ve gökyüzü renklerini gün saatine (ÅŸafak/günbatımı) ve bakış yönüne " +"baÄŸlı deÄŸiÅŸtir." #: src/settings_translation_file.cpp msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" +"DirectX'in LuaJIT ile çalışmasını saÄŸlar. Sorunlara neden olursa devre dışı " +"bırakın." + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "Tüm sıvıları opak yapar" #: src/settings_translation_file.cpp msgid "Map directory" -msgstr "" +msgstr "Harita dizini" #: src/settings_translation_file.cpp msgid "" @@ -2864,6 +3657,14 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Mapgen vadilerine özgü harita oluÅŸturma deÄŸerleri.\n" +"'altitude_chill' yüksek seviyeleri daha soÄŸuk yapar, bu biyom sorunlarına " +"neden olabilir.\n" +"'humid_rivers' nehirlerin ve suların toplandığı bölegelerin çevresinde nemi " +"arttırır.\n" +"Bayrak karakter dizisinde belirtilmeyen bayraklar varsayılandan " +"deÄŸiÅŸtirilmez.\n" +"'no' ile baÅŸlayan bayraklar onları devre dışı bırakır." #: src/settings_translation_file.cpp msgid "" @@ -2873,433 +3674,221 @@ msgid "" "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Mapgen düze özgü harita oluÅŸturma deÄŸerleri.\n" +"Ara sıra göller ve tepeler düz dünyaya eklenebilir.\n" +"Bayrak karakter dizisinde belirtilmeyen bayraklar varsayılandan " +"deÄŸiÅŸtirilmez.\n" +"'no' ile baÅŸlayan bayraklar onları devre dışı bırakır." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"Mapgen v5'e özgü harita oluÅŸturma deÄŸerleri.\n" +"Bayrak karakter dizisinde belirtilmeyen bayraklar varsayılandan " +"deÄŸiÅŸtirilmez.\n" +"'no' ile baÅŸlayan bayraklar onları devre dışı bırakır." #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Mapgen v6'ya özgü harita oluÅŸturma deÄŸerleri.\n" +"'snowbiomes' bayrağı yeni 5 biyom sistemini etkinleÅŸtir.\n" +"Yeni biyom sistemi etkinken cangıllar kendiliÄŸinden etkinleÅŸtirilir, " +"'jungles' bayrağı yok sayılır.\n" +"Bayrak karakter dizisinde belirtilmeyen bayraklar varsayılandan " +"deÄŸiÅŸtirilmez.\n" +"'no' ile baÅŸlayan bayraklar onları devre dışı bırakır." #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." msgstr "" +"Mapgen v7'ye özgü harita oluÅŸturma deÄŸerleri.\n" +"'ridges' bayrağı nehirleri etkinleÅŸtirir.\n" +"Yüzenkaralar henüz deneyseldir ve deÄŸiÅŸebilirler.\n" +"Bayrak karakter dizisinde belirtilmeyen bayraklar varsayılandan " +"deÄŸiÅŸtirilmez.\n" +"'no' ile baÅŸlayan bayraklar onları devre dışı bırakır." #: src/settings_translation_file.cpp msgid "Map generation limit" -msgstr "" +msgstr "Harita oluÅŸturma sınırı" #: src/settings_translation_file.cpp msgid "Map save interval" -msgstr "" +msgstr "Harita kaydetme aralığı" #: src/settings_translation_file.cpp msgid "Mapblock limit" -msgstr "" +msgstr "Harita bloÄŸu sınırı" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "" +msgid "Mapblock mesh generation delay" +msgstr "Harita bloÄŸu ızgara oluÅŸturma gecikmesi" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen Valleys" -msgstr "Mapgen" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "Harita BloÄŸu ızgara oluÅŸturucunun Harita BloÄŸu ön bellek boyutu MB" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "" +msgid "Mapblock unload timeout" +msgstr "Harita bloÄŸu boÅŸaltma zaman aşımı" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +msgid "Mapgen Valleys" +msgstr "Mapgen Vadiler" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen debug" -msgstr "Mapgen" +msgstr "Mapgen hata ayıklama" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen flags" -msgstr "Mapgen" +msgstr "Mapgen bayrakları" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen flat" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat cave width" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat flags" -msgstr "Mapgen" +msgstr "Mapgen düz" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat ground level" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake steepness" -msgstr "Parallax Occlusion" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen flat lake threshold" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" +msgid "Mapgen flat specific flags" +msgstr "Mapgen düze özgü bayraklar" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen fractal" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal cave width" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal fractal" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal iterations" -msgstr "Parallax Occlusion" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal offset" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal scale" -msgstr "Mapgen" +msgstr "Mapgen fraktal" #: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal slice w" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen name" -msgstr "Mapgen" +msgstr "Mapgen adı" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen v5" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen v5 cave width" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" +msgstr "Mapgen v5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" +msgid "Mapgen v5 specific flags" +msgstr "Mapgen v5'e özgü bayraklar" #: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen v6" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" +msgstr "Mapgen v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" +msgid "Mapgen v6 specific flags" +msgstr "Mapgen v6'ya özgü bayraklar" #: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen v7" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen v7 cave width" -msgstr "Mapgen" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" +msgstr "Mapgen v7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" +msgid "Mapgen v7 specific flags" +msgstr "Mapgen v7'ye özgü bayraklar" #: src/settings_translation_file.cpp msgid "Massive cave depth" -msgstr "" +msgstr "Devasa maÄŸara derinliÄŸi" #: src/settings_translation_file.cpp msgid "Massive cave noise" -msgstr "" +msgstr "Devasa maÄŸara gürültüsü" #: src/settings_translation_file.cpp msgid "Massive caves form here." -msgstr "" +msgstr "Devasa maÄŸaralar burada oluÅŸuyor." #: src/settings_translation_file.cpp msgid "Max block generate distance" -msgstr "" +msgstr "Maksimum blok oluÅŸturma uzaklığı" #: src/settings_translation_file.cpp msgid "Max block send distance" -msgstr "" +msgstr "Maksimum blok gönderme uzaklığı" #: src/settings_translation_file.cpp msgid "Max liquids processed per step." -msgstr "" +msgstr "Adım başına iÅŸlenen maksimum sıvı." #: src/settings_translation_file.cpp msgid "Max. clearobjects extra blocks" -msgstr "" +msgstr "Maksimum clearobjects ek bloÄŸu" #: src/settings_translation_file.cpp msgid "Max. packets per iteration" -msgstr "" +msgstr "Yineleme başına maksimum paket" #: src/settings_translation_file.cpp msgid "Maximum FPS" -msgstr "" +msgstr "Maksimum FPS" #: src/settings_translation_file.cpp msgid "Maximum FPS when game is paused." -msgstr "" +msgstr "Oyun duraklatıldığında maksimum FPS." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" -msgstr "" +msgstr "Maksimum zorla yüklenen blok" #: src/settings_translation_file.cpp msgid "Maximum hotbar width" -msgstr "" +msgstr "Maksimum hotbar geniÅŸliÄŸi" #: src/settings_translation_file.cpp msgid "Maximum number of blocks that are simultaneously sent in total." -msgstr "" +msgstr "Aynı anda toplamda gönderilen maksimum blok sayısı ." #: src/settings_translation_file.cpp msgid "Maximum number of blocks that are simultaneously sent per client." -msgstr "" +msgstr "Aynı anda istemci başına gönderilen maksimum blok sayısı." #: src/settings_translation_file.cpp msgid "Maximum number of blocks that can be queued for loading." -msgstr "" +msgstr "Yükleme için sıraya alınabilecek maksimum blok sayısı." #: src/settings_translation_file.cpp msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "Set to blank for an appropriate amount to be chosen automatically." msgstr "" +"OluÅŸturulması için sıraya koyulacak maksimum blok sayısı.\n" +"Uygun miktarın kendiliÄŸinden seçilmesi için boÅŸ olarak ayarlayın." #: src/settings_translation_file.cpp msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "Set to blank for an appropriate amount to be chosen automatically." msgstr "" +"Bir dosyadan yüklenmesi için sıraya koyulacak maksimum blok sayısı.\n" +"Uygun miktarın kendiliÄŸinden seçilmesi için boÅŸ olarak ayarlayın." #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." -msgstr "" +msgstr "Zorla yüklenen harita bloklarının maksimum sayısı." #: src/settings_translation_file.cpp msgid "" "Maximum number of mapblocks for client to be kept in memory.\n" "Set to -1 for unlimited amount." msgstr "" +"İstemcinin hafızada tutacağı maksimum harita bloÄŸu sayısı.\n" +"Sınırsız miktar için -1'e ayarlayın." #: src/settings_translation_file.cpp msgid "" @@ -3307,128 +3896,152 @@ msgid "" "try reducing it, but don't reduce it to a number below double of targeted\n" "client number." msgstr "" +"Gönderme adımı başına gönderilecek maksimum paket sayısı, baÄŸlantınız\n" +"yavaÅŸ ise azaltmayı deneyin, fakat hedeflenen istemci sayısının iki " +"katından\n" +"düşük bir sayıya azaltmayın." #: src/settings_translation_file.cpp msgid "Maximum number of players that can connect simultaneously." -msgstr "" +msgstr "Aynı anda baÄŸlanabilen maksimum oyuncu sayısı." #: src/settings_translation_file.cpp msgid "Maximum number of statically stored objects in a block." -msgstr "" +msgstr "Bir blokta statik olarak saklı nesnelerin maksimum sayısı." #: src/settings_translation_file.cpp msgid "Maximum objects per block" -msgstr "" +msgstr "Blok başına maksimum nesne" #: src/settings_translation_file.cpp msgid "" "Maximum proportion of current window to be used for hotbar.\n" "Useful if there's something to be displayed right or left of hotbar." msgstr "" +"Hotbar için kullanılacak geçerli pencerinin maksimum oranı.\n" +"SaÄŸ veya sol hotbar'da gösterilecek bir ÅŸey varsa yararlıdır." #: src/settings_translation_file.cpp msgid "Maximum simultaneous block sends per client" -msgstr "" +msgstr "İstemci başına maksimum eÅŸzamanlı blok gönderimi" #: src/settings_translation_file.cpp msgid "Maximum simultaneous block sends total" -msgstr "" +msgstr "Maksimum toplam eÅŸzamanlı blok gönderimi" #: src/settings_translation_file.cpp msgid "Maximum time in ms a file download (e.g. a mod download) may take." msgstr "" +"Bir dosya indirmesinin ms cinsinden alabileceÄŸi maksimum zaman (ör: mod " +"indirme)." #: src/settings_translation_file.cpp msgid "Maximum users" -msgstr "" +msgstr "Maksimum kullanıcı" #: src/settings_translation_file.cpp -#, fuzzy msgid "Menus" -msgstr "Menü" +msgstr "Menüler" #: src/settings_translation_file.cpp msgid "Mesh cache" -msgstr "" +msgstr "Kafes önbelleÄŸi" #: src/settings_translation_file.cpp msgid "Message of the day" -msgstr "" +msgstr "Günün mesajı" #: src/settings_translation_file.cpp msgid "Message of the day displayed to players connecting." -msgstr "" +msgstr "BaÄŸlanan oyunculara görüntülenecek günün mesajı." #: src/settings_translation_file.cpp msgid "Method used to highlight selected object." -msgstr "" +msgstr "Seçili nesneyi vurgulamak için kullanılan yöntem." #: src/settings_translation_file.cpp msgid "Minimap" -msgstr "" +msgstr "Mini harita" #: src/settings_translation_file.cpp msgid "Minimap key" -msgstr "" +msgstr "Mini harita tuÅŸu" #: src/settings_translation_file.cpp msgid "Minimap scan height" -msgstr "" +msgstr "Mini harita tarama yüksekliÄŸi" #: src/settings_translation_file.cpp msgid "Minimum texture size for filters" -msgstr "" +msgstr "Filtreler için minimum doku boyutu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mipmapping" -msgstr "Mip-Mapping" +msgstr "Mip eÅŸleme" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "Hudbar öğelerinin boyutunu deÄŸiÅŸtirir." #: src/settings_translation_file.cpp msgid "Modstore details URL" -msgstr "" +msgstr "Modstore ayrıntı URL'si" #: src/settings_translation_file.cpp msgid "Modstore download URL" -msgstr "" +msgstr "Modstore indirme URL'si" #: src/settings_translation_file.cpp msgid "Modstore mods list URL" -msgstr "" +msgstr "Modstore mod liste URL'si" #: src/settings_translation_file.cpp msgid "Monospace font path" -msgstr "" +msgstr "EÅŸ aralıklı yazı tipi konumu" #: src/settings_translation_file.cpp msgid "Monospace font size" -msgstr "" +msgstr "EÅŸ aralıklı yazı tipi boyutu" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "DaÄŸ yükseklik gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "DaÄŸ gürültüsü" #: src/settings_translation_file.cpp msgid "Mouse sensitivity" -msgstr "" +msgstr "Fare hassasiyeti" #: src/settings_translation_file.cpp msgid "Mouse sensitivity multiplier." -msgstr "" +msgstr "Fare hassasiyet çarpanı." + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "Çamur gürültüsü" #: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" +"Düşme sallanması için çarpan.\n" +"ÖrneÄŸin: 0 ise görüntü sallanması yok; 1.0 ise normal; 2.0 ise çift." #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" +msgid "Mute key" +msgstr "Ses kısma tuÅŸu" #: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." msgstr "" +"Yeni bir dünya yaratılırken kullanılacak harita oluÅŸturucu adı.\n" +"Ana menüde bir dünya yaratmak bunu geçersiz kılar." #: src/settings_translation_file.cpp msgid "" @@ -3436,62 +4049,63 @@ msgid "" "When running a server, clients connecting with this name are admins.\n" "When starting from the main menu, this is overridden." msgstr "" +"Oyuncunun adı.\n" +"Bir sunucu çalışırken, bu adla baÄŸlanan istemciler yöneticidir.\n" +"Ana menüden baÅŸlatırken, bu geçersiz kılınır." #: src/settings_translation_file.cpp msgid "" "Name of the server, to be displayed when players join and in the serverlist." msgstr "" +"Oyuncular katılındığında ve sunucu listesinde görüntülenecek sunucu adı." #: src/settings_translation_file.cpp msgid "Network" -msgstr "" +msgstr "AÄŸ" #: src/settings_translation_file.cpp msgid "" "Network port to listen (UDP).\n" "This value will be overridden when starting from the main menu." msgstr "" +"Dinlenecek aÄŸ portu (UDP).\n" +"Bu deÄŸer ana menüden baÅŸlatılırken geçersiz kılınır." #: src/settings_translation_file.cpp msgid "New users need to input this password." -msgstr "" +msgstr "Yeni kullanıcıların bu ÅŸifreyi girmesi gerekir." #: src/settings_translation_file.cpp msgid "Noclip" -msgstr "" +msgstr "Hayalet" #: src/settings_translation_file.cpp msgid "Noclip key" -msgstr "" +msgstr "Hayalet tuÅŸu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Node highlighting" -msgstr "Nesne seçme göstergesi" +msgstr "Nod vurgulama" #: src/settings_translation_file.cpp msgid "NodeTimer interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" +msgstr "NodeTimer aralığı" #: src/settings_translation_file.cpp msgid "Noises" -msgstr "" +msgstr "Gürültüler" #: src/settings_translation_file.cpp msgid "Normalmaps sampling" -msgstr "" +msgstr "Dikey eÅŸleme örnekleme" #: src/settings_translation_file.cpp msgid "Normalmaps strength" -msgstr "" +msgstr "Dikey eÅŸleme gücü" #: src/settings_translation_file.cpp msgid "Number of emerge threads" -msgstr "" +msgstr "Emerge iÅŸ sayısı" #: src/settings_translation_file.cpp msgid "" @@ -3501,6 +4115,11 @@ msgid "" "speed greatly\n" "at the cost of slightly buggy caves." msgstr "" +"Kullanılacak emerge iÅŸ sayısı. Çoklu iÅŸ kullanmak için bu alanı boÅŸ bırakın " +"veya\n" +"bu sayıyı arttırın. Çok iÅŸlemcili sistemlerde, bu mapgen hızını, biraz " +"hatalı maÄŸaralar\n" +"pahasına, büyük ölçüde arttıracaktır." #: src/settings_translation_file.cpp msgid "" @@ -3508,115 +4127,134 @@ msgid "" "This is a trade-off between sqlite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" +"/clearobjects tarafında tek seferde yüklenebilecek ek blokların sayısı.\n" +"Bu sqlite iÅŸlem yükü ve bellek tüketimi (4096=100MB)\n" +"arasında bir dengedir." #: src/settings_translation_file.cpp msgid "Number of parallax occlusion iterations." -msgstr "" +msgstr "Paralaks oklüzyon yineleme sayısı." + +#: src/settings_translation_file.cpp +msgid "Offset" +msgstr "Kaydırma" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "Opak sıvılar" #: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" +msgstr "Paralaks oklüzyon efektinin genel sapması, genellikle boyut/2." #: src/settings_translation_file.cpp msgid "Overall scale of parallax occlusion effect." -msgstr "" +msgstr "Paralaks oklüzyon efektinin genel boyutu." #: src/settings_translation_file.cpp -#, fuzzy msgid "Parallax occlusion" -msgstr "Parallax Occlusion" +msgstr "Paralaks oklüzyon" #: src/settings_translation_file.cpp -#, fuzzy msgid "Parallax occlusion Scale" -msgstr "Parallax Occlusion" +msgstr "Paralaks oklüzyon Boyutu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Parallax occlusion bias" -msgstr "Parallax Occlusion" +msgstr "Paralaks oklüzyon sapması" #: src/settings_translation_file.cpp -#, fuzzy msgid "Parallax occlusion iterations" -msgstr "Parallax Occlusion" +msgstr "Paralaks oklüzyon yinelemesi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Parallax occlusion mode" -msgstr "Parallax Occlusion" +msgstr "Paralaks oklüzyon kipi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Parallax occlusion strength" -msgstr "Parallax Occlusion" +msgstr "Paralaks oklüzyon gücü" #: src/settings_translation_file.cpp msgid "Path to TrueTypeFont or bitmap." -msgstr "" +msgstr "TrueTypeFont veya bitmap konumu." #: src/settings_translation_file.cpp msgid "Path to save screenshots at." +msgstr "Ekran yakalamaların kaydedileceÄŸi konum." + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." msgstr "" +"Gölgeleme dizininin konumu. Bir konum belirtilmediyse, varsayılan yer " +"kullanılacak." #: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." -msgstr "" +msgstr "Doku dizini konumu. Tüm dokular ilk burada aranır." #: src/settings_translation_file.cpp msgid "Physics" -msgstr "" +msgstr "Fizik" #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" "This requires the \"fly\" privilege on the server." msgstr "" +"Oyuncu yerçekimi tarafından etkilenmeden uçabilir.\n" +"Bu sunucu üzerinde \"fly\" ayrıcalığı gerektirir." #: src/settings_translation_file.cpp -#, fuzzy msgid "Player name" -msgstr "Kullanıcı adı çok uzun." +msgstr "Oyuncu adı" #: src/settings_translation_file.cpp msgid "Player transfer distance" -msgstr "" +msgstr "Oyuncu transfer uzaklığı" #: src/settings_translation_file.cpp msgid "Player versus Player" -msgstr "" +msgstr "Oyuncu Oyuncuya karşı" #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" "Note that the port field in the main menu overrides this setting." msgstr "" +"BaÄŸlanılacak port (UDP).\n" +"Ana menüdeki port alanının bunu geçersiz kılacağını unutmayın." #: src/settings_translation_file.cpp msgid "Prevent mods from doing insecure things like running shell commands." msgstr "" +"Modların bir kabuk komutu çalıştırmak gibi güvensiz ÅŸeyler yapmasını önle." #: src/settings_translation_file.cpp msgid "" "Print the engine's profiling data in regular intervals (in seconds). 0 = " "disable. Useful for developers." msgstr "" +"Motorun profilleme verilerini düzenli aralıklarla (saniye cinsinden) " +"yazdırın. 0 = devre dışı. GeliÅŸtiriciler için yararlıdır." #: src/settings_translation_file.cpp msgid "Privileges that players with basic_privs can grant" -msgstr "" +msgstr "basic_privs sahibi oyuncuların verebileceÄŸi ayrıcalıklar" #: src/settings_translation_file.cpp msgid "Profiler" -msgstr "" +msgstr "Profilleyici" #: src/settings_translation_file.cpp msgid "Profiler toggle key" -msgstr "" +msgstr "Profilleyiciyi açma/kapama tuÅŸu" #: src/settings_translation_file.cpp msgid "Profiling" -msgstr "" +msgstr "Profilleme" #: src/settings_translation_file.cpp msgid "" @@ -3624,77 +4262,93 @@ msgid "" "Values larger than 26 will start to produce sharp cutoffs at cloud area " "corners." msgstr "" +"Bulut alanı yarıçapı, 64 nod bulut kareleri sayısı cinsinden.\n" +"26'dan büyük deÄŸerler bulut alanı köşelerinde keskin kesimler üretmeye " +"baÅŸlar." #: src/settings_translation_file.cpp msgid "Raises terrain to make valleys around the rivers" -msgstr "" +msgstr "Nehirler etrafında vadiler yapmak için araziyi yükseltir" #: src/settings_translation_file.cpp msgid "Random input" -msgstr "" +msgstr "Rasgele giriÅŸ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Range select key" -msgstr "Uzaklık seçimi" +msgstr "Uzaklık seçim tuÅŸu" #: src/settings_translation_file.cpp msgid "Remote media" -msgstr "" +msgstr "Uzak medya" #: src/settings_translation_file.cpp msgid "Remote port" -msgstr "" +msgstr "Uzak port" #: src/settings_translation_file.cpp msgid "Replaces the default main menu with a custom one." -msgstr "" +msgstr "Varsayılan ana menüyü özel olanı ile deÄŸiÅŸtirir." #: src/settings_translation_file.cpp -#, fuzzy msgid "Report path" -msgstr "Seç" +msgstr "Rapor konumu" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "Sırt Gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "Sırt su altı gürültüsü" #: src/settings_translation_file.cpp -#, fuzzy msgid "Right key" -msgstr "SaÄŸ Menu" +msgstr "SaÄŸ tuÅŸ" #: src/settings_translation_file.cpp msgid "Rightclick repetition interval" -msgstr "" +msgstr "SaÄŸ tık tekrarlama aralığı" #: src/settings_translation_file.cpp msgid "River Depth" -msgstr "" +msgstr "Nehir DerinliÄŸi" #: src/settings_translation_file.cpp msgid "River Noise" -msgstr "" +msgstr "Nehir Gürültüsü" #: src/settings_translation_file.cpp msgid "River Size" -msgstr "" +msgstr "Nehir Boyutu" #: src/settings_translation_file.cpp msgid "River noise -- rivers occur close to zero" -msgstr "" +msgstr "Nehir gürültüsü -- nehirler sıfıra yakın oluÅŸur" #: src/settings_translation_file.cpp msgid "Rollback recording" -msgstr "" +msgstr "Geri alma kaydı" #: src/settings_translation_file.cpp msgid "Round minimap" -msgstr "" +msgstr "Yuvarlak mini harita" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "Kumlu sahiller np_beach bu deÄŸeri aÅŸtığında oluÅŸur." #: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." -msgstr "" +msgstr "İstemci tarafından alınan haritayı diske kaydet." #: src/settings_translation_file.cpp msgid "Saving map received from server" -msgstr "" +msgstr "Sunucudan alınan harita kaydediliyor" + +#: src/settings_translation_file.cpp +msgid "Scale" +msgstr "Boyut" #: src/settings_translation_file.cpp msgid "" @@ -3704,33 +4358,35 @@ msgid "" "pixels when scaling down, at the cost of blurring some\n" "edge pixels when images are scaled by non-integer sizes." msgstr "" +"Kullanıcı tanımlı bir deÄŸerle arayüzü boyutlandır.\n" +"Arayüzü boyutlandırırken en yakın-komÅŸu-kenar filtresi kullan.\n" +"Bu bazı pürüzlü kenarları yumuÅŸatır ve küçültürken pikselleri\n" +"kaynaÅŸtırır, görüntüler tam sayı olmayan boyutlarla ölçeklendiÄŸinde\n" +"bazı kenar piksellerde bulanıklığa neden olur." #: src/settings_translation_file.cpp msgid "Screen height" -msgstr "" +msgstr "Ekran yüksekliÄŸi" #: src/settings_translation_file.cpp msgid "Screen width" -msgstr "" +msgstr "Ekran geniÅŸliÄŸi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screenshot" -msgstr "Ekran Resmi" +msgstr "Ekran yakala" #: src/settings_translation_file.cpp msgid "Screenshot folder" -msgstr "" +msgstr "Ekran yakalama klasörü" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screenshot format" -msgstr "Ekran Resmi" +msgstr "Ekran yakalama biçimi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screenshot quality" -msgstr "Ekran Resmi" +msgstr "Ekran yakalama kalitesi" #: src/settings_translation_file.cpp msgid "" @@ -3738,151 +4394,202 @@ msgid "" "1 means worst quality; 100 means best quality.\n" "Use 0 for default quality." msgstr "" +"Ekran yakalama kalitesi. Sadece JPEG biçimi için kullanılır.\n" +"1 en kötü kalite; 100 en iyi kalite.\n" +"Varsayılan kalite için 0 kullanın." + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "Deniz yatağı gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "Birlikte tünelleri belirleyen 2 3D gürültüden ikincisi." #: src/settings_translation_file.cpp msgid "Security" -msgstr "" +msgstr "Güvenlik" #: src/settings_translation_file.cpp msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous" -msgstr "" +msgstr "http://www.sqlite.org/pragma.html#pragma_synchronous adresine bakın" #: src/settings_translation_file.cpp msgid "Selection box border color (R,G,B)." -msgstr "" +msgstr "Seçim kutusu kenar rengi (R,G,B)." #: src/settings_translation_file.cpp msgid "Selection box color" -msgstr "" +msgstr "Seçim kutusunu rengi" #: src/settings_translation_file.cpp msgid "Selection box width" -msgstr "" +msgstr "Seçim kutusu geniÅŸliÄŸi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Server / Singleplayer" -msgstr "Tek kiÅŸilik oyunu baÅŸlat" +msgstr "Sunucu / Tek oyunculu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Server URL" -msgstr "Sunucu Kur" +msgstr "Sunucu URL'si" #: src/settings_translation_file.cpp -#, fuzzy msgid "Server address" -msgstr "Sunucu portu" +msgstr "Sunucu adresi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Server description" -msgstr "Sunucu portu" +msgstr "Sunucu açıklaması" #: src/settings_translation_file.cpp -#, fuzzy msgid "Server name" -msgstr "Sunucu Kur" +msgstr "Sunucu adı" #: src/settings_translation_file.cpp -#, fuzzy msgid "Server port" msgstr "Sunucu portu" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Server side occlusion culling" +msgstr "Sunucu tarafı oklüzyon ayırma" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" -msgstr "Çevirimiçi Oyun Listesi" +msgstr "Sunucu liste URL'si" #: src/settings_translation_file.cpp -#, fuzzy msgid "Serverlist file" -msgstr "Çevirimiçi Oyun Listesi" +msgstr "Sunucu liste dosyası" #: src/settings_translation_file.cpp msgid "" "Set the language. Leave empty to use the system language.\n" "A restart is required after changing this." msgstr "" +"Dili ayarlayın. Sistem dilini kullanmak için boÅŸ bırakın.\n" +"Bunu deÄŸiÅŸtirdikten sonra yeniden baÅŸlatmak gerekir." #: src/settings_translation_file.cpp msgid "" "Set to true enables waving leaves.\n" "Requires shaders to be enabled." msgstr "" +"True (doÄŸru) olarak ayarlamak dalgalanan yaprakları etkinleÅŸtirir.\n" +"Gölgelemenin etkin olmasını gerektirir." #: src/settings_translation_file.cpp msgid "" "Set to true enables waving plants.\n" "Requires shaders to be enabled." msgstr "" +"True (doÄŸru) olarak ayarlamak dalgalanan bitkileri etkinleÅŸtirir.\n" +"Gölgelemenin etkin olmasını gerektirir." #: src/settings_translation_file.cpp msgid "" "Set to true enables waving water.\n" "Requires shaders to be enabled." msgstr "" +"True (doÄŸru) olarak ayarlamak dalgalanan suyu etkinleÅŸtirir.\n" +"Gölgelemenin etkin olmasını gerektirir." + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "Gölgeleme konumu" #: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" +"Gölgelemeler geliÅŸmiÅŸ görsel efektlere izin verir ve bazı ekran kartlarında " +"performansı arttırabilir.\n" +"Sadece OpenGL video arka ucu ile çalışır." + +#: src/settings_translation_file.cpp +msgid "Shadow limit" +msgstr "Gölge sınırı" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." -msgstr "" +msgstr "Mini harita ÅŸekli. Etkin = Yuvarlak, devre dışı = kare." #: src/settings_translation_file.cpp msgid "Show debug info" -msgstr "" +msgstr "Hata ayıklama bilgisini göster" #: src/settings_translation_file.cpp msgid "Show entity selection boxes" -msgstr "" +msgstr "Varlık seçim kutularını göster" #: src/settings_translation_file.cpp msgid "Shutdown message" -msgstr "" +msgstr "Kapanma mesajı" #: src/settings_translation_file.cpp msgid "" "Size of chunks to be generated at once by mapgen, stated in mapblocks (16 " "nodes)." msgstr "" +"Harita blokları (16 nod) cinsinden bir kerede mapgen tarafından oluÅŸturulan " +"yığınların boyutu." #: src/settings_translation_file.cpp -msgid "Slope and fill work together to modify the heights" +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." msgstr "" +"Izgara oluÅŸturucunun Harita BloÄŸu ön belleÄŸinin boyutu. Bunu arttırmak\n" +"ön bellek vuruÅŸ %'sini arttırır, ana iÅŸlem parçasından kopyalanan veriyi\n" +"azaltır, sonuçta yırtılmayı azaltır." + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "Dilim w" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights" +msgstr "Yükseklikleri deÄŸiÅŸtirmek için eÄŸim ve dolgu birlikte iÅŸler" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "Biyomların sınırlarda kaynaÅŸması için düşük çaplı nem deÄŸiÅŸimi." + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "Biyomların sınırlarda kaynaÅŸması için düşük çaplı sıcaklık deÄŸiÅŸimi." #: src/settings_translation_file.cpp -#, fuzzy msgid "Smooth lighting" -msgstr "Pürüzsüz ışıklandırma" +msgstr "YumuÅŸak aydınlatma" #: src/settings_translation_file.cpp msgid "" "Smooths camera when looking around. Also called look or mouse smoothing.\n" "Useful for recording videos." msgstr "" +"Etrafa bakarken kamerayı yumuÅŸatır. Bakış veya fare yumuÅŸatma olarak da " +"bilinir.\n" +"Videoların kaydı için yararlıdır." #: src/settings_translation_file.cpp msgid "Smooths rotation of camera in cinematic mode. 0 to disable." -msgstr "" +msgstr "Sinematik kipte kamera dönüşünü yumuÅŸatır. 0 devre dışı bırakır." #: src/settings_translation_file.cpp msgid "Smooths rotation of camera. 0 to disable." -msgstr "" +msgstr "Kamera dönüşünü yumuÅŸatır. 0 devre dışı bırakır." #: src/settings_translation_file.cpp -#, fuzzy msgid "Sneak key" -msgstr "Sessiz Yürü" +msgstr "Sızma tuÅŸu" #: src/settings_translation_file.cpp msgid "Sound" -msgstr "" +msgstr "Ses" #: src/settings_translation_file.cpp msgid "" @@ -3891,35 +4598,66 @@ msgid "" "(obviously, remote_media should end with a slash).\n" "Files that are not present will be fetched the usual way." msgstr "" +"İstemcinin UDP kullanmak yerine medyayı hangi URL'den alacağını belirtir.\n" +"$filename cURL ile $remote_media$filename den eriÅŸilebilir olmalıdır\n" +"(tabi ki, remote_media eÄŸik çizgi ile bitmelidir).\n" +"Var olmayan dosyalar her zamanki yoldan alınır." #: src/settings_translation_file.cpp msgid "Static spawnpoint" -msgstr "" +msgstr "Sabit canlanma noktası" + +#: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "BaÄŸlanınca durum mesajı" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "Diklik gürültüsü" #: src/settings_translation_file.cpp -#, fuzzy msgid "Strength of generated normalmaps." -msgstr "Normal haritalar oluÅŸtur" +msgstr "OluÅŸturulan dikey eÅŸlemelerin gücü." #: src/settings_translation_file.cpp msgid "Strength of parallax." -msgstr "" +msgstr "Paralaks gücü." #: src/settings_translation_file.cpp msgid "Strict protocol checking" -msgstr "" +msgstr "Sıkı protokol denetleme" #: src/settings_translation_file.cpp msgid "Support older servers" -msgstr "" +msgstr "Eski sunucuları destekle" #: src/settings_translation_file.cpp msgid "Synchronous SQLite" -msgstr "" +msgstr "EÅŸzamanlı SQLite" + +#: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "Biyomlar için sıcaklık deÄŸiÅŸimi." #: src/settings_translation_file.cpp msgid "Terrain Height" -msgstr "" +msgstr "Arazi YüksekliÄŸi" + +#: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "Arazi alt gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "Arazi taban gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "Arazi üst gürültüsü" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "Arazi gürültüsü" #: src/settings_translation_file.cpp msgid "" @@ -3927,6 +4665,9 @@ msgid "" "Controls proportion of world area covered by hills.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"Tepeler için arazi gürültü eÅŸiÄŸi.\n" +"Dünyanın tepelerle kaplı alanının oranını denetler.\n" +"Daha büyük oranlar için 0.0'a doÄŸru ayarlayın." #: src/settings_translation_file.cpp msgid "" @@ -3934,51 +4675,67 @@ msgid "" "Controls proportion of world area covered by lakes.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"Göller için arazi gürültü eÅŸiÄŸi.\n" +"Dünyanın göllerle kaplı alanının oranını denetler.\n" +"Daha büyük oranlar için 0.0'a doÄŸru ayarlayın." + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "Arazi süreklilik gürültüsü" #: src/settings_translation_file.cpp -#, fuzzy msgid "Texture path" -msgstr "Doku paketi" +msgstr "Doku konumu" #: src/settings_translation_file.cpp msgid "The altitude at which temperature drops by 20C" -msgstr "" +msgstr "Sıcaklığın 20C birden düşeceÄŸi yükseklik" #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" "when calling `/profiler save [format]` without format." msgstr "" +"`/profiler save [biçim]` biçim olmadan çağırıldığında,\n" +"profillerin kayıt edileceÄŸi varsayılan biçim." #: src/settings_translation_file.cpp msgid "The depth of dirt or other filler" -msgstr "" +msgstr "Toprağın veya baÅŸka doldurucunun derinliÄŸi" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" -msgstr "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "Profillerin içine kaydedileceÄŸi, dünya konumuna baÄŸlı dosya konumu." + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "Kullanılacak joystick'in tanımlayıcısı" #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." -msgstr "" +msgstr "Sunucunun dinlediÄŸi aÄŸ arayüzü." #: src/settings_translation_file.cpp msgid "" "The privileges that new users automatically get.\n" "See /privs in game for a full list on your server and mod configuration." msgstr "" +"Yeni kullanıcıların kendiliÄŸinden aldığı ayrıcalıklar.\n" +"Sunucunuzda ve mod yapılandırmanızda tam bir liste için oyun içinde /privs " +"komutuna bakın." #: src/settings_translation_file.cpp msgid "The rendering back-end for Irrlicht." -msgstr "" +msgstr "Irrlicht için iÅŸleme arka ucu." #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" "ingame view frustum around." msgstr "" +"Oyun-içi görünüm frustum'unu hareket ettirirken\n" +"joystick eksenlerinin hassasiyeti." #: src/settings_translation_file.cpp msgid "" @@ -3987,6 +4744,10 @@ msgid "" "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n" "set to the nearest valid value." msgstr "" +"Nod ortam-oklüzyon gölgelemenin gücü (koyuluÄŸu).\n" +"Daha düşük daha karanlık, daha yüksek daha aydınlıktır. Geçerli\n" +"deÄŸer aralığı 0.25 ile 4.0 dahil. DeÄŸer aralık dışında ise en yakın\n" +"geçerli deÄŸere ayarlanır." #: src/settings_translation_file.cpp msgid "" @@ -3994,44 +4755,61 @@ msgid "" "capacity until an attempt is made to decrease its size by dumping old queue\n" "items. A value of 0 disables the functionality." msgstr "" +"Eski sıra öğeleri atılarak boyutunun düşürülmesine çalışılana kadar, " +"sıvılar\n" +"sırasının iÅŸleme kapasitesinin ötesine büyüyebileceÄŸi süre (saniye " +"cinsinden)\n" +"0 deÄŸeri bu özelliÄŸi devre dışı bırakır." #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" "when holding down a joystick button combination." msgstr "" +"Bir joystick tuÅŸ kombinasyonuna basılı tutarken, saniye\n" +"cinsinden tekrar eden olaylar arasında geçen süre." #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated right clicks when holding the " "right mouse button." msgstr "" +"SaÄŸ fare tuÅŸuna basılı tutarken tekrar eden saÄŸ tıklar arasında saniye " +"cinsinden geçen süre." + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "Joystick'in türü" #: src/settings_translation_file.cpp msgid "This font will be used for certain languages." -msgstr "" +msgstr "Belirli diller için bu yazı tipi kullanılacak." #: src/settings_translation_file.cpp msgid "Time in between active block management cycles" -msgstr "" +msgstr "Etkin blok yönetimi döngüleri arasındaki zaman" #: 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 "" +"Saniye cinsinde öğe varlığının (atılan öğeler) yaÅŸayacağı süre.\n" +"-1'e ayarlamak bu özelliÄŸi devre dışı bırakır." #: src/settings_translation_file.cpp msgid "Time send interval" -msgstr "" +msgstr "Zaman gönderme aralığı" #: src/settings_translation_file.cpp msgid "Time speed" -msgstr "" +msgstr "Zaman hızı" #: src/settings_translation_file.cpp msgid "Timeout for client to remove unused map data from memory." msgstr "" +"İstemcinin kullanılmayan harita verilerini bellekten kaldırması için zaman " +"aşımı." #: src/settings_translation_file.cpp msgid "" @@ -4040,19 +4818,26 @@ msgid "" "This determines how long they are slowed down after placing or removing a " "node." msgstr "" +"Gecikmeyi azaltmak için, oyuncu birÅŸey inÅŸa ederken blok transferleri " +"yavaÅŸlatılır.\n" +"Bu bir nod yerleÅŸtirildikten veya kaldırıldıktan sonra ne kadar süre " +"yavaÅŸlayacaklarını belirler." #: src/settings_translation_file.cpp msgid "Toggle camera mode key" -msgstr "" +msgstr "Kamera kipi deÄŸiÅŸtirme tuÅŸu" #: src/settings_translation_file.cpp msgid "Tooltip delay" -msgstr "" +msgstr "İpucu gecikmesi" + +#: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "AÄŸaçlar gürültüsü" #: src/settings_translation_file.cpp -#, fuzzy msgid "Trilinear filtering" -msgstr "Üç yönlü süzme" +msgstr "Trilineer filtreleme" #: src/settings_translation_file.cpp msgid "" @@ -4060,114 +4845,182 @@ msgid "" "False = 128\n" "Useable to make minimap smoother on slower machines." msgstr "" +"True (DoÄŸru) = 256\n" +"False (Yanlış) = 128\n" +"YavaÅŸ makinelerde mini haritayı daha düzgün yapmak için kullanılabilir." #: src/settings_translation_file.cpp msgid "Trusted mods" +msgstr "Güvenilen modlar" + +#: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." msgstr "" +"Yüzenkara daÄŸ arazinin, orta noktanın altında ve üstünde, tipik maksimum " +"yüksekliÄŸi." #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "Multiplayer sekmesinde görüntülenen sunucu listesi URL'si." + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "AÅŸağı örnekleme" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." msgstr "" +"AÅŸağı örnekleme daha düşük bir ekran çözünürlüğü kullanmaya benzer, ancak\n" +"sadece oyun dünyasına uygulanır, GUI'ye dokunulmaz.\n" +"Daha az ayrıntılı resimler pahasına belirgin bir performans artışı vermesi " +"beklenir." #: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" -msgstr "" +msgstr "Sınırsız oyuncu transfer uzaklığı" #: src/settings_translation_file.cpp msgid "Unload unused server data" -msgstr "" +msgstr "Kullanılmayan sunucu verilerini boÅŸalt" #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." -msgstr "" +msgstr "Düz yerine 3D bulut görünümünü kullanın." #: src/settings_translation_file.cpp msgid "Use a cloud animation for the main menu background." -msgstr "" +msgstr "Ana menü arka planı için bir bulut animasyonu kullan." #: src/settings_translation_file.cpp msgid "Use anisotropic filtering when viewing at textures from an angle." -msgstr "" +msgstr "Dokulara bir açıdan bakarken anisotropik filtreleme kullan." #: src/settings_translation_file.cpp msgid "Use bilinear filtering when scaling textures." -msgstr "" +msgstr "Dokuları boyutlandırırken bilineer filtreleme kullan." #: src/settings_translation_file.cpp -#, fuzzy msgid "Use key" -msgstr "tuÅŸa bas" +msgstr "Kullan tuÅŸu" #: src/settings_translation_file.cpp msgid "Use mip mapping to scale textures. May slightly increase performance." msgstr "" +"Dokuları boyutlandırırken mip eÅŸleme kullan. Performansı biraz arttırabilir." #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." -msgstr "" +msgstr "Dokuları boyutlandırırken trilineer filtreleme kullan." #: src/settings_translation_file.cpp msgid "V-Sync" -msgstr "" +msgstr "V-Sync" #: src/settings_translation_file.cpp msgid "VBO" -msgstr "" +msgstr "VBO" #: src/settings_translation_file.cpp msgid "Valley Depth" -msgstr "" +msgstr "Vadi DerinliÄŸi" #: src/settings_translation_file.cpp msgid "Valley Fill" -msgstr "" +msgstr "Vadi Dolgu" #: src/settings_translation_file.cpp msgid "Valley Profile" -msgstr "" +msgstr "Vadi Profili" #: src/settings_translation_file.cpp msgid "Valley Slope" -msgstr "" +msgstr "Vadi EÄŸimi" #: src/settings_translation_file.cpp msgid "Valleys C Flags" -msgstr "" +msgstr "Vadi C Bayrakları" #: src/settings_translation_file.cpp -msgid "Vertical screen synchronization." -msgstr "" +msgid "Variation of biome filler depth." +msgstr "Biyom doldurma derinliÄŸinin deÄŸiÅŸimi." #: src/settings_translation_file.cpp -msgid "Video driver" -msgstr "" +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "Tepe yüksekliÄŸinin ve göl derinliÄŸinin yüzenkara düz arazide deÄŸiÅŸimi." + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "Maksimum daÄŸ yüksekliÄŸinin (nod cinsinden) deÄŸiÅŸimi." #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "Variation of number of caves." +msgstr "MaÄŸraların sayısının deÄŸiÅŸimi." + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." msgstr "" +"Arazi dikey boyutunun deÄŸiÅŸimi.\n" +"Gürültü < -0.55 iken arazi neredeyse düzdür." + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "Biyom yüzey nodlarının derinliÄŸini deÄŸiÅŸtirir." #: src/settings_translation_file.cpp msgid "" -"View distance in nodes.\n" -"Min = 20" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." msgstr "" +"Arazinin engebeliliÄŸni deÄŸiÅŸtirir.\n" +"terrain_base ve terrain_alt gürültüleri için 'persistence' deÄŸerini belirler." + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "Uçurumların dikliÄŸini deÄŸiÅŸtirir." + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "Dikey ekran eÅŸzamanlılığı." + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "Video sürücüsü" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "Görünüm sallanması çarpanı" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "Nodlar cinsinden görünüm uzaklığı." #: src/settings_translation_file.cpp msgid "View range decrease key" -msgstr "" +msgstr "Görüş uzaklığı azaltma tuÅŸu" #: src/settings_translation_file.cpp msgid "View range increase key" -msgstr "" +msgstr "Görüş uzaklığı arttırma tuÅŸu" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "Görünüm yakınlaÅŸtırma tuÅŸu" #: src/settings_translation_file.cpp msgid "Viewing range" -msgstr "" +msgstr "Görüş uzaklığı" #: src/settings_translation_file.cpp -#, fuzzy msgid "Volume" -msgstr "Ses yüksekliÄŸi :" +msgstr "Ses" #: src/settings_translation_file.cpp msgid "" @@ -4176,59 +5029,54 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" +"Bir 4D fraktalın oluÅŸturulan 3D diliminin W kordinatı.\n" +"4D ÅŸeklin hangi 3D diliminin oluÅŸturulacağını belirler.\n" +"3D fraktallarda etkisizdir.\n" +"Kabaca -2 ile 2 arası." #: src/settings_translation_file.cpp -#, fuzzy msgid "Walking speed" -msgstr "Dalgalanan Yapraklar" +msgstr "Yürüme hızı" #: src/settings_translation_file.cpp -#, fuzzy msgid "Water Features" -msgstr "Nesne dokuları ..." +msgstr "Su Özellikleri" #: src/settings_translation_file.cpp msgid "Water level" -msgstr "" +msgstr "Su seviyesi" #: src/settings_translation_file.cpp msgid "Water surface level of the world." -msgstr "" +msgstr "Dünyanın su yüzey seviyesi." #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving Nodes" -msgstr "Dalgalanan Yapraklar" +msgstr "Dalgalanan Nodlar" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving leaves" -msgstr "Dalgalanan Yapraklar" +msgstr "Dalgalanan yapraklar" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving plants" -msgstr "Dalgalanan Bitkiler" +msgstr "Dalgalanan bitkiler" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving water" -msgstr "Dalgalanan Su" +msgstr "Dalgalanan su" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving water height" -msgstr "Dalgalanan Su" +msgstr "Dalgalanan su yüksekliÄŸi" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving water length" -msgstr "Dalgalanan Su" +msgstr "Dalgalanan su uzunluÄŸu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving water speed" -msgstr "Dalgalanan Su" +msgstr "Dalgalanan su hızı" #: src/settings_translation_file.cpp msgid "" @@ -4236,6 +5084,9 @@ msgid "" "filtered in software, but some images are generated directly\n" "to hardware (e.g. render-to-texture for nodes in inventory)." msgstr "" +"gui_scaling_filter true (doÄŸru) olduÄŸunda, tüm arayüz görüntülerinin\n" +"yazılım ile filtrelenmesi gerekir, ama bazı görüntüler direkt\n" +"donanımda oluÅŸturulur (ör: envanterdeki nodlar için dokuya-iÅŸleme)." #: src/settings_translation_file.cpp msgid "" @@ -4244,6 +5095,10 @@ msgid "" "to the old scaling method, for video drivers that don't\n" "properly support downloading textures back from hardware." msgstr "" +"gui_scaling_filter_txr2img true (doÄŸru) olduÄŸunda, görüntüleri\n" +"boyutlandırmak için donanımdan yazılıma kopyala. False (yanlış) ise,\n" +"dokuları donanımdan geri indirmeyi düzgün desteklemeyen video\n" +"sürücüleri için, eski boyutlandırma yöntemini kullan." #: src/settings_translation_file.cpp msgid "" @@ -4255,50 +5110,66 @@ msgid "" "have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" "enabled." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" +"Bilineer/trilineer/anisotropik filtreler, düşük çözünürlüklü dokular " +"kullanırken\n" +"bulanık olabilir, bu yüzden en yakın komÅŸu aradeÄŸerleme ile keskin " +"pikselleri\n" +"korumak için kendiliÄŸinden büyütme yapılır. Bu minimum doku boyutunu\n" +"büyütülmüş dokular için ayarlar; daha yüksek deÄŸerler daha net görünür,\n" +"ama daha fazla bellek gerektirir. 2'nin kuvvetleri tavsiye edilir. 1'den " +"daha\n" +"yükseÄŸe ayarlamanın, bilineer/trilineer/anisotropik filtreler etkin deÄŸilse," +"\n" +"görünür bit etkisi olmayabilir." #: src/settings_translation_file.cpp msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" +"Freetype yazı tiplerinin kullanılıp kullanılmayacağını, freetype desteÄŸi ile " +"derlenmiÅŸ olması gerekir." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." msgstr "" +"Harita bloÄŸu başına nod doku animasyonlarının eÅŸzamansız yapılıp " +"yapılmayacağı." #: src/settings_translation_file.cpp msgid "" "Whether players are shown to clients without any range limit.\n" "Deprecated, use the setting player_transfer_distance instead." msgstr "" +"Bir uzaklık sınırı olmadan oyuncuların istemcilere gösterilip " +"gösterilmeyeceÄŸi.\n" +"Kaldırıldı, bunun yerine player_transfer_distance ayarını kullanın." #: src/settings_translation_file.cpp msgid "Whether to allow players to damage and kill each other." msgstr "" +"Oyuncuların birbirini öldürmesine veya zarar vermesine izin verilip " +"verilmeyeceÄŸi." #: src/settings_translation_file.cpp msgid "" "Whether to ask clients to reconnect after a (Lua) crash.\n" "Set this to true if your server is set up to restart automatically." msgstr "" +"İstemcilere bir (lua) çökmesinden sonra yeniden baÄŸlanmanın sorulup " +"sorulmayacağı.\n" +"EÄŸer sunucu kendiliÄŸinden yeniden baÅŸlamak için ayarlı ise bunu true (doÄŸru) " +"olarak ayarlayın." #: src/settings_translation_file.cpp msgid "Whether to fog out the end of the visible area." -msgstr "" +msgstr "Görünebilir alanın sonuda sis oluÅŸturulup oluÅŸturulmayacağı." #: src/settings_translation_file.cpp msgid "" "Whether to show the client debug info (has the same effect as hitting F5)." msgstr "" +"İstemciye hata ayıklama bilgisinin gösterilip gösterilmeyeceÄŸi (F5'e basmak " +"ile aynı etkiye sahiptir)." #: src/settings_translation_file.cpp msgid "" @@ -4307,40 +5178,325 @@ msgid "" "Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n" "Disabling this option will protect your password better." msgstr "" +"Protokol sürümü 25'ten önceki sunucuların desteklenip desteklenmeyeceÄŸi.\n" +"0.4.12 ve önceki sunuculara baÄŸlanmak için etkinleÅŸtirin.\n" +"0.4.13 ile baÅŸlayan sunucular çalışır, 0.4.12-dev sunucuları çalışabilir.\n" +"Bu seçeneÄŸi devre dışı bırakmak ÅŸifrenizi daha iyi korur." #: src/settings_translation_file.cpp msgid "Width component of the initial window size." -msgstr "" +msgstr "İlk pencere boyutunun geniÅŸlik bileÅŸeni." #: src/settings_translation_file.cpp msgid "Width of the selectionbox's lines around nodes." +msgstr "Nodlar etrafındaki seçim kutusunun hatlarının geniÅŸliÄŸi." + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." msgstr "" +"Sadece Windows sistemleri: Minetest'i komut satırı arka planda olarak baÅŸlat." +"\n" +"debug.txt (varsayılan ad) dosyası ile aynı bilgileri içerir." #: src/settings_translation_file.cpp msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" +"Dünya dizini (dünyadaki her ÅŸey burada saklanır).\n" +"Ana menüden baÅŸlatıldığında gerekli deÄŸildir." #: src/settings_translation_file.cpp msgid "Y of flat ground." -msgstr "" +msgstr "Düz zemin Y'si." #: src/settings_translation_file.cpp msgid "Y of upper limit of large pseudorandom caves." -msgstr "" +msgstr "Büyük ön-rastlantısal maÄŸaraların üst sınırının Y'si." + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "Oyukların üstünden tam boyuta uzanacağı Y-uzaklığı." + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "Ortalama arazi yüzeyinin Y-seviyesi." + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "Oyuk üst sınırının Y-seviyesi." + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "Yüzenkara orta noktasının ve göl yüzeyinin Y-seviyesi." + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "Daha yüksek (uçurum-tepesi) arazinin Y-seviyesi." + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "Daha alt arazinin ve göl yataklarının Y-seviyesi." + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "Deniz yatağının Y-seviyesi." + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "Yüzenkara gölgelerinin uzanacağı Y-seviyesi." + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "blok gönderme iyileÅŸtirme uzaklığı" #: src/settings_translation_file.cpp msgid "cURL file download timeout" -msgstr "" +msgstr "cURL dosya indirme zaman aşımı" #: src/settings_translation_file.cpp msgid "cURL parallel limit" -msgstr "" +msgstr "cURL paralel sınırı" #: src/settings_translation_file.cpp msgid "cURL timeout" -msgstr "" +msgstr "cURL zaman aşımı" + +#~ msgid "Hide mp content" +#~ msgstr "MP içeriÄŸini gizle" + +#~ msgid "Attn" +#~ msgstr "Dikkat" + +#~ msgid "Capital" +#~ msgstr "Büyük" + +#~ msgid "Comma" +#~ msgstr "Virgül" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "BitiÅŸ" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "Kana" + +#~ msgid "Kanji" +#~ msgstr "Kanji" + +#~ msgid "Minus" +#~ msgstr "Eksi" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Nokta" + +#~ msgid "Plus" +#~ msgstr "Artı" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "Mapgen v6'da çöllerin ve plajların boyutunu denetler.\n" +#~ "Kar biyomları etkin ise 'mgv6_freq_desert' yok sayılır." + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "Arazi ÅŸeklini belirler.\n" +#~ "Parantez içinde 3 rakam arazi boyutunu kontrol eder,\n" +#~ "3 rakam aynı olmalıdır." + +#~ msgid "Mapgen biome heat noise parameters" +#~ msgstr "Mapgen biyom ısı gürültü parametreleri" + +#~ msgid "Mapgen biome humidity blend noise parameters" +#~ msgstr "Mapgen biyom nem karıştırma gürültü parametreleri" + +#~ msgid "Mapgen biome humidity noise parameters" +#~ msgstr "Mapgen biyom nem gürültü parametreleri" + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Mapgen düz maÄŸara geniÅŸliÄŸi" + +#~ msgid "Mapgen flat cave1 noise parameters" +#~ msgstr "Mapgen düz maÄŸara1 gürültü parametreleri" + +#~ msgid "Mapgen flat cave2 noise parameters" +#~ msgstr "Mapgen düz maÄŸara2 gürültü parametreleri" + +#~ msgid "Mapgen flat filler depth noise parameters" +#~ msgstr "Mapgen düz doldurma derinlik gürültü parametreleri" + +#~ msgid "Mapgen flat large cave depth" +#~ msgstr "Mapgen düz büyük maÄŸara derinliÄŸi" + +#~ msgid "Mapgen flat terrain noise parameters" +#~ msgstr "Mapgen düz arazi gürültü parametreleri" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Mapgen fraktal maÄŸara geniÅŸliÄŸi" + +#~ msgid "Mapgen fractal cave1 noise parameters" +#~ msgstr "Mapgen fraktal maÄŸara1 gürültü parametreleri" + +#~ msgid "Mapgen fractal cave2 noise parameters" +#~ msgstr "Mapgen fraktal maÄŸara2 gürültü parametreleri" + +#~ msgid "Mapgen fractal filler depth noise parameters" +#~ msgstr "Mapgen fraktal doldurma derinlik gürültü parametreleri" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Mapgen fraktal fraktal" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Mapgen fraktal yinelemesi" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "Mapgen fraktal julia w" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "Mapgen fraktal julia x" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "Mapgen fraktal julia y" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "Mapgen fraktal julia z" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "Mapgen fraktal kaydırma" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Mapgen fraktal boyutu" + +#~ msgid "Mapgen fractal seabed noise parameters" +#~ msgstr "Mapgen fraktal deniz dibi gürültü parametreleri" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Mapgen fraktal dilim w" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Mapgen v5 maÄŸara geniÅŸliÄŸi" + +#~ msgid "Mapgen v5 cave1 noise parameters" +#~ msgstr "Mapgen v5 maÄŸara1 gürültü parametreleri" + +#~ msgid "Mapgen v5 cave2 noise parameters" +#~ msgstr "Mapgen v5 maÄŸara2 gürültü parametreleri" + +#~ msgid "Mapgen v5 factor noise parameters" +#~ msgstr "Mapgen v5 faktör gürültü parametreleri" + +#~ msgid "Mapgen v5 filler depth noise parameters" +#~ msgstr "Mapgen v5 doldurma derinlik gürültü parametreleri" + +#~ msgid "Mapgen v5 height noise parameters" +#~ msgstr "Mapgen v5 yükseklik gürültü parametreleri" + +#~ msgid "Mapgen v6 apple trees noise parameters" +#~ msgstr "Mapgen v6 elma aÄŸaçları gürültü parametreleri" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "Mapgen v6 sahil frekansı" + +#~ msgid "Mapgen v6 beach noise parameters" +#~ msgstr "Mapgen v6 sahil gürültü parametreleri" + +#~ msgid "Mapgen v6 biome noise parameters" +#~ msgstr "Mapgen v6 biyom gürültü parametreleri" + +#~ msgid "Mapgen v6 cave noise parameters" +#~ msgstr "Mapgen v6 maÄŸara gürültü parametreleri" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "Mapgen v6 çöl frekansı" + +#~ msgid "Mapgen v6 mud noise parameters" +#~ msgstr "Mapgen v6 çamur gürültü parametreleri" + +#~ msgid "Mapgen v6 steepness noise parameters" +#~ msgstr "Mapgen v6 diklik gürültü parametreleri" + +#~ msgid "Mapgen v6 terrain altitude noise parameters" +#~ msgstr "Mapgen v6 arazi yükseklik gürültü parametreleri" + +#~ msgid "Mapgen v6 terrain base noise parameters" +#~ msgstr "Mapgen v6 arazi taban gürültü parametreleri" + +#~ msgid "Mapgen v6 trees noise parameters" +#~ msgstr "Mapgen v6 aÄŸaç gürültü parametreleri" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Mapgen v7 maÄŸara geniÅŸliÄŸi" + +#~ msgid "Mapgen v7 cave1 noise parameters" +#~ msgstr "Mapgen v7 maÄŸara1 gürültü parametreleri" + +#~ msgid "Mapgen v7 cave2 noise parameters" +#~ msgstr "Mapgen v7 maÄŸara2 gürültü parametreleri" + +#~ msgid "Mapgen v7 filler depth noise parameters" +#~ msgstr "Mapgen v7 doldurma derinlik gürültü parametreleri" + +#~ msgid "Mapgen v7 height select noise parameters" +#~ msgstr "Mapgen v7 yükseklik seçme gürültü parametreleri" + +#~ msgid "Mapgen v7 mountain noise parameters" +#~ msgstr "Mapgen v7 daÄŸ gürültü parametreleri" + +#~ msgid "Mapgen v7 ridge noise parameters" +#~ msgstr "Mapgen v7 sırt gürültü parametreleri" + +#~ msgid "Mapgen v7 ridge water noise parameters" +#~ msgstr "Mapgen v7 sırt su gürültü parametreleri" + +#~ msgid "Mapgen v7 terrain altitude noise parameters" +#~ msgstr "Mapgen v7 arazi yükseklik gürültü parametreleri" + +#~ msgid "Mapgen v7 terrain base noise parameters" +#~ msgstr "Mapgen v7 arazi taban gürültü parametreleri" + +#~ msgid "Mapgen v7 terrain persistation noise parameters" +#~ msgstr "Mapgen v7 arazi sürdürme gürültü parametreleri" + +#~ msgid "" +#~ "Noise parameters for biome API temperature, humidity and biome blend." +#~ msgstr "" +#~ "Biyom API'si sıcaklık, nem ve biyom karıştırma için gürültü parametreleri." + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "Harita olÅŸturucunun nerede duracağı.\n" +#~ "Lütfen dikkat:\n" +#~ "- 31000 sınırdır (yukarıdaki ayar etkisizdir)\n" +#~ "- harita oluÅŸturucu grupları 80 x 80 x 80 nod (5 x 5 x 5 harita-bloÄŸu) " +#~ "ile çalışır.\n" +#~ "- Bu grupların merkezden -32, -32 nod kayması vardır.\n" +#~ "- Sadece map_generation_limit içinde grupları oluÅŸturulur" #, fuzzy #~ msgid "Useful for mod developers." @@ -4370,15 +5526,9 @@ msgstr "" #~ msgid "If enabled, " #~ msgstr "EtkinleÅŸtirildi" -#~ msgid "Rendering:" -#~ msgstr "Kaplama:" - #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "DeÄŸiÅŸikliklerin etkin olabilmesi için minetesti yeniden baÅŸlatın" -#~ msgid "Numpad " -#~ msgstr "Numpad " - #~ msgid " MB/s" #~ msgstr " MB/s" diff --git a/po/uk/minetest.po b/po/uk/minetest.po index 0035c792f..6965a5b11 100644 --- a/po/uk/minetest.po +++ b/po/uk/minetest.po @@ -7,18 +7,26 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-12-13 22:32+0000\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-05-21 20:31+0000\n" "Last-Translator: Fixer <artem.brz@gmail.com>\n" -"Language-Team: Ukrainian <https://hosted.weblate.org/projects/minetest/" -"minetest/uk/>\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 2.10-dev\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 2.14.1-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "ПереродитиÑÑ" + +#: builtin/client/init.lua +msgid "You died." +msgstr "Ви загинули." #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" @@ -78,12 +86,12 @@ msgstr "Ми підтримуємо протокол між верÑÑ–Ñми $1 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "СкаÑувати" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +msgid "Dependencies:" msgstr "Залежить від:" #: builtin/mainmenu/dlg_config_world.lua @@ -91,6 +99,10 @@ msgid "Disable MP" msgstr "Вимкнути модпак" #: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Вимкнути вÑе" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "Увімкнути модпак" @@ -107,17 +119,13 @@ msgstr "" "Ñимволи. ДозволÑєтьÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ‚Ð°ÐºÐ¸Ñ… Ñимволів: [a-z0-9_]." #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "Приховати гру" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "Сховати вміÑÑ‚ модпаку" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Мод:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "Ðеобов'Ñзкові залежноÑті:" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -180,8 +188,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "Ви впевнені, що бажаєте видалити \"$1\"?" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "Видалити" @@ -197,7 +204,7 @@ msgstr "Modmgr: недійÑний шлÑÑ… модифікації \"$1\"" msgid "Delete World \"$1\"?" msgstr "Видалити Ñвіт \"$1\"?" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "ПрийнÑти" @@ -219,7 +226,7 @@ msgstr "< Ðазад до Ðалаштувань" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Browse" -msgstr "ПроглÑнути" +msgstr "ПереглÑнути" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Disabled" @@ -238,7 +245,6 @@ msgid "Format is 3 numbers separated by commas and inside brackets." msgstr "Формат: 3 номера, відокремлених комами Ñ– вÑередині дужок." #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "" "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, " "<octaves>, <persistence>" @@ -256,7 +262,7 @@ msgstr "Модифікації" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Optionally the lacunarity can be appended with a leading comma." -msgstr "" +msgstr "За бажаннÑм лакунарніÑть може бути доповнена комою попереду." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a comma seperated list of flags." @@ -268,7 +274,7 @@ msgstr "Будь-лаÑка введіть дійÑне ціле чиÑло." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid number." -msgstr "Будь-лаÑка введіть дійÑний номер." +msgstr "Будь-лаÑка введіть дійÑне чиÑло." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Possible values are: " @@ -278,6 +284,11 @@ msgstr "Можливі значеннÑ: " msgid "Restore Default" msgstr "Відновити Ñк було" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Пошук" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "Вибрати шлÑÑ…" @@ -287,12 +298,12 @@ msgid "Show technical names" msgstr "Показувати технічні назви" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." -msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ” бути більше за $1." +msgid "The value must be at least $1." +msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ” бути Ñк мінімум $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." -msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ” бути менше ніж $1." +msgid "The value must not be larger than $1." +msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ” бути не більше $1." #: builtin/mainmenu/modmgr.lua msgid "" @@ -322,6 +333,10 @@ msgstr "" "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ—: неможливо знайти відповідну назву папки Ð´Ð»Ñ Ð·Ð±Ñ–Ñ€ÐºÐ¸ " "модифікацій $1" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "Вбудовані моди" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "Вийти з крамнички" @@ -343,10 +358,6 @@ msgid "Rating" msgstr "Оцінка" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "Пошук" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "Коротка назва:" @@ -368,7 +379,7 @@ msgstr "Ðктивні учаÑники" #: builtin/mainmenu/tab_credits.lua msgid "Core Developers" -msgstr "ОÑновні розробники Ñдра гри" +msgstr "Розробники Ñдра" #: builtin/mainmenu/tab_credits.lua msgid "Credits" @@ -376,12 +387,72 @@ msgstr "ПодÑка" #: builtin/mainmenu/tab_credits.lua msgid "Previous Contributors" -msgstr "Колишні учаÑники" +msgstr "Попередні учаÑники" #: builtin/mainmenu/tab_credits.lua msgid "Previous Core Developers" msgstr "Попередні оÑновні розробники Ñдра" +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "Публічний" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Закріпити адреÑу" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "Ðалаштувати" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "ТворчіÑть" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "ПораненнÑ" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "Грати (Ñервер)" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "Сервер" + +#: builtin/mainmenu/tab_local.lua +msgid "Local Game" +msgstr "Локальна гра" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "Ім'Ñ/Пароль" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Ðовий" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Світ не Ñтворено або не обрано!" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Грати" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "Порт" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Виберіть Ñвіт:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Порт Ñервера" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "Ð’Ñтановлені модифікації:" @@ -391,6 +462,10 @@ msgid "Mod information:" msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ—:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "Без залежноÑтей." + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "ÐžÐ¿Ð¸Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— відÑутній" @@ -410,96 +485,45 @@ msgstr "Видалити обрану модифікацію" msgid "Uninstall selected modpack" msgstr "Видалити обрану збірку модифікацій" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "ÐдреÑа / Порт" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "Клієнт" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "Під'єднатиÑÑ" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "ТворчіÑть" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "ПораненнÑ" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "Видалити мітку" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "Улюблені" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "Ім'Ñ / Пароль" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Бої увімкнено" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "Закріпити адреÑу" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "Ðалаштувати" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "ТворчіÑть" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "ПораненнÑ" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "Ім'Ñ/Пароль" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "Ðовий" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "Світ не Ñтворено або не обрано!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "Порт" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "Публічний" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "Виберіть Ñвіт:" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "Пінг" -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "Сервер" - -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "Порт Ñервера" +#: builtin/mainmenu/tab_online.lua +msgid "Play Online" +msgstr "Мережа" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "Почати гру" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "Бої увімкнено" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -526,9 +550,12 @@ msgid "Antialiasing:" msgstr "ЗгладжуваннÑ:" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Are you sure to reset your singleplayer world?" -msgstr "Ви впевнені, що бажаєте Ñкинути Ñвій Ñвіт однокориÑтувацької гри?" +msgstr "Ви впевнені, що бажаєте Ñкинути Ñвій Ñвіт одиночної гри?" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "Зберігати розмір вікна" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" @@ -604,7 +631,11 @@ msgstr "ЧаÑточки" #: builtin/mainmenu/tab_settings.lua msgid "Reset singleplayer world" -msgstr "Скинути Ñвіт однокориÑтувацької гри" +msgstr "Скинути Ñвіт одиночної гри" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Екран:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" @@ -628,8 +659,7 @@ msgstr "ТекÑтуруваннÑ:" #: builtin/mainmenu/tab_settings.lua msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" -"Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб увімкнути шейдери, потрібно викориÑтовувати драйвер OpenGL." +msgstr "Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб увімкнути шейдери, потрібно мати драйвер OpenGL." #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" @@ -637,7 +667,7 @@ msgstr "Тоновий шейдер" #: builtin/mainmenu/tab_settings.lua msgid "Touchthreshold (px)" -msgstr "" +msgstr "ЧутливіÑть дотику (пкÑ)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" @@ -671,14 +701,6 @@ msgstr "Головне Меню" msgid "Start Singleplayer" msgstr "Почати одиночну гру" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "Грати" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "Одиночна гра" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´ÑутнÑ" @@ -724,9 +746,8 @@ msgid "Could not find or load game \"" msgstr "Ðеможливо знайти або завантажити гру \"" #: src/client/clientlauncher.cpp -#, fuzzy msgid "Invalid gamespec." -msgstr "Помилкова ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð³Ñ€Ð¸." +msgstr "Помилкова ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ gamespec." #: src/client/clientlauncher.cpp msgid "Main Menu" @@ -741,12 +762,16 @@ msgid "Player name too long." msgstr "Ім'Ñ Ð³Ñ€Ð°Ð²Ñ†Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ довге." #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Будь-лаÑка введіть ім'Ñ!" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Вказаний шлÑÑ… до Ñвіту не Ñ–Ñнує: " #: src/fontengine.cpp msgid "needs_fallback_font" -msgstr "" +msgstr "needs_fallback_font" #: src/game.cpp msgid "" @@ -757,12 +782,44 @@ msgstr "" "Деталі у файлі debug.txt." #: src/game.cpp +msgid "- Address: " +msgstr "- ÐдреÑа: " + +#: src/game.cpp +msgid "- Creative Mode: " +msgstr "- ТворчіÑть: " + +#: src/game.cpp +msgid "- Damage: " +msgstr "- ПораненнÑ: " + +#: src/game.cpp +msgid "- Mode: " +msgstr "- Тип: " + +#: src/game.cpp +msgid "- Port: " +msgstr "- Порт: " + +#: src/game.cpp +msgid "- Public: " +msgstr "- Публічний: " + +#: src/game.cpp +msgid "- PvP: " +msgstr "- PvP (бої): " + +#: src/game.cpp +msgid "- Server Name: " +msgstr "- Ðазва Ñервера: " + +#: src/game.cpp msgid "Change Keys" msgstr "Змінити клавіші" #: src/game.cpp msgid "Change Password" -msgstr "Змінити Пароль" +msgstr "Змінити пароль" #: src/game.cpp msgid "Connecting to server..." @@ -773,38 +830,45 @@ msgid "Continue" msgstr "Продовжити" #: src/game.cpp -msgid "Creating client..." -msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñервера..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "Стандартне ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»Ð°Ð²Ñ–ÑˆÐ°Ð¼Ð¸:\n" -"- WASD: рух\n" -"- Space: Ñтрибок/лізти вгору\n" -"- Shift: краÑтиÑÑ/лізти вниз\n" -"- Q: кинути предмет\n" -"- I: інвентар\n" +"- %s: вперед\n" +"- %s: назад\n" +"- %s: ліворуч\n" +"- %s: праворуч\n" +"- %s: Ñтрибок/лізти вгору\n" +"- %s: краÑтиÑÑ/лізти вниз\n" +"- %s: кинути предмет\n" +"- %s: інвентар\n" "- Мишка: поворот/дивитиÑÑ\n" -"- Ліва клавіша миші: копати/удар\n" -"- Права клавіша миші: поÑтавити/викориÑтовувати\n" +"- Ліва кнопка миші: копати/удар\n" +"- Права кнопка миші: поÑтавити/зробити\n" "- КолеÑо миші: вибір предмета\n" -"- T: чат\n" +"- %s: чат\n" + +#: src/game.cpp +msgid "Creating client..." +msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñервера..." #: src/game.cpp msgid "" @@ -843,6 +907,18 @@ msgid "Exit to OS" msgstr "Вихід з гри" #: src/game.cpp +msgid "Game info:" +msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ гру:" + +#: src/game.cpp +msgid "Game paused" +msgstr "Гра на паузі" + +#: src/game.cpp +msgid "Hosting server" +msgstr "Сервер (хоÑÑ‚)" + +#: src/game.cpp msgid "Item definitions..." msgstr "Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ñ–Ð²..." @@ -863,24 +939,45 @@ msgid "Node definitions..." msgstr "Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑ–Ð²..." #: src/game.cpp -msgid "Resolving address..." -msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð°Ð´Ñ€ÐµÑи..." +msgid "Off" +msgstr "Вимкнено" #: src/game.cpp -msgid "Respawn" -msgstr "ПереродитиÑÑ" +msgid "On" +msgstr "Увімкнено" + +#: src/game.cpp +msgid "Remote server" +msgstr "Віддалений Ñервер" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð°Ð´Ñ€ÐµÑи..." #: src/game.cpp msgid "Shutting down..." msgstr "ВимкненнÑ..." #: src/game.cpp +msgid "Singleplayer" +msgstr "Одиночна гра" + +#: src/game.cpp msgid "Sound Volume" msgstr "ГучніÑть звуку" #: src/game.cpp -msgid "You died." -msgstr "Ви загинули." +#, c-format +msgid "Volume changed to %d%%" +msgstr "ГучніÑть звуку змінено на %d%%" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "ГучніÑть 0%" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "ГучніÑть 100%" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -896,7 +993,7 @@ msgstr "Далі" #: src/guiKeyChangeMenu.cpp msgid "\"Use\" = climb down" -msgstr "\"ВикориÑтовувати\" = підніматиÑÑ Ð²Ð³Ð¾Ñ€Ñƒ" +msgstr "\"ВикориÑтати\" = ÑпуÑкатиÑÑ" #: src/guiKeyChangeMenu.cpp msgid "Backward" @@ -915,8 +1012,12 @@ msgid "Console" msgstr "КонÑоль" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Зменшити звук" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" -msgstr "Двічі доторкнітьÑÑ Ð´Ð¾ \"Ñтрибок\" щоб полетіти" +msgstr "Подвійне Ñ‚Ð¾Ñ€ÐºÐ°Ð½Ð½Ñ \"Ñтрибок\" вмикає політ" #: src/guiKeyChangeMenu.cpp msgid "Drop" @@ -924,7 +1025,11 @@ msgstr "Викинути" #: src/guiKeyChangeMenu.cpp msgid "Forward" -msgstr "Уперед" +msgstr "Вперед" + +#: src/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "Збільшити звук" #: src/guiKeyChangeMenu.cpp msgid "Inventory" @@ -948,6 +1053,22 @@ msgstr "" msgid "Left" msgstr "Ліворуч" +#: src/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "Команда (локальна)" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Вимкнути звук" + +#: src/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "ÐаÑтупний Ñлот" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "Попередній Ñлот" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "Ðадрукувати Ñтак" @@ -966,26 +1087,25 @@ msgstr "КраÑтиÑÑ" #: src/guiKeyChangeMenu.cpp msgid "Toggle Cinematic" -msgstr "Переключити кінематографічний режим" +msgstr "Кінематографічний режим" #: src/guiKeyChangeMenu.cpp msgid "Toggle fast" -msgstr "Переключити швидкий режим" +msgstr "ПриÑкореннÑ" #: src/guiKeyChangeMenu.cpp msgid "Toggle fly" -msgstr "Переключити режим польоту" +msgstr "Політ" #: src/guiKeyChangeMenu.cpp msgid "Toggle noclip" -msgstr "Переключити режим Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÑ€Ñ–Ð·ÑŒ Ñтіни" +msgstr "Прохід крізь Ñтіни" #: src/guiKeyChangeMenu.cpp msgid "Use" -msgstr "ВикориÑтовувати" +msgstr "ВикориÑтати" #: src/guiKeyChangeMenu.cpp src/keycode.cpp -#, fuzzy msgid "Zoom" msgstr "Збільшити" @@ -999,15 +1119,15 @@ msgstr "Змінити" #: src/guiPasswordChange.cpp msgid "Confirm Password" -msgstr "ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ паролÑ" +msgstr "Підтвердити новий пароль" #: src/guiPasswordChange.cpp msgid "New Password" -msgstr "Ðовий Пароль" +msgstr "Ðовий пароль" #: src/guiPasswordChange.cpp msgid "Old Password" -msgstr "Старий Пароль" +msgstr "Старий пароль" #: src/guiPasswordChange.cpp msgid "Passwords do not match!" @@ -1026,15 +1146,11 @@ msgid "Apps" msgstr "Додатки" #: src/keycode.cpp -msgid "Attn" -msgstr "Увага" - -#: src/keycode.cpp msgid "Back" msgstr "Ðазад" #: src/keycode.cpp -msgid "Capital" +msgid "Caps Lock" msgstr "Caps Lock" #: src/keycode.cpp @@ -1042,72 +1158,56 @@ msgid "Clear" msgstr "ОчиÑтити" #: src/keycode.cpp -msgid "Comma" -msgstr "Кома" - -#: src/keycode.cpp msgid "Control" msgstr "Ctrl" #: src/keycode.cpp -msgid "Convert" -msgstr "Конвертувати" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "" - -#: src/keycode.cpp msgid "Down" msgstr "Вниз" #: src/keycode.cpp msgid "End" -msgstr "" +msgstr "End" #: src/keycode.cpp -msgid "Erase OEF" -msgstr "" - -#: src/keycode.cpp -msgid "Escape" -msgstr "Esc" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "" +msgid "Erase EOF" +msgstr "Стерти EOF" #: src/keycode.cpp msgid "Execute" msgstr "Виконати" #: src/keycode.cpp -msgid "Final" -msgstr "Кінець" - -#: src/keycode.cpp msgid "Help" msgstr "Допомога" #: src/keycode.cpp msgid "Home" -msgstr "" +msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "Insert" +msgid "IME Accept" +msgstr "IME ПрийнÑти" #: src/keycode.cpp -msgid "Junja" -msgstr "" +msgid "IME Convert" +msgstr "IME Конвертувати" #: src/keycode.cpp -msgid "Kana" -msgstr "" +msgid "IME Escape" +msgstr "IME Esc" #: src/keycode.cpp -msgid "Kanji" -msgstr "" +msgid "IME Mode Change" +msgstr "IME Змінити режим" + +#: src/keycode.cpp +msgid "IME Nonconvert" +msgstr "IME Ðе обернено" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Insert" #: src/keycode.cpp msgid "Left Button" @@ -1115,19 +1215,19 @@ msgstr "Ліва кнопка" #: src/keycode.cpp msgid "Left Control" -msgstr "Ліва клавіша Ctrl" +msgstr "Лівий Ctrl" #: src/keycode.cpp msgid "Left Menu" -msgstr "Ліва клавіша Menu" +msgstr "Лівий Menu" #: src/keycode.cpp msgid "Left Shift" -msgstr "Ліва клавіша Shift" +msgstr "Лівий Shift" #: src/keycode.cpp msgid "Left Windows" -msgstr "Ліва клавіша Win" +msgstr "Лівий Win" #: src/keycode.cpp msgid "Menu" @@ -1138,20 +1238,8 @@ msgid "Middle Button" msgstr "Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°" #: src/keycode.cpp -msgid "Minus" -msgstr "МінуÑ" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "Змінити режим" - -#: src/keycode.cpp msgid "Next" -msgstr "" - -#: src/keycode.cpp -msgid "Nonconvert" -msgstr "Ðе обернено" +msgstr "Next" #: src/keycode.cpp msgid "Num Lock" @@ -1170,6 +1258,10 @@ msgid "Numpad -" msgstr "Num -" #: src/keycode.cpp +msgid "Numpad ." +msgstr "Num ." + +#: src/keycode.cpp msgid "Numpad /" msgstr "Num /" @@ -1215,57 +1307,47 @@ msgstr "Num 9" #: src/keycode.cpp msgid "OEM Clear" -msgstr "" - -#: src/keycode.cpp -msgid "PA1" -msgstr "PA1" +msgstr "OEM Clear" #: src/keycode.cpp msgid "Pause" msgstr "Пауза" #: src/keycode.cpp -msgid "Period" -msgstr "Крапка" - -#: src/keycode.cpp -msgid "Plus" -msgstr "ПлюÑ" +msgid "Play" +msgstr "Грати" #: src/keycode.cpp msgid "Print" msgstr "Print Screen" #: src/keycode.cpp -#, fuzzy msgid "Prior" -msgstr "Page Down" +msgstr "Page Up" #: src/keycode.cpp msgid "Return" msgstr "Ввід" #: src/keycode.cpp -#, fuzzy msgid "Right Button" msgstr "Права кнопка" #: src/keycode.cpp msgid "Right Control" -msgstr "Права клавіша Ctrl" +msgstr "Правий Ctrl" #: src/keycode.cpp msgid "Right Menu" -msgstr "Права клавіша Menu" +msgstr "Правий Menu" #: src/keycode.cpp msgid "Right Shift" -msgstr "Права клавіша Shift" +msgstr "Правий Shift" #: src/keycode.cpp msgid "Right Windows" -msgstr "Права клавіша Win" +msgstr "Правий Win" #: src/keycode.cpp msgid "Scroll Lock" @@ -1317,13 +1399,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "0 = parallax occlusion with slope information (faster).\n" "1 = relief mapping (slower, more accurate)." msgstr "" -"0 = Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ñ–Ñ \"parallax occlusion\" з інформацією про криві (швидше)\n" -"1 = Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ñ–Ñ \"relief mapping\" (повільніше, більш акуратніше)" +"0 = Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ñ–Ñ \"parallax occlusion\" з інформацією про криві (швидше).\n" +"1 = Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ñ–Ñ \"relief mapping\" (повільніше, більш акуратніше)." #: src/settings_translation_file.cpp msgid "3D clouds" @@ -1334,6 +1415,20 @@ msgid "3D mode" msgstr "3D режим" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1395,6 +1490,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." @@ -1402,7 +1501,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" @@ -1427,12 +1527,18 @@ msgid "Amplifies the valleys" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "Ðнізотропна фільтраціÑ" #: src/settings_translation_file.cpp msgid "Announce server" -msgstr "" +msgstr "Публічний Ñервер" #: src/settings_translation_file.cpp msgid "" @@ -1442,6 +1548,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "" @@ -1450,6 +1560,19 @@ msgid "Ask to reconnect after crash" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "" @@ -1458,7 +1581,6 @@ msgid "Autorun key" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Backward key" msgstr "Ðазад" @@ -1475,6 +1597,14 @@ msgid "Basic Privileges" msgstr "" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "Білінійна фільтраціÑ" @@ -1483,6 +1613,14 @@ msgid "Bind address" msgstr "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "" @@ -1507,9 +1645,12 @@ msgid "Camera smoothing in cinematic mode" msgstr "Ð—Ð³Ð»Ð°Ð´Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÑƒÑ…Ñƒ камери у кінорежимі" #: src/settings_translation_file.cpp -#, fuzzy msgid "Camera update toggle key" -msgstr "Клавіша Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŽ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ°Ð¼ÐµÑ€Ð¸" +msgstr "Контроль Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ°Ð¼ÐµÑ€Ð¸" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" #: src/settings_translation_file.cpp msgid "Cave noise #1" @@ -1524,6 +1665,30 @@ msgid "Cave width" msgstr "" #: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "" @@ -1536,7 +1701,6 @@ msgid "Chat toggle key" msgstr "Чат" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chatcommands" msgstr "Команди чату" @@ -1580,10 +1744,18 @@ msgid "Clean transparent textures" msgstr "" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "Клієнт" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "Клієнт Ñ– Ñервер" #: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "Клієнт-моди" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "" @@ -1648,6 +1820,10 @@ msgid "Console color" msgstr "Колір конÑолі" #: src/settings_translation_file.cpp +msgid "Console height" +msgstr "ВиÑота конÑолі" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "КонÑоль" @@ -1671,17 +1847,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." msgstr "" #: src/settings_translation_file.cpp @@ -1705,6 +1881,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Creative" +msgstr "ТворчіÑть" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" @@ -1741,6 +1921,10 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "" @@ -1777,6 +1961,41 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1787,6 +2006,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "" @@ -1817,17 +2046,24 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" +msgid "Desert noise threshold" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" msgstr "" #: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "ЧаÑточки при копанні" + +#: src/settings_translation_file.cpp msgid "Disable anticheat" msgstr "Вимкнути античіт" @@ -1872,10 +2108,24 @@ msgid "Enable Joysticks" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "Увімкнути VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "" @@ -1911,6 +2161,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enable view bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -1954,6 +2214,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -1976,7 +2240,11 @@ msgid "FSAA" msgstr "" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp @@ -2046,6 +2314,10 @@ msgid "Filler Depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -2062,10 +2334,34 @@ msgid "Filtering" msgstr "ФільтраціÑ" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "" @@ -2078,6 +2374,10 @@ msgid "Fog" msgstr "Туман" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "" @@ -2114,6 +2414,14 @@ msgid "Forward key" msgstr "Вперед" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "" @@ -2150,7 +2458,6 @@ msgid "GUI scaling" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "GUI scaling filter" msgstr "МаÑштаб інтерфейÑу" @@ -2193,10 +2500,18 @@ msgid "Gravity" msgstr "ГравітаціÑ" #: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "HTTP Модифікації" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -2218,22 +2533,54 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "ВиÑотний шум" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "" #: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "" @@ -2255,6 +2602,18 @@ msgid "How wide to make rivers" msgstr "" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "" @@ -2280,6 +2639,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2312,6 +2680,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2339,6 +2711,14 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "Збільшити гучніÑть" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2381,6 +2761,10 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +msgid "Inventory image hack" +msgstr "Хак Ð´Ð»Ñ Ñ–Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ð½Ð¸Ñ… риÑунків" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "" @@ -2401,12 +2785,24 @@ msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" @@ -2444,6 +2840,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "Стрибок" @@ -2460,6 +2872,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2474,6 +2893,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2516,6 +2942,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2530,6 +2963,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2551,6 +2991,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2651,6 +3105,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2664,10 +3125,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "" #: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "Мова" @@ -2676,6 +3152,10 @@ msgid "Large cave depth" msgstr "" #: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "КонÑоль (повна)" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "" @@ -2731,6 +3211,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2803,6 +3290,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "" @@ -2830,9 +3321,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2841,7 +3341,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2860,23 +3361,19 @@ msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" +msgid "Mapblock mesh generation delay" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen Valleys" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" +msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" +msgid "Mapgen Valleys" msgstr "" #: src/settings_translation_file.cpp @@ -2892,51 +3389,7 @@ msgid "Mapgen flat" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" +msgid "Mapgen flat specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -2944,66 +3397,6 @@ msgid "Mapgen fractal" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "" @@ -3012,27 +3405,7 @@ msgid "Mapgen v5" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" +msgid "Mapgen v5 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3040,59 +3413,7 @@ msgid "Mapgen v6" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" +msgid "Mapgen v6 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3100,55 +3421,7 @@ msgid "Mapgen v7" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" +msgid "Mapgen v7 specific flags" msgstr "" #: src/settings_translation_file.cpp @@ -3315,6 +3588,10 @@ msgid "Mipmapping" msgstr "Mіп-текÑтуруваннÑ" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "" @@ -3335,6 +3612,14 @@ msgid "Monospace font size" msgstr "" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "" @@ -3343,18 +3628,20 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "Вимкнути звук" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3403,10 +3690,6 @@ msgid "NodeTimer interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "" @@ -3443,6 +3726,14 @@ msgid "Number of parallax occlusion iterations." msgstr "" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3483,6 +3774,12 @@ msgid "Path to save screenshots at." msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3572,9 +3869,16 @@ msgid "Replaces the default main menu with a custom one." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Report path" -msgstr "Вибрати шлÑÑ…" +msgstr "ШлÑÑ… Ð´Ð»Ñ Ð·Ð²Ñ–Ñ‚Ñƒ" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" #: src/settings_translation_file.cpp msgid "Right key" @@ -3609,6 +3913,10 @@ msgid "Round minimap" msgstr "" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3617,6 +3925,10 @@ msgid "Saving map received from server" msgstr "" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3657,6 +3969,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "Безпека" @@ -3701,6 +4021,10 @@ msgid "Server port" msgstr "Порт Ñервера" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "ÐдреÑа ÑпиÑку публічних Ñерверів" @@ -3733,10 +4057,18 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "ШлÑÑ… до шейдерів" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow limit" msgstr "" #: src/settings_translation_file.cpp @@ -3762,10 +4094,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "Згладжене оÑвітленнÑ" @@ -3804,6 +4155,14 @@ msgid "Static spawnpoint" msgstr "" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "" @@ -3824,10 +4183,30 @@ msgid "Synchronous SQLite" msgstr "" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3842,6 +4221,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "ШлÑÑ… до текÑтури" @@ -3861,8 +4244,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -3913,6 +4299,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "" @@ -3955,6 +4345,10 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Трилінійна фільтраціÑ" @@ -3970,10 +4364,28 @@ msgid "Trusted mods" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "" @@ -4038,6 +4450,42 @@ msgid "Valleys C Flags" msgstr "" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "" @@ -4046,13 +4494,11 @@ msgid "Video driver" msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing" +msgid "View bobbing factor" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +msgid "View distance in nodes." msgstr "" #: src/settings_translation_file.cpp @@ -4064,6 +4510,10 @@ msgid "View range increase key" msgstr "" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "" @@ -4096,7 +4546,6 @@ msgid "Water surface level of the world." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving Nodes" msgstr "Блоки, що коливаютьÑÑ" @@ -4152,16 +4601,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4212,6 +4651,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4225,6 +4671,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "" @@ -4236,6 +4718,33 @@ msgstr "" msgid "cURL timeout" msgstr "" +#~ msgid "Hide mp content" +#~ msgstr "Сховати вміÑÑ‚ модпаку" + +#~ msgid "Attn" +#~ msgstr "Увага" + +#~ msgid "Capital" +#~ msgstr "Caps Lock" + +#~ msgid "Comma" +#~ msgstr "Кома" + +#~ msgid "Final" +#~ msgstr "Кінець" + +#~ msgid "Minus" +#~ msgstr "МінуÑ" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "Крапка" + +#~ msgid "Plus" +#~ msgstr "ПлюÑ" + #~ msgid "No of course not!" #~ msgstr "ÐÑ–, звіÑно ні!" @@ -4258,10 +4767,6 @@ msgstr "" #~ msgstr "Увімкнено" #, fuzzy -#~ msgid "Game Name" -#~ msgstr "Гра" - -#, fuzzy #~ msgid "Password" #~ msgstr "Старий Пароль" diff --git a/po/zh_CN/minetest.po b/po/zh_CN/minetest.po index cd70e573e..99571b557 100644 --- a/po/zh_CN/minetest.po +++ b/po/zh_CN/minetest.po @@ -6,21 +6,29 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" -"PO-Revision-Date: 2016-06-11 10:56+0000\n" -"Last-Translator: arsdragonfly <arsdragonfly@gmail.com>\n" -"Language-Team: Chinese (China) <https://hosted.weblate.org/projects/minetest/" -"minetest/zh_CN/>\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" +"PO-Revision-Date: 2017-05-20 04:28+0000\n" +"Last-Translator: Gaunthan Huang <gaunthanhuang@gmail.com>\n" +"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" +"minetest/minetest/zh_Hans/>\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.7-dev\n" +"X-Generator: Weblate 2.14.1-dev\n" + +#: builtin/client/init.lua +msgid "Respawn" +msgstr "é‡ç”Ÿ" + +#: builtin/client/init.lua +msgid "You died." +msgstr "ä½ æ»äº†ã€‚" #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" -msgstr "Lua 脚本å‘生错误,如一个 mod:" +msgstr "Lua 脚本å‘生错误,如一个模组:" #: builtin/fstk/ui.lua msgid "An error occured:" @@ -74,12 +82,13 @@ msgstr "我们支æŒçš„å议版本为 $1 至 $2。" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "å–æ¶ˆ" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "ä¾èµ–:" #: builtin/mainmenu/dlg_config_world.lua @@ -87,6 +96,11 @@ msgid "Disable MP" msgstr "ç¦ç”¨MOD包" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "ç¦ç”¨MOD包" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "å¯ç”¨MOD包" @@ -101,17 +115,13 @@ msgid "" msgstr "æ— æ³•å¯ç”¨ MOD \"$1\"ï¼šå«æœ‰ä¸æ”¯æŒçš„å—符。å…许的å—符为 [a-z0-9_]。" #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "éšè—游æˆ" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "éšè—MOD包内容" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -174,8 +184,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "ä½ ç¡®è®¤è¦åˆ 除“$1â€ï¼Ÿ" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "åˆ é™¤" @@ -191,7 +200,7 @@ msgstr "MOD管ç†å™¨ï¼šMOD“$1â€œè·¯å¾„éžæ³•" msgid "Delete World \"$1\"?" msgstr "åˆ é™¤ä¸–ç•Œâ€œ$1â€ï¼Ÿ" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "接å—" @@ -271,6 +280,11 @@ msgstr "å¯è®¾ç½®çš„ flag: " msgid "Restore Default" msgstr "回å¤åˆå§‹è®¾ç½®" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "æœç´¢" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "选择路径" @@ -280,11 +294,13 @@ msgid "Show technical names" msgstr "显示高级设置" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "这个值必须大于 $1." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "这个值必须å°äºŽ $1." #: builtin/mainmenu/modmgr.lua @@ -311,6 +327,10 @@ msgstr "安装MOD:找ä¸åˆ°$1的真æ£MODå" msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "安装MOD:找ä¸åˆ°MOD包$1çš„åˆé€‚文件夹å" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "å…³é—商店" @@ -332,10 +352,6 @@ msgid "Rating" msgstr "评级" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "æœç´¢" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "çŸåç§°:" @@ -371,6 +387,71 @@ msgstr "å‰è´¡çŒ®è€…" msgid "Previous Core Developers" msgstr "剿 ¸å¿ƒå¼€å‘者" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "å‘布æœåС噍" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "绑定地å€" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "é…ç½®" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "åˆ›é€ æ¨¡å¼" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "å¼€å¯ä¼¤å®³é£Žé™©" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "éšè—游æˆ" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "æœåС噍" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "本地安装" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "åå—/密ç " + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "新建" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "未创建或选择世界!" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "玩家åç§°" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "端å£" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "选择世界:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "æœåŠ¡å™¨ç«¯å£" + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "已安装的MOD:" @@ -380,6 +461,10 @@ msgid "Mod information:" msgstr "MOD资料:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "æ— MOD资料å¯å¾—" @@ -399,97 +484,46 @@ msgstr "åˆ é™¤é€‰ä¸çš„MOD" msgid "Uninstall selected modpack" msgstr "åˆ é™¤é€‰ä¸çš„MOD包" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "地å€/端å£" -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "客户端" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "连接" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "åˆ›é€ æ¨¡å¼" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "å¯ç”¨ä¼¤å®³" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" -msgstr "åˆ é™¤æ”¶è—çš„æœåС噍" +msgstr "åˆ é™¤æ”¶è—项" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" -msgstr "æ”¶è—çš„æœåС噍" +msgstr "æ”¶è—项" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "用户å/密ç " -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "å¯ç”¨ PvP" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "绑定地å€" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "é…ç½®" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "åˆ›é€ æ¨¡å¼" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "å¼€å¯ä¼¤å®³é£Žé™©" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "åå—/密ç " - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "新建" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "未创建或选择世界!" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "端å£" - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "公共æœåС噍" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "选择世界:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "æœåС噍" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "æœåŠ¡å™¨ç«¯å£" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Play Online" +msgstr "玩家åç§°" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "å¯åŠ¨æ¸¸æˆ" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "å¯ç”¨çŽ©å®¶å¯¹æˆ˜" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -520,11 +554,14 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "ä½ ç¡®å®šè¦é‡ç½®æ‚¨çš„å•人世界å—?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "åŒçº¿æ€§è¿‡æ»¤" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Bump Mapping" msgstr "凹凸贴图" @@ -565,9 +602,8 @@ msgid "Node Highlighting" msgstr "节点高亮" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Node Outlining" -msgstr "æ–¹å—高亮" +msgstr "æ–¹å—轮廓" #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua msgid "None" @@ -594,9 +630,13 @@ msgid "Particles" msgstr "ç²’åæ•ˆæžœ" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Reset singleplayer world" -msgstr "é‡ç½®å•人游æˆ" +msgstr "é‡ç½®å•人世界" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "截图" #: builtin/mainmenu/tab_settings.lua msgid "Settings" @@ -662,14 +702,6 @@ msgstr "主è¦" msgid "Start Singleplayer" msgstr "å•人游æˆ" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "开始游æˆ" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "å•人游æˆ" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "æ— ä¿¡æ¯å¯ç”¨" @@ -731,6 +763,10 @@ msgid "Player name too long." msgstr "玩家å称太长了。" #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "æä¾›çš„世界路径ä¸å˜åœ¨: " @@ -747,6 +783,44 @@ msgstr "" "查看 debug.txt 以获得详细信æ¯ã€‚" #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "绑定地å€" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "åˆ›é€ æ¨¡å¼" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "伤害" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "端å£" + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "公共æœåС噍" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "æœåС噍åç§°" + +#: src/game.cpp msgid "Change Keys" msgstr "更改键ä½è®¾ç½®" @@ -763,26 +837,22 @@ msgid "Continue" msgstr "ç»§ç»" #: src/game.cpp -msgid "Creating client..." -msgstr "æ£åœ¨å»ºç«‹å®¢æˆ·ç«¯..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "建立æœåС噍...." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "默认控制:\n" "W/A/S/D: 移动\n" @@ -797,6 +867,14 @@ msgstr "" "T: èŠå¤©\n" #: src/game.cpp +msgid "Creating client..." +msgstr "æ£åœ¨å»ºç«‹å®¢æˆ·ç«¯..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "建立æœåС噍...." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -833,6 +911,20 @@ msgid "Exit to OS" msgstr "退出至æ“作系统" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "游æˆå" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "建立æœåС噍...." + +#: src/game.cpp msgid "Item definitions..." msgstr "物å“定义..." @@ -853,24 +945,46 @@ msgid "Node definitions..." msgstr "æ–¹å—定义..." #: src/game.cpp -msgid "Resolving address..." -msgstr "æ£åœ¨è§£æžåœ°å€..." +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "é‡ç”Ÿ" +msgid "On" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "远程端å£" + +#: src/game.cpp +msgid "Resolving address..." +msgstr "æ£åœ¨è§£æžåœ°å€..." #: src/game.cpp msgid "Shutting down..." msgstr "å…³é—..." #: src/game.cpp +msgid "Singleplayer" +msgstr "å•人游æˆ" + +#: src/game.cpp msgid "Sound Volume" msgstr "音é‡" #: src/game.cpp -msgid "You died." -msgstr "ä½ æ»äº†ã€‚" +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -905,6 +1019,10 @@ msgid "Console" msgstr "控制å°" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "连按两次“跳â€åˆ‡æ¢é£žè¡Œæ¨¡å¼" @@ -917,6 +1035,11 @@ msgid "Forward" msgstr "å‘å‰" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "音é‡" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "ç‰©å“æ " @@ -936,6 +1059,24 @@ msgstr "é”®ä½é…置。(如果这个èœå•被弄乱,从 minetest.conf ä¸åˆ msgid "Left" msgstr "å‘å·¦" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "命令" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "下一个" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "æ‰“å°æ ˆ" @@ -1013,38 +1154,22 @@ msgid "Apps" msgstr "应用" #: src/keycode.cpp -msgid "Attn" -msgstr "Attné”®" - -#: src/keycode.cpp msgid "Back" msgstr "é€€æ ¼" #: src/keycode.cpp -msgid "Capital" -msgstr "大写é”定键" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "Clearé”®" #: src/keycode.cpp -msgid "Comma" -msgstr "逗å·" - -#: src/keycode.cpp msgid "Control" msgstr "Ctrlé”®" #: src/keycode.cpp -msgid "Convert" -msgstr "转æ¢" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSelé”®" - -#: src/keycode.cpp msgid "Down" msgstr "å‘下" @@ -1053,26 +1178,15 @@ msgid "End" msgstr "Endé”®" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "Erase OEFé”®" #: src/keycode.cpp -msgid "Escape" -msgstr "Escé”®" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSelé”®" - -#: src/keycode.cpp msgid "Execute" msgstr "执行" #: src/keycode.cpp -msgid "Final" -msgstr "Finalé”®" - -#: src/keycode.cpp msgid "Help" msgstr "帮助" @@ -1081,20 +1195,33 @@ msgid "Home" msgstr "Homeé”®" #: src/keycode.cpp -msgid "Insert" -msgstr "Inserté”®" +#, fuzzy +msgid "IME Accept" +msgstr "接å—" #: src/keycode.cpp -msgid "Junja" -msgstr "Junjaé”®" +#, fuzzy +msgid "IME Convert" +msgstr "转æ¢" #: src/keycode.cpp -msgid "Kana" -msgstr "Kanaé”®" +#, fuzzy +msgid "IME Escape" +msgstr "Escé”®" #: src/keycode.cpp -msgid "Kanji" -msgstr "Kanjié”®" +#, fuzzy +msgid "IME Mode Change" +msgstr "更改模å¼" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Nonconvert" +msgstr "æ— è½¬æ¢" + +#: src/keycode.cpp +msgid "Insert" +msgstr "Inserté”®" #: src/keycode.cpp msgid "Left Button" @@ -1125,22 +1252,10 @@ msgid "Middle Button" msgstr "ä¸é”®" #: src/keycode.cpp -msgid "Minus" -msgstr "å‡å·" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "更改模å¼" - -#: src/keycode.cpp msgid "Next" msgstr "下一个" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "æ— è½¬æ¢" - -#: src/keycode.cpp msgid "Num Lock" msgstr "æ•°å—é”定键" @@ -1157,6 +1272,11 @@ msgid "Numpad -" msgstr "å°é”®ç›˜-" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "å°é”®ç›˜*" + +#: src/keycode.cpp msgid "Numpad /" msgstr "å°é”®ç›˜/" @@ -1205,20 +1325,12 @@ msgid "OEM Clear" msgstr "OEM Clearé”®" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1é”®" - -#: src/keycode.cpp msgid "Pause" msgstr "Pauseé”®" #: src/keycode.cpp -msgid "Period" -msgstr "å¥å·" - -#: src/keycode.cpp -msgid "Plus" -msgstr "åŠ å·" +msgid "Play" +msgstr "开始游æˆ" #: src/keycode.cpp msgid "Print" @@ -1322,6 +1434,20 @@ msgid "3D mode" msgstr "3D 模å¼" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1399,14 +1525,20 @@ msgstr "" "注æ„,主èœå•çš„åœ°å€æ 将会覆盖这里的设置。" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "为支æŒ4Kç‰å±å¹•,调节åƒç´ ç‚¹å¯†åº¦ï¼ˆéž X11/Android çŽ¯å¢ƒæ‰æœ‰æ•ˆï¼‰ã€‚" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "调整亮度表的伽玛编ç 。较低的数值会较亮。\n" @@ -1433,6 +1565,12 @@ msgid "Amplifies the valleys" msgstr "放大山谷" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "å„å‘异性过滤" @@ -1450,6 +1588,10 @@ msgstr "" "å¦‚æžœä½ æƒ³å‘å¸ƒä½ çš„ IPv6 地å€ï¼Œä½¿ç”¨ serverlist_url = v6.servers.minetest.net 。" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "大约 (X,Y,Z) 的节点分形规模。" @@ -1458,12 +1600,25 @@ msgid "Ask to reconnect after crash" msgstr "崩溃åŽè¯¢é—®é‡æ–°è¿žæŽ¥" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "自动报告到æœåŠ¡å™¨åˆ—è¡¨ã€‚" #: src/settings_translation_file.cpp msgid "Autorun key" -msgstr "" +msgstr "自动奔跑键" #: src/settings_translation_file.cpp msgid "Backward key" @@ -1482,6 +1637,14 @@ msgid "Basic Privileges" msgstr "基本æƒé™" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "åŒçº¿æ€§è¿‡æ»¤" @@ -1490,6 +1653,15 @@ msgid "Bind address" msgstr "绑定地å€" #: src/settings_translation_file.cpp +msgid "Biome API temperature and humidity noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome noise" +msgstr "æ²³æµå™ªéŸ³" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "免屿¨¡å¼ä¸çš„ä½ï¼åƒç´ (åˆç§°è‰²å½©æ·±åº¦ï¼‰ã€‚" @@ -1499,7 +1671,7 @@ msgstr "建立内部玩家" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "内置" #: src/settings_translation_file.cpp msgid "Bumpmapping" @@ -1518,6 +1690,11 @@ msgid "Camera update toggle key" msgstr "镜头更新切æ¢é”®" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "洞穴噪音 #1" @@ -1531,6 +1708,35 @@ msgid "Cave width" msgstr "å±å¹•宽度" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "å±å¹•宽度" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "地图生æˆå™¨å¹³é¢å±±ä¸˜é˜ˆå€¼" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "洞穴与隧é“由两ç§å™ªéŸ³çš„交集形æˆ" @@ -1606,10 +1812,19 @@ msgid "Clean transparent textures" msgstr "干净逿˜Žçº¹ç†" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "客户端" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "客户端和æœåС噍" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "客户端" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "攀登速度" @@ -1679,6 +1894,11 @@ msgid "Console color" msgstr "控制å°é¢œè‰²" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "控制å°é”®" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "控制å°é”®" @@ -1704,22 +1924,20 @@ msgstr "" "示例:72 = 20分钟,360 = 4分钟,1 = 24å°æ—¶ï¼Œ0 = æ—¥ï¼å¤œï¼ä¸€åˆ‡ä¿æŒä¸å˜ã€‚" #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"控制在 Mapgen v6 ä¸çš„æ²™æ¼ 与沙滩大å°ã€‚\n" -"当 snowbiomes å¯ç”¨æ—¶ã€Œmgv6_freq_desertã€ä¼šè¢«å¿½ç•¥ã€‚" - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." -msgstr "" +msgstr "控制湖泊洼地的å¡åº¦/深度。" #: src/settings_translation_file.cpp msgid "Controls steepness/height of hills." msgstr "控制山丘的å¡åº¦/高度。" #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "控制隧é“宽度,较å°çš„值创建更宽的隧é“。" @@ -1736,13 +1954,17 @@ msgstr "" "è¿™å¯ä»¥ä½¿æŒ–æŽ˜æ›´åŠ å›°éš¾ã€‚0 表示ç¦ç”¨ã€‚ (0-10)" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Creates unpredictable water features in caves.\n" "These can make mining difficult. Zero disables them. (0-10)" msgstr "" "在洞穴ä¸åˆ›å»ºéšæœºçš„æ°´åŸŸã€‚\n" -"会使挖矿å˜å¾—困难。值为0则ç¦ç”¨ã€‚(0-10)" +"水域会使挖矿å˜å¾—困难。值为0则ç¦ç”¨ã€‚(0-10)" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "创建" #: src/settings_translation_file.cpp msgid "Crosshair alpha" @@ -1781,6 +2003,11 @@ msgid "Debug log level" msgstr "调试日志级别" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "HUD 切æ¢é”®" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "专用æœåС噍æ¥éª¤" @@ -1810,7 +2037,7 @@ msgstr "默认æƒé™" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "é»˜è®¤æŠ¥å‘Šæ ¼å¼" #: src/settings_translation_file.cpp msgid "" @@ -1821,6 +2048,41 @@ msgstr "" "仅使用 cURL 编译时有效果。" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1830,13 +2092,23 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "定义玩家å¯ä¼ é€çš„æœ€å¤§è·ç¦»ï¼Œä»¥æ–¹å—为å•ä½ (0 = ä¸é™åˆ¶)。" + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." msgstr "" #: src/settings_translation_file.cpp -msgid "Delay in sending blocks after building" +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." msgstr "" #: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "å»ºé€ åŽå‘逿–¹å—的延迟时间" + +#: src/settings_translation_file.cpp msgid "Delay showing tooltips, stated in milliseconds." msgstr "工具æç¤ºæ˜¾ç¤ºå»¶è¿Ÿï¼ŒæŒ‰æ¯«ç§’计算。" @@ -1863,31 +2135,43 @@ msgid "" msgstr "æœåС噍æè¿°ï¼Œå°†æ˜¾ç¤ºåœ¨æä¾›ç»™çŽ©å®¶çš„æœåŠ¡å™¨åˆ—è¡¨ã€‚" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "åŽ»åŒæ¥å—动画" +msgid "Desert noise threshold" +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" #: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "åŽ»åŒæ¥å—动画" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "ç²’åæ•ˆæžœ" + +#: src/settings_translation_file.cpp msgid "Disable anticheat" msgstr "ç¦ç”¨å作弊" #: src/settings_translation_file.cpp msgid "Disable escape sequences" -msgstr "" +msgstr "ç¦ç”¨è½¬ä¹‰åºåˆ—" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Disable escape sequences, e.g. chat coloring.\n" "Use this if you want to run a server with pre-0.4.14 clients and you want to " "disable\n" "the escape sequences generated by mods." msgstr "" +"决定地形尺寸。\n" +"ä½¿ç”¨è¯¥é¡¹ï¼Œå¦‚æžœä½ æƒ³ä½¿ç”¨ 0.4.14 版本之å‰çš„客户端è¿è¡ŒæœåŠ¡å™¨å¹¶ä¸”ç¦æ¢\n" +"模组生æˆçš„转义åºåˆ—。" #: src/settings_translation_file.cpp msgid "Disallow empty passwords" @@ -1915,6 +2199,12 @@ msgstr "转储地图生æˆå™¨è°ƒè¯•ä¿¡æ¯ã€‚" #: src/settings_translation_file.cpp msgid "Enable Joysticks" +msgstr "å¯ç”¨æ‘‡æ†" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." msgstr "" #: src/settings_translation_file.cpp @@ -1922,6 +2212,14 @@ msgid "Enable VBO" msgstr "å¯ç”¨ VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "å¯ç”¨ mod 安全" @@ -1942,6 +2240,7 @@ msgstr "" "ç¦ç”¨å¯å½±å“速度和获得ä¸åŒå¤–观。" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Enable to disallow old clients from connecting.\n" "Older clients are compatible in the sense that they will not crash when " @@ -1949,6 +2248,9 @@ msgid "" "to new servers, but they may not support all new features that you are " "expecting." msgstr "" +"å¯ç”¨ä»¥ç¦æ¢æ—§ç‰ˆå®¢æˆ·ç«¯è¿žæŽ¥ã€‚\n" +"旧版客户端是å¯å…¼å®¹çš„,它们ä¸ä¼šåœ¨è¿žæŽ¥æ–°ç‰ˆæœåŠ¡å™¨æ—¶\n" +"崩溃,但å¯èƒ½ä¸æ”¯æŒæŸäº›æ‚¨æ‰€æœŸæœ›çš„æ–°ç‰¹æ€§ã€‚" #: src/settings_translation_file.cpp msgid "" @@ -1957,6 +2259,19 @@ msgid "" "textures)\n" "when connecting to the server." msgstr "" +"å…许使用远程媒体æœåС噍 (如果由æœåС噍æä¾›)。\n" +"连接到æœåŠ¡å™¨æ—¶ï¼Œè¿œç¨‹æœåŠ¡å™¨ä¼šæä¾›ä¸€ç§æ›´å¿«çš„æ–¹å¼ä¸‹è½½åª’体 (如纹ç†)。" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Enable view bobbing" +msgstr "范围摇动" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -1964,6 +2279,9 @@ msgid "" "to IPv6 clients, depending on system configuration.\n" "Ignored if bind_address is set." msgstr "" +"å…许/ç¦æ¢è¿è¡Œ IPv6 æœåŠ¡å™¨ã€‚ä¸€ä¸ª IPv6 æœåС噍å¯èƒ½ä»…é™\n" +" IPv6 客户端,这å–决于系统é…置。\n" +"如果设置了 bind_address 则本项被忽略。" #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." @@ -2004,13 +2322,17 @@ msgstr "" "需è¦ç€è‰²å™¨å·²å¯ç”¨ã€‚" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "剖æžå°å‡ºé—´éš”" #: src/settings_translation_file.cpp +#, fuzzy msgid "Entity methods" -msgstr "" +msgstr "实体方法" #: src/settings_translation_file.cpp msgid "" @@ -2027,7 +2349,12 @@ msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Fall bobbing factor" msgstr "å è½ä¸Šä¸‹æ‘†åЍ" #: src/settings_translation_file.cpp @@ -2077,14 +2404,13 @@ msgstr "视界" #: src/settings_translation_file.cpp #, fuzzy msgid "Field of view for zoom" -msgstr "视界" +msgstr "放大时的视界。" #: src/settings_translation_file.cpp msgid "Field of view in degrees." msgstr "视界程度。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Field of view while zooming in degrees.\n" "This requires the \"zoom\" privilege on the server." @@ -2104,6 +2430,11 @@ msgid "Filler Depth" msgstr "填充深度" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Filler depth noise" +msgstr "填充深度" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "ç”µå½±åŸºè°ƒæ˜ å°„" @@ -2120,10 +2451,35 @@ msgid "Filtering" msgstr "过滤" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "固定地图ç§å" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Floatland level" +msgstr "水级别" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "飞行键" @@ -2136,6 +2492,10 @@ msgid "Fog" msgstr "雾" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "雾切æ¢é”®" @@ -2164,15 +2524,22 @@ msgid "Font size" msgstr "å—体大å°" #: src/settings_translation_file.cpp -#, fuzzy msgid "Format of screenshots." -msgstr "å±å¹•截图ä¿å˜ä½ç½®ã€‚" +msgstr "å±å¹•æˆªå›¾æ ¼å¼ã€‚" #: src/settings_translation_file.cpp msgid "Forward key" msgstr "å‰è¿›é”®" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "FreeType å—体" @@ -2229,8 +2596,9 @@ msgid "Generate normalmaps" msgstr "生æˆå¸¸è§„地图" #: src/settings_translation_file.cpp +#, fuzzy msgid "Global callbacks" -msgstr "" +msgstr "全局回调" #: src/settings_translation_file.cpp msgid "" @@ -2251,10 +2619,19 @@ msgid "Gravity" msgstr "é‡åŠ›" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "地图生æˆå™¨å¹³åœ°çº§åˆ«" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "HTTP Mod" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "HUD 切æ¢é”®" @@ -2276,22 +2653,58 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "å³Windowsé”®" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "云在多高的高度出现。" #: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "高精度 FPU" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "地图生æˆå™¨å¹³é¢å±±ä¸˜å¡åº¦" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "地图生æˆå™¨å¹³é¢å±±ä¸˜é˜ˆå€¼" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "æœåŠ¡å™¨é¦–é¡µï¼Œå°†ä¼šæ˜¾ç¤ºåœ¨æœåŠ¡å™¨åˆ—è¡¨ä¸ã€‚" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "æ²³æµæœ‰å¤šæ·±" @@ -2313,6 +2726,18 @@ msgid "How wide to make rivers" msgstr "æ²³æµæœ‰å¤šå®½" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2338,6 +2763,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2370,6 +2804,10 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "" #: src/settings_translation_file.cpp +msgid "If enabled, show the server status message on player connection." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2397,6 +2835,15 @@ msgid "In-game chat console background color (R,G,B)." msgstr "" #: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "控制å°é”®" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2439,6 +2886,11 @@ msgid "Interval of sending time of day to clients." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "库å˜é”®" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "库å˜ç‰©å“动画" @@ -2459,12 +2911,24 @@ msgid "Item entity TTL" msgstr "物å“实体 TTL" #: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." msgstr "" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp #, fuzzy msgid "Joystick button repetition interval" msgstr "å³å‡»é‡å¤é—´éš”" @@ -2504,6 +2968,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "跳跃键" @@ -2520,6 +3000,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2534,6 +3021,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2576,6 +3070,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2590,6 +3091,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2611,6 +3119,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " "disabled.\n" @@ -2711,6 +3233,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -2724,10 +3253,27 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "攀登/é™è½çš„é”®" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "地图生æˆå™¨å¹³é¢æ¹–å¡åº¦" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "地图生æˆå™¨å¹³é¢é˜ˆå€¼" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "è¯è¨€" @@ -2736,6 +3282,11 @@ msgid "Large cave depth" msgstr "巨大洞穴深度" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "控制å°é”®" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "熔岩特性" @@ -2791,6 +3342,13 @@ msgstr "è¦ç”Ÿæˆçš„生产队列ç»å¯¹é™åˆ¶" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -2864,6 +3422,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "地图目录" @@ -2891,9 +3453,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2902,7 +3473,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -2921,24 +3493,21 @@ msgid "Mapblock limit" msgstr "地图å—é™åˆ¶" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "地图å—å¸è½½è¶…æ—¶" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "地图生æˆå™¨å±±è°·" +#, fuzzy +msgid "Mapblock mesh generation delay" +msgstr "地图生æˆé™åˆ¶" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" +msgid "Mapblock mesh generator's MapBlock cache size MB" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "" +msgid "Mapblock unload timeout" +msgstr "地图å—å¸è½½è¶…æ—¶" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "" +msgid "Mapgen Valleys" +msgstr "地图生æˆå™¨å±±è°·" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -2954,119 +3523,14 @@ msgstr "地图生æˆå™¨å¹³é¢" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen flat cave width" -msgstr "地图生æˆå™¨å¹³é¢é˜ˆå€¼" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" +msgid "Mapgen flat specific flags" msgstr "地图生æˆå™¨å¹³é¢æ ‡å¿—" #: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "地图生æˆå™¨å¹³åœ°çº§åˆ«" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "地图生æˆå™¨å¹³é¢å±±ä¸˜å¡åº¦" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "地图生æˆå™¨å¹³é¢å±±ä¸˜é˜ˆå€¼" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "地图生æˆå™¨å¹³é¢æ¹–å¡åº¦" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "地图生æˆå™¨å¹³é¢é˜ˆå€¼" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "地图生æˆå™¨åˆ†å½¢" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Mapgen fractal cave width" -msgstr "地图生æˆå™¨åˆ†å½¢ç‰‡ w" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "地图生æˆå™¨åˆ†å½¢åˆ†å½¢" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "地图生æˆå™¨åˆ†å½¢è¿ä»£" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "地图生æˆå™¨åˆ†å½¢ julia w" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "地图生æˆå™¨åˆ†å½¢ julia x" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "地图生æˆå™¨åˆ†å½¢ julia y" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "地图生æˆå™¨åˆ†å½¢ julia z" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "地图生æˆå™¨åˆ†å½¢åç§»" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "地图生æˆå™¨åˆ†å½¢è§„模" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "地图生æˆå™¨åˆ†å½¢ç‰‡ w" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "地图生æˆå™¨åç§°" @@ -3076,147 +3540,28 @@ msgstr "地图生æˆå™¨ v5" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v5 cave width" -msgstr "巨大洞穴深度" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "" +msgid "Mapgen v5 specific flags" +msgstr "地图生æˆå™¨ v6 æ ‡å¿—" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "地图生æˆå™¨ v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "地图生æˆå™¨ v6 沙滩频率" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "地图生æˆå™¨ v6 æ²™æ¼ é¢‘çŽ‡" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" +#, fuzzy +msgid "Mapgen v6 specific flags" msgstr "地图生æˆå™¨ v6 æ ‡å¿—" #: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "地图生æˆå™¨ v7" #: src/settings_translation_file.cpp #, fuzzy -msgid "Mapgen v7 cave width" -msgstr "巨大洞穴深度" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" +msgid "Mapgen v7 specific flags" msgstr "地图生æˆå™¨ v7 æ ‡å¿—" #: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp msgid "Massive cave depth" msgstr "巨大洞穴深度" @@ -3381,6 +3726,10 @@ msgid "Mipmapping" msgstr "Mip 贴图处ç†" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "Mod å˜å‚¨è¯¦æƒ… URL" @@ -3401,6 +3750,14 @@ msgid "Monospace font size" msgstr "ç‰å®½å—体大å°" #: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "é¼ æ ‡çµæ•度" @@ -3409,18 +3766,21 @@ msgid "Mouse sensitivity multiplier." msgstr "é¼ æ ‡çµæ•åº¦å€æ•°ã€‚" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for fall bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgid "Mud noise" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Multiplier for view bobbing.\n" +"Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mute key" +msgstr "使用按键" + +#: src/settings_translation_file.cpp msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this." @@ -3475,10 +3835,6 @@ msgid "NodeTimer interval" msgstr "å‘é€é—´é𔿗¶é—´" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "噪声" @@ -3515,6 +3871,14 @@ msgid "Number of parallax occlusion iterations." msgstr "视差é—塞è¿ä»£æ•°ã€‚" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "" @@ -3555,6 +3919,12 @@ msgid "Path to save screenshots at." msgstr "å±å¹•截图ä¿å˜ä½ç½®ã€‚" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "" @@ -3651,6 +4021,15 @@ msgid "Report path" msgstr "å—体路径" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ridge noise" +msgstr "æ²³æµå™ªéŸ³" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "峿–¹å‘é”®" @@ -3683,6 +4062,10 @@ msgid "Round minimap" msgstr "圆形å°åœ°å›¾" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "" @@ -3691,6 +4074,10 @@ msgid "Saving map received from server" msgstr "ä¿å˜ä»ŽæœåŠ¡å™¨æ”¶åˆ°çš„åœ°å›¾" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3733,6 +4120,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "安全" @@ -3777,6 +4173,10 @@ msgid "Server port" msgstr "æœåŠ¡å™¨ç«¯å£" #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "æœåŠ¡å™¨åˆ—è¡¨ URL" @@ -3809,13 +4209,23 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "ç€è‰²å™¨" + +#: src/settings_translation_file.cpp msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow limit" +msgstr "地图å—é™åˆ¶" + +#: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." msgstr "" @@ -3838,10 +4248,29 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "平滑光照" @@ -3880,6 +4309,14 @@ msgid "Static spawnpoint" msgstr "陿€é‡ç”Ÿç‚¹" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "生æˆçš„一般地图强度。" @@ -3900,10 +4337,33 @@ msgid "Synchronous SQLite" msgstr "åŒæ¥ SQLite" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "地形高度" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain base noise" +msgstr "地形高度" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain higher noise" +msgstr "地形高度" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain noise" +msgstr "地形高度" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -3918,6 +4378,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "纹ç†è·¯å¾„" @@ -3937,8 +4401,11 @@ msgstr "泥土深度或其他过滤器" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" msgstr "" #: src/settings_translation_file.cpp @@ -3989,6 +4456,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "用于特定è¯è¨€çš„å—体。" @@ -4031,6 +4502,10 @@ msgid "Tooltip delay" msgstr "工具æç¤ºå»¶è¿Ÿ" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "三线性过滤" @@ -4046,10 +4521,28 @@ msgid "Trusted mods" msgstr "å¯ä¿¡ MOD" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "æ— é™çš„玩家转移è·ç¦»" @@ -4114,6 +4607,43 @@ msgid "Valleys C Flags" msgstr "山谷 C æ ‡å¿—" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "控制山丘的å¡åº¦/高度。" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "å±å¹•åž‚ç›´åŒæ¥ã€‚" @@ -4122,13 +4652,13 @@ msgid "Video driver" msgstr "视频驱动程åº" #: src/settings_translation_file.cpp -msgid "View bobbing" +#, fuzzy +msgid "View bobbing factor" msgstr "范围摇动" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +#, fuzzy +msgid "View distance in nodes." msgstr "" "节点间å¯è§†è·ç¦»ã€‚\n" "æœ€å° = 20" @@ -4142,6 +4672,10 @@ msgid "View range increase key" msgstr "å¯è§†èŒƒå›´å¢žåŠ é”®" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "å¯è§†èŒƒå›´" @@ -4229,16 +4763,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "" @@ -4280,13 +4804,26 @@ msgid "" "Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n" "Disabling this option will protect your password better." msgstr "" +"æ˜¯å¦æ”¯æŒå议版本在25之å‰çš„æ—§ç‰ˆæœåŠ¡å™¨ã€‚\n" +"å¯ç”¨å¦‚æžœä½ æƒ³è¿žæŽ¥åˆ°0.4.12åŠä¹‹å‰ç‰ˆæœ¬çš„æœåŠ¡å™¨ã€‚\n" +"0.4.13开始的æœåŠ¡å™¨ä¼šå·¥ä½œï¼Œ0.4.12-devæœåС噍å¯èƒ½ä¼šå·¥ä½œã€‚\n" +"ç¦ç”¨è¯¥é¡¹å¯ä»¥æ›´å¥½åœ°ä¿æŠ¤ä½ 的密ç 。" #: src/settings_translation_file.cpp +#, fuzzy msgid "Width component of the initial window size." -msgstr "åˆå§‹åŒ–窗å£å°ºå¯¸ä¹‹å®½åº¦ç»„件。" +msgstr "åˆå§‹åŒ–窗å£å°ºå¯¸çš„宽度组件。" #: src/settings_translation_file.cpp +#, fuzzy msgid "Width of the selectionbox's lines around nodes." +msgstr "结点周围的选择框的线宽。" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." msgstr "" #: src/settings_translation_file.cpp @@ -4306,6 +4843,42 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "å¤§åž‹éšæœºæ´žç©´çš„Y轴最大值。" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "cURL 文件下载超时" @@ -4317,6 +4890,113 @@ msgstr "cURL å¹¶å‘é™åˆ¶" msgid "cURL timeout" msgstr "cURL è¶…æ—¶" +#~ msgid "Hide mp content" +#~ msgstr "éšè—MOD包内容" + +#~ msgid "Start Game" +#~ msgstr "å¯åŠ¨æ¸¸æˆ" + +#~ msgid "Attn" +#~ msgstr "Attné”®" + +#~ msgid "Capital" +#~ msgstr "大写é”定键" + +#~ msgid "Comma" +#~ msgstr "逗å·" + +#~ msgid "CrSel" +#~ msgstr "CrSelé”®" + +#~ msgid "ExSel" +#~ msgstr "ExSelé”®" + +#~ msgid "Final" +#~ msgstr "Finalé”®" + +#~ msgid "Junja" +#~ msgstr "Junjaé”®" + +#~ msgid "Kana" +#~ msgstr "Kanaé”®" + +#~ msgid "Kanji" +#~ msgstr "Kanjié”®" + +#~ msgid "Minus" +#~ msgstr "å‡å·" + +#~ msgid "PA1" +#~ msgstr "PA1é”®" + +#~ msgid "Period" +#~ msgstr "å¥å·" + +#~ msgid "Plus" +#~ msgstr "åŠ å·" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "控制在 Mapgen v6 ä¸çš„æ²™æ¼ 与沙滩大å°ã€‚\n" +#~ "当 snowbiomes å¯ç”¨æ—¶ã€Œmgv6_freq_desertã€ä¼šè¢«å¿½ç•¥ã€‚" + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "决定地形尺寸。" + +#, fuzzy +#~ msgid "Mapgen flat cave width" +#~ msgstr "地图生æˆå™¨å¹³é¢é˜ˆå€¼" + +#, fuzzy +#~ msgid "Mapgen fractal cave width" +#~ msgstr "地图生æˆå™¨åˆ†å½¢ç‰‡ w" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "地图生æˆå™¨åˆ†å½¢åˆ†å½¢" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "地图生æˆå™¨åˆ†å½¢è¿ä»£" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "地图生æˆå™¨åˆ†å½¢ julia w" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "地图生æˆå™¨åˆ†å½¢ julia x" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "地图生æˆå™¨åˆ†å½¢ julia y" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "地图生æˆå™¨åˆ†å½¢ julia z" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "地图生æˆå™¨åˆ†å½¢åç§»" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "地图生æˆå™¨åˆ†å½¢è§„模" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "地图生æˆå™¨åˆ†å½¢ç‰‡ w" + +#, fuzzy +#~ msgid "Mapgen v5 cave width" +#~ msgstr "巨大洞穴深度" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "地图生æˆå™¨ v6 沙滩频率" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "地图生æˆå™¨ v6 æ²™æ¼ é¢‘çŽ‡" + +#, fuzzy +#~ msgid "Mapgen v7 cave width" +#~ msgstr "巨大洞穴深度" + #~ msgid "Detailed mod profiling" #~ msgstr "详细 mod 剖æž" @@ -4346,9 +5026,6 @@ msgstr "cURL è¶…æ—¶" #~ msgid "Restart minetest for driver change to take effect" #~ msgstr "é‡å¯minetest让驱动å˜åŒ–生效" -#~ msgid "Game Name" -#~ msgstr "游æˆå" - #~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\"" #~ msgstr "游æˆç®¡ç†: æ— æ³•å¤åˆ¶MOD“$1â€åˆ°æ¸¸æˆâ€œ$2â€" @@ -4403,9 +5080,6 @@ msgstr "cURL è¶…æ—¶" #~ msgid "Add mod:" #~ msgstr "æ·»åŠ MOD:" -#~ msgid "Local install" -#~ msgstr "本地安装" - #~ msgid "" #~ "Warning: Some mods are not configured yet.\n" #~ "They will be enabled by default when you save the configuration. " diff --git a/po/zh_TW/minetest.po b/po/zh_TW/minetest.po index 7718ae462..1c1c544b2 100644 --- a/po/zh_TW/minetest.po +++ b/po/zh_TW/minetest.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-30 06:18+0200\n" +"POT-Creation-Date: 2017-05-21 17:40+0200\n" "PO-Revision-Date: 2016-10-15 08:04+0000\n" "Last-Translator: Jeff Huang <s8321414@gmail.com>\n" "Language-Team: Chinese (Taiwan) <https://hosted.weblate.org/projects/" @@ -19,6 +19,14 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 2.9-dev\n" +#: builtin/client/init.lua +msgid "Respawn" +msgstr "é‡ç”Ÿ" + +#: builtin/client/init.lua +msgid "You died." +msgstr "您已經æ»äº¡ã€‚" + #: builtin/fstk/ui.lua msgid "An error occured in a Lua script, such as a mod:" msgstr "在 Lua 指令稿ä¸ç™¼ç”ŸéŒ¯èª¤ï¼Œå¦‚ mod:" @@ -75,12 +83,13 @@ msgstr "我們支æ´å”定版本 $1 到 $2。" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp -#: src/keycode.cpp +#: src/guiPasswordChange.cpp src/keycode.cpp msgid "Cancel" msgstr "å–æ¶ˆ" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua -msgid "Depends:" +#, fuzzy +msgid "Dependencies:" msgstr "ä¾è³´ï¼š" #: builtin/mainmenu/dlg_config_world.lua @@ -88,6 +97,11 @@ msgid "Disable MP" msgstr "åœç”¨ MP" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy +msgid "Disable all" +msgstr "åœç”¨ MP" + +#: builtin/mainmenu/dlg_config_world.lua msgid "Enable MP" msgstr "啟用 MP" @@ -104,17 +118,13 @@ msgstr "" "的。" #: builtin/mainmenu/dlg_config_world.lua -msgid "Hide Game" -msgstr "éš±è—éŠæˆ²" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Hide mp content" -msgstr "éš±è— mp 內容" - -#: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp msgid "Save" @@ -177,8 +187,7 @@ msgid "Are you sure you want to delete \"$1\"?" msgstr "您確定您è¦åˆªé™¤ã€Œ$1ã€å—Žï¼Ÿ" #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -#: src/keycode.cpp +#: builtin/mainmenu/tab_local.lua src/keycode.cpp msgid "Delete" msgstr "刪除" @@ -194,7 +203,7 @@ msgstr "Mod 管ç†å“¡ï¼šç„¡æ•ˆçš„ mod 路徑「$1ã€" msgid "Delete World \"$1\"?" msgstr "刪除世界「$1ã€ï¼Ÿ" -#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp +#: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "接å—" @@ -274,6 +283,11 @@ msgstr "å¯èƒ½çš„值為: " msgid "Restore Default" msgstr "æ¢å¾©é è¨å€¼" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/store.lua +#: builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "æœå°‹" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select path" msgstr "é¸å–路徑" @@ -283,11 +297,13 @@ msgid "Show technical names" msgstr "顯示技術å稱" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be greater than $1." +#, fuzzy +msgid "The value must be at least $1." msgstr "å€¼å¿…é ˆå¤§æ–¼ $1。" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be lower than $1." +#, fuzzy +msgid "The value must not be larger than $1." msgstr "å€¼å¿…é ˆä½Žæ–¼ $1。" #: builtin/mainmenu/modmgr.lua @@ -314,6 +330,10 @@ msgstr "å®‰è£ Mod:找ä¸åˆ° $1 的真實 mod å稱" msgid "Install Mod: unable to find suitable foldername for modpack $1" msgstr "å®‰è£ Mod:找ä¸åˆ° mod 包 $1 é©åˆçš„資料夾å稱" +#: builtin/mainmenu/modmgr.lua +msgid "Subgame Mods" +msgstr "" + #: builtin/mainmenu/store.lua msgid "Close store" msgstr "關閉商店" @@ -335,10 +355,6 @@ msgid "Rating" msgstr "評分" #: builtin/mainmenu/store.lua -msgid "Search" -msgstr "æœå°‹" - -#: builtin/mainmenu/store.lua msgid "Shortname:" msgstr "çŸå稱:" @@ -374,6 +390,71 @@ msgstr "å…ˆå‰çš„è²¢ç»è€…" msgid "Previous Core Developers" msgstr "å…ˆå‰çš„æ ¸å¿ƒé–‹ç™¼è€…" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Announce Server" +msgstr "公佈伺æœå™¨" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "ç¶å®šåœ°å€" + +#: builtin/mainmenu/tab_local.lua +msgid "Configure" +msgstr "è¨å®š" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Creative Mode" +msgstr "å‰µé€ æ¨¡å¼" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +msgid "Enable Damage" +msgstr "啟用傷害" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Game" +msgstr "éš±è—éŠæˆ²" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Host Server" +msgstr "伺æœå™¨" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Local Game" +msgstr "é–‹å§‹éŠæˆ²" + +#: builtin/mainmenu/tab_local.lua +msgid "Name/Password" +msgstr "å稱ï¼å¯†ç¢¼" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "æ–°" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "未有已建立或已é¸å–的世界ï¼" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Play Game" +msgstr "玩家å稱" + +#: builtin/mainmenu/tab_local.lua +msgid "Port" +msgstr "åŸ " + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "é¸å–世界:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "伺æœå™¨åŸ " + #: builtin/mainmenu/tab_mods.lua msgid "Installed Mods:" msgstr "已安è£çš„ Mod:" @@ -383,6 +464,10 @@ msgid "Mod information:" msgstr "Mod 資訊:" #: builtin/mainmenu/tab_mods.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_mods.lua msgid "No mod description available" msgstr "找ä¸åˆ° mod æè¿°" @@ -402,95 +487,46 @@ msgstr "解除安è£å·²é¸å–çš„ mod" msgid "Uninstall selected modpack" msgstr "解除安è£å·²é¸å–çš„ mod 包" -#: builtin/mainmenu/tab_multiplayer.lua +#: builtin/mainmenu/tab_online.lua msgid "Address / Port" msgstr "地å€ï¼åŸ " -#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp -msgid "Client" -msgstr "客戶端" - -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Connect" msgstr "連線" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative mode" msgstr "å‰µé€ æ¨¡å¼" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Damage enabled" msgstr "已啟用傷害" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Del. Favorite" msgstr "刪除收è—" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Favorite" msgstr "最愛" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua msgid "Name / Password" msgstr "å稱ï¼å¯†ç¢¼" -#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "已啟用 PvP" - -#: builtin/mainmenu/tab_server.lua -msgid "Bind Address" -msgstr "ç¶å®šåœ°å€" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Configure" -msgstr "è¨å®š" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Creative Mode" -msgstr "å‰µé€ æ¨¡å¼" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Enable Damage" -msgstr "啟用傷害" - -#: builtin/mainmenu/tab_server.lua -msgid "Name/Password" -msgstr "å稱ï¼å¯†ç¢¼" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "New" -msgstr "æ–°" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "No world created or selected!" -msgstr "未有已建立或已é¸å–的世界ï¼" - -#: builtin/mainmenu/tab_server.lua -msgid "Port" -msgstr "åŸ " - -#: builtin/mainmenu/tab_server.lua -msgid "Public" -msgstr "公共" - -#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua -msgid "Select World:" -msgstr "é¸å–世界:" - -#: builtin/mainmenu/tab_server.lua -msgid "Server" -msgstr "伺æœå™¨" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "Ping" +msgstr "" -#: builtin/mainmenu/tab_server.lua -msgid "Server Port" -msgstr "伺æœå™¨åŸ " +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Play Online" +msgstr "玩家å稱" -#: builtin/mainmenu/tab_server.lua -msgid "Start Game" -msgstr "é–‹å§‹éŠæˆ²" +#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +msgid "PvP enabled" +msgstr "已啟用 PvP" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -521,6 +557,10 @@ msgid "Are you sure to reset your singleplayer world?" msgstr "您確定è¦è¦é‡ç½®æ‚¨çš„å–®äººéŠæˆ²ä¸–界嗎?" #: builtin/mainmenu/tab_settings.lua +msgid "Autosave screen size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "é›™ç·šæ€§éŽæ¿¾å™¨" @@ -597,6 +637,11 @@ msgid "Reset singleplayer world" msgstr "é‡ç½®å–®äººéŠæˆ²ä¸–界" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Screen:" +msgstr "螢幕截圖" + +#: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "è¨å®š" @@ -660,14 +705,6 @@ msgstr "主è¦" msgid "Start Singleplayer" msgstr "é–‹å§‹å–®äººéŠæˆ²" -#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp -msgid "Play" -msgstr "玩" - -#: builtin/mainmenu/tab_singleplayer.lua -msgid "Singleplayer" -msgstr "å–®äººéŠæˆ²" - #: builtin/mainmenu/tab_texturepacks.lua msgid "No information available" msgstr "ä¸æä¾›è³‡è¨Š" @@ -729,6 +766,10 @@ msgid "Player name too long." msgstr "玩家å稱太長。" #: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "æä¾›çš„世界路徑ä¸å˜åœ¨ï¼š " @@ -745,6 +786,44 @@ msgstr "" "檢視 debug.txt 以å–得更多資訊。" #: src/game.cpp +#, fuzzy +msgid "- Address: " +msgstr "ç¶å®šåœ°å€" + +#: src/game.cpp +#, fuzzy +msgid "- Creative Mode: " +msgstr "å‰µé€ æ¨¡å¼" + +#: src/game.cpp +#, fuzzy +msgid "- Damage: " +msgstr "傷害" + +#: src/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Port: " +msgstr "åŸ " + +#: src/game.cpp +#, fuzzy +msgid "- Public: " +msgstr "公共" + +#: src/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "- Server Name: " +msgstr "伺æœå™¨å稱" + +#: src/game.cpp msgid "Change Keys" msgstr "變更按éµ" @@ -761,26 +840,22 @@ msgid "Continue" msgstr "繼續" #: src/game.cpp -msgid "Creating client..." -msgstr "æ£åœ¨å»ºç«‹å®¢æˆ¶ç«¯..." - -#: src/game.cpp -msgid "Creating server..." -msgstr "æ£åœ¨å»ºç«‹ä¼ºæœå™¨..." - -#: src/game.cpp -msgid "" -"Default Controls:\n" -"- WASD: move\n" -"- Space: jump/climb\n" -"- Shift: sneak/go down\n" -"- Q: drop item\n" -"- I: inventory\n" +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb\n" +"- %s: sneak/go down\n" +"- %s: drop item\n" +"- %s: inventory\n" "- Mouse: turn/look\n" "- Mouse left: dig/punch\n" "- Mouse right: place/use\n" "- Mouse wheel: select item\n" -"- T: chat\n" +"- %s: chat\n" msgstr "" "é è¨æŽ§åˆ¶ï¼š\n" "- WASD:移動\n" @@ -795,6 +870,14 @@ msgstr "" "- T:èŠå¤©\n" #: src/game.cpp +msgid "Creating client..." +msgstr "æ£åœ¨å»ºç«‹å®¢æˆ¶ç«¯..." + +#: src/game.cpp +msgid "Creating server..." +msgstr "æ£åœ¨å»ºç«‹ä¼ºæœå™¨..." + +#: src/game.cpp msgid "" "Default Controls:\n" "No menu visible:\n" @@ -831,6 +914,20 @@ msgid "Exit to OS" msgstr "離開到作æ¥ç³»çµ±" #: src/game.cpp +msgid "Game info:" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Game paused" +msgstr "éŠæˆ²" + +#: src/game.cpp +#, fuzzy +msgid "Hosting server" +msgstr "æ£åœ¨å»ºç«‹ä¼ºæœå™¨..." + +#: src/game.cpp msgid "Item definitions..." msgstr "物å“定義..." @@ -851,24 +948,46 @@ msgid "Node definitions..." msgstr "節點定義..." #: src/game.cpp -msgid "Resolving address..." -msgstr "æ£åœ¨è§£æžåœ°å€â€¦â€¦" +msgid "Off" +msgstr "" #: src/game.cpp -msgid "Respawn" -msgstr "é‡ç”Ÿ" +msgid "On" +msgstr "" + +#: src/game.cpp +#, fuzzy +msgid "Remote server" +msgstr "é ç«¯åŸ " + +#: src/game.cpp +msgid "Resolving address..." +msgstr "æ£åœ¨è§£æžåœ°å€â€¦â€¦" #: src/game.cpp msgid "Shutting down..." msgstr "關閉..." #: src/game.cpp +msgid "Singleplayer" +msgstr "å–®äººéŠæˆ²" + +#: src/game.cpp msgid "Sound Volume" msgstr "音é‡" #: src/game.cpp -msgid "You died." -msgstr "您已經æ»äº¡ã€‚" +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 0%" +msgstr "" + +#: src/game.cpp +msgid "Volume changed to 100%" +msgstr "" #: src/game.cpp src/guiFormSpecMenu.cpp msgid "ok" @@ -903,6 +1022,10 @@ msgid "Console" msgstr "終端機" #: src/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "輕擊兩次「跳èºã€ä»¥åˆ‡æ›æˆé£›è¡Œ" @@ -915,6 +1038,11 @@ msgid "Forward" msgstr "å‰é€²" #: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Inc. volume" +msgstr "音é‡" + +#: src/guiKeyChangeMenu.cpp msgid "Inventory" msgstr "ç‰©å“æ¬„" @@ -934,6 +1062,24 @@ msgstr "按éµç¶å®šã€‚(若æ¤é¸å–®éŽ–ä½äº†ï¼Œå¾ž minetest.conf 移除相關 msgid "Left" msgstr "å·¦" +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Local command" +msgstr "èŠå¤©æŒ‡ä»¤" + +#: src/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Next item" +msgstr "下一個" + +#: src/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Print stacks" msgstr "å°å‡ºå †ç–Š" @@ -1011,38 +1157,22 @@ msgid "Apps" msgstr "應用程å¼" #: src/keycode.cpp -msgid "Attn" -msgstr "Attn" - -#: src/keycode.cpp msgid "Back" msgstr "Back" #: src/keycode.cpp -msgid "Capital" -msgstr "大寫" +msgid "Caps Lock" +msgstr "" #: src/keycode.cpp msgid "Clear" msgstr "清除" #: src/keycode.cpp -msgid "Comma" -msgstr "逗號" - -#: src/keycode.cpp msgid "Control" msgstr "Control" #: src/keycode.cpp -msgid "Convert" -msgstr "轉æ›" - -#: src/keycode.cpp -msgid "CrSel" -msgstr "CrSel" - -#: src/keycode.cpp msgid "Down" msgstr "下" @@ -1051,26 +1181,15 @@ msgid "End" msgstr "End" #: src/keycode.cpp -msgid "Erase OEF" +#, fuzzy +msgid "Erase EOF" msgstr "抹除 OEF" #: src/keycode.cpp -msgid "Escape" -msgstr "Escape" - -#: src/keycode.cpp -msgid "ExSel" -msgstr "ExSel" - -#: src/keycode.cpp msgid "Execute" msgstr "執行" #: src/keycode.cpp -msgid "Final" -msgstr "Final" - -#: src/keycode.cpp msgid "Help" msgstr "說明" @@ -1079,20 +1198,33 @@ msgid "Home" msgstr "Home" #: src/keycode.cpp -msgid "Insert" -msgstr "æ’å…¥" +#, fuzzy +msgid "IME Accept" +msgstr "接å—" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Convert" +msgstr "轉æ›" + +#: src/keycode.cpp +#, fuzzy +msgid "IME Escape" +msgstr "Escape" #: src/keycode.cpp -msgid "Junja" -msgstr "Junja" +#, fuzzy +msgid "IME Mode Change" +msgstr "模å¼è®Šæ›´" #: src/keycode.cpp -msgid "Kana" -msgstr "å‡å" +#, fuzzy +msgid "IME Nonconvert" +msgstr "ä¸è½‰æ›" #: src/keycode.cpp -msgid "Kanji" -msgstr "日文漢å—" +msgid "Insert" +msgstr "æ’å…¥" #: src/keycode.cpp msgid "Left Button" @@ -1123,22 +1255,10 @@ msgid "Middle Button" msgstr "ä¸éµ" #: src/keycode.cpp -msgid "Minus" -msgstr "減號" - -#: src/keycode.cpp -msgid "Mode Change" -msgstr "模å¼è®Šæ›´" - -#: src/keycode.cpp msgid "Next" msgstr "下一個" #: src/keycode.cpp -msgid "Nonconvert" -msgstr "ä¸è½‰æ›" - -#: src/keycode.cpp msgid "Num Lock" msgstr "Num Lock" @@ -1155,6 +1275,11 @@ msgid "Numpad -" msgstr "數å—éµ -" #: src/keycode.cpp +#, fuzzy +msgid "Numpad ." +msgstr "數å—éµ *" + +#: src/keycode.cpp msgid "Numpad /" msgstr "數å—éµ /" @@ -1203,20 +1328,12 @@ msgid "OEM Clear" msgstr "OEM 清除" #: src/keycode.cpp -msgid "PA1" -msgstr "PA1" - -#: src/keycode.cpp msgid "Pause" msgstr "æš«åœ" #: src/keycode.cpp -msgid "Period" -msgstr "å¥è™Ÿ" - -#: src/keycode.cpp -msgid "Plus" -msgstr "åŠ è™Ÿ" +msgid "Play" +msgstr "玩" #: src/keycode.cpp msgid "Print" @@ -1320,6 +1437,20 @@ msgid "3D mode" msgstr "3D 模å¼" #: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "3D support.\n" "Currently supported:\n" @@ -1394,14 +1525,20 @@ msgstr "" "注æ„在主é¸å–®ä¸çš„åœ°å€æ¬„會覆寫這個è¨å®šã€‚" #: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "調整您螢幕的 DPI è¨å®šï¼ˆä¸¦ä¸åªæœ‰ X11/Android)例如 4K 螢幕。" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n" +"Adjust the gamma encoding for the light tables. Higher numbers are " +"brighter.\n" "This setting is for the client only and is ignored by the server." msgstr "" "調整亮度表的伽瑪編碼。較低的數值會較亮。\n" @@ -1428,6 +1565,12 @@ msgid "Amplifies the valleys" msgstr "放大山谷" #: src/settings_translation_file.cpp +msgid "" +"Android systems only: Tries to create inventory textures from meshes\n" +"when no supported render was found." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "å„å‘ç•°æ€§éŽæ¿¾" @@ -1445,6 +1588,10 @@ msgstr "" "若您想è¦å…¬ä½ˆæ‚¨çš„ IPv6 地å€ï¼Œä½¿ç”¨ serverlist_url = v6.servers.minetest.net。" #: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Approximate (X,Y,Z) scale of fractal in nodes." msgstr "大約 (X,Y,Z) çš„ç¯€é»žç¢Žå½¢è¦æ¨¡ã€‚" @@ -1453,6 +1600,19 @@ msgid "Ask to reconnect after crash" msgstr "è©¢å•æ˜¯å¦åœ¨ç•¶æ©Ÿå¾Œé‡æ–°é€£ç·š" #: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible rendering glitches.\n" +"(some blocks will not be rendered under water and in caves, as well as " +"sometimes on land)\n" +"Setting this to a value greater than max_block_send_distance disables this " +"optimization.\n" +"Stated in mapblocks (16 nodes)" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automaticaly report to the serverlist." msgstr "è‡ªå‹•å›žå ±åˆ°ä¼ºæœå™¨åˆ—表。" @@ -1477,6 +1637,14 @@ msgid "Basic Privileges" msgstr "基礎特權" #: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bilinear filtering" msgstr "é›™ç·šæ€§éŽæ¿¾å™¨" @@ -1485,6 +1653,16 @@ msgid "Bind address" msgstr "ç¶å®šåœ°å€" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome API temperature and humidity noise parameters" +msgstr "Mapgen v6 濕度 噪音 åƒæ•¸" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Biome noise" +msgstr "æ²³æµå™ªéŸ³" + +#: src/settings_translation_file.cpp msgid "Bits per pixel (aka color depth) in fullscreen mode." msgstr "全螢幕模å¼ä¸çš„ä½å…ƒï¼åƒç´ (åˆç¨±è‰²å½©æ·±åº¦ï¼‰ã€‚" @@ -1513,6 +1691,11 @@ msgid "Camera update toggle key" msgstr "æ”å½±æ©Ÿåˆ‡æ›æ›´æ–°æŒ‰éµ" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp msgid "Cave noise #1" msgstr "洞穴噪音 #1" @@ -1525,6 +1708,35 @@ msgid "Cave width" msgstr "洞穴寬度" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave1 noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cave2 noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern limit" +msgstr "洞穴寬度" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Cavern threshold" +msgstr "Mapgen flat 山丘閾值" + +#: src/settings_translation_file.cpp msgid "Caves and tunnels form at the intersection of the two noises" msgstr "洞穴與隧é“å½¢æˆå…©ç¨®å™ªéŸ³çš„交集" @@ -1599,10 +1811,19 @@ msgid "Clean transparent textures" msgstr "æ¸…é™¤é€æ˜Žæè³ª" #: src/settings_translation_file.cpp +msgid "Client" +msgstr "客戶端" + +#: src/settings_translation_file.cpp msgid "Client and Server" msgstr "客戶端與伺æœå™¨" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Client modding" +msgstr "客戶端" + +#: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "攀爬速度" @@ -1671,6 +1892,11 @@ msgid "Console color" msgstr "終端機é¡è‰²" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Console height" +msgstr "終端機按éµ" + +#: src/settings_translation_file.cpp msgid "Console key" msgstr "終端機按éµ" @@ -1696,14 +1922,6 @@ msgstr "" "範例:72 = 20分é˜ï¼Œ360 = 4分é˜ï¼Œ1 = 24å°æ™‚,0 = æ—¥ï¼å¤œï¼ä¸€åˆ‡ä¿æŒä¸è®Šã€‚" #: src/settings_translation_file.cpp -msgid "" -"Controls size of deserts and beaches in Mapgen v6.\n" -"When snowbiomes are enabled 'mgv6_freq_desert' is ignored." -msgstr "" -"控制在 Mapgen v6 ä¸çš„æ²™æ¼ 與沙ç˜å¤§å°ã€‚\n" -"ç•¶ snowbiomes 啟用時「mgv6_freq_desertã€æœƒè¢«å¿½ç•¥ã€‚" - -#: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." msgstr "æŽ§åˆ¶æ¹–æ³Šçªªåœ°çš„é™¡åº¦ï¼æ·±åº¦ã€‚" @@ -1712,6 +1930,12 @@ msgid "Controls steepness/height of hills." msgstr "æŽ§åˆ¶å±±ä¸˜çš„é™¡åº¦ï¼æ·±åº¦ã€‚" #: src/settings_translation_file.cpp +msgid "" +"Controls the density of floatland mountain terrain.\n" +"Is an offset added to the 'np_mountain' noise value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Controls width of tunnels, a smaller value creates wider tunnels." msgstr "控制隧é“的寬度,較å°çš„å€¼æœƒå‰µé€ å‡ºè¼ƒå¯¬çš„éš§é“。" @@ -1736,6 +1960,11 @@ msgstr "" "這些會讓挖礦變得困難。è¨ç‚ºé›¶ä»¥åœç”¨ã€‚ (0-10)" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Creative" +msgstr "建立" + +#: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "åå— alpha 值" @@ -1772,6 +2001,11 @@ msgid "Debug log level" msgstr "除錯記錄ç‰ç´š" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Dec. volume key" +msgstr "HUD 切æ›éµ" + +#: src/settings_translation_file.cpp msgid "Dedicated server step" msgstr "專用伺æœå™¨æ¥é©Ÿ" @@ -1812,6 +2046,41 @@ msgstr "" "åªæœƒåœ¨èˆ‡ cURL 一åŒç·¨è¯çš„æƒ…æ³ä¸‹æ‰æœƒæœ‰å½±éŸ¿ã€‚" #: src/settings_translation_file.cpp +msgid "Defines areas of 'terrain_higher' (cliff-top terrain)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of floatland smooth terrain.\n" +"Smooth floatlands occur when noise > 0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Defines areas of higher (cliff-top) terrain and affects steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Defines sampling step of texture.\n" "A higher value results in smoother normal maps." @@ -1824,6 +2093,16 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "定義玩家最大å¯å‚³é€çš„è·é›¢ï¼Œä»¥æ–¹å¡Šè¨ˆï¼ˆ0 = ä¸é™åˆ¶ï¼‰ã€‚" #: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Delay between mesh updates on the client in ms. Increasing this will slow\n" +"down the rate of mesh updates, thus reducing jitter on slower clients." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" msgstr "å»ºé€ åŽç™¼é€å€å¡Šå‰å»¶é²çš„æ™‚é–“" @@ -1854,18 +2133,23 @@ msgid "" msgstr "伺æœå™¨çš„æè¿°ï¼Œæœƒåœ¨çŽ©å®¶åŠ å…¥æ™‚é¡¯ç¤ºï¼Œä¹Ÿæœƒé¡¯ç¤ºåœ¨ä¼ºæœå™¨åˆ—表上。" #: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "ç•°æ¥åŒ–方塊動畫" +msgid "Desert noise threshold" +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Determines terrain shape.\n" -"The 3 numbers in brackets control the scale of the\n" -"terrain, the 3 numbers should be identical." +"Deserts occur when np_biome exceeds this value.\n" +"When the new biome system is enabled, this is ignored." msgstr "" -"決定地形的形狀。\n" -"在括號ä¸çš„ 3 å€‹æ•¸å—æŽ§åˆ¶è‘—\n" -"åœ°å½¢çš„è¦æ¨¡ï¼Œé‚£ä¸‰å€‹æ•¸å—æ‡‰è©²è¦æ˜¯ç›¸åŒçš„。" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "ç•°æ¥åŒ–方塊動畫" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Digging particles" +msgstr "ç²’å" #: src/settings_translation_file.cpp msgid "Disable anticheat" @@ -1915,10 +2199,24 @@ msgid "Enable Joysticks" msgstr "å•Ÿç”¨æ–æ¡¿" #: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable VBO" msgstr "啟用 VBO" #: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for new created maps." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod security" msgstr "啟用 mod 安全性" @@ -1962,6 +2260,19 @@ msgstr "" "顯著較快的下載媒體(如æè³ªï¼‰çš„æ–¹å¼ã€‚" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Enable view bobbing" +msgstr "視野晃動" + +#: src/settings_translation_file.cpp +msgid "" +"Enable view bobbing and amount of view bobbing.\n" +"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." +msgstr "" +"è¦–é‡Žæ™ƒå‹•çš„å€æ•¸ã€‚\n" +"舉例來說:è¨ç‚º 0 就䏿œƒæœ‰è¦–野晃動;1.0 是一般情æ³ï¼›2.0 為雙å€ã€‚" + +#: src/settings_translation_file.cpp msgid "" "Enable/disable running an IPv6 server. An IPv6 server may be restricted\n" "to IPv6 clients, depending on system configuration.\n" @@ -2015,6 +2326,10 @@ msgstr "" "å¿…é ˆå•Ÿç”¨è‘—è‰²å™¨ã€‚" #: src/settings_translation_file.cpp +msgid "Enables view bobbing when walking." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "引擎性能資料å°å‡ºé–“éš”" @@ -2039,7 +2354,12 @@ msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -msgid "Fall bobbing" +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Fall bobbing factor" msgstr "墜è½ä¸Šä¸‹ç§»å‹•" #: src/settings_translation_file.cpp @@ -2114,6 +2434,11 @@ msgid "Filler Depth" msgstr "填充深度" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Filler depth noise" +msgstr "填充深度" + +#: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "é›»å½±è‰²èª¿æ˜ å°„" @@ -2134,10 +2459,35 @@ msgid "Filtering" msgstr "éŽæ¿¾å™¨" #: src/settings_translation_file.cpp +msgid "First of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "固定的地圖種å" #: src/settings_translation_file.cpp +msgid "Floatland base height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland base noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Floatland level" +msgstr "æ°´ä½" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland mountain height" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fly key" msgstr "飛行按éµ" @@ -2150,6 +2500,10 @@ msgid "Fog" msgstr "霧" #: src/settings_translation_file.cpp +msgid "Fog Start" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "霧切æ›éµ" @@ -2186,6 +2540,14 @@ msgid "Forward key" msgstr "å‰é€²éµ" #: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Freetype fonts" msgstr "Freetype å—åž‹" @@ -2269,10 +2631,19 @@ msgid "Gravity" msgstr "é‡åŠ›" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ground level" +msgstr "Mapgen flat 地é¢" + +#: src/settings_translation_file.cpp msgid "HTTP Mods" msgstr "HTTP Mod" #: src/settings_translation_file.cpp +msgid "HUD scale factor" +msgstr "" + +#: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "HUD 切æ›éµ" @@ -2302,22 +2673,60 @@ msgstr "" "* 採樣工具會被用於更新統計。" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat blend noise" +msgstr "Mapgen 熱 æ··åˆ å™ªéŸ³ åƒæ•¸" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Heat noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp msgid "Height component of the initial window size." msgstr "åˆå§‹è¦–窗大å°çš„高度組件。" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height noise" +msgstr "峿–¹è¦–窗" + +#: src/settings_translation_file.cpp msgid "Height on which clouds are appearing." msgstr "雲朵è¦å‡ºç¾çš„高度。" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Height select noise" +msgstr "Mapgen v6 高度 鏿“‡ 噪音 åƒæ•¸" + +#: src/settings_translation_file.cpp msgid "High-precision FPU" msgstr "高精度 FPU" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill steepness" +msgstr "Mapgen flat 山丘å¡åº¦" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Hill threshold" +msgstr "Mapgen flat 山丘閾值" + +#: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "伺æœå™¨çš„首é ,會在伺æœå™¨æ¸…å–®ä¸é¡¯ç¤ºã€‚" #: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "How deep to make rivers" msgstr "æ²³æµå¤šæ·±" @@ -2343,6 +2752,18 @@ msgid "How wide to make rivers" msgstr "æ²³æµå¤šå¯¬" #: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "IPv6" msgstr "IPv6" @@ -2370,6 +2791,15 @@ msgstr "è‹¥åœç”¨ï¼Œåœ¨é£›è¡Œèˆ‡å¿«é€Ÿæ¨¡å¼çš†å•Ÿç”¨æ™‚,「使用ã€éµå°‡ç”¨ #: src/settings_translation_file.cpp msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "If enabled together with fly mode, player is able to fly through solid " "nodes.\n" "This requires the \"noclip\" privilege on the server." @@ -2408,6 +2838,11 @@ msgid "If enabled, new players cannot join with an empty password." msgstr "è‹¥å•Ÿç”¨ï¼Œæ–°çŽ©å®¶å°‡ç„¡æ³•ä»¥ç©ºå¯†ç¢¼åŠ å…¥ã€‚" #: src/settings_translation_file.cpp +#, fuzzy +msgid "If enabled, show the server status message on player connection." +msgstr "æ¯æ—¥è¨Šæ¯æœƒåœ¨çŽ©å®¶é€£ç·šæ™‚é¡¯ç¤ºã€‚" + +#: src/settings_translation_file.cpp msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" @@ -2437,6 +2872,16 @@ msgid "In-game chat console background color (R,G,B)." msgstr "éŠæˆ²å…§èŠå¤©è¦–窗背景é¡è‰² (R,G,B)。" #: src/settings_translation_file.cpp +#, fuzzy +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "éŠæˆ²å…§èŠå¤©è¦–窗背景 alpha 值(ä¸é€æ˜Žåº¦ï¼Œä»‹æ–¼ 0 到 255 間)。" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Inc. volume key" +msgstr "終端機按éµ" + +#: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" @@ -2483,6 +2928,11 @@ msgid "Interval of sending time of day to clients." msgstr "發é€ç•¶æ—¥æ™‚間至客戶端的間隔。" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Inventory image hack" +msgstr "ç‰©å“æ¬„按éµ" + +#: src/settings_translation_file.cpp msgid "Inventory items animations" msgstr "ç‰©å“æ¬„物å“å‹•ç•«" @@ -2503,6 +2953,11 @@ msgid "Item entity TTL" msgstr "物å“主體 TTL" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Iterations" +msgstr "儀表" + +#: src/settings_translation_file.cpp msgid "" "Iterations of the recursive function.\n" "Controls the amount of fine detail." @@ -2511,6 +2966,14 @@ msgstr "" "控制細節的å“質。" #: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick Type" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "æ–æ¡¿æŒ‰éˆ•é‡è¦†é–“éš”" @@ -2560,6 +3023,22 @@ msgstr "" "範åœç´„在 -2 至 2 間。" #: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Jump key" msgstr "è·³èºéµ" @@ -2578,6 +3057,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"é™ä½Žè¦–野範åœçš„æŒ‰éµã€‚\n" +"請見 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2598,6 +3088,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"å¢žåŠ è¦–é‡Žç¯„åœçš„æŒ‰éµã€‚\n" +"請見 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for jumping.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2658,6 +3159,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"è·³èºçš„æŒ‰éµã€‚\n" +"請見 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2678,6 +3190,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"開啟å°è©±è¦–窗以供輸入指令的按éµã€‚\n" +"請見 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for opening the chat window.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2708,6 +3231,28 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"é–‹å•Ÿç‰©å“æ¬„的按éµã€‚\n" +"請見 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"é–‹å•Ÿç‰©å“æ¬„的按éµã€‚\n" +"請見 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for sneaking.\n" "Also used for climbing down and descending in water if aux1_descends is " @@ -2851,6 +3396,17 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"切æ›é¡¯ç¤ºèŠå¤©çš„æŒ‰éµã€‚\n" +"請見 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for toggling the display of the profiler. Used for development.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -2871,10 +3427,31 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"è·³èºçš„æŒ‰éµã€‚\n" +"請見 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "Key use for climbing/descending" msgstr "用於攀爬ï¼ä¸‹é™çš„æŒ‰éµ" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake steepness" +msgstr "Mapgen flat 湖泊å¡åº¦" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lake threshold" +msgstr "Mapgen flat 湖泊閾值" + +#: src/settings_translation_file.cpp msgid "Language" msgstr "語言" @@ -2883,6 +3460,11 @@ msgid "Large cave depth" msgstr "大型洞穴深度" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Large chat console key" +msgstr "終端機按éµ" + +#: src/settings_translation_file.cpp msgid "Lava Features" msgstr "岩漿功能" @@ -2950,6 +3532,13 @@ msgstr "è¦ç”Ÿæˆçš„出ç¾ä½‡åˆ—çš„é™åˆ¶" #: src/settings_translation_file.cpp msgid "" +"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" +"Only mapchunks completely within the mapgen limit are generated.\n" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "Limits number of parallel HTTP requests. Affects:\n" "- Media fetch if server uses remote_media setting.\n" "- Serverlist download and server announcement.\n" @@ -3030,6 +3619,10 @@ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgstr "讓 DirectX 與 LuaJIT 一åŒé‹ä½œã€‚è‹¥å…¶é€ æˆéº»ç…©å‰‡è«‹åœç”¨ã€‚" #: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Map directory" msgstr "地圖目錄" @@ -3066,10 +3659,25 @@ msgstr "" "以「noã€é–‹é 的旗標å—串將會用於明確的åœç”¨å®ƒå€‘。" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Map generation attributes specific to Mapgen v5.\n" +"Flags that are not specified in the flag string are not modified from the " +"default.\n" +"Flags starting with 'no' are used to explicitly disable them." +msgstr "" +"專用於 Mapgen v7 的地圖生æˆå±¬æ€§ã€‚\n" +"「ridgesã€ç‚ºæ²³æµã€‚\n" +"未在旗標å—䏲䏿Œ‡å®šçš„æ——æ¨™å°‡ä¸æœƒè‡ªé è¨å€¼ä¿®æ”¹ã€‚\n" +"以「noã€é–‹é 的旗標å—串將會用於明確的åœç”¨å®ƒå€‘。" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" -"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' " -"flag is ignored.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the new biome system is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3080,9 +3688,11 @@ msgstr "" "以「noã€é–‹é 的旗標å—串將會用於明確的åœç”¨å®ƒå€‘。" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" -"The 'ridges' flag controls the rivers.\n" +"The 'ridges' flag enables the rivers.\n" +"Floatlands are currently experimental and subject to change.\n" "Flags that are not specified in the flag string are not modified from the " "default.\n" "Flags starting with 'no' are used to explicitly disable them." @@ -3105,24 +3715,21 @@ msgid "Mapblock limit" msgstr "地圖å€å¡Šé™åˆ¶" #: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "地圖å€å¡Šå¸é™¤é€¾æ™‚" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Mapgen 山谷" +#, fuzzy +msgid "Mapblock mesh generation delay" +msgstr "地圖生æˆé™åˆ¶" #: src/settings_translation_file.cpp -msgid "Mapgen biome heat noise parameters" -msgstr "Mapgen ç”Ÿç‰©ç¾¤è½ ç†± 噪音 åƒæ•¸" +msgid "Mapblock mesh generator's MapBlock cache size MB" +msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity blend noise parameters" -msgstr "Mapgen ç”Ÿç‰©ç¾¤è½ æ¿•åº¦ æ··åˆ å™ªéŸ³ åƒæ•¸" +msgid "Mapblock unload timeout" +msgstr "地圖å€å¡Šå¸é™¤é€¾æ™‚" #: src/settings_translation_file.cpp -msgid "Mapgen biome humidity noise parameters" -msgstr "Mapgen ç”Ÿç‰©ç¾¤è½ æ¿•åº¦ 噪音 åƒæ•¸" +msgid "Mapgen Valleys" +msgstr "Mapgen 山谷" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -3137,118 +3744,15 @@ msgid "Mapgen flat" msgstr "Mapgen flat" #: src/settings_translation_file.cpp -msgid "Mapgen flat cave width" -msgstr "Mapgen flat 洞穴寬度" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave1 noise parameters" -msgstr "Mapgen flat æ´žç©´1 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat cave2 noise parameters" -msgstr "Mapgen flat æ´žç©´2 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat filler depth noise parameters" -msgstr "Mapgen flat 填充器 深度 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat flags" +#, fuzzy +msgid "Mapgen flat specific flags" msgstr "Mapgen flat 旗標" #: src/settings_translation_file.cpp -msgid "Mapgen flat ground level" -msgstr "Mapgen flat 地é¢" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill steepness" -msgstr "Mapgen flat 山丘å¡åº¦" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat hill threshold" -msgstr "Mapgen flat 山丘閾值" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake steepness" -msgstr "Mapgen flat 湖泊å¡åº¦" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat lake threshold" -msgstr "Mapgen flat 湖泊閾值" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat large cave depth" -msgstr "Mapgen flat 大型洞穴深度" - -#: src/settings_translation_file.cpp -msgid "Mapgen flat terrain noise parameters" -msgstr "Mapgen flat 地形 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp msgid "Mapgen fractal" msgstr "地圖產生器分形" #: src/settings_translation_file.cpp -msgid "Mapgen fractal cave width" -msgstr "Mapgen 分形洞穴寬度" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave1 noise parameters" -msgstr "Mapgen fractal æ´žç©´1 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal cave2 noise parameters" -msgstr "Mapgen fractal æ´žç©´2 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal filler depth noise parameters" -msgstr "Mapgen fractal 填充器 深度 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal fractal" -msgstr "Mapgen fractal fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal iterations" -msgstr "Mapgen fractal è¿ä»£" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia w" -msgstr "Mapgen fractal 朱利亞 w" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia x" -msgstr "Mapgen fractal 朱利亞 x" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia y" -msgstr "Mapgen fractal 朱利亞 y" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal julia z" -msgstr "Mapgen fractal 朱利亞 z" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal offset" -msgstr "Mapgen fractal åç§»" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal scale" -msgstr "Mapgen fractal è¦æ¨¡" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal seabed noise parameters" -msgstr "Mapgen fractal 海床 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen fractal slice w" -msgstr "Mapgen fractal slice w" - -#: src/settings_translation_file.cpp -msgid "Mapgen heat blend noise parameters" -msgstr "Mapgen 熱 æ··åˆ å™ªéŸ³ åƒæ•¸" - -#: src/settings_translation_file.cpp msgid "Mapgen name" msgstr "Mapgen å稱" @@ -3257,146 +3761,29 @@ msgid "Mapgen v5" msgstr "Mapgen v5" #: src/settings_translation_file.cpp -msgid "Mapgen v5 cave width" -msgstr "Mapgen v5 洞穴寬度" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave1 noise parameters" -msgstr "Mapgen v5 æ´žç©´1 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 cave2 noise parameters" -msgstr "Mapgen v5 æ´žç©´2 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 factor noise parameters" -msgstr "Mapgen v5 å› å 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 filler depth noise parameters" -msgstr "Mapgen v5 填充器 深度 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v5 height noise parameters" -msgstr "Mapgen v5 高度 噪音 åƒæ•¸" +#, fuzzy +msgid "Mapgen v5 specific flags" +msgstr "Mapgen v6 旗標" #: src/settings_translation_file.cpp msgid "Mapgen v6" msgstr "Mapgen v6" #: src/settings_translation_file.cpp -msgid "Mapgen v6 apple trees noise parameters" -msgstr "Mapgen v6 蘋果樹 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach frequency" -msgstr "Mapgen v6 æµ·ç˜é »çއ" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 beach noise parameters" -msgstr "Mapgen v6 æµ·ç˜ å™ªéŸ³ åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 biome noise parameters" -msgstr "Mapgen v6 ç”Ÿç‰©ç¾¤è½ å™ªéŸ³ åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 cave noise parameters" -msgstr "Mapgen v6 æ´žç©´ 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 desert frequency" -msgstr "Mapgen v6 æ²™æ¼ é »çŽ‡" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 flags" +#, fuzzy +msgid "Mapgen v6 specific flags" msgstr "Mapgen v6 旗標" #: src/settings_translation_file.cpp -msgid "Mapgen v6 height select noise parameters" -msgstr "Mapgen v6 高度 鏿“‡ 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 humidity noise parameters" -msgstr "Mapgen v6 濕度 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 mud noise parameters" -msgstr "Mapgen v6 泥土 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 steepness noise parameters" -msgstr "Mapgen v6 å¡åº¦ 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain altitude noise parameters" -msgstr "Mapgen v6 地形 æµ·æ‹” 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 terrain base noise parameters" -msgstr "Mapgen v6 地形 基礎 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v6 trees noise parameters" -msgstr "Mapgen v6 樹 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp msgid "Mapgen v7" msgstr "地圖產生器 v7" #: src/settings_translation_file.cpp -msgid "Mapgen v7 cave width" -msgstr "Mapgen v7 洞穴寬度" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave1 noise parameters" -msgstr "Mapgen v7 æ´žç©´1 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 cave2 noise parameters" -msgstr "Mapgen v7 æ´žç©´2 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 filler depth noise parameters" -msgstr "Mapgen v7 填充器 深度 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 flags" +#, fuzzy +msgid "Mapgen v7 specific flags" msgstr "Mapgen v7 旗標" #: src/settings_translation_file.cpp -msgid "Mapgen v7 height select noise parameters" -msgstr "Mapgen v7 高度 鏿“‡ 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mount height noise parameters" -msgstr "Mapgen v7 å騎 高度 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 mountain noise parameters" -msgstr "Mapgen v7 å±± 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge noise parameters" -msgstr "Mapgen v7 ridge 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 ridge water noise parameters" -msgstr "Mapgen v7 ridge æ°´ 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain altitude noise parameters" -msgstr "Mapgen v7 地形 æµ·æ‹” 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain base noise parameters" -msgstr "Mapgen v7 地形 基礎 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp -msgid "Mapgen v7 terrain persistation noise parameters" -msgstr "Mapgen v7 地形 æŒä¹… 噪音 åƒæ•¸" - -#: src/settings_translation_file.cpp msgid "Massive cave depth" msgstr "å¤§è¦æ¨¡æ´žç©´æ·±åº¦" @@ -3571,6 +3958,10 @@ msgid "Mipmapping" msgstr "æ˜ å°„è²¼åœ–" #: src/settings_translation_file.cpp +msgid "Modifies the size of the hudbar elements." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Modstore details URL" msgstr "Modstore 詳細資訊 URL" @@ -3591,6 +3982,15 @@ msgid "Monospace font size" msgstr "ç‰å¯¬å—型大å°" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Mountain height noise" +msgstr "Mapgen v7 å騎 高度 噪音 åƒæ•¸" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Mouse sensitivity" msgstr "æ»‘é¼ éˆæ•度" @@ -3599,6 +3999,10 @@ msgid "Mouse sensitivity multiplier." msgstr "æ»‘é¼ éˆæ•åº¦å€æ•¸ã€‚" #: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." @@ -3607,12 +4011,9 @@ msgstr "" "舉例來說:è¨ç‚º 0 就䏿œƒæœ‰è¦–野晃動;1.0 是一般情æ³ï¼›2.0 為雙å€ã€‚" #: src/settings_translation_file.cpp -msgid "" -"Multiplier for view bobbing.\n" -"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." -msgstr "" -"è¦–é‡Žæ™ƒå‹•çš„å€æ•¸ã€‚\n" -"舉例來說:è¨ç‚º 0 就䏿œƒæœ‰è¦–野晃動;1.0 是一般情æ³ï¼›2.0 為雙å€ã€‚" +#, fuzzy +msgid "Mute key" +msgstr "使用按éµ" #: src/settings_translation_file.cpp msgid "" @@ -3670,10 +4071,6 @@ msgid "NodeTimer interval" msgstr "NodeTimer é–“éš”" #: src/settings_translation_file.cpp -msgid "Noise parameters for biome API temperature, humidity and biome blend." -msgstr "å™ªéŸ³åƒæ•¸ä¾›ç”Ÿç‰©ç¾¤è½ API æº«åº¦ã€æ¿•度與生物混åˆä½¿ç”¨ã€‚" - -#: src/settings_translation_file.cpp msgid "Noises" msgstr "噪音" @@ -3716,6 +4113,14 @@ msgid "Number of parallax occlusion iterations." msgstr "視差é®è”½è¿ä»£æ¬¡æ•¸ã€‚" #: src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Overall bias of parallax occlusion effect, usually scale/2." msgstr "視差é®è”½æ•ˆæžœçš„總åå·®ï¼Œé€šå¸¸æ˜¯è¦æ¨¡/2。" @@ -3756,6 +4161,12 @@ msgid "Path to save screenshots at." msgstr "儲å˜èž¢å¹•截圖的路徑。" #: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Path to texture directory. All textures are first searched from here." msgstr "æè³ªç›®éŒ„的路徑。所有æè³ªéƒ½æœƒå…ˆå¾žé€™è£¡æœå°‹ã€‚" @@ -3855,6 +4266,15 @@ msgid "Report path" msgstr "å ±å‘Šè·¯å¾‘" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Ridge noise" +msgstr "æ²³æµå™ªéŸ³" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Right key" msgstr "å³éµ" @@ -3887,6 +4307,10 @@ msgid "Round minimap" msgstr "圓形å°åœ°åœ–" #: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." msgstr "ç”±å®¢æˆ¶ç«¯å„²å˜æŽ¥æ”¶åˆ°çš„åœ°åœ–åˆ°ç£ç¢Ÿä¸Šã€‚" @@ -3895,6 +4319,10 @@ msgid "Saving map received from server" msgstr "儲å˜å¾žä¼ºæœå™¨æŽ¥æ”¶åˆ°çš„地圖" #: src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: src/settings_translation_file.cpp msgid "" "Scale gui by a user specified value.\n" "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" @@ -3943,6 +4371,15 @@ msgstr "" "使用 0 來使用é è¨å“質。" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Seabed noise" +msgstr "洞穴噪音 #1" + +#: src/settings_translation_file.cpp +msgid "Second of 2 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Security" msgstr "安全" @@ -3987,6 +4424,10 @@ msgid "Server port" msgstr "伺æœå™¨åŸ " #: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "伺æœå™¨æ¸…å–® URL" @@ -4027,15 +4468,26 @@ msgstr "" "å¿…é ˆåŒæ™‚啟用著色器。" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shader path" +msgstr "著色器" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video cards.\n" -"Thy only work with the OpenGL video backend." +"This only works with the OpenGL video backend." msgstr "" "著色器讓您å¯ä»¥æœ‰é€²éšŽè¦–覺效果並å¯èƒ½æœƒåœ¨æŸäº›é¡¯ç¤ºå¡ä¸Šå¢žå¼·æ•ˆèƒ½ã€‚\n" "這僅在 OpenGL 視訊後端上æ‰èƒ½é‹ä½œã€‚" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow limit" +msgstr "地圖å€å¡Šé™åˆ¶" + +#: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." msgstr "è¿·ä½ åœ°åœ–çš„å½¢ç‹€ã€‚å•Ÿç”¨ = 圓形,åœç”¨ = 方形。" @@ -4058,10 +4510,29 @@ msgid "" msgstr "è¦ç”± mapgen 生æˆçš„å€å¡Šå¤§å°ï¼Œä»¥åœ°åœ–å€å¡Šï¼ˆ16 個節電)。" #: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights" msgstr "å¡åº¦èˆ‡å¡«å……一åŒé‹ä½œä¾†ä¿®æ”¹é«˜åº¦" #: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Smooth lighting" msgstr "平滑光" @@ -4106,6 +4577,14 @@ msgid "Static spawnpoint" msgstr "éœæ…‹é‡ç”Ÿé»ž" #: src/settings_translation_file.cpp +msgid "Status message on connection" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Strength of generated normalmaps." msgstr "生æˆä¹‹ä¸€èˆ¬åœ°åœ–的強度。" @@ -4126,10 +4605,33 @@ msgid "Synchronous SQLite" msgstr "åŒæ¥çš„ SQLite" #: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Terrain Height" msgstr "地形高度" #: src/settings_translation_file.cpp +msgid "Terrain alt noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain base noise" +msgstr "地形高度" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain higher noise" +msgstr "地形高度" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Terrain noise" +msgstr "地形高度" + +#: src/settings_translation_file.cpp msgid "" "Terrain noise threshold for hills.\n" "Controls proportion of world area covered by hills.\n" @@ -4150,6 +4652,10 @@ msgstr "" "å¾€ 0.0 調整一å–得較大的比例。" #: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Texture path" msgstr "æè³ªè·¯å¾‘" @@ -4170,12 +4676,16 @@ msgid "The depth of dirt or other filler" msgstr "塵土或其他填充物的深度" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"The file path relative to your worldpath in which profiles will be saved " -"to.\n" +"The file path relative to your worldpath in which profiles will be saved to." msgstr "è¨å®šæª”將會被儲å˜åˆ°çš„ï¼Œç›¸å°æ–¼æ‚¨çš„全域路徑的檔案路徑。\n" #: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp msgid "The network interface that the server listens on." msgstr "伺æœå™¨è¦ç›£è½çš„網路介é¢ã€‚" @@ -4236,6 +4746,10 @@ msgid "" msgstr "ç•¶æŒ‰ä½æ»‘é¼ å³éµæ™‚,é‡è¦†å³éµé»žé¸çš„間隔以秒計。" #: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp msgid "This font will be used for certain languages." msgstr "這個å—型將會被用於特定的語言。" @@ -4282,6 +4796,10 @@ msgid "Tooltip delay" msgstr "工具æç¤ºå»¶é²" #: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "ä¸‰ç·šæ€§éŽæ¿¾å™¨" @@ -4300,10 +4818,28 @@ msgid "Trusted mods" msgstr "信任的 mod" #: src/settings_translation_file.cpp +msgid "" +"Typical maximum height, above and below midpoint, of floatland mountain " +"terrain." +msgstr "" + +#: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "æœƒåœ¨å¤šäººéŠæˆ²åˆ†é ä¸é¡¯ç¤ºçš„伺æœå™¨æ¸…單的 URL。" #: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give significant performance boost at the cost of less detailed " +"image." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" msgstr "ä¸é™åˆ¶çީ家傳é€è·é›¢" @@ -4368,6 +4904,43 @@ msgid "Valleys C Flags" msgstr "山谷 C 旗標" #: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of hill height and lake depth on floatland smooth terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Varies steepness of cliffs." +msgstr "æŽ§åˆ¶å±±ä¸˜çš„é™¡åº¦ï¼æ·±åº¦ã€‚" + +#: src/settings_translation_file.cpp msgid "Vertical screen synchronization." msgstr "åž‚ç›´èž¢å¹•åŒæ¥ã€‚" @@ -4376,13 +4949,13 @@ msgid "Video driver" msgstr "顯示å¡é©…動程å¼" #: src/settings_translation_file.cpp -msgid "View bobbing" +#, fuzzy +msgid "View bobbing factor" msgstr "視野晃動" #: src/settings_translation_file.cpp -msgid "" -"View distance in nodes.\n" -"Min = 20" +#, fuzzy +msgid "View distance in nodes." msgstr "" "以節點數計算的視野è·é›¢ã€‚\n" "最å°å€¼ = 20" @@ -4396,6 +4969,10 @@ msgid "View range increase key" msgstr "å¢žåŠ è¦–é‡Žçš„æŒ‰éµ" #: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Viewing range" msgstr "視野" @@ -4501,22 +5078,6 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Where the map generator stops.\n" -"Please note:\n" -"- Limited to 31000 (setting above has no effect)\n" -"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n" -"- Those groups have an offset of -32, -32 nodes from the origin.\n" -"- Only groups which are within the map_generation_limit are generated" -msgstr "" -"地圖產生器è¦åœ¨å“ªè£¡åœæ¢ã€‚\n" -"請注æ„:\n" -"- é™åˆ¶ç‚º 31000(上é¢çš„è¨å®šæ²’有影響)\n" -"- 地圖產生器以 80x80x80 個節點為一組的方å¼é‹ä½œï¼ˆ5x5x5 地圖å€å¡Šï¼‰ã€‚\n" -"- 這些群組有 -32 çš„å移,從原點åç§» -32 節點。\n" -"- åªæœ‰åœ¨ map_generation_limit 內的群組會被生æˆ" - -#: src/settings_translation_file.cpp -msgid "" "Whether freetype fonts are used, requires freetype support to be compiled in." msgstr "是å¦ä½¿ç”¨ freetype å—型,需è¦å°‡ freetype 支æ´ç·¨è¯é€²ä¾†ã€‚" @@ -4575,6 +5136,13 @@ msgstr "é¸å–框在節點周邊的é¸å–框線。" #: src/settings_translation_file.cpp msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" @@ -4590,6 +5158,43 @@ msgid "Y of upper limit of large pseudorandom caves." msgstr "大型å½éš¨æ©Ÿæ´žç©´çš„ Y 上é™ã€‚" #: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of floatland midpoint and lake surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher (cliff-top) terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and lakebeds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level to which floatland shadows extend." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "block send optimize distance" +msgstr "最大å€å¡Šå‚³é€è·é›¢" + +#: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "cURL 檔案下載逾時" @@ -4601,6 +5206,237 @@ msgstr "cURL 並行é™åˆ¶" msgid "cURL timeout" msgstr "cURL 逾時" +#~ msgid "Hide mp content" +#~ msgstr "éš±è— mp 內容" + +#~ msgid "Attn" +#~ msgstr "Attn" + +#~ msgid "Capital" +#~ msgstr "大寫" + +#~ msgid "Comma" +#~ msgstr "逗號" + +#~ msgid "CrSel" +#~ msgstr "CrSel" + +#~ msgid "ExSel" +#~ msgstr "ExSel" + +#~ msgid "Final" +#~ msgstr "Final" + +#~ msgid "Junja" +#~ msgstr "Junja" + +#~ msgid "Kana" +#~ msgstr "å‡å" + +#~ msgid "Kanji" +#~ msgstr "日文漢å—" + +#~ msgid "Minus" +#~ msgstr "減號" + +#~ msgid "PA1" +#~ msgstr "PA1" + +#~ msgid "Period" +#~ msgstr "å¥è™Ÿ" + +#~ msgid "Plus" +#~ msgstr "åŠ è™Ÿ" + +#~ msgid "" +#~ "Controls size of deserts and beaches in Mapgen v6.\n" +#~ "When snowbiomes are enabled 'mgv6_freq_desert' is ignored." +#~ msgstr "" +#~ "控制在 Mapgen v6 ä¸çš„æ²™æ¼ 與沙ç˜å¤§å°ã€‚\n" +#~ "ç•¶ snowbiomes 啟用時「mgv6_freq_desertã€æœƒè¢«å¿½ç•¥ã€‚" + +#~ msgid "" +#~ "Determines terrain shape.\n" +#~ "The 3 numbers in brackets control the scale of the\n" +#~ "terrain, the 3 numbers should be identical." +#~ msgstr "" +#~ "決定地形的形狀。\n" +#~ "在括號ä¸çš„ 3 å€‹æ•¸å—æŽ§åˆ¶è‘—\n" +#~ "åœ°å½¢çš„è¦æ¨¡ï¼Œé‚£ä¸‰å€‹æ•¸å—æ‡‰è©²è¦æ˜¯ç›¸åŒçš„。" + +#~ msgid "Mapgen biome heat noise parameters" +#~ msgstr "Mapgen ç”Ÿç‰©ç¾¤è½ ç†± 噪音 åƒæ•¸" + +#~ msgid "Mapgen biome humidity blend noise parameters" +#~ msgstr "Mapgen ç”Ÿç‰©ç¾¤è½ æ¿•åº¦ æ··åˆ å™ªéŸ³ åƒæ•¸" + +#~ msgid "Mapgen biome humidity noise parameters" +#~ msgstr "Mapgen ç”Ÿç‰©ç¾¤è½ æ¿•åº¦ 噪音 åƒæ•¸" + +#~ msgid "Mapgen flat cave width" +#~ msgstr "Mapgen flat 洞穴寬度" + +#~ msgid "Mapgen flat cave1 noise parameters" +#~ msgstr "Mapgen flat æ´žç©´1 噪音 åƒæ•¸" + +#~ msgid "Mapgen flat cave2 noise parameters" +#~ msgstr "Mapgen flat æ´žç©´2 噪音 åƒæ•¸" + +#~ msgid "Mapgen flat filler depth noise parameters" +#~ msgstr "Mapgen flat 填充器 深度 噪音 åƒæ•¸" + +#~ msgid "Mapgen flat large cave depth" +#~ msgstr "Mapgen flat 大型洞穴深度" + +#~ msgid "Mapgen flat terrain noise parameters" +#~ msgstr "Mapgen flat 地形 噪音 åƒæ•¸" + +#~ msgid "Mapgen fractal cave width" +#~ msgstr "Mapgen 分形洞穴寬度" + +#~ msgid "Mapgen fractal cave1 noise parameters" +#~ msgstr "Mapgen fractal æ´žç©´1 噪音 åƒæ•¸" + +#~ msgid "Mapgen fractal cave2 noise parameters" +#~ msgstr "Mapgen fractal æ´žç©´2 噪音 åƒæ•¸" + +#~ msgid "Mapgen fractal filler depth noise parameters" +#~ msgstr "Mapgen fractal 填充器 深度 噪音 åƒæ•¸" + +#~ msgid "Mapgen fractal fractal" +#~ msgstr "Mapgen fractal fractal" + +#~ msgid "Mapgen fractal iterations" +#~ msgstr "Mapgen fractal è¿ä»£" + +#~ msgid "Mapgen fractal julia w" +#~ msgstr "Mapgen fractal 朱利亞 w" + +#~ msgid "Mapgen fractal julia x" +#~ msgstr "Mapgen fractal 朱利亞 x" + +#~ msgid "Mapgen fractal julia y" +#~ msgstr "Mapgen fractal 朱利亞 y" + +#~ msgid "Mapgen fractal julia z" +#~ msgstr "Mapgen fractal 朱利亞 z" + +#~ msgid "Mapgen fractal offset" +#~ msgstr "Mapgen fractal åç§»" + +#~ msgid "Mapgen fractal scale" +#~ msgstr "Mapgen fractal è¦æ¨¡" + +#~ msgid "Mapgen fractal seabed noise parameters" +#~ msgstr "Mapgen fractal 海床 噪音 åƒæ•¸" + +#~ msgid "Mapgen fractal slice w" +#~ msgstr "Mapgen fractal slice w" + +#~ msgid "Mapgen v5 cave width" +#~ msgstr "Mapgen v5 洞穴寬度" + +#~ msgid "Mapgen v5 cave1 noise parameters" +#~ msgstr "Mapgen v5 æ´žç©´1 噪音 åƒæ•¸" + +#~ msgid "Mapgen v5 cave2 noise parameters" +#~ msgstr "Mapgen v5 æ´žç©´2 噪音 åƒæ•¸" + +#~ msgid "Mapgen v5 factor noise parameters" +#~ msgstr "Mapgen v5 å› å 噪音 åƒæ•¸" + +#~ msgid "Mapgen v5 filler depth noise parameters" +#~ msgstr "Mapgen v5 填充器 深度 噪音 åƒæ•¸" + +#~ msgid "Mapgen v5 height noise parameters" +#~ msgstr "Mapgen v5 高度 噪音 åƒæ•¸" + +#~ msgid "Mapgen v6 apple trees noise parameters" +#~ msgstr "Mapgen v6 蘋果樹 噪音 åƒæ•¸" + +#~ msgid "Mapgen v6 beach frequency" +#~ msgstr "Mapgen v6 æµ·ç˜é »çއ" + +#~ msgid "Mapgen v6 beach noise parameters" +#~ msgstr "Mapgen v6 æµ·ç˜ å™ªéŸ³ åƒæ•¸" + +#~ msgid "Mapgen v6 biome noise parameters" +#~ msgstr "Mapgen v6 ç”Ÿç‰©ç¾¤è½ å™ªéŸ³ åƒæ•¸" + +#~ msgid "Mapgen v6 cave noise parameters" +#~ msgstr "Mapgen v6 æ´žç©´ 噪音 åƒæ•¸" + +#~ msgid "Mapgen v6 desert frequency" +#~ msgstr "Mapgen v6 æ²™æ¼ é »çŽ‡" + +#~ msgid "Mapgen v6 mud noise parameters" +#~ msgstr "Mapgen v6 泥土 噪音 åƒæ•¸" + +#~ msgid "Mapgen v6 steepness noise parameters" +#~ msgstr "Mapgen v6 å¡åº¦ 噪音 åƒæ•¸" + +#~ msgid "Mapgen v6 terrain altitude noise parameters" +#~ msgstr "Mapgen v6 地形 æµ·æ‹” 噪音 åƒæ•¸" + +#~ msgid "Mapgen v6 terrain base noise parameters" +#~ msgstr "Mapgen v6 地形 基礎 噪音 åƒæ•¸" + +#~ msgid "Mapgen v6 trees noise parameters" +#~ msgstr "Mapgen v6 樹 噪音 åƒæ•¸" + +#~ msgid "Mapgen v7 cave width" +#~ msgstr "Mapgen v7 洞穴寬度" + +#~ msgid "Mapgen v7 cave1 noise parameters" +#~ msgstr "Mapgen v7 æ´žç©´1 噪音 åƒæ•¸" + +#~ msgid "Mapgen v7 cave2 noise parameters" +#~ msgstr "Mapgen v7 æ´žç©´2 噪音 åƒæ•¸" + +#~ msgid "Mapgen v7 filler depth noise parameters" +#~ msgstr "Mapgen v7 填充器 深度 噪音 åƒæ•¸" + +#~ msgid "Mapgen v7 height select noise parameters" +#~ msgstr "Mapgen v7 高度 鏿“‡ 噪音 åƒæ•¸" + +#~ msgid "Mapgen v7 mountain noise parameters" +#~ msgstr "Mapgen v7 å±± 噪音 åƒæ•¸" + +#~ msgid "Mapgen v7 ridge noise parameters" +#~ msgstr "Mapgen v7 ridge 噪音 åƒæ•¸" + +#~ msgid "Mapgen v7 ridge water noise parameters" +#~ msgstr "Mapgen v7 ridge æ°´ 噪音 åƒæ•¸" + +#~ msgid "Mapgen v7 terrain altitude noise parameters" +#~ msgstr "Mapgen v7 地形 æµ·æ‹” 噪音 åƒæ•¸" + +#~ msgid "Mapgen v7 terrain base noise parameters" +#~ msgstr "Mapgen v7 地形 基礎 噪音 åƒæ•¸" + +#~ msgid "Mapgen v7 terrain persistation noise parameters" +#~ msgstr "Mapgen v7 地形 æŒä¹… 噪音 åƒæ•¸" + +#~ msgid "" +#~ "Noise parameters for biome API temperature, humidity and biome blend." +#~ msgstr "å™ªéŸ³åƒæ•¸ä¾›ç”Ÿç‰©ç¾¤è½ API æº«åº¦ã€æ¿•度與生物混åˆä½¿ç”¨ã€‚" + +#~ msgid "" +#~ "Where the map generator stops.\n" +#~ "Please note:\n" +#~ "- Limited to 31000 (setting above has no effect)\n" +#~ "- The map generator works in groups of 80x80x80 nodes (5x5x5 " +#~ "MapBlocks).\n" +#~ "- Those groups have an offset of -32, -32 nodes from the origin.\n" +#~ "- Only groups which are within the map_generation_limit are generated" +#~ msgstr "" +#~ "地圖產生器è¦åœ¨å“ªè£¡åœæ¢ã€‚\n" +#~ "請注æ„:\n" +#~ "- é™åˆ¶ç‚º 31000(上é¢çš„è¨å®šæ²’有影響)\n" +#~ "- 地圖產生器以 80x80x80 個節點為一組的方å¼é‹ä½œï¼ˆ5x5x5 地圖å€å¡Šï¼‰ã€‚\n" +#~ "- 這些群組有 -32 çš„å移,從原點åç§» -32 節點。\n" +#~ "- åªæœ‰åœ¨ map_generation_limit 內的群組會被生æˆ" + #~ msgid "Detailed mod profile data. Useful for mod developers." #~ msgstr "詳細的 mod æª”æ¡ˆè³‡æ–™ã€‚å° mod 開發者很有用。" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3aa645df9..7c1a4eee0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -156,26 +156,6 @@ if(ENABLE_FREETYPE) endif() endif(ENABLE_FREETYPE) -# LuaJIT -option(ENABLE_LUAJIT "Enable LuaJIT support" TRUE) -set(USE_LUAJIT FALSE) -if(ENABLE_LUAJIT) - find_package(LuaJIT) - if(LUAJIT_FOUND) - set(USE_LUAJIT TRUE) - endif(LUAJIT_FOUND) -else() - message (STATUS "LuaJIT detection disabled! (ENABLE_LUAJIT=0)") -endif() -if(NOT USE_LUAJIT) - message(STATUS "LuaJIT not found, using bundled Lua.") - set(LUA_LIBRARY "lua") - set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src") - add_subdirectory(lua) -endif() - -find_package(GMP REQUIRED) - option(ENABLE_CURSES "Enable ncurses console" TRUE) set(USE_CURSES FALSE) @@ -253,7 +233,6 @@ endif(ENABLE_REDIS) find_package(SQLite3 REQUIRED) -find_package(Json REQUIRED) OPTION(ENABLE_SPATIAL "Enable SpatialIndex AreaStore backend" TRUE) set(USE_SPATIAL FALSE) @@ -284,6 +263,8 @@ if(WIN32) set(PLATFORM_LIBS dbghelp.lib ${PLATFORM_LIBS}) # Surpress some useless warnings add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 ) + # Get M_PI to work + add_definitions(/D "_USE_MATH_DEFINES") else() # Probably MinGW = GCC set(PLATFORM_LIBS "") endif() @@ -396,6 +377,7 @@ set(common_SRCS convert_json.cpp craftdef.cpp database-dummy.cpp + database-files.cpp database-leveldb.cpp database-postgresql.cpp database-redis.cpp @@ -406,6 +388,7 @@ set(common_SRCS dungeongen.cpp emerge.cpp environment.cpp + face_position_cache.cpp filesys.cpp genericobject.cpp gettext.cpp @@ -413,6 +396,7 @@ set(common_SRCS inventory.cpp inventorymanager.cpp itemdef.cpp + itemstackmetadata.cpp light.cpp log.cpp map.cpp @@ -428,6 +412,7 @@ set(common_SRCS mapgen_valleys.cpp mapnode.cpp mapsector.cpp + metadata.cpp mg_biome.cpp mg_decoration.cpp mg_ore.cpp @@ -447,10 +432,12 @@ set(common_SRCS quicktune.cpp reflowscan.cpp remoteplayer.cpp + raycast.cpp rollback.cpp rollback_interface.cpp serialization.cpp server.cpp + serverenvironment.cpp serverlist.cpp serverobject.cpp settings.cpp @@ -459,6 +446,7 @@ set(common_SRCS staticobject.cpp subgame.cpp terminal_chat_console.cpp + tileanimation.cpp tool.cpp treegen.cpp version.cpp @@ -506,6 +494,7 @@ set(client_SRCS ${client_irrlicht_changes_SRCS} camera.cpp client.cpp + clientenvironment.cpp clientmap.cpp clientmedia.cpp clientobject.cpp @@ -535,6 +524,7 @@ set(client_SRCS main.cpp mapblock_mesh.cpp mesh.cpp + mesh_generator_thread.cpp minimap.cpp particles.cpp shader.cpp @@ -722,7 +712,11 @@ if(MSVC) # EHa enables SEH exceptions (used for catching segfaults) set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MT /GS- /Zi /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP") #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"") - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /DEBUG /OPT:REF /OPT:ICF") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF") + + + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") + set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1") @@ -760,18 +754,22 @@ else() set(OTHER_FLAGS "${OTHER_FLAGS} -mthreads -fexceptions") endif() - set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops") - if(APPLE) + set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -Wall -pipe -funroll-loops") + if(CMAKE_SYSTEM_NAME MATCHES "(Darwin|FreeBSD)") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os") else() - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer") - endif(APPLE) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -ffast-math -fomit-frame-pointer") + endif(CMAKE_SYSTEM_NAME MATCHES "(Darwin|FreeBSD)") set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}") if(USE_GPROF) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg") endif() + + if(MINGW) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mwindows") + endif() endif() @@ -887,4 +885,3 @@ endif() if (BUILD_CLIENT AND USE_FREETYPE) add_subdirectory(cguittfont) endif() - diff --git a/src/activeobject.h b/src/activeobject.h index 48f078d3f..f349ddef3 100644 --- a/src/activeobject.h +++ b/src/activeobject.h @@ -28,9 +28,9 @@ enum ActiveObjectType { ACTIVEOBJECT_TYPE_TEST = 1, // Deprecated stuff ACTIVEOBJECT_TYPE_ITEM = 2, - ACTIVEOBJECT_TYPE_RAT = 3, - ACTIVEOBJECT_TYPE_OERKKI1 = 4, - ACTIVEOBJECT_TYPE_FIREFLY = 5, +// ACTIVEOBJECT_TYPE_RAT = 3, +// ACTIVEOBJECT_TYPE_OERKKI1 = 4, +// ACTIVEOBJECT_TYPE_FIREFLY = 5, ACTIVEOBJECT_TYPE_MOBV2 = 6, // End deprecated stuff ACTIVEOBJECT_TYPE_LUAENTITY = 7, @@ -43,7 +43,7 @@ enum ActiveObjectType { struct ActiveObjectMessage { - ActiveObjectMessage(u16 id_, bool reliable_=true, std::string data_=""): + ActiveObjectMessage(u16 id_, bool reliable_=true, const std::string &data_ = "") : id(id_), reliable(reliable_), datastring(data_) @@ -64,7 +64,7 @@ public: m_id(id) { } - + u16 getId() { return m_id; @@ -76,8 +76,8 @@ public: } virtual ActiveObjectType getType() const = 0; - virtual bool getCollisionBox(aabb3f *toset) = 0; - virtual bool collideWithObjects() = 0; + virtual bool getCollisionBox(aabb3f *toset) const = 0; + virtual bool collideWithObjects() const = 0; protected: u16 m_id; // 0 is invalid, "no id" }; @@ -41,12 +41,12 @@ public: void add(const std::string &ip, const std::string &name); void remove(const std::string &ip_or_name); bool isModified(); + private: Mutex m_mutex; std::string m_banfilepath; StringMap m_ips; bool m_modified; - }; #endif diff --git a/src/camera.cpp b/src/camera.cpp index 43980db1c..52a42a3a9 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -27,21 +27,20 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "wieldmesh.h" #include "noise.h" // easeCurve -#include "gamedef.h" #include "sound.h" #include "event.h" #include "profiler.h" #include "util/numeric.h" -#include "util/mathconstants.h" #include "constants.h" #include "fontengine.h" +#include "script/scripting_client.h" #define CAMERA_OFFSET_STEP 200 #include "nodedef.h" Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control, - IGameDef *gamedef): + Client *client): m_playernode(NULL), m_headnode(NULL), m_cameranode(NULL), @@ -50,7 +49,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control, m_wieldnode(NULL), m_draw_control(draw_control), - m_gamedef(gamedef), + m_client(client), m_camera_position(0,0,0), m_camera_direction(0,0,0), @@ -88,7 +87,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control, m_wieldmgr = smgr->createNewSceneManager(); m_wieldmgr->addCameraSceneNode(); m_wieldnode = new WieldMeshSceneNode(m_wieldmgr->getRootSceneNode(), m_wieldmgr, -1, false); - m_wieldnode->setItem(ItemStack(), m_gamedef); + m_wieldnode->setItem(ItemStack(), m_client); m_wieldnode->drop(); // m_wieldmgr grabbed it /* TODO: Add a callback function so these can be updated when a setting @@ -104,7 +103,6 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control, m_cache_view_bobbing_amount = g_settings->getFloat("view_bobbing_amount"); m_cache_fov = g_settings->getFloat("fov"); m_cache_zoom_fov = g_settings->getFloat("zoom_fov"); - m_cache_view_bobbing = g_settings->getBool("view_bobbing"); m_nametags.clear(); } @@ -128,6 +126,10 @@ bool Camera::successfullyCreated(std::string &error_message) } else { error_message.clear(); } + + if (g_settings->getBool("enable_client_modding")) { + m_client->getScript()->on_camera_ready(this); + } return error_message.empty(); } @@ -151,7 +153,7 @@ void Camera::step(f32 dtime) m_wield_change_timer = MYMIN(m_wield_change_timer + dtime, 0.125); if (m_wield_change_timer >= 0 && was_under_zero) - m_wieldnode->setItem(m_wield_item_next, m_gamedef); + m_wieldnode->setItem(m_wield_item_next, m_client); if (m_view_bobbing_state != 0) { @@ -189,7 +191,7 @@ void Camera::step(f32 dtime) (was > 0.5f && m_view_bobbing_anim <= 0.5f)); if(step) { MtEvent *e = new SimpleTriggerEvent("ViewBobbingStep"); - m_gamedef->event()->put(e); + m_client->event()->put(e); } } } @@ -210,10 +212,10 @@ void Camera::step(f32 dtime) if(m_digging_button == 0) { MtEvent *e = new SimpleTriggerEvent("CameraPunchLeft"); - m_gamedef->event()->put(e); + m_client->event()->put(e); } else if(m_digging_button == 1) { MtEvent *e = new SimpleTriggerEvent("CameraPunchRight"); - m_gamedef->event()->put(e); + m_client->event()->put(e); } } } @@ -282,8 +284,8 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, v3f rel_cam_target = v3f(0,0,1); v3f rel_cam_up = v3f(0,1,0); - if (m_view_bobbing_anim != 0 && m_camera_mode < CAMERA_MODE_THIRD) - { + if (m_cache_view_bobbing_amount != 0.0f && m_view_bobbing_anim != 0.0f && + m_camera_mode < CAMERA_MODE_THIRD) { f32 bobfrac = my_modf(m_view_bobbing_anim * 2); f32 bobdir = (m_view_bobbing_anim < 0.5) ? 1.0 : -1.0; @@ -352,7 +354,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, my_cp.Y = m_camera_position.Y + (m_camera_direction.Y*-i); // Prevent camera positioned inside nodes - INodeDefManager *nodemgr = m_gamedef->ndef(); + INodeDefManager *nodemgr = m_client->ndef(); MapNode n = c_env.getClientMap().getNodeNoEx(floatToInt(my_cp, BS)); const ContentFeatures& features = nodemgr->get(n); if(features.walkable) @@ -390,13 +392,12 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, // Get FOV f32 fov_degrees; - if (player->getPlayerControl().zoom && m_gamedef->checkLocalPrivilege("zoom")) { + if (player->getPlayerControl().zoom && m_client->checkLocalPrivilege("zoom")) { fov_degrees = m_cache_zoom_fov; } else { fov_degrees = m_cache_fov; } - fov_degrees = MYMAX(fov_degrees, 10.0); - fov_degrees = MYMIN(fov_degrees, 170.0); + fov_degrees = rangelim(fov_degrees, 7.0, 160.0); // FOV and aspect ratio m_aspect = (f32) porting::getWindowSize().X / (f32) porting::getWindowSize().Y; @@ -407,9 +408,12 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, m_cameranode->setAspectRatio(m_aspect); m_cameranode->setFOV(m_fov_y); + float wieldmesh_offset_Y = -35 + player->getPitch() * 0.05; + wieldmesh_offset_Y = rangelim(wieldmesh_offset_Y, -52, -32); + // Position the wielded item //v3f wield_position = v3f(45, -35, 65); - v3f wield_position = v3f(55, -35, 65); + v3f wield_position = v3f(55, wieldmesh_offset_Y, 65); //v3f wield_rotation = v3f(-100, 120, -100); v3f wield_rotation = v3f(-100, 120, -100); wield_position.Y += fabs(m_wield_change_timer)*320 - 40; @@ -467,9 +471,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, const bool swimming = (movement_XZ || player->swimming_vertical) && player->in_liquid; const bool climbing = movement_Y && player->is_climbing; if ((walking || swimming || climbing) && - m_cache_view_bobbing && - (!g_settings->getBool("free_move") || !m_gamedef->checkLocalPrivilege("fly"))) - { + (!g_settings->getBool("free_move") || !m_client->checkLocalPrivilege("fly"))) { // Start animation m_view_bobbing_state = 1; m_view_bobbing_speed = MYMIN(speed.getLength(), 70); @@ -501,7 +503,8 @@ void Camera::setDigging(s32 button) void Camera::wield(const ItemStack &item) { - if (item.name != m_wield_item_next.name) { + if (item.name != m_wield_item_next.name || + item.metadata != m_wield_item_next.metadata) { m_wield_item_next = item; if (m_wield_change_timer > 0) m_wield_change_timer = -m_wield_change_timer; @@ -555,9 +558,10 @@ void Camera::drawNametags() f32 transformed_pos[4] = { pos.X, pos.Y, pos.Z, 1.0f }; trans.multiplyWith1x4Matrix(transformed_pos); if (transformed_pos[3] > 0) { + std::string nametag_colorless = unescape_enriched(nametag->nametag_text); core::dimension2d<u32> textsize = g_fontengine->getFont()->getDimension( - utf8_to_wide(nametag->nametag_text).c_str()); + utf8_to_wide(nametag_colorless).c_str()); f32 zDiv = transformed_pos[3] == 0.0f ? 1.0f : core::reciprocal(transformed_pos[3]); v2u32 screensize = m_driver->getScreenSize(); diff --git a/src/camera.h b/src/camera.h index cb0e9686d..1e4800cba 100644 --- a/src/camera.h +++ b/src/camera.h @@ -33,7 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc., class LocalPlayer; struct MapDrawControl; -class IGameDef; +class Client; class WieldMeshSceneNode; struct Nametag { @@ -61,25 +61,9 @@ class Camera { public: Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control, - IGameDef *gamedef); + Client *client); ~Camera(); - // Get player scene node. - // This node is positioned at the player's torso (without any view bobbing), - // as given by Player::m_position. Yaw is applied but not pitch. - inline scene::ISceneNode* getPlayerNode() const - { - return m_playernode; - } - - // Get head scene node. - // It has the eye transformation and pitch applied, - // but no view bobbing. - inline scene::ISceneNode* getHeadNode() const - { - return m_headnode; - } - // Get camera scene node. // It has the eye transformation, pitch and view bobbing applied. inline scene::ICameraSceneNode* getCameraNode() const @@ -161,6 +145,12 @@ public: m_camera_mode = CAMERA_MODE_FIRST; } + // Set the current camera mode + inline void setCameraMode(CameraMode mode) + { + m_camera_mode = mode; + } + //read the current camera mode inline CameraMode getCameraMode() { @@ -172,8 +162,7 @@ public: void removeNametag(Nametag *nametag); - std::list<Nametag *> *getNametags() - { return &m_nametags; } + const std::list<Nametag *> &getNametags() { return m_nametags; } void drawNametags(); @@ -189,7 +178,7 @@ private: // draw control MapDrawControl& m_draw_control; - IGameDef *m_gamedef; + Client *m_client; video::IVideoDriver *m_driver; // Absolute camera position @@ -232,7 +221,6 @@ private: f32 m_cache_view_bobbing_amount; f32 m_cache_fov; f32 m_cache_zoom_fov; - bool m_cache_view_bobbing; std::list<Nametag *> m_nametags; }; diff --git a/src/cavegen.cpp b/src/cavegen.cpp index bb6aa25a6..dbed79951 100644 --- a/src/cavegen.cpp +++ b/src/cavegen.cpp @@ -74,19 +74,23 @@ void CavesNoiseIntersection::generateCaves(MMVManip *vm, noise_cave2->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z); v3s16 em = vm->m_area.getExtent(); - u32 index2d = 0; + u32 index2d = 0; // Biomemap index for (s16 z = nmin.Z; z <= nmax.Z; z++) for (s16 x = nmin.X; x <= nmax.X; x++, index2d++) { bool column_is_open = false; // Is column open to overground bool is_under_river = false; // Is column under river water - bool is_tunnel = false; // Is tunnel or tunnel floor + bool is_under_tunnel = false; // Is tunnel or is under tunnel + // Indexes at column top u32 vi = vm->m_area.index(x, nmax.Y, z); u32 index3d = (z - nmin.Z) * m_zstride_1d + m_csize.Y * m_ystride + - (x - nmin.X); + (x - nmin.X); // 3D noise index // Biome of column Biome *biome = (Biome *)m_bmgr->getRaw(biomemap[index2d]); - + u16 depth_top = biome->depth_top; + u16 base_filler = depth_top + biome->depth_filler; + u16 depth_riverbed = biome->depth_riverbed; + u16 nplaced = 0; // Don't excavate the overgenerated stone at nmax.Y + 1, // this creates a 'roof' over the tunnel, preventing light in // tunnels at mapchunk borders when generating mapchunks upwards. @@ -112,20 +116,34 @@ void CavesNoiseIntersection::generateCaves(MMVManip *vm, if (d1 * d2 > m_cave_width && m_ndef->get(c).is_ground_content) { // In tunnel and ground content, excavate vm->m_data[vi] = MapNode(CONTENT_AIR); - is_tunnel = true; - } else { - // Not in tunnel or not ground content - if (is_tunnel && column_is_open && - (c == biome->c_filler || c == biome->c_stone)) { - // Tunnel entrance floor - if (is_under_river) + is_under_tunnel = true; + } else if (column_is_open && is_under_tunnel && + (c == biome->c_stone || c == biome->c_filler)) { + // Tunnel entrance floor, place biome surface nodes + if (is_under_river) { + if (nplaced < depth_riverbed) { vm->m_data[vi] = MapNode(biome->c_riverbed); - else - vm->m_data[vi] = MapNode(biome->c_top); + nplaced++; + } else { + // Disable top/filler placement + column_is_open = false; + is_under_river = false; + is_under_tunnel = false; + } + } else if (nplaced < depth_top) { + vm->m_data[vi] = MapNode(biome->c_top); + nplaced++; + } else if (nplaced < base_filler) { + vm->m_data[vi] = MapNode(biome->c_filler); + nplaced++; + } else { + // Disable top/filler placement + column_is_open = false; + is_under_tunnel = false; } - + } else { + // Not tunnel or tunnel entrance floor column_is_open = false; - is_tunnel = false; } } } @@ -133,6 +151,104 @@ void CavesNoiseIntersection::generateCaves(MMVManip *vm, //// +//// CavernsNoise +//// + +CavernsNoise::CavernsNoise( + INodeDefManager *nodedef, v3s16 chunksize, NoiseParams *np_cavern, + s32 seed, float cavern_limit, float cavern_taper, float cavern_threshold) +{ + assert(nodedef); + + m_ndef = nodedef; + + m_csize = chunksize; + m_cavern_limit = cavern_limit; + m_cavern_taper = cavern_taper; + m_cavern_threshold = cavern_threshold; + + m_ystride = m_csize.X; + m_zstride_1d = m_csize.X * (m_csize.Y + 1); + + // Noise is created using 1-down overgeneration + // A Nx-by-1-by-Nz-sized plane is at the bottom of the desired for + // re-carving the solid overtop placed for blocking sunlight + noise_cavern = new Noise(np_cavern, seed, m_csize.X, m_csize.Y + 1, m_csize.Z); + + c_water_source = m_ndef->getId("mapgen_water_source"); + if (c_water_source == CONTENT_IGNORE) + c_water_source = CONTENT_AIR; + + c_lava_source = m_ndef->getId("mapgen_lava_source"); + if (c_lava_source == CONTENT_IGNORE) + c_lava_source = CONTENT_AIR; +} + + +CavernsNoise::~CavernsNoise() +{ + delete noise_cavern; +} + + +bool CavernsNoise::generateCaverns(MMVManip *vm, v3s16 nmin, v3s16 nmax) +{ + assert(vm); + + // Calculate noise + noise_cavern->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z); + + // Cache cavern_amp values + float *cavern_amp = new float[m_csize.Y + 1]; + u8 cavern_amp_index = 0; // Index zero at column top + for (s16 y = nmax.Y; y >= nmin.Y - 1; y--, cavern_amp_index++) { + cavern_amp[cavern_amp_index] = + MYMIN((m_cavern_limit - y) / (float)m_cavern_taper, 1.0f); + } + + //// Place nodes + bool near_cavern = false; + v3s16 em = vm->m_area.getExtent(); + u32 index2d = 0; + + for (s16 z = nmin.Z; z <= nmax.Z; z++) + for (s16 x = nmin.X; x <= nmax.X; x++, index2d++) { + // Reset cave_amp index to column top + cavern_amp_index = 0; + // Initial voxelmanip index at column top + u32 vi = vm->m_area.index(x, nmax.Y, z); + // Initial 3D noise index at column top + u32 index3d = (z - nmin.Z) * m_zstride_1d + m_csize.Y * m_ystride + + (x - nmin.X); + // Don't excavate the overgenerated stone at node_max.Y + 1, + // this creates a 'roof' over the cavern, preventing light in + // caverns at mapchunk borders when generating mapchunks upwards. + // This 'roof' is excavated when the mapchunk above is generated. + for (s16 y = nmax.Y; y >= nmin.Y - 1; y--, + index3d -= m_ystride, + vm->m_area.add_y(em, vi, -1), + cavern_amp_index++) { + content_t c = vm->m_data[vi].getContent(); + float n_absamp_cavern = fabs(noise_cavern->result[index3d]) * + cavern_amp[cavern_amp_index]; + // Disable CavesRandomWalk at a safe distance from caverns + // to avoid excessively spreading liquids in caverns. + if (n_absamp_cavern > m_cavern_threshold - 0.1f) { + near_cavern = true; + if (n_absamp_cavern > m_cavern_threshold && + m_ndef->get(c).is_ground_content) + vm->m_data[vi] = MapNode(CONTENT_AIR); + } + } + } + + delete[] cavern_amp; + + return near_cavern; +} + + +//// //// CavesRandomWalk //// diff --git a/src/cavegen.h b/src/cavegen.h index 2bf503d47..a1140594e 100644 --- a/src/cavegen.h +++ b/src/cavegen.h @@ -37,11 +37,12 @@ class GenerateNotifier; TODO(hmmmm): Remove dependency on biomes TODO(hmmmm): Find alternative to overgeneration as solution for sunlight issue */ -class CavesNoiseIntersection { +class CavesNoiseIntersection +{ public: CavesNoiseIntersection(INodeDefManager *nodedef, BiomeManager *biomemgr, - v3s16 chunksize, NoiseParams *np_cave1, NoiseParams *np_cave2, - s32 seed, float cave_width); + v3s16 chunksize, NoiseParams *np_cave1, NoiseParams *np_cave2, + s32 seed, float cave_width); ~CavesNoiseIntersection(); void generateCaves(MMVManip *vm, v3s16 nmin, v3s16 nmax, u8 *biomemap); @@ -63,6 +64,38 @@ private: }; /* + CavernsNoise is a cave digging algorithm +*/ +class CavernsNoise +{ +public: + CavernsNoise(INodeDefManager *nodedef, v3s16 chunksize, NoiseParams *np_cavern, + s32 seed, float cavern_limit, float cavern_taper, + float cavern_threshold); + ~CavernsNoise(); + + bool generateCaverns(MMVManip *vm, v3s16 nmin, v3s16 nmax); + +private: + INodeDefManager *m_ndef; + + // configurable parameters + v3s16 m_csize; + float m_cavern_limit; + float m_cavern_taper; + float m_cavern_threshold; + + // intermediate state variables + u16 m_ystride; + u16 m_zstride_1d; + + Noise *noise_cavern; + + content_t c_water_source; + content_t c_lava_source; +}; + +/* CavesRandomWalk is an implementation of a cave-digging algorithm that operates on the principle of a "random walk" to approximate the stochiastic activity of cavern development. @@ -75,7 +108,8 @@ private: This algorithm is very fast, executing in less than 1ms on average for an 80x80x80 chunk of map on a modern processor. */ -class CavesRandomWalk { +class CavesRandomWalk +{ public: MMVManip *vm; INodeDefManager *ndef; @@ -120,18 +154,16 @@ public: // ndef is a mandatory parameter. // If gennotify is NULL, generation events are not logged. - CavesRandomWalk(INodeDefManager *ndef, - GenerateNotifier *gennotify = NULL, - s32 seed = 0, - int water_level = 1, - content_t water_source = CONTENT_IGNORE, - content_t lava_source = CONTENT_IGNORE); + CavesRandomWalk(INodeDefManager *ndef, GenerateNotifier *gennotify = NULL, + s32 seed = 0, int water_level = 1, + content_t water_source = CONTENT_IGNORE, + content_t lava_source = CONTENT_IGNORE); // vm and ps are mandatory parameters. // If heightmap is NULL, the surface level at all points is assumed to // be water_level. void makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax, PseudoRandom *ps, - bool is_large_cave, int max_stone_height, s16 *heightmap); + bool is_large_cave, int max_stone_height, s16 *heightmap); private: void makeTunnel(bool dirswitch); @@ -153,7 +185,8 @@ private: tl;dr, *** DO NOT TOUCH THIS CLASS UNLESS YOU KNOW WHAT YOU ARE DOING *** */ -class CavesV6 { +class CavesV6 +{ public: MMVManip *vm; INodeDefManager *ndef; @@ -192,18 +225,16 @@ public: // ndef is a mandatory parameter. // If gennotify is NULL, generation events are not logged. - CavesV6(INodeDefManager *ndef, - GenerateNotifier *gennotify = NULL, - int water_level = 1, - content_t water_source = CONTENT_IGNORE, - content_t lava_source = CONTENT_IGNORE); + CavesV6(INodeDefManager *ndef, GenerateNotifier *gennotify = NULL, + int water_level = 1, content_t water_source = CONTENT_IGNORE, + content_t lava_source = CONTENT_IGNORE); // vm, ps, and ps2 are mandatory parameters. // If heightmap is NULL, the surface level at all points is assumed to // be water_level. - void makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax, - PseudoRandom *ps, PseudoRandom *ps2, - bool is_large_cave, int max_stone_height, s16 *heightmap = NULL); + void makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax, PseudoRandom *ps, + PseudoRandom *ps2, bool is_large_cave, int max_stone_height, + s16 *heightmap = NULL); private: void makeTunnel(bool dirswitch); diff --git a/src/cguittfont/CGUITTFont.cpp b/src/cguittfont/CGUITTFont.cpp index c2d37c6c0..bd4e700de 100644 --- a/src/cguittfont/CGUITTFont.cpp +++ b/src/cguittfont/CGUITTFont.cpp @@ -512,9 +512,11 @@ CGUITTGlyphPage* CGUITTFont::createGlyphPage(const u8& pixel_mode) if (page_texture_size.Width > max_texture_size.Width || page_texture_size.Height > max_texture_size.Height) page_texture_size = max_texture_size; - if (!page->createPageTexture(pixel_mode, page_texture_size)) + if (!page->createPageTexture(pixel_mode, page_texture_size)) { // TODO: add error message? + delete page; return 0; + } if (page) { diff --git a/src/cguittfont/CGUITTFont.h b/src/cguittfont/CGUITTFont.h index 0aa540c5c..77c9e34f8 100644 --- a/src/cguittfont/CGUITTFont.h +++ b/src/cguittfont/CGUITTFont.h @@ -125,6 +125,10 @@ namespace gui bool flgmip = driver->getTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS); driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 + bool flgcpy = driver->getTextureCreationFlag(video::ETCF_ALLOW_MEMORY_COPY); + driver->setTextureCreationFlag(video::ETCF_ALLOW_MEMORY_COPY, true); +#endif // Set the texture color format. switch (pixel_mode) @@ -140,6 +144,9 @@ namespace gui // Restore our texture creation flags. driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, flgmip); +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 + driver->setTextureCreationFlag(video::ETCF_ALLOW_MEMORY_COPY, flgcpy); +#endif return texture ? true : false; } diff --git a/src/chat.cpp b/src/chat.cpp index 46555b3dc..ade3fefd3 100644 --- a/src/chat.cpp +++ b/src/chat.cpp @@ -77,11 +77,6 @@ u32 ChatBuffer::getLineCount() const return m_unformatted.size(); } -u32 ChatBuffer::getScrollback() const -{ - return m_scrollback; -} - const ChatLine& ChatBuffer::getLine(u32 index) const { assert(index < getLineCount()); // pre-condition @@ -336,7 +331,7 @@ u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols, while (frag_length < remaining_in_input && frag_length < remaining_in_output) { - if (isspace(line.text.getString()[in_pos + frag_length])) + if (iswspace(line.text.getString()[in_pos + frag_length])) space_pos = frag_length; ++frag_length; } @@ -386,7 +381,7 @@ s32 ChatBuffer::getBottomScrollPos() const -ChatPrompt::ChatPrompt(std::wstring prompt, u32 history_limit): +ChatPrompt::ChatPrompt(const std::wstring &prompt, u32 history_limit): m_prompt(prompt), m_line(L""), m_history(), @@ -493,9 +488,9 @@ void ChatPrompt::nickCompletion(const std::list<std::string>& names, bool backwa { // no previous nick completion is active prefix_start = prefix_end = m_cursor; - while (prefix_start > 0 && !isspace(m_line[prefix_start-1])) + while (prefix_start > 0 && !iswspace(m_line[prefix_start-1])) --prefix_start; - while (prefix_end < m_line.size() && !isspace(m_line[prefix_end])) + while (prefix_end < m_line.size() && !iswspace(m_line[prefix_end])) ++prefix_end; if (prefix_start == prefix_end) return; @@ -524,7 +519,7 @@ void ChatPrompt::nickCompletion(const std::list<std::string>& names, bool backwa u32 replacement_index = 0; if (!initial) { - while (word_end < m_line.size() && !isspace(m_line[word_end])) + while (word_end < m_line.size() && !iswspace(m_line[word_end])) ++word_end; std::wstring word = m_line.substr(prefix_start, word_end - prefix_start); @@ -543,7 +538,7 @@ void ChatPrompt::nickCompletion(const std::list<std::string>& names, bool backwa } } std::wstring replacement = completions[replacement_index]; - if (word_end < m_line.size() && isspace(word_end)) + if (word_end < m_line.size() && iswspace(m_line[word_end])) ++word_end; // replace existing word with replacement word, @@ -598,17 +593,17 @@ void ChatPrompt::cursorOperation(CursorOp op, CursorOpDir dir, CursorOpScope sco case CURSOROP_SCOPE_WORD: if (dir == CURSOROP_DIR_RIGHT) { // skip one word to the right - while (new_cursor < length && isspace(m_line[new_cursor])) + while (new_cursor < length && iswspace(m_line[new_cursor])) new_cursor++; - while (new_cursor < length && !isspace(m_line[new_cursor])) + while (new_cursor < length && !iswspace(m_line[new_cursor])) new_cursor++; - while (new_cursor < length && isspace(m_line[new_cursor])) + while (new_cursor < length && iswspace(m_line[new_cursor])) new_cursor++; } else { // skip one word to the left - while (new_cursor >= 1 && isspace(m_line[new_cursor - 1])) + while (new_cursor >= 1 && iswspace(m_line[new_cursor - 1])) new_cursor--; - while (new_cursor >= 1 && !isspace(m_line[new_cursor - 1])) + while (new_cursor >= 1 && !iswspace(m_line[new_cursor - 1])) new_cursor--; } break; diff --git a/src/chat.h b/src/chat.h index 11061fd39..b7c6b74b9 100644 --- a/src/chat.h +++ b/src/chat.h @@ -38,14 +38,14 @@ struct ChatLine // message text EnrichedString text; - ChatLine(std::wstring a_name, std::wstring a_text): + ChatLine(const std::wstring &a_name, const std::wstring &a_text): age(0.0), name(a_name), text(a_text) { } - ChatLine(EnrichedString a_name, EnrichedString a_text): + ChatLine(const EnrichedString &a_name, const EnrichedString &a_text): age(0.0), name(a_name), text(a_text) @@ -86,8 +86,6 @@ public: // Get number of lines currently in buffer. u32 getLineCount() const; - // Get scrollback size, maximum number of lines in buffer. - u32 getScrollback() const; // Get reference to i-th chat line. const ChatLine& getLine(u32 index) const; @@ -148,7 +146,7 @@ private: class ChatPrompt { public: - ChatPrompt(std::wstring prompt, u32 history_limit); + ChatPrompt(const std::wstring &prompt, u32 history_limit); ~ChatPrompt(); // Input character or string @@ -162,8 +160,7 @@ public: std::wstring getLine() const { return m_line; } // Get section of line that is currently selected - std::wstring getSelection() const - { return m_line.substr(m_cursor, m_cursor_len); } + std::wstring getSelection() const { return m_line.substr(m_cursor, m_cursor_len); } // Clear the current line void clear(); diff --git a/src/client.cpp b/src/client.cpp index 5476aad0e..a5228132d 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -32,172 +32,33 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client.h" #include "network/clientopcodes.h" #include "filesys.h" -#include "porting.h" #include "mapblock_mesh.h" #include "mapblock.h" #include "minimap.h" -#include "settings.h" +#include "mods.h" #include "profiler.h" #include "gettext.h" -#include "log.h" -#include "nodemetadata.h" -#include "itemdef.h" -#include "shader.h" #include "clientmap.h" #include "clientmedia.h" -#include "sound.h" -#include "IMeshCache.h" -#include "config.h" #include "version.h" #include "drawscene.h" #include "database-sqlite3.h" #include "serialization.h" #include "guiscalingfilter.h" +#include "script/scripting_client.h" +#include "game.h" extern gui::IGUIEnvironment* guienv; /* - QueuedMeshUpdate -*/ - -QueuedMeshUpdate::QueuedMeshUpdate(): - p(-1337,-1337,-1337), - data(NULL), - ack_block_to_server(false) -{ -} - -QueuedMeshUpdate::~QueuedMeshUpdate() -{ - if(data) - delete data; -} - -/* - MeshUpdateQueue -*/ - -MeshUpdateQueue::MeshUpdateQueue() -{ -} - -MeshUpdateQueue::~MeshUpdateQueue() -{ - MutexAutoLock lock(m_mutex); - - for(std::vector<QueuedMeshUpdate*>::iterator - i = m_queue.begin(); - i != m_queue.end(); ++i) - { - QueuedMeshUpdate *q = *i; - delete q; - } -} - -/* - peer_id=0 adds with nobody to send to -*/ -void MeshUpdateQueue::addBlock(v3s16 p, MeshMakeData *data, bool ack_block_to_server, bool urgent) -{ - DSTACK(FUNCTION_NAME); - - assert(data); // pre-condition - - MutexAutoLock lock(m_mutex); - - if(urgent) - m_urgents.insert(p); - - /* - Find if block is already in queue. - If it is, update the data and quit. - */ - for(std::vector<QueuedMeshUpdate*>::iterator - i = m_queue.begin(); - i != m_queue.end(); ++i) - { - QueuedMeshUpdate *q = *i; - if(q->p == p) - { - if(q->data) - delete q->data; - q->data = data; - if(ack_block_to_server) - q->ack_block_to_server = true; - return; - } - } - - /* - Add the block - */ - QueuedMeshUpdate *q = new QueuedMeshUpdate; - q->p = p; - q->data = data; - q->ack_block_to_server = ack_block_to_server; - m_queue.push_back(q); -} - -// Returned pointer must be deleted -// Returns NULL if queue is empty -QueuedMeshUpdate *MeshUpdateQueue::pop() -{ - MutexAutoLock lock(m_mutex); - - bool must_be_urgent = !m_urgents.empty(); - for(std::vector<QueuedMeshUpdate*>::iterator - i = m_queue.begin(); - i != m_queue.end(); ++i) - { - QueuedMeshUpdate *q = *i; - if(must_be_urgent && m_urgents.count(q->p) == 0) - continue; - m_queue.erase(i); - m_urgents.erase(q->p); - return q; - } - return NULL; -} - -/* - MeshUpdateThread -*/ - -void MeshUpdateThread::enqueueUpdate(v3s16 p, MeshMakeData *data, - bool ack_block_to_server, bool urgent) -{ - m_queue_in.addBlock(p, data, ack_block_to_server, urgent); - deferUpdate(); -} - -void MeshUpdateThread::doUpdate() -{ - QueuedMeshUpdate *q; - while ((q = m_queue_in.pop())) { - - ScopeProfiler sp(g_profiler, "Client: Mesh making"); - - MapBlockMesh *mesh_new = new MapBlockMesh(q->data, m_camera_offset); - - MeshUpdateResult r; - r.p = q->p; - r.mesh = mesh_new; - r.ack_block_to_server = q->ack_block_to_server; - - m_queue_out.push_back(r); - - delete q; - } -} - -/* Client */ Client::Client( IrrlichtDevice *device, const char *playername, - std::string password, + const std::string &password, + const std::string &address_name, MapDrawControl &control, IWritableTextureSource *tsrc, IWritableShaderSource *shsrc, @@ -205,7 +66,8 @@ Client::Client( IWritableNodeDefManager *nodedef, ISoundManager *sound, MtEventManager *event, - bool ipv6 + bool ipv6, + GameUIFlags *game_ui_flags ): m_packetcounter_timer(0.0), m_connection_reinit_timer(0.1), @@ -218,9 +80,9 @@ Client::Client( m_nodedef(nodedef), m_sound(sound), m_event(event), - m_mesh_update_thread(), + m_mesh_update_thread(this), m_env( - new ClientMap(this, this, control, + new ClientMap(this, control, device->getSceneManager()->getRootSceneNode(), device->getSceneManager(), 666), device->getSceneManager(), @@ -228,8 +90,10 @@ Client::Client( ), m_particle_manager(&m_env), m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, ipv6, this), + m_address_name(address_name), m_device(device), m_camera(NULL), + m_minimap(NULL), m_minimap_disabled_by_server(false), m_server_ser_ver(SER_FMT_VER_INVALID), m_proto_ver(0), @@ -240,6 +104,8 @@ Client::Client( m_animation_time(0), m_crack_level(-1), m_crack_pos(0,0,0), + m_last_chat_message_sent(time(NULL)), + m_chat_message_allowance(5.0f), m_map_seed(0), m_password(password), m_chosen_auth_mech(AUTH_MECHANISM_NONE), @@ -255,23 +121,95 @@ Client::Client( m_recommended_send_interval(0.1), m_removed_sounds_check_timer(0), m_state(LC_Created), - m_localdb(NULL) + m_localdb(NULL), + m_script(NULL), + m_mod_storage_save_timer(10.0f), + m_game_ui_flags(game_ui_flags), + m_shutdown(false) { // Add local player m_env.setLocalPlayer(new LocalPlayer(this, playername)); - m_mapper = new Mapper(device, this); + if (g_settings->getBool("enable_minimap")) { + m_minimap = new Minimap(device, this); + } m_cache_save_interval = g_settings->getU16("server_map_save_interval"); - m_cache_smooth_lighting = g_settings->getBool("smooth_lighting"); - m_cache_enable_shaders = g_settings->getBool("enable_shaders"); - m_cache_use_tangent_vertices = m_cache_enable_shaders && ( - g_settings->getBool("enable_bumpmapping") || - g_settings->getBool("enable_parallax_occlusion")); + m_modding_enabled = g_settings->getBool("enable_client_modding"); + m_script = new ClientScripting(this); + m_env.setScript(m_script); + m_script->setEnv(&m_env); +} + +void Client::initMods() +{ + m_script->loadMod(getBuiltinLuaPath() + DIR_DELIM "init.lua", BUILTIN_MOD_NAME); + + // If modding is not enabled, don't load mods, just builtin + if (!m_modding_enabled) { + return; + } + + ClientModConfiguration modconf(getClientModsLuaPath()); + std::vector<ModSpec> mods = modconf.getMods(); + std::vector<ModSpec> unsatisfied_mods = modconf.getUnsatisfiedMods(); + // complain about mods with unsatisfied dependencies + if (!modconf.isConsistent()) { + modconf.printUnsatisfiedModsError(); + } + + // Print mods + infostream << "Client Loading mods: "; + for (std::vector<ModSpec>::const_iterator i = mods.begin(); + i != mods.end(); ++i) { + infostream << (*i).name << " "; + } + + infostream << std::endl; + // Load and run "mod" scripts + for (std::vector<ModSpec>::const_iterator it = mods.begin(); + it != mods.end(); ++it) { + const ModSpec &mod = *it; + if (!string_allowed(mod.name, MODNAME_ALLOWED_CHARS)) { + throw ModError("Error loading mod \"" + mod.name + + "\": Mod name does not follow naming conventions: " + "Only characters [a-z0-9_] are allowed."); + } + std::string script_path = mod.path + DIR_DELIM + "init.lua"; + infostream << " [" << padStringRight(mod.name, 12) << "] [\"" + << script_path << "\"]" << std::endl; + m_script->loadMod(script_path, mod.name); + } +} + +const std::string &Client::getBuiltinLuaPath() +{ + static const std::string builtin_dir = porting::path_share + DIR_DELIM + "builtin"; + return builtin_dir; +} + +const std::string &Client::getClientModsLuaPath() +{ + static const std::string clientmods_dir = porting::path_share + DIR_DELIM + "clientmods"; + return clientmods_dir; +} + +const std::vector<ModSpec>& Client::getMods() const +{ + static std::vector<ModSpec> client_modspec_temp; + return client_modspec_temp; +} + +const ModSpec* Client::getModSpec(const std::string &modname) const +{ + return NULL; } void Client::Stop() { + m_shutdown = true; + // Don't disable this part when modding is disabled, it's used in builtin + m_script->on_shutdown(); //request all client managed threads to stop m_mesh_update_thread.stop(); // Save local server map @@ -279,18 +217,18 @@ void Client::Stop() infostream << "Local map saving ended." << std::endl; m_localdb->endSave(); } + + delete m_script; } bool Client::isShutdown() { - - if (!m_mesh_update_thread.isRunning()) return true; - - return false; + return m_shutdown || !m_mesh_update_thread.isRunning(); } Client::~Client() { + m_shutdown = true; m_con.Disconnect(); m_mesh_update_thread.stop(); @@ -319,16 +257,14 @@ Client::~Client() m_device->getSceneManager()->getMeshCache()->removeMesh(mesh); } - delete m_mapper; + delete m_minimap; } -void Client::connect(Address address, - const std::string &address_name, - bool is_local_server) +void Client::connect(Address address, bool is_local_server) { DSTACK(FUNCTION_NAME); - initLocalMapSaving(address, address_name, is_local_server); + initLocalMapSaving(address, m_address_name, is_local_server); m_con.SetTimeoutMs(0); m_con.Connect(address); @@ -467,6 +403,14 @@ void Client::step(float dtime) } /* + Send pending messages on out chat queue + */ + if (!m_out_chat_queue.empty() && canSendChatMessage()) { + sendChatMessage(m_out_chat_queue.front()); + m_out_chat_queue.pop(); + } + + /* Handle environment */ // Control local player (0ms) @@ -476,20 +420,19 @@ void Client::step(float dtime) // Step environment m_env.step(dtime); + m_sound->step(dtime); /* Get events */ - for(;;) { - ClientEnvEvent event = m_env.getClientEvent(); - if(event.type == CEE_NONE) { - break; - } - else if(event.type == CEE_PLAYER_DAMAGE) { - if(m_ignore_damage_timer <= 0) { - u8 damage = event.player_damage.amount; + while (m_env.hasClientEnvEvents()) { + ClientEnvEvent envEvent = m_env.getClientEnvEvent(); + + if (envEvent.type == CEE_PLAYER_DAMAGE) { + if (m_ignore_damage_timer <= 0) { + u8 damage = envEvent.player_damage.amount; - if(event.player_damage.send_to_server) + if (envEvent.player_damage.send_to_server) sendDamage(damage); // Add to ClientEvent queue @@ -499,9 +442,10 @@ void Client::step(float dtime) m_client_event_queue.push(event); } } - else if(event.type == CEE_PLAYER_BREATH) { - u16 breath = event.player_breath.amount; - sendBreath(breath); + // Protocol v29 or greater obsoleted this event + else if (envEvent.type == CEE_PLAYER_BREATH && m_proto_ver < 29) { + u16 breath = envEvent.player_breath.amount; + sendBreath(breath); } } @@ -555,20 +499,24 @@ void Client::step(float dtime) minimap_mapblock = r.mesh->moveMinimapMapblock(); if (minimap_mapblock == NULL) do_mapper_update = false; - } - if (r.mesh && r.mesh->getMesh()->getMeshBufferCount() == 0) { - delete r.mesh; - } else { - // Replace with the new mesh - block->mesh = r.mesh; + bool is_empty = true; + for (int l = 0; l < MAX_TILE_LAYERS; l++) + if (r.mesh->getMesh(l)->getMeshBufferCount() != 0) + is_empty = false; + + if (is_empty) + delete r.mesh; + else + // Replace with the new mesh + block->mesh = r.mesh; } } else { delete r.mesh; } - if (do_mapper_update) - m_mapper->addBlock(r.p, minimap_mapblock); + if (m_minimap && do_mapper_update) + m_minimap->addBlock(r.p, minimap_mapblock); if (r.ack_block_to_server) { /* @@ -590,7 +538,6 @@ void Client::step(float dtime) if (m_media_downloader && m_media_downloader->isStarted()) { m_media_downloader->step(this); if (m_media_downloader->isDone()) { - received_media(); delete m_media_downloader; m_media_downloader = NULL; } @@ -663,6 +610,18 @@ void Client::step(float dtime) } } + m_mod_storage_save_timer -= dtime; + if (m_mod_storage_save_timer <= 0.0f) { + verbosestream << "Saving registered mod storages." << std::endl; + m_mod_storage_save_timer = g_settings->getFloat("server_map_save_interval"); + for (UNORDERED_MAP<std::string, ModMetadata *>::const_iterator + it = m_mod_storages.begin(); it != m_mod_storages.end(); ++it) { + if (it->second->isModified()) { + it->second->save(getModStoragePath()); + } + } + } + // Write server map if (m_localdb && m_localdb_save_interval.step(dtime, m_cache_save_interval)) { @@ -799,14 +758,6 @@ void Client::request_media(const std::vector<std::string> &file_requests) << file_requests.size() << " files. packet size)" << std::endl; } -void Client::received_media() -{ - NetworkPacket pkt(TOSERVER_RECEIVED_MEDIA, 0); - Send(&pkt); - infostream << "Client: Notifying server that we received all media" - << std::endl; -} - void Client::initLocalMapSaving(const Address &address, const std::string &hostname, bool is_local_server) @@ -822,7 +773,7 @@ void Client::initLocalMapSaving(const Address &address, fs::CreateAllDirs(world_path); - m_localdb = new Database_SQLite3(world_path); + m_localdb = new MapDatabaseSQLite3(world_path); m_localdb->beginSave(); actionstream << "Local map saving started, map will be saved at '" << world_path << "'" << std::endl; } @@ -830,7 +781,7 @@ void Client::initLocalMapSaving(const Address &address, void Client::ReceiveAll() { DSTACK(FUNCTION_NAME); - u32 start_ms = porting::getTimeMs(); + u64 start_ms = porting::getTimeMs(); for(;;) { // Limit time even if there would be huge amounts of data to @@ -1217,13 +1168,50 @@ void Client::sendInventoryAction(InventoryAction *a) Send(&pkt); } +bool Client::canSendChatMessage() const +{ + u32 now = time(NULL); + float time_passed = now - m_last_chat_message_sent; + + float virt_chat_message_allowance = m_chat_message_allowance + time_passed * + (CLIENT_CHAT_MESSAGE_LIMIT_PER_10S / 8.0f); + + if (virt_chat_message_allowance < 1.0f) + return false; + + return true; +} + void Client::sendChatMessage(const std::wstring &message) { - NetworkPacket pkt(TOSERVER_CHAT_MESSAGE, 2 + message.size() * sizeof(u16)); + const s16 max_queue_size = g_settings->getS16("max_out_chat_queue_size"); + if (canSendChatMessage()) { + u32 now = time(NULL); + float time_passed = now - m_last_chat_message_sent; + m_last_chat_message_sent = time(NULL); - pkt << message; + m_chat_message_allowance += time_passed * (CLIENT_CHAT_MESSAGE_LIMIT_PER_10S / 8.0f); + if (m_chat_message_allowance > CLIENT_CHAT_MESSAGE_LIMIT_PER_10S) + m_chat_message_allowance = CLIENT_CHAT_MESSAGE_LIMIT_PER_10S; - Send(&pkt); + m_chat_message_allowance -= 1.0f; + + NetworkPacket pkt(TOSERVER_CHAT_MESSAGE, 2 + message.size() * sizeof(u16)); + + pkt << message; + + Send(&pkt); + } else if (m_out_chat_queue.size() < (u16) max_queue_size || max_queue_size == -1) { + m_out_chat_queue.push(message); + } else { + infostream << "Could not queue chat message because maximum out chat queue size (" + << max_queue_size << ") is reached." << std::endl; + } +} + +void Client::clearOutChatQueue() +{ + m_out_chat_queue = std::queue<std::wstring>(); } void Client::sendChangePassword(const std::string &oldpassword, @@ -1270,6 +1258,10 @@ void Client::sendBreath(u16 breath) { DSTACK(FUNCTION_NAME); + // Protocol v29 make this obsolete + if (m_proto_ver >= 29) + return; + NetworkPacket pkt(TOSERVER_BREATH, sizeof(u16)); pkt << breath; Send(&pkt); @@ -1384,6 +1376,11 @@ void Client::removeNode(v3s16 p) } } +MapNode Client::getNode(v3s16 p, bool *is_valid_position) +{ + return m_env.getMap().getNodeNoEx(p, is_valid_position); +} + void Client::addNode(v3s16 p, MapNode n, bool remove_metadata) { //TimeTaker timer1("Client::addNode()"); @@ -1495,44 +1492,6 @@ void Client::inventoryAction(InventoryAction *a) delete a; } -ClientActiveObject * Client::getSelectedActiveObject( - f32 max_d, - v3f from_pos_f_on_map, - core::line3d<f32> shootline_on_map - ) -{ - std::vector<DistanceSortedActiveObject> objects; - - m_env.getActiveObjects(from_pos_f_on_map, max_d, objects); - - // Sort them. - // After this, the closest object is the first in the array. - std::sort(objects.begin(), objects.end()); - - for(unsigned int i=0; i<objects.size(); i++) - { - ClientActiveObject *obj = objects[i].obj; - - aabb3f *selection_box = obj->getSelectionBox(); - if(selection_box == NULL) - continue; - - v3f pos = obj->getPosition(); - - aabb3f offsetted_box( - selection_box->MinEdge + pos, - selection_box->MaxEdge + pos - ); - - if(offsetted_box.intersectsWithLine(shootline_on_map)) - { - return obj; - } - } - - return NULL; -} - float Client::getAnimationTime() { return m_animation_time; @@ -1543,6 +1502,11 @@ int Client::getCrackLevel() return m_crack_level; } +v3s16 Client::getCrackPos() +{ + return m_crack_pos; +} + void Client::setCrack(int level, v3s16 pos) { int old_crack_level = m_crack_level; @@ -1585,47 +1549,37 @@ void Client::typeChatMessage(const std::wstring &message) if(message == L"") return; + // If message was ate by script API, don't send it to server + if (m_script->on_sending_message(wide_to_utf8(message))) { + return; + } + // Send to others sendChatMessage(message); // Show locally - if (message[0] == L'/') - { - m_chat_queue.push((std::wstring)L"issued command: " + message); - } - else + if (message[0] != L'/') { - LocalPlayer *player = m_env.getLocalPlayer(); - assert(player != NULL); - std::wstring name = narrow_to_wide(player->getName()); - m_chat_queue.push((std::wstring)L"<" + name + L"> " + message); + // compatibility code + if (m_proto_ver < 29) { + LocalPlayer *player = m_env.getLocalPlayer(); + assert(player != NULL); + std::wstring name = narrow_to_wide(player->getName()); + pushToChatQueue((std::wstring)L"<" + name + L"> " + message); + } } } void Client::addUpdateMeshTask(v3s16 p, bool ack_to_server, bool urgent) { + // Check if the block exists to begin with. In the case when a non-existing + // neighbor is automatically added, it may not. In that case we don't want + // to tell the mesh update thread about it. MapBlock *b = m_env.getMap().getBlockNoCreateNoEx(p); - if(b == NULL) + if (b == NULL) return; - /* - Create a task to update the mesh of the block - */ - - MeshMakeData *data = new MeshMakeData(this, m_cache_enable_shaders, - m_cache_use_tangent_vertices); - - { - //TimeTaker timer("data fill"); - // Release: ~0ms - // Debug: 1-6ms, avg=2ms - data->fill(b); - data->setCrack(m_crack_level, m_crack_pos); - data->setSmoothLighting(m_cache_smooth_lighting); - } - - // Add task to queue - m_mesh_update_thread.enqueueUpdate(p, data, ack_to_server, urgent); + m_mesh_update_thread.updateBlock(&m_env.getMap(), p, ack_to_server, urgent); } void Client::addUpdateMeshTaskWithEdge(v3s16 blockpos, bool ack_to_server, bool urgent) @@ -1691,14 +1645,11 @@ void Client::addUpdateMeshTaskForNode(v3s16 nodepos, bool ack_to_server, bool ur ClientEvent Client::getClientEvent() { - ClientEvent event; - if (m_client_event_queue.empty()) { - event.type = CE_NONE; - } - else { - event = m_client_event_queue.front(); - m_client_event_queue.pop(); - } + FATAL_ERROR_IF(m_client_event_queue.empty(), + "Cannot getClientEvent, queue is empty."); + + ClientEvent event = m_client_event_queue.front(); + m_client_event_queue.pop(); return event; } @@ -1713,9 +1664,10 @@ float Client::mediaReceiveProgress() typedef struct TextureUpdateArgs { IrrlichtDevice *device; gui::IGUIEnvironment *guienv; - u32 last_time_ms; + u64 last_time_ms; u16 last_percent; const wchar_t* text_base; + ITextureSource *tsrc; } TextureUpdateArgs; void texture_update_progress(void *args, u32 progress, u32 max_progress) @@ -1725,10 +1677,10 @@ void texture_update_progress(void *args, u32 progress, u32 max_progress) // update the loading menu -- if neccessary bool do_draw = false; - u32 time_ms = targs->last_time_ms; + u64 time_ms = targs->last_time_ms; if (cur_percent != targs->last_percent) { targs->last_percent = cur_percent; - time_ms = getTimeMs(); + time_ms = porting::getTimeMs(); // only draw when the user will notice something: do_draw = (time_ms - targs->last_time_ms > 100); } @@ -1737,8 +1689,8 @@ void texture_update_progress(void *args, u32 progress, u32 max_progress) targs->last_time_ms = time_ms; std::basic_stringstream<wchar_t> strm; strm << targs->text_base << " " << targs->last_percent << "%..."; - draw_load_screen(strm.str(), targs->device, targs->guienv, 0, - 72 + (u16) ((18. / 100.) * (double) targs->last_percent)); + draw_load_screen(strm.str(), targs->device, targs->guienv, targs->tsrc, 0, + 72 + (u16) ((18. / 100.) * (double) targs->last_percent), true); } } @@ -1758,21 +1710,21 @@ void Client::afterContentReceived(IrrlichtDevice *device) // Rebuild inherited images and recreate textures infostream<<"- Rebuilding images and textures"<<std::endl; - draw_load_screen(text,device, guienv, 0, 70); + draw_load_screen(text,device, guienv, m_tsrc, 0, 70); m_tsrc->rebuildImagesAndTextures(); delete[] text; // Rebuild shaders infostream<<"- Rebuilding shaders"<<std::endl; text = wgettext("Rebuilding shaders..."); - draw_load_screen(text, device, guienv, 0, 71); + draw_load_screen(text, device, guienv, m_tsrc, 0, 71); m_shsrc->rebuildShaders(); delete[] text; // Update node aliases infostream<<"- Updating node aliases"<<std::endl; text = wgettext("Initializing nodes..."); - draw_load_screen(text, device, guienv, 0, 72); + draw_load_screen(text, device, guienv, m_tsrc, 0, 72); m_nodedef->updateAliases(m_itemdef); std::string texture_path = g_settings->get("texture_path"); if (texture_path != "" && fs::IsDir(texture_path)) @@ -1786,9 +1738,10 @@ void Client::afterContentReceived(IrrlichtDevice *device) TextureUpdateArgs tu_args; tu_args.device = device; tu_args.guienv = guienv; - tu_args.last_time_ms = getTimeMs(); + tu_args.last_time_ms = porting::getTimeMs(); tu_args.last_percent = 0; tu_args.text_base = wgettext("Initializing nodes"); + tu_args.tsrc = m_tsrc; m_nodedef->updateTextures(this, texture_update_progress, &tu_args); delete[] tu_args.text_base; @@ -1798,29 +1751,29 @@ void Client::afterContentReceived(IrrlichtDevice *device) m_state = LC_Ready; sendReady(); + + if (g_settings->getBool("enable_client_modding")) { + m_script->on_client_ready(m_env.getLocalPlayer()); + m_script->on_connect(); + } + text = wgettext("Done!"); - draw_load_screen(text, device, guienv, 0, 100); + draw_load_screen(text, device, guienv, m_tsrc, 0, 100); infostream<<"Client::afterContentReceived() done"<<std::endl; delete[] text; } -float Client::getRTT(void) +float Client::getRTT() { return m_con.getPeerStat(PEER_ID_SERVER,con::AVG_RTT); } -float Client::getCurRate(void) +float Client::getCurRate() { - return ( m_con.getLocalStat(con::CUR_INC_RATE) + + return (m_con.getLocalStat(con::CUR_INC_RATE) + m_con.getLocalStat(con::CUR_DL_RATE)); } -float Client::getAvgRate(void) -{ - return ( m_con.getLocalStat(con::AVG_INC_RATE) + - m_con.getLocalStat(con::AVG_DL_RATE)); -} - void Client::makeScreenshot(IrrlichtDevice *device) { irr::video::IVideoDriver *driver = device->getVideoDriver(); @@ -1871,7 +1824,7 @@ void Client::makeScreenshot(IrrlichtDevice *device) } else { sstr << "Failed to save screenshot '" << filename << "'"; } - m_chat_queue.push(narrow_to_wide(sstr.str())); + pushToChatQueue(narrow_to_wide(sstr.str())); infostream << sstr.str() << std::endl; image->drop(); } @@ -1880,6 +1833,41 @@ void Client::makeScreenshot(IrrlichtDevice *device) raw_image->drop(); } +bool Client::shouldShowMinimap() const +{ + return !m_minimap_disabled_by_server; +} + +void Client::showGameChat(const bool show) +{ + m_game_ui_flags->show_chat = show; +} + +void Client::showGameHud(const bool show) +{ + m_game_ui_flags->show_hud = show; +} + +void Client::showMinimap(const bool show) +{ + m_game_ui_flags->show_minimap = show; +} + +void Client::showProfiler(const bool show) +{ + m_game_ui_flags->show_profiler_graph = show; +} + +void Client::showGameFog(const bool show) +{ + m_game_ui_flags->force_fog_off = !show; +} + +void Client::showGameDebug(const bool show) +{ + m_game_ui_flags->show_debug = show; +} + // IGameDef interface // Under envlock IItemDefManager* Client::getItemDefManager() @@ -1956,3 +1944,30 @@ scene::IAnimatedMesh* Client::getMesh(const std::string &filename) smgr->getMeshCache()->removeMesh(mesh); return mesh; } + +bool Client::registerModStorage(ModMetadata *storage) +{ + if (m_mod_storages.find(storage->getModName()) != m_mod_storages.end()) { + errorstream << "Unable to register same mod storage twice. Storage name: " + << storage->getModName() << std::endl; + return false; + } + + m_mod_storages[storage->getModName()] = storage; + return true; +} + +void Client::unregisterModStorage(const std::string &name) +{ + UNORDERED_MAP<std::string, ModMetadata *>::const_iterator it = m_mod_storages.find(name); + if (it != m_mod_storages.end()) { + // Save unconditionaly on unregistration + it->second->save(getModStoragePath()); + m_mod_storages.erase(name); + } +} + +std::string Client::getModStoragePath() const +{ + return porting::path_user + DIR_DELIM + "client" + DIR_DELIM + "mod_storage"; +} diff --git a/src/client.h b/src/client.h index 9f5bda059..b4145c76f 100644 --- a/src/client.h +++ b/src/client.h @@ -21,7 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define CLIENT_HEADER #include "network/connection.h" -#include "environment.h" +#include "clientenvironment.h" #include "irrlichttypes_extrabloated.h" #include "threading/mutex.h" #include <ostream> @@ -34,7 +34,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "localplayer.h" #include "hud.h" #include "particles.h" -#include "network/networkpacket.h" +#include "mapnode.h" +#include "tileanimation.h" +#include "mesh_generator_thread.h" + +#define CLIENT_CHAT_MESSAGE_LIMIT_PER_10S 10.0f struct MeshMakeData; class MapBlockMesh; @@ -47,20 +51,11 @@ class ClientMediaDownloader; struct MapDrawControl; class MtEventManager; struct PointedThing; -class Database; -class Mapper; +class MapDatabase; +class Minimap; struct MinimapMapblock; class Camera; - -struct QueuedMeshUpdate -{ - v3s16 p; - MeshMakeData *data; - bool ack_block_to_server; - - QueuedMeshUpdate(); - ~QueuedMeshUpdate(); -}; +class NetworkPacket; enum LocalClientState { LC_Created, @@ -68,71 +63,6 @@ enum LocalClientState { LC_Ready }; -/* - A thread-safe queue of mesh update tasks -*/ -class MeshUpdateQueue -{ -public: - MeshUpdateQueue(); - - ~MeshUpdateQueue(); - - /* - peer_id=0 adds with nobody to send to - */ - void addBlock(v3s16 p, MeshMakeData *data, - bool ack_block_to_server, bool urgent); - - // Returned pointer must be deleted - // Returns NULL if queue is empty - QueuedMeshUpdate * pop(); - - u32 size() - { - MutexAutoLock lock(m_mutex); - return m_queue.size(); - } - -private: - std::vector<QueuedMeshUpdate*> m_queue; - std::set<v3s16> m_urgents; - Mutex m_mutex; -}; - -struct MeshUpdateResult -{ - v3s16 p; - MapBlockMesh *mesh; - bool ack_block_to_server; - - MeshUpdateResult(): - p(-1338,-1338,-1338), - mesh(NULL), - ack_block_to_server(false) - { - } -}; - -class MeshUpdateThread : public UpdateThread -{ -private: - MeshUpdateQueue m_queue_in; - -protected: - virtual void doUpdate(); - -public: - - MeshUpdateThread() : UpdateThread("Mesh") {} - - void enqueueUpdate(v3s16 p, MeshMakeData *data, - bool ack_block_to_server, bool urgent); - MutexedQueue<MeshUpdateResult> m_queue_out; - - v3s16 m_camera_offset; -}; - enum ClientEventType { CE_NONE, @@ -140,6 +70,7 @@ enum ClientEventType CE_PLAYER_FORCE_MOVE, CE_DEATHSCREEN, CE_SHOW_FORMSPEC, + CE_SHOW_LOCAL_FORMSPEC, CE_SPAWN_PARTICLE, CE_ADD_PARTICLESPAWNER, CE_DELETE_PARTICLESPAWNER, @@ -148,6 +79,7 @@ enum ClientEventType CE_HUDCHANGE, CE_SET_SKY, CE_OVERRIDE_DAY_NIGHT_RATIO, + CE_CLOUD_PARAMS, }; struct ClientEvent @@ -185,6 +117,8 @@ struct ClientEvent bool collision_removal; bool vertical; std::string *texture; + struct TileAnimationParams animation; + u8 glow; } spawn_particle; struct{ u16 amount; @@ -205,6 +139,8 @@ struct ClientEvent bool vertical; std::string *texture; u32 id; + struct TileAnimationParams animation; + u8 glow; } add_particlespawner; struct{ u32 id; @@ -240,11 +176,21 @@ struct ClientEvent video::SColor *bgcolor; std::string *type; std::vector<std::string> *params; + bool clouds; } set_sky; struct{ bool do_override; float ratio_f; } override_day_night_ratio; + struct { + f32 density; + u32 color_bright; + u32 color_ambient; + f32 height; + f32 thickness; + f32 speed_x; + f32 speed_y; + } cloud_params; }; }; @@ -299,6 +245,9 @@ private: std::map<u16, u16> m_packets; }; +class ClientScripting; +struct GameUIFlags; + class Client : public con::PeerHandler, public InventoryManager, public IGameDef { public: @@ -309,7 +258,8 @@ public: Client( IrrlichtDevice *device, const char *playername, - std::string password, + const std::string &password, + const std::string &address_name, MapDrawControl &control, IWritableTextureSource *tsrc, IWritableShaderSource *shsrc, @@ -317,11 +267,14 @@ public: IWritableNodeDefManager *nodedef, ISoundManager *sound, MtEventManager *event, - bool ipv6 + bool ipv6, + GameUIFlags *game_ui_flags ); ~Client(); + void initMods(); + /* request all threads managed by client to be stopped */ @@ -334,9 +287,7 @@ public: The name of the local player should already be set when calling this, as it is sent in the initialization. */ - void connect(Address address, - const std::string &address_name, - bool is_local_server); + void connect(Address address, bool is_local_server); /* Stuff that references the environment is valid only as @@ -372,16 +323,14 @@ public: void handleCommand_HP(NetworkPacket* pkt); void handleCommand_Breath(NetworkPacket* pkt); void handleCommand_MovePlayer(NetworkPacket* pkt); - void handleCommand_PlayerItem(NetworkPacket* pkt); void handleCommand_DeathScreen(NetworkPacket* pkt); void handleCommand_AnnounceMedia(NetworkPacket* pkt); void handleCommand_Media(NetworkPacket* pkt); - void handleCommand_ToolDef(NetworkPacket* pkt); void handleCommand_NodeDef(NetworkPacket* pkt); - void handleCommand_CraftItemDef(NetworkPacket* pkt); void handleCommand_ItemDef(NetworkPacket* pkt); void handleCommand_PlaySound(NetworkPacket* pkt); void handleCommand_StopSound(NetworkPacket* pkt); + void handleCommand_FadeSound(NetworkPacket *pkt); void handleCommand_Privileges(NetworkPacket* pkt); void handleCommand_InventoryFormSpec(NetworkPacket* pkt); void handleCommand_DetachedInventory(NetworkPacket* pkt); @@ -395,6 +344,7 @@ public: void handleCommand_HudSetFlags(NetworkPacket* pkt); void handleCommand_HudSetParam(NetworkPacket* pkt); void handleCommand_HudSetSky(NetworkPacket* pkt); + void handleCommand_CloudParams(NetworkPacket* pkt); void handleCommand_OverrideDayNightRatio(NetworkPacket* pkt); void handleCommand_LocalPlayerAnimations(NetworkPacket* pkt); void handleCommand_EyeOffset(NetworkPacket* pkt); @@ -402,9 +352,6 @@ public: void ProcessData(NetworkPacket *pkt); - // Returns true if something was received - bool AsyncProcessPacket(); - bool AsyncProcessData(); void Send(NetworkPacket* pkt); void interact(u8 action, const PointedThing& pointed); @@ -415,6 +362,7 @@ public: const StringMap &fields); void sendInventoryAction(InventoryAction *a); void sendChatMessage(const std::wstring &message); + void clearOutChatQueue(); void sendChangePassword(const std::string &oldpassword, const std::string &newpassword); void sendDamage(u8 damage); @@ -422,11 +370,18 @@ public: void sendRespawn(); void sendReady(); - ClientEnvironment& getEnv() - { return m_env; } + ClientEnvironment& getEnv() { return m_env; } + ITextureSource *tsrc() { return getTextureSource(); } + ISoundManager *sound() { return getSoundManager(); } + static const std::string &getBuiltinLuaPath(); + static const std::string &getClientModsLuaPath(); + + virtual const std::vector<ModSpec> &getMods() const; + virtual const ModSpec* getModSpec(const std::string &modname) const; // Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent) void removeNode(v3s16 p); + MapNode getNode(v3s16 p, bool *is_valid_position); void addNode(v3s16 p, MapNode n, bool remove_metadata = true); void setPlayerControl(PlayerControl &control); @@ -445,14 +400,6 @@ public: Inventory* getInventory(const InventoryLocation &loc); void inventoryAction(InventoryAction *a); - // Gets closest object pointed by the shootline - // Returns NULL if not found - ClientActiveObject * getSelectedActiveObject( - f32 max_d, - v3f from_pos_f_on_map, - core::line3d<f32> shootline_on_map - ); - const std::list<std::string> &getConnectedPlayerNames() { return m_env.getPlayerNames(); @@ -461,6 +408,7 @@ public: float getAnimationTime(); int getCrackLevel(); + v3s16 getCrackPos(); void setCrack(int level, v3s16 pos); u16 getHP(); @@ -481,16 +429,23 @@ public: void updateCameraOffset(v3s16 camera_offset) { m_mesh_update_thread.m_camera_offset = camera_offset; } - // Get event from queue. CE_NONE is returned if queue is empty. + bool hasClientEvents() const { return !m_client_event_queue.empty(); } + // Get event from queue. If queue is empty, it triggers an assertion failure. ClientEvent getClientEvent(); - bool accessDenied() - { return m_access_denied; } + bool accessDenied() const { return m_access_denied; } + + bool reconnectRequested() const { return m_access_denied_reconnect; } - bool reconnectRequested() { return m_access_denied_reconnect; } + void setFatalError(const std::string &reason) + { + m_access_denied = true; + m_access_denied_reason = reason; + } - std::string accessDeniedReason() - { return m_access_denied_reason; } + // Renaming accessDeniedReason to better name could be good as it's used to + // disconnect client when CSM failed. + const std::string &accessDeniedReason() const { return m_access_denied_reason; } bool itemdefReceived() { return m_itemdef_received; } @@ -509,49 +464,78 @@ public: void afterContentReceived(IrrlichtDevice *device); - float getRTT(void); - float getCurRate(void); - float getAvgRate(void); + float getRTT(); + float getCurRate(); - Mapper* getMapper () - { return m_mapper; } + Minimap* getMinimap() { return m_minimap; } + void setCamera(Camera* camera) { m_camera = camera; } - void setCamera(Camera* camera) - { m_camera = camera; } + Camera* getCamera () { return m_camera; } - Camera* getCamera () - { return m_camera; } - - bool isMinimapDisabledByServer() - { return m_minimap_disabled_by_server; } + bool shouldShowMinimap() const; // IGameDef interface virtual IItemDefManager* getItemDefManager(); virtual INodeDefManager* getNodeDefManager(); virtual ICraftDefManager* getCraftDefManager(); - virtual ITextureSource* getTextureSource(); + ITextureSource* getTextureSource(); virtual IShaderSource* getShaderSource(); - virtual scene::ISceneManager* getSceneManager(); + IShaderSource *shsrc() { return getShaderSource(); } + scene::ISceneManager* getSceneManager(); virtual u16 allocateUnknownNodeId(const std::string &name); virtual ISoundManager* getSoundManager(); virtual MtEventManager* getEventManager(); virtual ParticleManager* getParticleManager(); - virtual bool checkLocalPrivilege(const std::string &priv) + bool checkLocalPrivilege(const std::string &priv) { return checkPrivilege(priv); } virtual scene::IAnimatedMesh* getMesh(const std::string &filename); + virtual std::string getModStoragePath() const; + virtual bool registerModStorage(ModMetadata *meta); + virtual void unregisterModStorage(const std::string &name); + // The following set of functions is used by ClientMediaDownloader // Insert a media file appropriately into the appropriate manager bool loadMedia(const std::string &data, const std::string &filename); // Send a request for conventional media transfer void request_media(const std::vector<std::string> &file_requests); - // Send a notification that no conventional media transfer is needed - void received_media(); LocalClientState getState() { return m_state; } void makeScreenshot(IrrlichtDevice *device); + inline void pushToChatQueue(const std::wstring &input) + { + m_chat_queue.push(input); + } + + ClientScripting *getScript() { return m_script; } + const bool moddingEnabled() const { return m_modding_enabled; } + + inline void pushToEventQueue(const ClientEvent &event) + { + m_client_event_queue.push(event); + } + + void showGameChat(const bool show = true); + void showGameHud(const bool show = true); + void showMinimap(const bool show = true); + void showProfiler(const bool show = true); + void showGameFog(const bool show = true); + void showGameDebug(const bool show = true); + + IrrlichtDevice *getDevice() const { return m_device; } + + const Address getServerAddress() + { + return m_con.GetPeerAddress(PEER_ID_SERVER); + } + + const std::string &getAddressName() const + { + return m_address_name; + } + private: // Virtual methods from con::PeerHandler @@ -584,6 +568,8 @@ private: inline std::string getPlayerName() { return m_env.getLocalPlayer()->getName(); } + bool canSendChatMessage() const; + float m_packetcounter_timer; float m_connection_reinit_timer; float m_avg_rtt_timer; @@ -603,9 +589,10 @@ private: ClientEnvironment m_env; ParticleManager m_particle_manager; con::Connection m_con; + std::string m_address_name; IrrlichtDevice *m_device; Camera *m_camera; - Mapper *m_mapper; + Minimap *m_minimap; bool m_minimap_disabled_by_server; // Server serialization version u8 m_server_ser_ver; @@ -630,6 +617,9 @@ private: //s32 m_daynight_i; //u32 m_daynight_ratio; std::queue<std::wstring> m_chat_queue; + std::queue<std::wstring> m_out_chat_queue; + u32 m_last_chat_message_sent; + float m_chat_message_allowance; // The authentication methods we can use to enter sudo mode (=change password) u32 m_sudo_auth_methods; @@ -686,15 +676,17 @@ private: LocalClientState m_state; // Used for saving server map to disk client-side - Database *m_localdb; + MapDatabase *m_localdb; IntervalLimiter m_localdb_save_interval; u16 m_cache_save_interval; - // TODO: Add callback to update these when g_settings changes - bool m_cache_smooth_lighting; - bool m_cache_enable_shaders; - bool m_cache_use_tangent_vertices; + ClientScripting *m_script; + bool m_modding_enabled; + UNORDERED_MAP<std::string, ModMetadata *> m_mod_storages; + float m_mod_storage_save_timer; + GameUIFlags *m_game_ui_flags; + bool m_shutdown; DISABLE_CLASS_COPY(Client); }; diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index 5faa186a7..2d274ae68 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -1,5 +1,6 @@ set(client_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/clientlauncher.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/inputhandler.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tile.cpp ${CMAKE_CURRENT_SOURCE_DIR}/joystick_controller.cpp PARENT_SCOPE diff --git a/src/client/clientlauncher.cpp b/src/client/clientlauncher.cpp index 6145e3dde..289d1537b 100644 --- a/src/client/clientlauncher.cpp +++ b/src/client/clientlauncher.cpp @@ -42,31 +42,15 @@ gui::IGUIEnvironment *guienv = NULL; gui::IGUIStaticText *guiroot = NULL; MainMenuManager g_menumgr; -bool noMenuActive() +bool isMenuActive() { - return g_menumgr.menuCount() == 0; + return g_menumgr.menuCount() != 0; } // Passed to menus to allow disconnecting and exiting MainGameCallback *g_gamecallback = NULL; -// Instance of the time getter -static TimeGetter *g_timegetter = NULL; - -u32 getTimeMs() -{ - if (g_timegetter == NULL) - return 0; - return g_timegetter->getTime(PRECISION_MILLI); -} - -u32 getTime(TimePrecision prec) { - if (g_timegetter == NULL) - return 0; - return g_timegetter->getTime(prec); -} - ClientLauncher::~ClientLauncher() { if (receiver) @@ -96,9 +80,6 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args) return false; } - // Create time getter - g_timegetter = new IrrlichtTimeGetter(device); - // Speed tests (done after irrlicht is loaded to get timer) if (cmd_args.getFlag("speedtests")) { dstream << "Running speed tests" << std::endl; @@ -114,7 +95,7 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args) porting::setXorgClassHint(video_driver->getExposedVideoData(), PROJECT_NAME_C); - porting::setXorgWindowIcon(device); + porting::setWindowIcon(device); /* This changes the minimum allowed number of vertices in a VBO. @@ -127,10 +108,7 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args) device->setResizable(true); - if (random_input) - input = new RandomInputHandler(); - else - input = new RealInputHandler(device, receiver); + init_input(); smgr = device->getSceneManager(); smgr->getParameters()->setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, true); @@ -337,6 +315,33 @@ bool ClientLauncher::init_engine() return device != NULL; } +void ClientLauncher::init_input() +{ + if (random_input) + input = new RandomInputHandler(); + else + input = new RealInputHandler(device, receiver); + + if (g_settings->getBool("enable_joysticks")) { + irr::core::array<irr::SJoystickInfo> infos; + std::vector<irr::SJoystickInfo> joystick_infos; + + // Make sure this is called maximum once per + // irrlicht device, otherwise it will give you + // multiple events for the same joystick. + if (device->activateJoysticks(infos)) { + infostream << "Joystick support enabled" << std::endl; + joystick_infos.reserve(infos.size()); + for (u32 i = 0; i < infos.size(); i++) { + joystick_infos.push_back(infos[i]); + } + input->joystick.onJoystickConnect(joystick_infos); + } else { + errorstream << "Could not activate joystick support." << std::endl; + } + } +} + bool ClientLauncher::launch_game(std::string &error_message, bool reconnect_requested, GameParams &game_params, const Settings &cmd_args) @@ -403,15 +408,14 @@ bool ClientLauncher::launch_game(std::string &error_message, return false; } - if (menudata.name == "") - menudata.name = std::string("Guest") + itos(myrand_range(1000, 9999)); - else - playername = menudata.name; + if (menudata.name == "" && !simple_singleplayer_mode) { + error_message = gettext("Please choose a name!"); + return false; + } + playername = menudata.name; password = menudata.password; - g_settings->set("name", playername); - current_playername = playername; current_password = password; current_address = address; @@ -424,13 +428,16 @@ bool ClientLauncher::launch_game(std::string &error_message, current_password = ""; current_address = ""; current_port = myrand_range(49152, 65535); - } else if (address != "") { - ServerListSpec server; - server["name"] = menudata.servername; - server["address"] = menudata.address; - server["port"] = menudata.port; - server["description"] = menudata.serverdescription; - ServerList::insert(server); + } else { + g_settings->set("name", playername); + if (address != "") { + ServerListSpec server; + server["name"] = menudata.servername; + server["address"] = menudata.address; + server["port"] = menudata.port; + server["description"] = menudata.serverdescription; + ServerList::insert(server); + } } infostream << "Selected world: " << worldspec.name @@ -489,7 +496,7 @@ void ClientLauncher::main_menu(MainMenuData *menudata) infostream << "Waiting for other menus" << std::endl; while (device->run() && *kill == false) { - if (noMenuActive()) + if (!isMenuActive()) break; driver->beginScene(true, true, video::SColor(255, 128, 128, 128)); guienv->drawAll(); @@ -528,7 +535,7 @@ bool ClientLauncher::create_engine_device() // Determine driver video::E_DRIVER_TYPE driverType = video::EDT_OPENGL; - std::string driverstring = g_settings->get("video_driver"); + const std::string &driverstring = g_settings->get("video_driver"); std::vector<video::E_DRIVER_TYPE> drivers = porting::getSupportedVideoDrivers(); u32 i; @@ -564,25 +571,8 @@ bool ClientLauncher::create_engine_device() device = createDeviceEx(params); - if (device) { - if (g_settings->getBool("enable_joysticks")) { - irr::core::array<irr::SJoystickInfo> infos; - std::vector<irr::SJoystickInfo> joystick_infos; - // Make sure this is called maximum once per - // irrlicht device, otherwise it will give you - // multiple events for the same joystick. - if (device->activateJoysticks(infos)) { - infostream << "Joystick support enabled" << std::endl; - joystick_infos.reserve(infos.size()); - for (u32 i = 0; i < infos.size(); i++) { - joystick_infos.push_back(infos[i]); - } - } else { - errorstream << "Could not activate joystick support." << std::endl; - } - } + if (device) porting::initIrrlicht(device); - } return device != NULL; } diff --git a/src/client/clientlauncher.h b/src/client/clientlauncher.h index b10bbebc9..4ff77bc03 100644 --- a/src/client/clientlauncher.h +++ b/src/client/clientlauncher.h @@ -24,42 +24,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/inputhandler.h" #include "gameparams.h" -// A small helper class -class TimeGetter -{ -public: - virtual u32 getTime(TimePrecision prec) = 0; -}; - -// A precise irrlicht one -class IrrlichtTimeGetter: public TimeGetter -{ -public: - IrrlichtTimeGetter(IrrlichtDevice *device): - m_device(device) - {} - u32 getTime(TimePrecision prec) - { - if (prec == PRECISION_MILLI) { - if (m_device == NULL) - return 0; - return m_device->getTimer()->getRealTime(); - } else { - return porting::getTime(prec); - } - } -private: - IrrlichtDevice *m_device; -}; -// Not so precise one which works without irrlicht -class SimpleTimeGetter: public TimeGetter -{ -public: - u32 getTime(TimePrecision prec) - { - return porting::getTime(prec); - } -}; class ClientLauncher { @@ -91,6 +55,7 @@ public: protected: void init_args(GameParams &game_params, const Settings &cmd_args); bool init_engine(); + void init_input(); bool launch_game(std::string &error_message, bool reconnect_requested, GameParams &game_params, const Settings &cmd_args); diff --git a/src/client/inputhandler.cpp b/src/client/inputhandler.cpp new file mode 100644 index 000000000..9c7a94c4e --- /dev/null +++ b/src/client/inputhandler.cpp @@ -0,0 +1,119 @@ +/* +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "util/numeric.h" +#include "inputhandler.h" +#include "mainmenumanager.h" + +bool MyEventReceiver::OnEvent(const SEvent &event) +{ + /* + React to nothing here if a menu is active + */ + if (isMenuActive()) { +#ifdef HAVE_TOUCHSCREENGUI + if (m_touchscreengui) { + m_touchscreengui->Toggle(false); + } +#endif + return g_menumgr.preprocessEvent(event); + } + + // Remember whether each key is down or up + if (event.EventType == irr::EET_KEY_INPUT_EVENT) { + const KeyPress &keyCode = event.KeyInput; + if (keysListenedFor[keyCode]) { + if (event.KeyInput.PressedDown) { + keyIsDown.set(keyCode); + keyWasDown.set(keyCode); + } else { + keyIsDown.unset(keyCode); + } + return true; + } + } + +#ifdef HAVE_TOUCHSCREENGUI + // case of touchscreengui we have to handle different events + if (m_touchscreengui && event.EventType == irr::EET_TOUCH_INPUT_EVENT) { + m_touchscreengui->translateEvent(event); + return true; + } +#endif + + if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT) { + /* TODO add a check like: + if (event.JoystickEvent != joystick_we_listen_for) + return false; + */ + return joystick->handleEvent(event.JoystickEvent); + } + // handle mouse events + if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) { + if (isMenuActive()) { + left_active = false; + middle_active = false; + right_active = false; + } else { + left_active = event.MouseInput.isLeftPressed(); + middle_active = event.MouseInput.isMiddlePressed(); + right_active = event.MouseInput.isRightPressed(); + + if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) { + leftclicked = true; + } + if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) { + rightclicked = true; + } + if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) { + leftreleased = true; + } + if (event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) { + rightreleased = true; + } + if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) { + mouse_wheel += event.MouseInput.Wheel; + } + } + } else if (event.EventType == irr::EET_LOG_TEXT_EVENT) { + static const LogLevel irr_loglev_conv[] = { + LL_VERBOSE, // ELL_DEBUG + LL_INFO, // ELL_INFORMATION + LL_WARNING, // ELL_WARNING + LL_ERROR, // ELL_ERROR + LL_NONE, // ELL_NONE + }; + assert(event.LogEvent.Level < ARRLEN(irr_loglev_conv)); + g_logger.log(irr_loglev_conv[event.LogEvent.Level], + std::string("Irrlicht: ") + + (const char *)event.LogEvent.Text); + return true; + } + /* always return false in order to continue processing events */ + return false; +} + +/* + * RandomInputHandler + */ +s32 RandomInputHandler::Rand(s32 min, s32 max) +{ + return (myrand() % (max - min + 1)) + min; +} diff --git a/src/client/inputhandler.h b/src/client/inputhandler.h index 824b0da2e..7c422d189 100644 --- a/src/client/inputhandler.h +++ b/src/client/inputhandler.h @@ -22,104 +22,87 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include "joystick_controller.h" +#include <list> +#include "keycode.h" -class MyEventReceiver : public IEventReceiver -{ -public: - // This is the one method that we have to implement - virtual bool OnEvent(const SEvent& event) - { - /* - React to nothing here if a menu is active - */ - if (noMenuActive() == false) { #ifdef HAVE_TOUCHSCREENGUI - if (m_touchscreengui != 0) { - m_touchscreengui->Toggle(false); - } +#include "touchscreengui.h" #endif - return g_menumgr.preprocessEvent(event); - } - // Remember whether each key is down or up - if (event.EventType == irr::EET_KEY_INPUT_EVENT) { - const KeyPress &keyCode = event.KeyInput; - if (keysListenedFor[keyCode]) { - if (event.KeyInput.PressedDown) { - keyIsDown.set(keyCode); - keyWasDown.set(keyCode); - } else { - keyIsDown.unset(keyCode); - } - return true; - } - } +class KeyList : private std::list<KeyPress> +{ + typedef std::list<KeyPress> super; + typedef super::iterator iterator; + typedef super::const_iterator const_iterator; -#ifdef HAVE_TOUCHSCREENGUI - // case of touchscreengui we have to handle different events - if ((m_touchscreengui != 0) && - (event.EventType == irr::EET_TOUCH_INPUT_EVENT)) { - m_touchscreengui->translateEvent(event); - return true; - } -#endif + virtual const_iterator find(const KeyPress &key) const + { + const_iterator f(begin()); + const_iterator e(end()); + + while (f != e) { + if (*f == key) + return f; - if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT) { - /* TODO add a check like: - if (event.JoystickEvent != joystick_we_listen_for) - return false; - */ - return joystick->handleEvent(event.JoystickEvent); + ++f; } - // handle mouse events - if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) { - if (noMenuActive() == false) { - left_active = false; - middle_active = false; - right_active = false; - } else { - left_active = event.MouseInput.isLeftPressed(); - middle_active = event.MouseInput.isMiddlePressed(); - right_active = event.MouseInput.isRightPressed(); - - if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) { - leftclicked = true; - } - if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) { - rightclicked = true; - } - if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) { - leftreleased = true; - } - if (event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) { - rightreleased = true; - } - if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) { - mouse_wheel += event.MouseInput.Wheel; - } - } - } else if (event.EventType == irr::EET_LOG_TEXT_EVENT) { - static const LogLevel irr_loglev_conv[] = { - LL_VERBOSE, // ELL_DEBUG - LL_INFO, // ELL_INFORMATION - LL_WARNING, // ELL_WARNING - LL_ERROR, // ELL_ERROR - LL_NONE, // ELL_NONE - }; - assert(event.LogEvent.Level < ARRLEN(irr_loglev_conv)); - g_logger.log(irr_loglev_conv[event.LogEvent.Level], - std::string("Irrlicht: ") + (const char*) event.LogEvent.Text); - return true; + + return e; + } + + virtual iterator find(const KeyPress &key) + { + iterator f(begin()); + iterator e(end()); + + while (f != e) { + if (*f == key) + return f; + + ++f; } - /* always return false in order to continue processing events */ - return false; + + return e; + } + +public: + void clear() { super::clear(); } + + void set(const KeyPress &key) + { + if (find(key) == end()) + push_back(key); } - bool IsKeyDown(const KeyPress &keyCode) const + void unset(const KeyPress &key) { - return keyIsDown[keyCode]; + iterator p(find(key)); + + if (p != end()) + erase(p); } + void toggle(const KeyPress &key) + { + iterator p(this->find(key)); + + if (p != end()) + erase(p); + else + push_back(key); + } + + bool operator[](const KeyPress &key) const { return find(key) != end(); } +}; + +class MyEventReceiver : public IEventReceiver +{ +public: + // This is the one method that we have to implement + virtual bool OnEvent(const SEvent &event); + + bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown[keyCode]; } + // Checks whether a key was down and resets the state bool WasKeyDown(const KeyPress &keyCode) { @@ -129,14 +112,8 @@ public: return b; } - void listenForKey(const KeyPress &keyCode) - { - keysListenedFor.set(keyCode); - } - void dontListenForKeys() - { - keysListenedFor.clear(); - } + void listenForKey(const KeyPress &keyCode) { keysListenedFor.set(keyCode); } + void dontListenForKeys() { keysListenedFor.clear(); } s32 getMouseWheel() { @@ -184,7 +161,7 @@ public: JoystickController *joystick; #ifdef HAVE_TOUCHSCREENGUI - TouchScreenGUI* m_touchscreengui; + TouchScreenGUI *m_touchscreengui; #endif private: @@ -200,7 +177,42 @@ private: KeyList keysListenedFor; }; +class InputHandler +{ +public: + InputHandler() {} + virtual ~InputHandler() {} + + virtual bool isKeyDown(const KeyPress &keyCode) = 0; + virtual bool wasKeyDown(const KeyPress &keyCode) = 0; + + virtual void listenForKey(const KeyPress &keyCode) {} + virtual void dontListenForKeys() {} + + virtual v2s32 getMousePos() = 0; + virtual void setMousePos(s32 x, s32 y) = 0; + + virtual bool getLeftState() = 0; + virtual bool getRightState() = 0; + + virtual bool getLeftClicked() = 0; + virtual bool getRightClicked() = 0; + virtual void resetLeftClicked() = 0; + virtual void resetRightClicked() = 0; + + virtual bool getLeftReleased() = 0; + virtual bool getRightReleased() = 0; + virtual void resetLeftReleased() = 0; + virtual void resetRightReleased() = 0; + virtual s32 getMouseWheel() = 0; + + virtual void step(float dtime) {} + + virtual void clear() {} + + JoystickController joystick; +}; /* Separated input handler */ @@ -208,10 +220,8 @@ private: class RealInputHandler : public InputHandler { public: - RealInputHandler(IrrlichtDevice *device, MyEventReceiver *receiver): - m_device(device), - m_receiver(receiver), - m_mousepos(0,0) + RealInputHandler(IrrlichtDevice *device, MyEventReceiver *receiver) + : m_device(device), m_receiver(receiver), m_mousepos(0, 0) { m_receiver->joystick = &joystick; } @@ -227,16 +237,12 @@ public: { m_receiver->listenForKey(keyCode); } - virtual void dontListenForKeys() - { - m_receiver->dontListenForKeys(); - } + virtual void dontListenForKeys() { m_receiver->dontListenForKeys(); } virtual v2s32 getMousePos() { if (m_device->getCursorControl()) { return m_device->getCursorControl()->getPosition(); - } - else { + } else { return m_mousepos; } } @@ -244,69 +250,36 @@ public: { if (m_device->getCursorControl()) { m_device->getCursorControl()->setPosition(x, y); - } - else { - m_mousepos = v2s32(x,y); + } else { + m_mousepos = v2s32(x, y); } } - virtual bool getLeftState() - { - return m_receiver->left_active; - } - virtual bool getRightState() - { - return m_receiver->right_active; - } + virtual bool getLeftState() { return m_receiver->left_active; } + virtual bool getRightState() { return m_receiver->right_active; } - virtual bool getLeftClicked() - { - return m_receiver->leftclicked; - } - virtual bool getRightClicked() - { - return m_receiver->rightclicked; - } - virtual void resetLeftClicked() - { - m_receiver->leftclicked = false; - } - virtual void resetRightClicked() - { - m_receiver->rightclicked = false; - } + virtual bool getLeftClicked() { return m_receiver->leftclicked; } + virtual bool getRightClicked() { return m_receiver->rightclicked; } + virtual void resetLeftClicked() { m_receiver->leftclicked = false; } + virtual void resetRightClicked() { m_receiver->rightclicked = false; } - virtual bool getLeftReleased() - { - return m_receiver->leftreleased; - } - virtual bool getRightReleased() - { - return m_receiver->rightreleased; - } - virtual void resetLeftReleased() - { - m_receiver->leftreleased = false; - } - virtual void resetRightReleased() - { - m_receiver->rightreleased = false; - } + virtual bool getLeftReleased() { return m_receiver->leftreleased; } + virtual bool getRightReleased() { return m_receiver->rightreleased; } + virtual void resetLeftReleased() { m_receiver->leftreleased = false; } + virtual void resetRightReleased() { m_receiver->rightreleased = false; } - virtual s32 getMouseWheel() - { - return m_receiver->getMouseWheel(); - } + virtual s32 getMouseWheel() { return m_receiver->getMouseWheel(); } void clear() { joystick.clear(); m_receiver->clearInput(); } + private: - IrrlichtDevice *m_device; + IrrlichtDevice *m_device; MyEventReceiver *m_receiver; - v2s32 m_mousepos; + v2s32 m_mousepos; }; class RandomInputHandler : public InputHandler @@ -322,70 +295,25 @@ public: rightreleased = false; keydown.clear(); } - virtual bool isKeyDown(const KeyPress &keyCode) - { - return keydown[keyCode]; - } - virtual bool wasKeyDown(const KeyPress &keyCode) - { - return false; - } - virtual v2s32 getMousePos() - { - return mousepos; - } - virtual void setMousePos(s32 x, s32 y) - { - mousepos = v2s32(x, y); - } + virtual bool isKeyDown(const KeyPress &keyCode) { return keydown[keyCode]; } + virtual bool wasKeyDown(const KeyPress &keyCode) { return false; } + virtual v2s32 getMousePos() { return mousepos; } + virtual void setMousePos(s32 x, s32 y) { mousepos = v2s32(x, y); } - virtual bool getLeftState() - { - return leftdown; - } - virtual bool getRightState() - { - return rightdown; - } + virtual bool getLeftState() { return leftdown; } + virtual bool getRightState() { return rightdown; } - virtual bool getLeftClicked() - { - return leftclicked; - } - virtual bool getRightClicked() - { - return rightclicked; - } - virtual void resetLeftClicked() - { - leftclicked = false; - } - virtual void resetRightClicked() - { - rightclicked = false; - } + virtual bool getLeftClicked() { return leftclicked; } + virtual bool getRightClicked() { return rightclicked; } + virtual void resetLeftClicked() { leftclicked = false; } + virtual void resetRightClicked() { rightclicked = false; } - virtual bool getLeftReleased() - { - return leftreleased; - } - virtual bool getRightReleased() - { - return rightreleased; - } - virtual void resetLeftReleased() - { - leftreleased = false; - } - virtual void resetRightReleased() - { - rightreleased = false; - } + virtual bool getLeftReleased() { return leftreleased; } + virtual bool getRightReleased() { return rightreleased; } + virtual void resetLeftReleased() { leftreleased = false; } + virtual void resetRightReleased() { rightreleased = false; } - virtual s32 getMouseWheel() - { - return 0; - } + virtual s32 getMouseWheel() { return 0; } virtual void step(float dtime) { @@ -456,10 +384,8 @@ public: mousepos += mousespeed; } - s32 Rand(s32 min, s32 max) - { - return (myrand()%(max-min+1))+min; - } + s32 Rand(s32 min, s32 max); + private: KeyList keydown; v2s32 mousepos; diff --git a/src/client/joystick_controller.cpp b/src/client/joystick_controller.cpp index ef8d18ab0..905ca6420 100644 --- a/src/client/joystick_controller.cpp +++ b/src/client/joystick_controller.cpp @@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "keys.h" #include "settings.h" #include "gettime.h" +#include "porting.h" +#include "../util/string.h" bool JoystickButtonCmb::isTriggered(const irr::SEvent::SJoystickEvent &ev) const { @@ -42,7 +44,7 @@ bool JoystickAxisCmb::isTriggered(const irr::SEvent::SJoystickEvent &ev) const #define JLO_B_PB(A, B, C) jlo.button_keys.push_back(JoystickButtonCmb(A, B, C)) #define JLO_A_PB(A, B, C, D) jlo.axis_keys.push_back(JoystickAxisCmb(A, B, C, D)) -static JoystickLayout create_default_layout() +JoystickLayout create_default_layout() { JoystickLayout jlo; @@ -103,11 +105,59 @@ static JoystickLayout create_default_layout() return jlo; } -static const JoystickLayout default_layout = create_default_layout(); +JoystickLayout create_xbox_layout() +{ + JoystickLayout jlo; + + jlo.axes_dead_border = 7000; + + const JoystickAxisLayout axes[JA_COUNT] = { + {0, 1}, // JA_SIDEWARD_MOVE + {1, 1}, // JA_FORWARD_MOVE + {2, 1}, // JA_FRUSTUM_HORIZONTAL + {3, 1}, // JA_FRUSTUM_VERTICAL + }; + memcpy(jlo.axes, axes, sizeof(jlo.axes)); + + // The back button means "ESC". + JLO_B_PB(KeyType::ESC, 1 << 8, 1 << 8); // back + JLO_B_PB(KeyType::ESC, 1 << 9, 1 << 9); // start + + // 4 Buttons + JLO_B_PB(KeyType::JUMP, 1 << 0, 1 << 0); // A/green + JLO_B_PB(KeyType::ESC, 1 << 1, 1 << 1); // B/red + JLO_B_PB(KeyType::SPECIAL1, 1 << 2, 1 << 2); // X/blue + JLO_B_PB(KeyType::INVENTORY, 1 << 3, 1 << 3); // Y/yellow + + // Analog Sticks + JLO_B_PB(KeyType::SPECIAL1, 1 << 11, 1 << 11); // left + JLO_B_PB(KeyType::SNEAK, 1 << 12, 1 << 12); // right + + // Triggers + JLO_B_PB(KeyType::MOUSE_L, 1 << 6, 1 << 6); // lt + JLO_B_PB(KeyType::MOUSE_R, 1 << 7, 1 << 7); // rt + JLO_B_PB(KeyType::SCROLL_UP, 1 << 4, 1 << 4); // lb + JLO_B_PB(KeyType::SCROLL_DOWN, 1 << 5, 1 << 5); // rb + + // D-PAD + JLO_B_PB(KeyType::ZOOM, 1 << 15, 1 << 15); // up + JLO_B_PB(KeyType::DROP, 1 << 13, 1 << 13); // left + JLO_B_PB(KeyType::SCREENSHOT, 1 << 14, 1 << 14); // right + JLO_B_PB(KeyType::FREEMOVE, 1 << 16, 1 << 16); // down + + // Movement buttons, important for vessels + JLO_A_PB(KeyType::FORWARD, 1, 1, 1024); + JLO_A_PB(KeyType::BACKWARD, 1, -1, 1024); + JLO_A_PB(KeyType::LEFT, 0, 1, 1024); + JLO_A_PB(KeyType::RIGHT, 0, -1, 1024); + + return jlo; +} JoystickController::JoystickController() { - m_layout = &default_layout; + m_joystick_id = 0; + doubling_dtime = g_settings->getFloat("repeat_joystick_button_time"); for (size_t i = 0; i < KeyType::INTERNAL_ENUM_COUNT; i++) { @@ -116,23 +166,55 @@ JoystickController::JoystickController() clear(); } +void JoystickController::onJoystickConnect(const std::vector<irr::SJoystickInfo> &joystick_infos) +{ + s32 id = g_settings->getS32("joystick_id"); + std::string layout = g_settings->get("joystick_type"); + + if (id < 0 || (u16)id >= joystick_infos.size()) { + // TODO: auto detection + id = 0; + } + + if (id >= 0 && (u16)id < joystick_infos.size()) { + if (layout.empty() || layout == "auto") + setLayoutFromControllerName(joystick_infos[id].Name.c_str()); + else + setLayoutFromControllerName(layout); + } + + m_joystick_id = id; +} + +void JoystickController::setLayoutFromControllerName(const std::string &name) +{ + if (lowercase(name).find("xbox") != std::string::npos) { + m_layout = create_xbox_layout(); + } else { + m_layout = create_default_layout(); + } +} + bool JoystickController::handleEvent(const irr::SEvent::SJoystickEvent &ev) { - m_internal_time = getTimeMs() / 1000.f; + if (ev.Joystick != m_joystick_id) + return false; + + m_internal_time = porting::getTimeMs() / 1000.f; std::bitset<KeyType::INTERNAL_ENUM_COUNT> keys_pressed; // First generate a list of keys pressed - for (size_t i = 0; i < m_layout->button_keys.size(); i++) { - if (m_layout->button_keys[i].isTriggered(ev)) { - keys_pressed.set(m_layout->button_keys[i].key); + for (size_t i = 0; i < m_layout.button_keys.size(); i++) { + if (m_layout.button_keys[i].isTriggered(ev)) { + keys_pressed.set(m_layout.button_keys[i].key); } } - for (size_t i = 0; i < m_layout->axis_keys.size(); i++) { - if (m_layout->axis_keys[i].isTriggered(ev)) { - keys_pressed.set(m_layout->axis_keys[i].key); + for (size_t i = 0; i < m_layout.axis_keys.size(); i++) { + if (m_layout.axis_keys[i].isTriggered(ev)) { + keys_pressed.set(m_layout.axis_keys[i].key); } } @@ -153,7 +235,7 @@ bool JoystickController::handleEvent(const irr::SEvent::SJoystickEvent &ev) } for (size_t i = 0; i < JA_COUNT; i++) { - const JoystickAxisLayout &ax_la = m_layout->axes[i]; + const JoystickAxisLayout &ax_la = m_layout.axes[i]; m_axes_vals[i] = ax_la.invert * ev.Axis[ax_la.axis_id]; } @@ -172,8 +254,8 @@ void JoystickController::clear() s16 JoystickController::getAxisWithoutDead(JoystickAxis axis) { s16 v = m_axes_vals[axis]; - if (((v > 0) && (v < m_layout->axes_dead_border)) || - ((v < 0) && (v > -m_layout->axes_dead_border))) + if (((v > 0) && (v < m_layout.axes_dead_border)) || + ((v < 0) && (v > -m_layout.axes_dead_border))) return 0; return v; } diff --git a/src/client/joystick_controller.h b/src/client/joystick_controller.h index ed0ee4068..2c0e7b90a 100644 --- a/src/client/joystick_controller.h +++ b/src/client/joystick_controller.h @@ -98,6 +98,9 @@ class JoystickController { public: JoystickController(); + + void onJoystickConnect(const std::vector<irr::SJoystickInfo> &joystick_infos); + bool handleEvent(const irr::SEvent::SJoystickEvent &ev); void clear(); @@ -146,10 +149,14 @@ public: f32 doubling_dtime; private: - const JoystickLayout *m_layout; + void setLayoutFromControllerName(const std::string &name); + + JoystickLayout m_layout; s16 m_axes_vals[JA_COUNT]; + u8 m_joystick_id; + std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_pressed_keys; f32 m_internal_time; diff --git a/src/client/keys.h b/src/client/keys.h index 6467c443e..9478737f6 100644 --- a/src/client/keys.h +++ b/src/client/keys.h @@ -20,11 +20,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef KEYS_HEADER #define KEYS_HEADER -#include<list> +#include <list> -class KeyType { +class KeyType +{ public: - enum T { + enum T + { // Player movement FORWARD, BACKWARD, @@ -42,11 +44,17 @@ public: INVENTORY, CHAT, CMD, + CMD_LOCAL, CONSOLE, MINIMAP, FREEMOVE, FASTMOVE, NOCLIP, + HOTBAR_PREV, + HOTBAR_NEXT, + MUTE, + INC_VOLUME, + DEC_VOLUME, CINEMATIC, SCREENSHOT, TOGGLE_HUD, @@ -82,5 +90,4 @@ public: typedef KeyType::T GameKeyType; - #endif diff --git a/src/client/tile.cpp b/src/client/tile.cpp index 8f0c39465..99495132b 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -134,9 +134,8 @@ std::string getTexturePath(const std::string &filename) /* Check from texture_path */ - std::string texture_path = g_settings->get("texture_path"); - if (texture_path != "") - { + const std::string &texture_path = g_settings->get("texture_path"); + if (texture_path != "") { std::string testpath = texture_path + DIR_DELIM + filename; // Check all filename extensions. Returns "" if not found. fullpath = getImagePath(testpath); @@ -342,6 +341,8 @@ public: */ video::ITexture* getTextureForMesh(const std::string &name, u32 *id); + virtual Palette* getPalette(const std::string &name); + // Returns a pointer to the irrlicht device virtual IrrlichtDevice* getDevice() { @@ -378,11 +379,6 @@ public: video::ITexture* generateTextureFromMesh( const TextureFromMeshParams ¶ms); - // Generates an image from a full string like - // "stone.png^mineral_coal.png^[crack:1:0". - // Shall be called from the main thread. - video::IImage* generateImage(const std::string &name); - video::ITexture* getNormalTexture(const std::string &name); video::SColor getTextureAverageColor(const std::string &name); video::ITexture *getShaderFlagsTexture(bool normamap_present); @@ -405,6 +401,13 @@ private: // if baseimg is NULL, it is created. Otherwise stuff is made on it. bool generateImagePart(std::string part_of_name, video::IImage *& baseimg); + /*! Generates an image from a full string like + * "stone.png^mineral_coal.png^[crack:1:0". + * Shall be called from the main thread. + * The returned Image should be dropped. + */ + video::IImage* generateImage(const std::string &name); + // Thread-safe cache of what source images are known (true = known) MutexedMap<std::string, bool> m_source_image_existence; @@ -423,6 +426,9 @@ private: // but can't be deleted because the ITexture* might still be used std::vector<video::ITexture*> m_texture_trash; + // Maps image file names to loaded palettes. + UNORDERED_MAP<std::string, Palette> m_palettes; + // Cached settings needed for making textures from meshes bool m_setting_trilinear_filter; bool m_setting_bilinear_filter; @@ -558,7 +564,11 @@ static void blit_with_alpha_overlay(video::IImage *src, video::IImage *dst, // color alpha with the destination alpha. // Otherwise, any pixels that are not fully transparent get the color alpha. static void apply_colorize(video::IImage *dst, v2u32 dst_pos, v2u32 size, - video::SColor color, int ratio, bool keep_alpha); + const video::SColor &color, int ratio, bool keep_alpha); + +// paint a texture using the given color +static void apply_multiplication(video::IImage *dst, v2u32 dst_pos, v2u32 size, + const video::SColor &color); // Apply a mask to an image static void apply_mask(video::IImage *mask, video::IImage *dst, @@ -682,6 +692,61 @@ video::ITexture* TextureSource::getTextureForMesh(const std::string &name, u32 * return getTexture(name + "^[applyfiltersformesh", id); } +Palette* TextureSource::getPalette(const std::string &name) +{ + // Only the main thread may load images + sanity_check(thr_is_current_thread(m_main_thread)); + + if (name == "") + return NULL; + + UNORDERED_MAP<std::string, Palette>::iterator it = m_palettes.find(name); + if (it == m_palettes.end()) { + // Create palette + video::IImage *img = generateImage(name); + if (!img) { + warningstream << "TextureSource::getPalette(): palette \"" << name + << "\" could not be loaded." << std::endl; + return NULL; + } + Palette new_palette; + u32 w = img->getDimension().Width; + u32 h = img->getDimension().Height; + // Real area of the image + u32 area = h * w; + if (area == 0) + return NULL; + if (area > 256) { + warningstream << "TextureSource::getPalette(): the specified" + << " palette image \"" << name << "\" is larger than 256" + << " pixels, using the first 256." << std::endl; + area = 256; + } else if (256 % area != 0) + warningstream << "TextureSource::getPalette(): the " + << "specified palette image \"" << name << "\" does not " + << "contain power of two pixels." << std::endl; + // We stretch the palette so it will fit 256 values + // This many param2 values will have the same color + u32 step = 256 / area; + // For each pixel in the image + for (u32 i = 0; i < area; i++) { + video::SColor c = img->getPixel(i % w, i / w); + // Fill in palette with 'step' colors + for (u32 j = 0; j < step; j++) + new_palette.push_back(c); + } + img->drop(); + // Fill in remaining elements + while (new_palette.size() < 256) + new_palette.push_back(video::SColor(0xFFFFFFFF)); + m_palettes[name] = new_palette; + it = m_palettes.find(name); + } + if (it != m_palettes.end()) + return &((*it).second); + return NULL; +} + void TextureSource::processQueue() { /* @@ -725,8 +790,6 @@ void TextureSource::rebuildImagesAndTextures() video::IImage *img = generateImage(ti->name); #ifdef __ANDROID__ img = Align2Npot2(img, driver); - sanity_check(img->getDimension().Height == npot2(img->getDimension().Height)); - sanity_check(img->getDimension().Width == npot2(img->getDimension().Width)); #endif // Create texture from resulting image video::ITexture *t = NULL; @@ -938,7 +1001,7 @@ video::ITexture* TextureSource::generateTextureFromMesh( smgr->drop(); // Unset render target - driver->setRenderTarget(0, false, true, 0); + driver->setRenderTarget(0, false, true, video::SColor(0,0,0,0)); if (params.delete_texture_on_shutdown) m_texture_trash.push_back(rtt); @@ -1059,6 +1122,13 @@ video::IImage* TextureSource::generateImage(const std::string &name) * @param driver driver to use for image operations * @return image or copy of image aligned to npot2 */ + +inline u16 get_GL_major_version() +{ + const GLubyte *gl_version = glGetString(GL_VERSION); + return (u16) (gl_version[0] - '0'); +} + video::IImage * Align2Npot2(video::IImage * image, video::IVideoDriver* driver) { @@ -1069,7 +1139,10 @@ video::IImage * Align2Npot2(video::IImage * image, core::dimension2d<u32> dim = image->getDimension(); std::string extensions = (char*) glGetString(GL_EXTENSIONS); - if (extensions.find("GL_OES_texture_npot") != std::string::npos) { + + // Only GLES2 is trusted to correctly report npot support + if (get_GL_major_version() > 1 && + extensions.find("GL_OES_texture_npot") != std::string::npos) { return image; } @@ -1135,17 +1208,17 @@ bool TextureSource::generateImagePart(std::string part_of_name, #endif if (image == NULL) { if (part_of_name != "") { - if (part_of_name.find("_normal.png") == std::string::npos){ - errorstream<<"generateImage(): Could not load image \"" - <<part_of_name<<"\""<<" while building texture"<<std::endl; - errorstream<<"generateImage(): Creating a dummy" - <<" image for \""<<part_of_name<<"\""<<std::endl; - } else { - infostream<<"generateImage(): Could not load normal map \"" - <<part_of_name<<"\""<<std::endl; - infostream<<"generateImage(): Creating a dummy" - <<" normal map for \""<<part_of_name<<"\""<<std::endl; + + // Do not create normalmap dummies + if (part_of_name.find("_normal.png") != std::string::npos) { + warningstream << "generateImage(): Could not load normal map \"" + << part_of_name << "\"" << std::endl; + return true; } + + errorstream << "generateImage(): Could not load image \"" + << part_of_name << "\" while building texture; " + "Creating a dummy image" << std::endl; } // Just create a dummy image @@ -1660,6 +1733,30 @@ bool TextureSource::generateImagePart(std::string part_of_name, } } /* + [multiply:color + multiplys a given color to any pixel of an image + color = color as ColorString + */ + else if (str_starts_with(part_of_name, "[multiply:")) { + Strfnd sf(part_of_name); + sf.next(":"); + std::string color_str = sf.next(":"); + + if (baseimg == NULL) { + errorstream << "generateImagePart(): baseimg != NULL " + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; + return false; + } + + video::SColor color; + + if (!parseColorString(color_str, color, false)) + return false; + + apply_multiplication(baseimg, v2u32(0, 0), baseimg->getDimension(), color); + } + /* [colorize:color Overlays image with given color color = color as ColorString @@ -1716,6 +1813,12 @@ bool TextureSource::generateImagePart(std::string part_of_name, * equal to the target minimum. If e.g. this is a vertical frames * animation, the short dimension will be the real size. */ + if ((dim.Width == 0) || (dim.Height == 0)) { + errorstream << "generateImagePart(): Illegal 0 dimension " + << "for part_of_name=\""<< part_of_name + << "\", cancelling." << std::endl; + return false; + } u32 xscale = scaleto / dim.Width; u32 yscale = scaleto / dim.Height; u32 scale = (xscale > yscale) ? xscale : yscale; @@ -1823,10 +1926,53 @@ bool TextureSource::generateImagePart(std::string part_of_name, for (u32 x = 0; x < dim.Width; x++) { video::SColor c = baseimg->getPixel(x, y); - c.color ^= mask; + c.color ^= mask; baseimg->setPixel(x, y, c); } } + /* + [sheet:WxH:X,Y + Retrieves a tile at position X,Y (in tiles) + from the base image it assumes to be a + tilesheet with dimensions W,H (in tiles). + */ + else if (part_of_name.substr(0,7) == "[sheet:") { + if (baseimg == NULL) { + errorstream << "generateImagePart(): baseimg != NULL " + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; + return false; + } + + Strfnd sf(part_of_name); + sf.next(":"); + u32 w0 = stoi(sf.next("x")); + u32 h0 = stoi(sf.next(":")); + u32 x0 = stoi(sf.next(",")); + u32 y0 = stoi(sf.next(":")); + + core::dimension2d<u32> img_dim = baseimg->getDimension(); + core::dimension2d<u32> tile_dim(v2u32(img_dim) / v2u32(w0, h0)); + + video::IImage *img = driver->createImage( + video::ECF_A8R8G8B8, tile_dim); + if (!img) { + errorstream << "generateImagePart(): Could not create image " + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; + return false; + } + + img->fill(video::SColor(0,0,0,0)); + v2u32 vdim(tile_dim); + core::rect<s32> rect(v2s32(x0 * vdim.X, y0 * vdim.Y), tile_dim); + baseimg->copyToWithAlpha(img, v2s32(0), rect, + video::SColor(255,255,255,255), NULL); + + // Replace baseimg + baseimg->drop(); + baseimg = img; + } else { errorstream << "generateImagePart(): Invalid " @@ -1920,7 +2066,7 @@ static void blit_with_interpolate_overlay(video::IImage *src, video::IImage *dst Apply color to destination */ static void apply_colorize(video::IImage *dst, v2u32 dst_pos, v2u32 size, - video::SColor color, int ratio, bool keep_alpha) + const video::SColor &color, int ratio, bool keep_alpha) { u32 alpha = color.getAlpha(); video::SColor dst_c; @@ -1955,6 +2101,27 @@ static void apply_colorize(video::IImage *dst, v2u32 dst_pos, v2u32 size, } /* + Apply color to destination +*/ +static void apply_multiplication(video::IImage *dst, v2u32 dst_pos, v2u32 size, + const video::SColor &color) +{ + video::SColor dst_c; + + for (u32 y = dst_pos.Y; y < dst_pos.Y + size.Y; y++) + for (u32 x = dst_pos.X; x < dst_pos.X + size.X; x++) { + dst_c = dst->getPixel(x, y); + dst_c.set( + dst_c.getAlpha(), + (dst_c.getRed() * color.getRed()) / 255, + (dst_c.getGreen() * color.getGreen()) / 255, + (dst_c.getBlue() * color.getBlue()) / 255 + ); + dst->setPixel(x, y, dst_c); + } +} + +/* Apply mask to destination */ static void apply_mask(video::IImage *mask, video::IImage *dst, @@ -2171,7 +2338,8 @@ video::ITexture* TextureSource::getNormalTexture(const std::string &name) if (isKnownSourceImage("override_normal.png")) return getTexture("override_normal.png"); std::string fname_base = name; - std::string normal_ext = "_normal.png"; + static const char *normal_ext = "_normal.png"; + static const u32 normal_ext_size = strlen(normal_ext); size_t pos = fname_base.find("."); std::string fname_normal = fname_base.substr(0, pos) + normal_ext; if (isKnownSourceImage(fname_normal)) { @@ -2179,10 +2347,10 @@ video::ITexture* TextureSource::getNormalTexture(const std::string &name) size_t i = 0; while ((i = fname_base.find(".", i)) != std::string::npos) { fname_base.replace(i, 4, normal_ext); - i += normal_ext.length(); + i += normal_ext_size; } return getTexture(fname_base); - } + } return NULL; } diff --git a/src/client/tile.h b/src/client/tile.h index b75916841..15854fb71 100644 --- a/src/client/tile.h +++ b/src/client/tile.h @@ -33,6 +33,8 @@ class IGameDef; struct TileSpec; struct TileDef; +typedef std::vector<video::SColor> Palette; + /* tile.{h,cpp}: Texture handling stuff. */ @@ -106,6 +108,13 @@ public: const std::string &name, u32 *id = NULL)=0; virtual video::ITexture* getTextureForMesh( const std::string &name, u32 *id = NULL) = 0; + /*! + * Returns a palette from the given texture name. + * The pointer is valid until the texture source is + * destructed. + * Should be called from the main thread. + */ + virtual Palette* getPalette(const std::string &name) = 0; virtual IrrlichtDevice* getDevice()=0; virtual bool isKnownSourceImage(const std::string &name)=0; virtual video::ITexture* generateTextureFromMesh( @@ -161,9 +170,7 @@ enum MaterialType{ // Should the crack be drawn on transparent pixels (unset) or not (set)? // Ignored if MATERIAL_FLAG_CRACK is not set. #define MATERIAL_FLAG_CRACK_OVERLAY 0x04 -// Animation made up by splitting the texture to vertical frames, as -// defined by extra parameters -#define MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES 0x08 +#define MATERIAL_FLAG_ANIMATION 0x08 #define MATERIAL_FLAG_HIGHLIGHTED 0x10 #define MATERIAL_FLAG_TILEABLE_HORIZONTAL 0x20 #define MATERIAL_FLAG_TILEABLE_VERTICAL 0x40 @@ -187,65 +194,67 @@ struct FrameSpec video::ITexture *flags_texture; }; -struct TileSpec +#define MAX_TILE_LAYERS 2 + +//! Defines a layer of a tile. +struct TileLayer { - TileSpec(): - texture_id(0), + TileLayer(): texture(NULL), normal_texture(NULL), flags_texture(NULL), - alpha(255), + shader_id(0), + texture_id(0), + animation_frame_length_ms(0), + animation_frame_count(1), material_type(TILE_MATERIAL_BASIC), material_flags( //0 // <- DEBUG, Use the one below - MATERIAL_FLAG_BACKFACE_CULLING + MATERIAL_FLAG_BACKFACE_CULLING | + MATERIAL_FLAG_TILEABLE_HORIZONTAL| + MATERIAL_FLAG_TILEABLE_VERTICAL ), - shader_id(0), - animation_frame_count(1), - animation_frame_length_ms(0), - rotation(0) + has_color(false), + color() { } - bool operator==(const TileSpec &other) const + /*! + * Two layers are equal if they can be merged. + */ + bool operator==(const TileLayer &other) const { - return ( + return texture_id == other.texture_id && - /* texture == other.texture && */ - alpha == other.alpha && material_type == other.material_type && material_flags == other.material_flags && - rotation == other.rotation - ); + color == other.color; } - bool operator!=(const TileSpec &other) const + /*! + * Two tiles are not equal if they must have different vertices. + */ + bool operator!=(const TileLayer &other) const { return !(*this == other); } - + // Sets everything else except the texture in the material void applyMaterialOptions(video::SMaterial &material) const { switch (material_type) { case TILE_MATERIAL_BASIC: + case TILE_MATERIAL_WAVING_LEAVES: + case TILE_MATERIAL_WAVING_PLANTS: material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; break; case TILE_MATERIAL_ALPHA: - material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - break; case TILE_MATERIAL_LIQUID_TRANSPARENT: - material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA; + material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; break; case TILE_MATERIAL_LIQUID_OPAQUE: material.MaterialType = video::EMT_SOLID; break; - case TILE_MATERIAL_WAVING_LEAVES: - material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; - break; - case TILE_MATERIAL_WAVING_PLANTS: - material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; - break; } material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) ? true : false; @@ -270,23 +279,73 @@ struct TileSpec material.TextureLayer[1].TextureWrapV = video::ETC_CLAMP_TO_EDGE; } } - - u32 texture_id; + + bool isTileable() const + { + return (material_flags & MATERIAL_FLAG_TILEABLE_HORIZONTAL) + && (material_flags & MATERIAL_FLAG_TILEABLE_VERTICAL); + } + + // Ordered for size, please do not reorder + video::ITexture *texture; video::ITexture *normal_texture; video::ITexture *flags_texture; - - // Vertex alpha (when MATERIAL_ALPHA_VERTEX is used) - u8 alpha; - // Material parameters - u8 material_type; - u8 material_flags; + u32 shader_id; - // Animation parameters - u8 animation_frame_count; + + u32 texture_id; + u16 animation_frame_length_ms; + u8 animation_frame_count; + + u8 material_type; + u8 material_flags; + + //! If true, the tile has its own color. + bool has_color; + std::vector<FrameSpec> frames; + /*! + * The color of the tile, or if the tile does not own + * a color then the color of the node owning this tile. + */ + video::SColor color; +}; + +/*! + * Defines a face of a node. May have up to two layers. + */ +struct TileSpec +{ + TileSpec(): + rotation(0), + emissive_light(0) + { + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) + layers[layer] = TileLayer(); + } + + /*! + * Returns true if this tile can be merged with the other tile. + */ + bool isTileable(const TileSpec &other) const { + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { + if (layers[layer] != other.layers[layer]) + return false; + if (!layers[layer].isTileable()) + return false; + } + return rotation == 0 + && rotation == other.rotation + && emissive_light == other.emissive_light; + } + u8 rotation; + //! This much light does the tile emit. + u8 emissive_light; + //! The first is base texture, the second is overlay. + TileLayer layers[MAX_TILE_LAYERS]; }; #endif diff --git a/src/clientenvironment.cpp b/src/clientenvironment.cpp new file mode 100644 index 000000000..cc7cb54dd --- /dev/null +++ b/src/clientenvironment.cpp @@ -0,0 +1,847 @@ +/* +Minetest +Copyright (C) 2010-2017 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "util/serialize.h" +#include "util/pointedthing.h" +#include "clientenvironment.h" +#include "clientsimpleobject.h" +#include "clientmap.h" +#include "scripting_client.h" +#include "mapblock_mesh.h" +#include "event.h" +#include "collision.h" +#include "profiler.h" +#include "raycast.h" +#include "voxelalgorithms.h" +#include "settings.h" +#include <algorithm> + +/* + ClientEnvironment +*/ + +ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, + ITextureSource *texturesource, Client *client, + IrrlichtDevice *irr): + Environment(client), + m_map(map), + m_local_player(NULL), + m_smgr(smgr), + m_texturesource(texturesource), + m_client(client), + m_script(NULL), + m_irr(irr) +{ + char zero = 0; + memset(attachement_parent_ids, zero, sizeof(attachement_parent_ids)); +} + +ClientEnvironment::~ClientEnvironment() +{ + // delete active objects + for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + delete i->second; + } + + for(std::vector<ClientSimpleObject*>::iterator + i = m_simple_objects.begin(); i != m_simple_objects.end(); ++i) { + delete *i; + } + + // Drop/delete map + m_map->drop(); + + delete m_local_player; +} + +Map & ClientEnvironment::getMap() +{ + return *m_map; +} + +ClientMap & ClientEnvironment::getClientMap() +{ + return *m_map; +} + +void ClientEnvironment::setLocalPlayer(LocalPlayer *player) +{ + DSTACK(FUNCTION_NAME); + /* + It is a failure if already is a local player + */ + FATAL_ERROR_IF(m_local_player != NULL, + "Local player already allocated"); + + m_local_player = player; +} + +void ClientEnvironment::step(float dtime) +{ + DSTACK(FUNCTION_NAME); + + /* Step time of day */ + stepTimeOfDay(dtime); + + // Get some settings + bool fly_allowed = m_client->checkLocalPrivilege("fly"); + bool free_move = fly_allowed && g_settings->getBool("free_move"); + + // Get local player + LocalPlayer *lplayer = getLocalPlayer(); + assert(lplayer); + // collision info queue + std::vector<CollisionInfo> player_collisions; + + /* + Get the speed the player is going + */ + bool is_climbing = lplayer->is_climbing; + + f32 player_speed = lplayer->getSpeed().getLength(); + + /* + Maximum position increment + */ + //f32 position_max_increment = 0.05*BS; + f32 position_max_increment = 0.1*BS; + + // Maximum time increment (for collision detection etc) + // time = distance / speed + f32 dtime_max_increment = 1; + if(player_speed > 0.001) + dtime_max_increment = position_max_increment / player_speed; + + // Maximum time increment is 10ms or lower + if(dtime_max_increment > 0.01) + dtime_max_increment = 0.01; + + // Don't allow overly huge dtime + if(dtime > 0.5) + dtime = 0.5; + + f32 dtime_downcount = dtime; + + /* + Stuff that has a maximum time increment + */ + + u32 loopcount = 0; + do + { + loopcount++; + + f32 dtime_part; + if(dtime_downcount > dtime_max_increment) + { + dtime_part = dtime_max_increment; + dtime_downcount -= dtime_part; + } + else + { + dtime_part = dtime_downcount; + /* + Setting this to 0 (no -=dtime_part) disables an infinite loop + when dtime_part is so small that dtime_downcount -= dtime_part + does nothing + */ + dtime_downcount = 0; + } + + /* + Handle local player + */ + + { + // Apply physics + if(!free_move && !is_climbing) + { + // Gravity + v3f speed = lplayer->getSpeed(); + if(!lplayer->in_liquid) + speed.Y -= lplayer->movement_gravity * lplayer->physics_override_gravity * dtime_part * 2; + + // Liquid floating / sinking + if(lplayer->in_liquid && !lplayer->swimming_vertical) + speed.Y -= lplayer->movement_liquid_sink * dtime_part * 2; + + // Liquid resistance + if(lplayer->in_liquid_stable || lplayer->in_liquid) + { + // How much the node's viscosity blocks movement, ranges between 0 and 1 + // Should match the scale at which viscosity increase affects other liquid attributes + const f32 viscosity_factor = 0.3; + + v3f d_wanted = -speed / lplayer->movement_liquid_fluidity; + f32 dl = d_wanted.getLength(); + if(dl > lplayer->movement_liquid_fluidity_smooth) + dl = lplayer->movement_liquid_fluidity_smooth; + dl *= (lplayer->liquid_viscosity * viscosity_factor) + (1 - viscosity_factor); + + v3f d = d_wanted.normalize() * dl; + speed += d; + } + + lplayer->setSpeed(speed); + } + + /* + Move the lplayer. + This also does collision detection. + */ + lplayer->move(dtime_part, this, position_max_increment, + &player_collisions); + } + } + while(dtime_downcount > 0.001); + + //std::cout<<"Looped "<<loopcount<<" times."<<std::endl; + + for(std::vector<CollisionInfo>::iterator i = player_collisions.begin(); + i != player_collisions.end(); ++i) { + CollisionInfo &info = *i; + v3f speed_diff = info.new_speed - info.old_speed;; + // Handle only fall damage + // (because otherwise walking against something in fast_move kills you) + if(speed_diff.Y < 0 || info.old_speed.Y >= 0) + continue; + // Get rid of other components + speed_diff.X = 0; + speed_diff.Z = 0; + f32 pre_factor = 1; // 1 hp per node/s + f32 tolerance = BS*14; // 5 without damage + f32 post_factor = 1; // 1 hp per node/s + if(info.type == COLLISION_NODE) + { + const ContentFeatures &f = m_client->ndef()-> + get(m_map->getNodeNoEx(info.node_p)); + // Determine fall damage multiplier + int addp = itemgroup_get(f.groups, "fall_damage_add_percent"); + pre_factor = 1.0 + (float)addp/100.0; + } + float speed = pre_factor * speed_diff.getLength(); + if (speed > tolerance) { + f32 damage_f = (speed - tolerance) / BS * post_factor; + u8 damage = (u8)MYMIN(damage_f + 0.5, 255); + if (damage != 0) { + damageLocalPlayer(damage, true); + MtEvent *e = new SimpleTriggerEvent("PlayerFallingDamage"); + m_client->event()->put(e); + } + } + } + + if (m_client->moddingEnabled()) { + m_script->environment_step(dtime); + } + + // Protocol v29 make this behaviour obsolete + if (getGameDef()->getProtoVersion() < 29) { + if (m_lava_hurt_interval.step(dtime, 1.0)) { + v3f pf = lplayer->getPosition(); + + // Feet, middle and head + v3s16 p1 = floatToInt(pf + v3f(0, BS * 0.1, 0), BS); + MapNode n1 = m_map->getNodeNoEx(p1); + v3s16 p2 = floatToInt(pf + v3f(0, BS * 0.8, 0), BS); + MapNode n2 = m_map->getNodeNoEx(p2); + v3s16 p3 = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); + MapNode n3 = m_map->getNodeNoEx(p3); + + u32 damage_per_second = 0; + damage_per_second = MYMAX(damage_per_second, + m_client->ndef()->get(n1).damage_per_second); + damage_per_second = MYMAX(damage_per_second, + m_client->ndef()->get(n2).damage_per_second); + damage_per_second = MYMAX(damage_per_second, + m_client->ndef()->get(n3).damage_per_second); + + if (damage_per_second != 0) + damageLocalPlayer(damage_per_second, true); + } + + /* + Drowning + */ + if (m_drowning_interval.step(dtime, 2.0)) { + v3f pf = lplayer->getPosition(); + + // head + v3s16 p = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); + MapNode n = m_map->getNodeNoEx(p); + ContentFeatures c = m_client->ndef()->get(n); + u8 drowning_damage = c.drowning; + if (drowning_damage > 0 && lplayer->hp > 0) { + u16 breath = lplayer->getBreath(); + if (breath > 10) { + breath = 11; + } + if (breath > 0) { + breath -= 1; + } + lplayer->setBreath(breath); + updateLocalPlayerBreath(breath); + } + + if (lplayer->getBreath() == 0 && drowning_damage > 0) { + damageLocalPlayer(drowning_damage, true); + } + } + if (m_breathing_interval.step(dtime, 0.5)) { + v3f pf = lplayer->getPosition(); + + // head + v3s16 p = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); + MapNode n = m_map->getNodeNoEx(p); + ContentFeatures c = m_client->ndef()->get(n); + if (!lplayer->hp) { + lplayer->setBreath(11); + } else if (c.drowning == 0) { + u16 breath = lplayer->getBreath(); + if (breath <= 10) { + breath += 1; + lplayer->setBreath(breath); + updateLocalPlayerBreath(breath); + } + } + } + } + + // Update lighting on local player (used for wield item) + u32 day_night_ratio = getDayNightRatio(); + { + // Get node at head + + // On InvalidPositionException, use this as default + // (day: LIGHT_SUN, night: 0) + MapNode node_at_lplayer(CONTENT_AIR, 0x0f, 0); + + v3s16 p = lplayer->getLightPosition(); + node_at_lplayer = m_map->getNodeNoEx(p); + + u16 light = getInteriorLight(node_at_lplayer, 0, m_client->ndef()); + final_color_blend(&lplayer->light_color, light, day_night_ratio); + } + + /* + Step active objects and update lighting of them + */ + + g_profiler->avg("CEnv: num of objects", m_active_objects.size()); + bool update_lighting = m_active_object_light_update_interval.step(dtime, 0.21); + for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + ClientActiveObject* obj = i->second; + // Step object + obj->step(dtime, this); + + if(update_lighting) + { + // Update lighting + u8 light = 0; + bool pos_ok; + + // Get node at head + v3s16 p = obj->getLightPosition(); + MapNode n = m_map->getNodeNoEx(p, &pos_ok); + if (pos_ok) + light = n.getLightBlend(day_night_ratio, m_client->ndef()); + else + light = blend_light(day_night_ratio, LIGHT_SUN, 0); + + obj->updateLight(light); + } + } + + /* + Step and handle simple objects + */ + g_profiler->avg("CEnv: num of simple objects", m_simple_objects.size()); + for(std::vector<ClientSimpleObject*>::iterator + i = m_simple_objects.begin(); i != m_simple_objects.end();) { + std::vector<ClientSimpleObject*>::iterator cur = i; + ClientSimpleObject *simple = *cur; + + simple->step(dtime); + if(simple->m_to_be_removed) { + delete simple; + i = m_simple_objects.erase(cur); + } + else { + ++i; + } + } +} + +void ClientEnvironment::addSimpleObject(ClientSimpleObject *simple) +{ + m_simple_objects.push_back(simple); +} + +GenericCAO* ClientEnvironment::getGenericCAO(u16 id) +{ + ClientActiveObject *obj = getActiveObject(id); + if (obj && obj->getType() == ACTIVEOBJECT_TYPE_GENERIC) + return (GenericCAO*) obj; + else + return NULL; +} + +ClientActiveObject* ClientEnvironment::getActiveObject(u16 id) +{ + UNORDERED_MAP<u16, ClientActiveObject*>::iterator n = m_active_objects.find(id); + if (n == m_active_objects.end()) + return NULL; + return n->second; +} + +bool isFreeClientActiveObjectId(const u16 id, + UNORDERED_MAP<u16, ClientActiveObject*> &objects) +{ + if(id == 0) + return false; + + return objects.find(id) == objects.end(); +} + +u16 getFreeClientActiveObjectId(UNORDERED_MAP<u16, ClientActiveObject*> &objects) +{ + //try to reuse id's as late as possible + static u16 last_used_id = 0; + u16 startid = last_used_id; + for(;;) { + last_used_id ++; + if (isFreeClientActiveObjectId(last_used_id, objects)) + return last_used_id; + + if (last_used_id == startid) + return 0; + } +} + +u16 ClientEnvironment::addActiveObject(ClientActiveObject *object) +{ + assert(object); // Pre-condition + if(object->getId() == 0) + { + u16 new_id = getFreeClientActiveObjectId(m_active_objects); + if(new_id == 0) + { + infostream<<"ClientEnvironment::addActiveObject(): " + <<"no free ids available"<<std::endl; + delete object; + return 0; + } + object->setId(new_id); + } + if (!isFreeClientActiveObjectId(object->getId(), m_active_objects)) { + infostream<<"ClientEnvironment::addActiveObject(): " + <<"id is not free ("<<object->getId()<<")"<<std::endl; + delete object; + return 0; + } + infostream<<"ClientEnvironment::addActiveObject(): " + <<"added (id="<<object->getId()<<")"<<std::endl; + m_active_objects[object->getId()] = object; + object->addToScene(m_smgr, m_texturesource, m_irr); + { // Update lighting immediately + u8 light = 0; + bool pos_ok; + + // Get node at head + v3s16 p = object->getLightPosition(); + MapNode n = m_map->getNodeNoEx(p, &pos_ok); + if (pos_ok) + light = n.getLightBlend(getDayNightRatio(), m_client->ndef()); + else + light = blend_light(getDayNightRatio(), LIGHT_SUN, 0); + + object->updateLight(light); + } + return object->getId(); +} + +void ClientEnvironment::addActiveObject(u16 id, u8 type, + const std::string &init_data) +{ + ClientActiveObject* obj = + ClientActiveObject::create((ActiveObjectType) type, m_client, this); + if(obj == NULL) + { + infostream<<"ClientEnvironment::addActiveObject(): " + <<"id="<<id<<" type="<<type<<": Couldn't create object" + <<std::endl; + return; + } + + obj->setId(id); + + try + { + obj->initialize(init_data); + } + catch(SerializationError &e) + { + errorstream<<"ClientEnvironment::addActiveObject():" + <<" id="<<id<<" type="<<type + <<": SerializationError in initialize(): " + <<e.what() + <<": init_data="<<serializeJsonString(init_data) + <<std::endl; + } + + addActiveObject(obj); +} + +void ClientEnvironment::removeActiveObject(u16 id) +{ + verbosestream<<"ClientEnvironment::removeActiveObject(): " + <<"id="<<id<<std::endl; + ClientActiveObject* obj = getActiveObject(id); + if (obj == NULL) { + infostream<<"ClientEnvironment::removeActiveObject(): " + <<"id="<<id<<" not found"<<std::endl; + return; + } + obj->removeFromScene(true); + delete obj; + m_active_objects.erase(id); +} + +void ClientEnvironment::processActiveObjectMessage(u16 id, const std::string &data) +{ + ClientActiveObject *obj = getActiveObject(id); + if (obj == NULL) { + infostream << "ClientEnvironment::processActiveObjectMessage():" + << " got message for id=" << id << ", which doesn't exist." + << std::endl; + return; + } + + try { + obj->processMessage(data); + } catch (SerializationError &e) { + errorstream<<"ClientEnvironment::processActiveObjectMessage():" + << " id=" << id << " type=" << obj->getType() + << " SerializationError in processMessage(): " << e.what() + << std::endl; + } +} + +/* + Callbacks for activeobjects +*/ + +void ClientEnvironment::damageLocalPlayer(u8 damage, bool handle_hp) +{ + LocalPlayer *lplayer = getLocalPlayer(); + assert(lplayer); + + if (handle_hp) { + if (lplayer->hp > damage) + lplayer->hp -= damage; + else + lplayer->hp = 0; + } + + ClientEnvEvent event; + event.type = CEE_PLAYER_DAMAGE; + event.player_damage.amount = damage; + event.player_damage.send_to_server = handle_hp; + m_client_event_queue.push(event); +} + +void ClientEnvironment::updateLocalPlayerBreath(u16 breath) +{ + ClientEnvEvent event; + event.type = CEE_PLAYER_BREATH; + event.player_breath.amount = breath; + m_client_event_queue.push(event); +} + +/* + Client likes to call these +*/ + +void ClientEnvironment::getActiveObjects(v3f origin, f32 max_d, + std::vector<DistanceSortedActiveObject> &dest) +{ + for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + ClientActiveObject* obj = i->second; + + f32 d = (obj->getPosition() - origin).getLength(); + + if(d > max_d) + continue; + + DistanceSortedActiveObject dso(obj, d); + + dest.push_back(dso); + } +} + +ClientEnvEvent ClientEnvironment::getClientEnvEvent() +{ + FATAL_ERROR_IF(m_client_event_queue.empty(), + "ClientEnvironment::getClientEnvEvent(): queue is empty"); + + ClientEnvEvent event = m_client_event_queue.front(); + m_client_event_queue.pop(); + return event; +} + +ClientActiveObject * ClientEnvironment::getSelectedActiveObject( + const core::line3d<f32> &shootline_on_map, v3f *intersection_point, + v3s16 *intersection_normal) +{ + std::vector<DistanceSortedActiveObject> objects; + getActiveObjects(shootline_on_map.start, + shootline_on_map.getLength() + 3, objects); + const v3f line_vector = shootline_on_map.getVector(); + + // Sort them. + // After this, the closest object is the first in the array. + std::sort(objects.begin(), objects.end()); + + /* Because objects can have different nodebox sizes, + * the object whose center is the nearest isn't necessarily + * the closest one. If an object is found, don't stop + * immediately. */ + + f32 d_min = shootline_on_map.getLength(); + ClientActiveObject *nearest_obj = NULL; + for (u32 i = 0; i < objects.size(); i++) { + ClientActiveObject *obj = objects[i].obj; + + aabb3f *selection_box = obj->getSelectionBox(); + if (selection_box == NULL) + continue; + + v3f pos = obj->getPosition(); + + aabb3f offsetted_box(selection_box->MinEdge + pos, + selection_box->MaxEdge + pos); + + if (offsetted_box.getCenter().getDistanceFrom( + shootline_on_map.start) > d_min + 9.6f*BS) { + // Probably there is no active object that has bigger nodebox than + // (-5.5,-5.5,-5.5,5.5,5.5,5.5) + // 9.6 > 5.5*sqrt(3) + break; + } + + v3f current_intersection; + v3s16 current_normal; + if (boxLineCollision(offsetted_box, shootline_on_map.start, line_vector, + ¤t_intersection, ¤t_normal)) { + f32 d_current = current_intersection.getDistanceFrom( + shootline_on_map.start); + if (d_current <= d_min) { + d_min = d_current; + nearest_obj = obj; + *intersection_point = current_intersection; + *intersection_normal = current_normal; + } + } + } + + return nearest_obj; +} + +/* + Check if a node is pointable +*/ +static inline bool isPointableNode(const MapNode &n, + INodeDefManager *ndef, bool liquids_pointable) +{ + const ContentFeatures &features = ndef->get(n); + return features.pointable || + (liquids_pointable && features.isLiquid()); +} + +PointedThing ClientEnvironment::getPointedThing( + core::line3d<f32> shootline, + bool liquids_pointable, + bool look_for_object) +{ + PointedThing result; + + INodeDefManager *nodedef = m_map->getNodeDefManager(); + + core::aabbox3d<s16> maximal_exceed = nodedef->getSelectionBoxIntUnion(); + // The code needs to search these nodes + core::aabbox3d<s16> search_range(-maximal_exceed.MaxEdge, + -maximal_exceed.MinEdge); + // If a node is found, there might be a larger node behind. + // To find it, we have to go further. + s16 maximal_overcheck = + std::max(abs(search_range.MinEdge.X), abs(search_range.MaxEdge.X)) + + std::max(abs(search_range.MinEdge.Y), abs(search_range.MaxEdge.Y)) + + std::max(abs(search_range.MinEdge.Z), abs(search_range.MaxEdge.Z)); + + const v3f original_vector = shootline.getVector(); + const f32 original_length = original_vector.getLength(); + + f32 min_distance = original_length; + + // First try to find an active object + if (look_for_object) { + ClientActiveObject *selected_object = getSelectedActiveObject( + shootline, &result.intersection_point, + &result.intersection_normal); + + if (selected_object != NULL) { + min_distance = + (result.intersection_point - shootline.start).getLength(); + + result.type = POINTEDTHING_OBJECT; + result.object_id = selected_object->getId(); + } + } + + // Reduce shootline + if (original_length > 0) { + shootline.end = shootline.start + + shootline.getVector() / original_length * min_distance; + } + + // Try to find a node that is closer than the selected active + // object (if it exists). + + voxalgo::VoxelLineIterator iterator(shootline.start / BS, + shootline.getVector() / BS); + v3s16 oldnode = iterator.m_current_node_pos; + // Indicates that a node was found. + bool is_node_found = false; + // If a node is found, it is possible that there's a node + // behind it with a large nodebox, so continue the search. + u16 node_foundcounter = 0; + // If a node is found, this is the center of the + // first nodebox the shootline meets. + v3f found_boxcenter(0, 0, 0); + // The untested nodes are in this range. + core::aabbox3d<s16> new_nodes; + while (true) { + // Test the nodes around the current node in search_range. + new_nodes = search_range; + new_nodes.MinEdge += iterator.m_current_node_pos; + new_nodes.MaxEdge += iterator.m_current_node_pos; + + // Only check new nodes + v3s16 delta = iterator.m_current_node_pos - oldnode; + if (delta.X > 0) + new_nodes.MinEdge.X = new_nodes.MaxEdge.X; + else if (delta.X < 0) + new_nodes.MaxEdge.X = new_nodes.MinEdge.X; + else if (delta.Y > 0) + new_nodes.MinEdge.Y = new_nodes.MaxEdge.Y; + else if (delta.Y < 0) + new_nodes.MaxEdge.Y = new_nodes.MinEdge.Y; + else if (delta.Z > 0) + new_nodes.MinEdge.Z = new_nodes.MaxEdge.Z; + else if (delta.Z < 0) + new_nodes.MaxEdge.Z = new_nodes.MinEdge.Z; + + // For each untested node + for (s16 x = new_nodes.MinEdge.X; x <= new_nodes.MaxEdge.X; x++) { + for (s16 y = new_nodes.MinEdge.Y; y <= new_nodes.MaxEdge.Y; y++) { + for (s16 z = new_nodes.MinEdge.Z; z <= new_nodes.MaxEdge.Z; z++) { + MapNode n; + v3s16 np(x, y, z); + bool is_valid_position; + + n = m_map->getNodeNoEx(np, &is_valid_position); + if (!(is_valid_position && + isPointableNode(n, nodedef, liquids_pointable))) { + continue; + } + std::vector<aabb3f> boxes; + n.getSelectionBoxes(nodedef, &boxes, + n.getNeighbors(np, m_map)); + + v3f npf = intToFloat(np, BS); + for (std::vector<aabb3f>::const_iterator i = boxes.begin(); + i != boxes.end(); ++i) { + aabb3f box = *i; + box.MinEdge += npf; + box.MaxEdge += npf; + v3f intersection_point; + v3s16 intersection_normal; + if (!boxLineCollision(box, shootline.start, shootline.getVector(), + &intersection_point, &intersection_normal)) { + continue; + } + f32 distance = (intersection_point - shootline.start).getLength(); + if (distance >= min_distance) { + continue; + } + result.type = POINTEDTHING_NODE; + result.node_undersurface = np; + result.intersection_point = intersection_point; + result.intersection_normal = intersection_normal; + found_boxcenter = box.getCenter(); + min_distance = distance; + is_node_found = true; + } + } + } + } + if (is_node_found) { + node_foundcounter++; + if (node_foundcounter > maximal_overcheck) { + break; + } + } + // Next node + if (iterator.hasNext()) { + oldnode = iterator.m_current_node_pos; + iterator.next(); + } else { + break; + } + } + + if (is_node_found) { + // Set undersurface and abovesurface nodes + f32 d = 0.002 * BS; + v3f fake_intersection = result.intersection_point; + // Move intersection towards its source block. + if (fake_intersection.X < found_boxcenter.X) + fake_intersection.X += d; + else + fake_intersection.X -= d; + + if (fake_intersection.Y < found_boxcenter.Y) + fake_intersection.Y += d; + else + fake_intersection.Y -= d; + + if (fake_intersection.Z < found_boxcenter.Z) + fake_intersection.Z += d; + else + fake_intersection.Z -= d; + + result.node_real_undersurface = floatToInt(fake_intersection, BS); + result.node_abovesurface = result.node_real_undersurface + + result.intersection_normal; + } + return result; +} diff --git a/src/clientenvironment.h b/src/clientenvironment.h new file mode 100644 index 000000000..79b4797ad --- /dev/null +++ b/src/clientenvironment.h @@ -0,0 +1,195 @@ +/* +Minetest +Copyright (C) 2010-2017 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef CLIENT_ENVIRONMENT_HEADER +#define CLIENT_ENVIRONMENT_HEADER + +#include <IrrlichtDevice.h> +#include <ISceneManager.h> +#include "environment.h" +#include "clientobject.h" + +class ClientSimpleObject; +class ClientMap; +class ClientScripting; +class ClientActiveObject; +class GenericCAO; +class LocalPlayer; +struct PointedThing; + +/* + The client-side environment. + + This is not thread-safe. + Must be called from main (irrlicht) thread (uses the SceneManager) + Client uses an environment mutex. +*/ + +enum ClientEnvEventType +{ + CEE_NONE, + CEE_PLAYER_DAMAGE, + CEE_PLAYER_BREATH +}; + +struct ClientEnvEvent +{ + ClientEnvEventType type; + union { + //struct{ + //} none; + struct{ + u8 amount; + bool send_to_server; + } player_damage; + struct{ + u16 amount; + } player_breath; + }; +}; + +class ClientEnvironment : public Environment +{ +public: + ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, + ITextureSource *texturesource, Client *client, + IrrlichtDevice *device); + ~ClientEnvironment(); + + Map & getMap(); + ClientMap & getClientMap(); + + Client *getGameDef() { return m_client; } + void setScript(ClientScripting *script) { m_script = script; } + + void step(f32 dtime); + + virtual void setLocalPlayer(LocalPlayer *player); + LocalPlayer *getLocalPlayer() { return m_local_player; } + + /* + ClientSimpleObjects + */ + + void addSimpleObject(ClientSimpleObject *simple); + + /* + ActiveObjects + */ + + GenericCAO* getGenericCAO(u16 id); + ClientActiveObject* getActiveObject(u16 id); + + /* + Adds an active object to the environment. + Environment handles deletion of object. + Object may be deleted by environment immediately. + If id of object is 0, assigns a free id to it. + Returns the id of the object. + Returns 0 if not added and thus deleted. + */ + u16 addActiveObject(ClientActiveObject *object); + + void addActiveObject(u16 id, u8 type, const std::string &init_data); + void removeActiveObject(u16 id); + + void processActiveObjectMessage(u16 id, const std::string &data); + + /* + Callbacks for activeobjects + */ + + void damageLocalPlayer(u8 damage, bool handle_hp=true); + void updateLocalPlayerBreath(u16 breath); + + /* + Client likes to call these + */ + + // Get all nearby objects + void getActiveObjects(v3f origin, f32 max_d, + std::vector<DistanceSortedActiveObject> &dest); + + bool hasClientEnvEvents() const { return !m_client_event_queue.empty(); } + // Get event from queue. If queue is empty, it triggers an assertion failure. + ClientEnvEvent getClientEnvEvent(); + + /*! + * Gets closest object pointed by the shootline. + * Returns NULL if not found. + * + * \param[in] shootline_on_map the shootline for + * the test in world coordinates + * \param[out] intersection_point the first point where + * the shootline meets the object. Valid only if + * not NULL is returned. + * \param[out] intersection_normal the normal vector of + * the intersection, pointing outwards. Zero vector if + * the shootline starts in an active object. + * Valid only if not NULL is returned. + */ + ClientActiveObject * getSelectedActiveObject( + const core::line3d<f32> &shootline_on_map, + v3f *intersection_point, + v3s16 *intersection_normal + ); + + /*! + * Performs a raycast on the world. + * Returns the first thing the shootline meets. + * + * @param[in] shootline the shootline, starting from + * the camera position. This also gives the maximal distance + * of the search. + * @param[in] liquids_pointable if false, liquids are ignored + * @param[in] look_for_object if false, objects are ignored + */ + PointedThing getPointedThing( + core::line3d<f32> shootline, + bool liquids_pointable, + bool look_for_object); + + u16 attachement_parent_ids[USHRT_MAX + 1]; + + const std::list<std::string> &getPlayerNames() { return m_player_names; } + void addPlayerName(const std::string &name) { m_player_names.push_back(name); } + void removePlayerName(const std::string &name) { m_player_names.remove(name); } + void updateCameraOffset(v3s16 camera_offset) + { m_camera_offset = camera_offset; } + v3s16 getCameraOffset() const { return m_camera_offset; } +private: + ClientMap *m_map; + LocalPlayer *m_local_player; + scene::ISceneManager *m_smgr; + ITextureSource *m_texturesource; + Client *m_client; + ClientScripting *m_script; + IrrlichtDevice *m_irr; + UNORDERED_MAP<u16, ClientActiveObject*> m_active_objects; + std::vector<ClientSimpleObject*> m_simple_objects; + std::queue<ClientEnvEvent> m_client_event_queue; + IntervalLimiter m_active_object_light_update_interval; + IntervalLimiter m_lava_hurt_interval; + IntervalLimiter m_drowning_interval; + IntervalLimiter m_breathing_interval; + std::list<std::string> m_player_names; + v3s16 m_camera_offset; +}; + +#endif diff --git a/src/clientiface.cpp b/src/clientiface.cpp index 0390cf0ff..68bd4afe7 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -20,18 +20,18 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <sstream> #include "clientiface.h" -#include "util/numeric.h" -#include "util/mathconstants.h" #include "remoteplayer.h" #include "settings.h" #include "mapblock.h" #include "network/connection.h" -#include "environment.h" +#include "serverenvironment.h" #include "map.h" #include "emerge.h" #include "content_sao.h" // TODO this is used for cleanup of only #include "log.h" +#include "network/serveropcodes.h" #include "util/srp.h" +#include "face_position_cache.h" const char *ClientInterface::statenames[] = { "Invalid", @@ -198,6 +198,9 @@ void RemoteClient::GetNextBlocks ( s32 nearest_sent_d = -1; //bool queue_is_full = false; + const v3s16 cam_pos_nodes = floatToInt(camera_pos, BS); + const bool occ_cull = g_settings->getBool("server_side_occlusion_culling"); + s16 d; for(d = d_start; d <= d_max; d++) { /* @@ -236,9 +239,9 @@ void RemoteClient::GetNextBlocks ( continue; /* - Do not go over-limit + Do not go over max mapgen limit */ - if (blockpos_over_limit(p)) + if (blockpos_over_max_limit(p)) continue; // If this is true, inexistent block will be made from scratch @@ -250,8 +253,8 @@ void RemoteClient::GetNextBlocks ( FOV setting. The default of 72 degrees is fine. */ - if(isBlockInSight(p, camera_pos, camera_dir, camera_fov, d_blocks_in_sight) == false) - { + f32 dist; + if (!isBlockInSight(p, camera_pos, camera_dir, camera_fov, d_blocks_in_sight, &dist)) { continue; } @@ -284,12 +287,6 @@ void RemoteClient::GetNextBlocks ( surely_not_found_on_disk = true; } - // Block is valid if lighting is up-to-date and data exists - if(block->isValid() == false) - { - block_is_invalid = true; - } - if(block->isGenerated() == false) block_is_invalid = true; @@ -305,6 +302,11 @@ void RemoteClient::GetNextBlocks ( if(block->getDayNightDiff() == false) continue; } + + if (occ_cull && !block_is_invalid && + env->getMap().isBlockOccluded(block, cam_pos_nodes)) { + continue; + } } /* @@ -341,7 +343,7 @@ void RemoteClient::GetNextBlocks ( /* Add block to send queue */ - PrioritySortedBlockTransfer q((float)d, p, peer_id); + PrioritySortedBlockTransfer q((float)dist, p, peer_id); dest.push_back(q); @@ -588,9 +590,9 @@ void RemoteClient::notifyEvent(ClientStateEvent event) } } -u32 RemoteClient::uptime() +u64 RemoteClient::uptime() const { - return getTime(PRECISION_SECONDS) - m_connection_time; + return porting::getTimeS() - m_connection_time; } ClientInterface::ClientInterface(con::Connection* con) @@ -677,16 +679,17 @@ void ClientInterface::send(u16 peer_id, u8 channelnum, m_con->Send(peer_id, channelnum, pkt, reliable); } -void ClientInterface::sendToAll(u16 channelnum, - NetworkPacket* pkt, bool reliable) +void ClientInterface::sendToAll(NetworkPacket *pkt) { MutexAutoLock clientslock(m_clients_mutex); - for(UNORDERED_MAP<u16, RemoteClient*>::iterator i = m_clients.begin(); - i != m_clients.end(); ++i) { + for (UNORDERED_MAP<u16, RemoteClient*>::iterator i = m_clients.begin(); + i != m_clients.end(); ++i) { RemoteClient *client = i->second; if (client->net_proto_version != 0) { - m_con->Send(client->peer_id, channelnum, pkt, reliable); + m_con->Send(client->peer_id, + clientCommandFactoryTable[pkt->getCommand()].channel, pkt, + clientCommandFactoryTable[pkt->getCommand()].reliable); } } } diff --git a/src/clientiface.h b/src/clientiface.h index 551d71bbe..d2299c879 100644 --- a/src/clientiface.h +++ b/src/clientiface.h @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "threading/mutex.h" #include "network/networkpacket.h" #include "util/cpp11_container.h" +#include "porting.h" #include <list> #include <vector> @@ -165,7 +166,6 @@ namespace con { class Connection; } -#define CI_ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) // Also make sure to update the ClientInterface::statenames // array when modifying these enums @@ -266,7 +266,7 @@ public: m_version_patch(0), m_full_version("unknown"), m_deployed_compression(0), - m_connection_time(getTime(PRECISION_SECONDS)) + m_connection_time(porting::getTimeS()) { } ~RemoteClient() @@ -325,14 +325,11 @@ public: */ std::set<u16> m_known_objects; - ClientState getState() - { return m_state; } + ClientState getState() const { return m_state; } - std::string getName() - { return m_name; } + std::string getName() const { return m_name; } - void setName(std::string name) - { m_name = name; } + void setName(const std::string &name) { m_name = name; } /* update internal client state */ void notifyEvent(ClientStateEvent event); @@ -348,10 +345,11 @@ public: { serialization_version = m_pending_serialization_version; } /* get uptime */ - u32 uptime(); + u64 uptime() const; /* set version information */ - void setVersionInfo(u8 major, u8 minor, u8 patch, std::string full) { + void setVersionInfo(u8 major, u8 minor, u8 patch, const std::string &full) + { m_version_major = major; m_version_minor = minor; m_version_patch = patch; @@ -359,10 +357,9 @@ public: } /* read version information */ - u8 getMajor() { return m_version_major; } - u8 getMinor() { return m_version_minor; } - u8 getPatch() { return m_version_patch; } - std::string getVersion() { return m_full_version; } + u8 getMajor() const { return m_version_major; } + u8 getMinor() const { return m_version_minor; } + u8 getPatch() const { return m_version_patch; } private: // Version is stored in here after INIT before INIT2 u8 m_pending_serialization_version; @@ -435,7 +432,7 @@ private: /* time this client was created */ - const u32 m_connection_time; + const u64 m_connection_time; }; class ClientInterface { @@ -459,7 +456,7 @@ public: void send(u16 peer_id, u8 channelnum, NetworkPacket* pkt, bool reliable); /* send to all clients */ - void sendToAll(u16 channelnum, NetworkPacket* pkt, bool reliable); + void sendToAll(NetworkPacket *pkt); /* delete a client */ void DeleteClient(u16 peer_id); diff --git a/src/clientmap.cpp b/src/clientmap.cpp index faa1461f6..6cd24ffc6 100644 --- a/src/clientmap.cpp +++ b/src/clientmap.cpp @@ -29,20 +29,17 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "profiler.h" #include "settings.h" #include "camera.h" // CameraModes -#include "util/mathconstants.h" +#include "util/basic_macros.h" #include <algorithm> -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - ClientMap::ClientMap( Client *client, - IGameDef *gamedef, MapDrawControl &control, scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id ): - Map(dout_client, gamedef), + Map(dout_client, client), scene::ISceneNode(parent, mgr, id), m_client(client), m_control(control), @@ -112,36 +109,7 @@ void ClientMap::OnRegisterSceneNode() ISceneNode::OnRegisterSceneNode(); } -static bool isOccluded(Map *map, v3s16 p0, v3s16 p1, float step, float stepfac, - float start_off, float end_off, u32 needed_count, INodeDefManager *nodemgr) -{ - float d0 = (float)BS * p0.getDistanceFrom(p1); - v3s16 u0 = p1 - p0; - v3f uf = v3f(u0.X, u0.Y, u0.Z) * BS; - uf.normalize(); - v3f p0f = v3f(p0.X, p0.Y, p0.Z) * BS; - u32 count = 0; - for(float s=start_off; s<d0+end_off; s+=step){ - v3f pf = p0f + uf * s; - v3s16 p = floatToInt(pf, BS); - MapNode n = map->getNodeNoEx(p); - bool is_transparent = false; - const ContentFeatures &f = nodemgr->get(n); - if(f.solidness == 0) - is_transparent = (f.visual_solidness != 2); - else - is_transparent = (f.solidness != 2); - if(!is_transparent){ - count++; - if(count >= needed_count) - return true; - } - step *= stepfac; - } - return false; -} - -void ClientMap::getBlocksInViewRange(v3s16 cam_pos_nodes, +void ClientMap::getBlocksInViewRange(v3s16 cam_pos_nodes, v3s16 *p_blocks_min, v3s16 *p_blocks_max) { v3s16 box_nodes_d = m_control.wanted_range * v3s16(1, 1, 1); @@ -173,8 +141,6 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) ScopeProfiler sp(g_profiler, "CM::updateDrawList()", SPT_AVG); g_profiler->add("CM::updateDrawList() count", 1); - INodeDefManager *nodemgr = m_gamedef->ndef(); - for (std::map<v3s16, MapBlock*>::iterator i = m_drawlist.begin(); i != m_drawlist.end(); ++i) { MapBlock *block = i->second; @@ -214,6 +180,16 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) // Distance to farthest drawn block float farthest_drawn = 0; + // No occlusion culling when free_move is on and camera is + // inside ground + bool occlusion_culling_enabled = true; + if (g_settings->getBool("free_move")) { + MapNode n = getNodeNoEx(cam_pos_nodes); + if (n.getContent() == CONTENT_IGNORE || + m_nodedef->get(n).solidness == 2) + occlusion_culling_enabled = false; + } + for (std::map<v2s16, MapSector*>::iterator si = m_sectors.begin(); si != m_sectors.end(); ++si) { MapSector *sector = si->second; @@ -255,76 +231,20 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) camera_direction, camera_fov, range, &d)) continue; - // This is ugly (spherical distance limit?) - /*if(m_control.range_all == false && - d - 0.5*BS*MAP_BLOCKSIZE > range) - continue;*/ - blocks_in_range++; /* Ignore if mesh doesn't exist */ - { - //MutexAutoLock lock(block->mesh_mutex); - - if (block->mesh == NULL) { - blocks_in_range_without_mesh++; - continue; - } + if (block->mesh == NULL) { + blocks_in_range_without_mesh++; + continue; } /* Occlusion culling */ - - // No occlusion culling when free_move is on and camera is - // inside ground - bool occlusion_culling_enabled = true; - if (g_settings->getBool("free_move")) { - MapNode n = getNodeNoEx(cam_pos_nodes); - if (n.getContent() == CONTENT_IGNORE || - nodemgr->get(n).solidness == 2) - occlusion_culling_enabled = false; - } - - v3s16 cpn = block->getPos() * MAP_BLOCKSIZE; - cpn += v3s16(MAP_BLOCKSIZE / 2, MAP_BLOCKSIZE / 2, MAP_BLOCKSIZE / 2); - float step = BS * 1; - float stepfac = 1.1; - float startoff = BS * 1; - // The occlusion search of 'isOccluded()' must stop short of the target - // point by distance 'endoff' (end offset) to not enter the target mapblock. - // For the 8 mapblock corners 'endoff' must therefore be the maximum diagonal - // of a mapblock, because we must consider all view angles. - // sqrt(1^2 + 1^2 + 1^2) = 1.732 - float endoff = -BS * MAP_BLOCKSIZE * 1.732050807569; - v3s16 spn = cam_pos_nodes; - s16 bs2 = MAP_BLOCKSIZE / 2 + 1; - // to reduce the likelihood of falsely occluded blocks - // require at least two solid blocks - // this is a HACK, we should think of a more precise algorithm - u32 needed_count = 2; - if (occlusion_culling_enabled && - // For the central point of the mapblock 'endoff' can be halved - isOccluded(this, spn, cpn, - step, stepfac, startoff, endoff / 2.0f, needed_count, nodemgr) && - isOccluded(this, spn, cpn + v3s16(bs2,bs2,bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && - isOccluded(this, spn, cpn + v3s16(bs2,bs2,-bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && - isOccluded(this, spn, cpn + v3s16(bs2,-bs2,bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && - isOccluded(this, spn, cpn + v3s16(bs2,-bs2,-bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && - isOccluded(this, spn, cpn + v3s16(-bs2,bs2,bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && - isOccluded(this, spn, cpn + v3s16(-bs2,bs2,-bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && - isOccluded(this, spn, cpn + v3s16(-bs2,-bs2,bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && - isOccluded(this, spn, cpn + v3s16(-bs2,-bs2,-bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr)) { + if (occlusion_culling_enabled && isBlockOccluded(block, cam_pos_nodes)) { blocks_occlusion_culled++; continue; } @@ -370,6 +290,11 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) struct MeshBufList { + /*! + * Specifies in which layer the list is. + * All lists which are in a lower layer are rendered before this list. + */ + u8 layer; video::SMaterial m; std::vector<scene::IMeshBuffer*> bufs; }; @@ -383,25 +308,29 @@ struct MeshBufListList lists.clear(); } - void add(scene::IMeshBuffer *buf) + void add(scene::IMeshBuffer *buf, u8 layer) { + const video::SMaterial &m = buf->getMaterial(); for(std::vector<MeshBufList>::iterator i = lists.begin(); i != lists.end(); ++i){ MeshBufList &l = *i; - video::SMaterial &m = buf->getMaterial(); // comparing a full material is quite expensive so we don't do it if // not even first texture is equal if (l.m.TextureLayer[0].Texture != m.TextureLayer[0].Texture) continue; + if(l.layer != layer) + continue; + if (l.m == m) { l.bufs.push_back(buf); return; } } MeshBufList l; - l.m = buf->getMaterial(); + l.layer = layer; + l.m = m; l.bufs.push_back(buf); lists.push_back(l); } @@ -448,11 +377,6 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) Get all blocks and draw all visible ones */ - v3s16 cam_pos_nodes = floatToInt(camera_position, BS); - v3s16 p_blocks_min; - v3s16 p_blocks_max; - getBlocksInViewRange(cam_pos_nodes, &p_blocks_min, &p_blocks_max); - u32 vertex_count = 0; u32 meshbuffer_count = 0; @@ -490,7 +414,7 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) continue; // Mesh animation - { + if (pass == scene::ESNRP_SOLID) { //MutexAutoLock lock(block->mesh_mutex); MapBlockMesh *mapBlockMesh = block->mesh; assert(mapBlockMesh); @@ -519,28 +443,34 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) MapBlockMesh *mapBlockMesh = block->mesh; assert(mapBlockMesh); - scene::IMesh *mesh = mapBlockMesh->getMesh(); - assert(mesh); - - u32 c = mesh->getMeshBufferCount(); - for (u32 i = 0; i < c; i++) - { - scene::IMeshBuffer *buf = mesh->getMeshBuffer(i); + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { + scene::IMesh *mesh = mapBlockMesh->getMesh(layer); + assert(mesh); - buf->getMaterial().setFlag(video::EMF_TRILINEAR_FILTER, m_cache_trilinear_filter); - buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, m_cache_bilinear_filter); - buf->getMaterial().setFlag(video::EMF_ANISOTROPIC_FILTER, m_cache_anistropic_filter); - buf->getMaterial().setFlag(video::EMF_WIREFRAME, m_control.show_wireframe); + u32 c = mesh->getMeshBufferCount(); + for (u32 i = 0; i < c; i++) { + scene::IMeshBuffer *buf = mesh->getMeshBuffer(i); - const video::SMaterial& material = buf->getMaterial(); - video::IMaterialRenderer* rnd = + video::SMaterial& material = buf->getMaterial(); + video::IMaterialRenderer* rnd = driver->getMaterialRenderer(material.MaterialType); - bool transparent = (rnd && rnd->isTransparent()); - if (transparent == is_transparent_pass) { - if (buf->getVertexCount() == 0) - errorstream << "Block [" << analyze_block(block) - << "] contains an empty meshbuf" << std::endl; - drawbufs.add(buf); + bool transparent = (rnd && rnd->isTransparent()); + if (transparent == is_transparent_pass) { + if (buf->getVertexCount() == 0) + errorstream << "Block [" << analyze_block(block) + << "] contains an empty meshbuf" << std::endl; + + material.setFlag(video::EMF_TRILINEAR_FILTER, + m_cache_trilinear_filter); + material.setFlag(video::EMF_BILINEAR_FILTER, + m_cache_bilinear_filter); + material.setFlag(video::EMF_ANISOTROPIC_FILTER, + m_cache_anistropic_filter); + material.setFlag(video::EMF_WIREFRAME, + m_control.show_wireframe); + + drawbufs.add(buf, layer); + } } } } @@ -672,7 +602,6 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor, int oldvalue, bool *sunlight_seen_result) { const bool debugprint = false; - INodeDefManager *ndef = m_gamedef->ndef(); static v3f z_directions[50] = { v3f(-100, 0, 0) }; @@ -710,7 +639,7 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor, float off = step * z_offsets[i]; bool sunlight_seen_now = false; bool ok = getVisibleBrightness(this, m_camera_position, dir, - step, 1.0, max_d*0.6+off, max_d, ndef, daylight_factor, + step, 1.0, max_d*0.6+off, max_d, m_nodedef, daylight_factor, sunlight_min_d, &br, &sunlight_seen_now); if(sunlight_seen_now) @@ -750,8 +679,8 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor, int ret = 0; if(brightness_count == 0){ MapNode n = getNodeNoEx(floatToInt(m_camera_position, BS)); - if(ndef->get(n).param_type == CPT_LIGHT){ - ret = decode_light(n.getLightBlend(daylight_factor, ndef)); + if(m_nodedef->get(n).param_type == CPT_LIGHT){ + ret = decode_light(n.getLightBlend(daylight_factor, m_nodedef)); } else { ret = oldvalue; } @@ -774,8 +703,6 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor, void ClientMap::renderPostFx(CameraMode cam_mode) { - INodeDefManager *nodemgr = m_gamedef->ndef(); - // Sadly ISceneManager has no "post effects" render pass, in that case we // could just register for that and handle it in renderMap(). @@ -784,10 +711,10 @@ void ClientMap::renderPostFx(CameraMode cam_mode) // - If the player is in a solid node, make everything black. // - If the player is in liquid, draw a semi-transparent overlay. // - Do not if player is in third person mode - const ContentFeatures& features = nodemgr->get(n); + const ContentFeatures& features = m_nodedef->get(n); video::SColor post_effect_color = features.post_effect_color; if(features.solidness == 2 && !(g_settings->getBool("noclip") && - m_gamedef->checkLocalPrivilege("noclip")) && + m_client->checkLocalPrivilege("noclip")) && cam_mode == CAMERA_MODE_FIRST) { post_effect_color = video::SColor(255, 0, 0, 0); diff --git a/src/clientmap.h b/src/clientmap.h index cb686ff33..84228f4ca 100644 --- a/src/clientmap.h +++ b/src/clientmap.h @@ -59,7 +59,7 @@ class ITextureSource; /* ClientMap - + This is the only map class that is able to render itself on screen. */ @@ -68,7 +68,6 @@ class ClientMap : public Map, public scene::ISceneNode public: ClientMap( Client *client, - IGameDef *gamedef, MapDrawControl &control, scene::ISceneNode* parent, scene::ISceneManager* mgr, @@ -114,13 +113,13 @@ public: driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); renderMap(driver, SceneManager->getSceneNodeRenderPass()); } - + virtual const aabb3f &getBoundingBox() const { return m_box; } - - void getBlocksInViewRange(v3s16 cam_pos_nodes, + + void getBlocksInViewRange(v3s16 cam_pos_nodes, v3s16 *p_blocks_min, v3s16 *p_blocks_max); void updateDrawList(video::IVideoDriver* driver); void renderMap(video::IVideoDriver* driver, s32 pass); @@ -132,20 +131,14 @@ public: // For debug printing virtual void PrintInfo(std::ostream &out); - - // Check if sector was drawn on last render() - bool sectorWasDrawn(v2s16 p) - { - return (m_last_drawn_sectors.find(p) != m_last_drawn_sectors.end()); - } const MapDrawControl & getControl() const { return m_control; } f32 getCameraFov() const { return m_camera_fov; } private: Client *m_client; - + aabb3f m_box; - + MapDrawControl &m_control; v3f m_camera_position; @@ -154,7 +147,7 @@ private: v3s16 m_camera_offset; std::map<v3s16, MapBlock*> m_drawlist; - + std::set<v2s16> m_last_drawn_sectors; bool m_cache_trilinear_filter; diff --git a/src/clientmedia.cpp b/src/clientmedia.cpp index bca3f67c2..9c1e430df 100644 --- a/src/clientmedia.cpp +++ b/src/clientmedia.cpp @@ -42,12 +42,12 @@ static std::string getMediaCacheDir() */ ClientMediaDownloader::ClientMediaDownloader(): - m_media_cache(getMediaCacheDir()) + m_media_cache(getMediaCacheDir()), + m_initial_step_done(false), + m_uncached_count(0), + m_uncached_received_count(0), + m_name_bound("") { - m_initial_step_done = false; - m_name_bound = ""; // works because "" is an invalid file name - m_uncached_count = 0; - m_uncached_received_count = 0; m_httpfetch_caller = HTTPFETCH_DISCARD; m_httpfetch_active = 0; m_httpfetch_active_limit = 0; @@ -69,7 +69,7 @@ ClientMediaDownloader::~ClientMediaDownloader() delete m_remotes[i]; } -void ClientMediaDownloader::addFile(std::string name, std::string sha1) +void ClientMediaDownloader::addFile(const std::string &name, const std::string &sha1) { assert(!m_initial_step_done); // pre-condition @@ -104,7 +104,7 @@ void ClientMediaDownloader::addFile(std::string name, std::string sha1) m_files.insert(std::make_pair(name, filestatus)); } -void ClientMediaDownloader::addRemoteServer(std::string baseurl) +void ClientMediaDownloader::addRemoteServer(const std::string &baseurl) { assert(!m_initial_step_done); // pre-condition @@ -348,7 +348,7 @@ void ClientMediaDownloader::remoteMediaReceived( std::string name; { - std::map<unsigned long, std::string>::iterator it = + UNORDERED_MAP<unsigned long, std::string>::iterator it = m_remote_file_transfers.find(fetch_result.request_id); assert(it != m_remote_file_transfers.end()); name = it->second; diff --git a/src/clientmedia.h b/src/clientmedia.h index 1f0da70d9..3c96dfe8a 100644 --- a/src/clientmedia.h +++ b/src/clientmedia.h @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <map> #include <set> #include <vector> +#include "util/cpp11_container.h" class Client; struct HTTPFetchResult; @@ -58,10 +59,10 @@ public: } // Add a file to the list of required file (but don't fetch it yet) - void addFile(std::string name, std::string sha1); + void addFile(const std::string &name, const std::string &sha1); // Add a remote server to the list; ignored if not built with cURL - void addRemoteServer(std::string baseurl); + void addRemoteServer(const std::string &baseurl); // Steps the media downloader: // - May load media into client by calling client->loadMedia() @@ -137,7 +138,7 @@ private: s32 m_httpfetch_active; s32 m_httpfetch_active_limit; s32 m_outstanding_hash_sets; - std::map<unsigned long, std::string> m_remote_file_transfers; + UNORDERED_MAP<unsigned long, std::string> m_remote_file_transfers; // All files up to this name have either been received from a // remote server or failed on all remote servers, so those files diff --git a/src/clientobject.cpp b/src/clientobject.cpp index ff3f47187..89a0474a4 100644 --- a/src/clientobject.cpp +++ b/src/clientobject.cpp @@ -20,16 +20,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "clientobject.h" #include "debug.h" #include "porting.h" -#include "constants.h" /* ClientActiveObject */ -ClientActiveObject::ClientActiveObject(u16 id, IGameDef *gamedef, +ClientActiveObject::ClientActiveObject(u16 id, Client *client, ClientEnvironment *env): ActiveObject(id), - m_gamedef(gamedef), + m_client(client), m_env(env) { } @@ -40,7 +39,7 @@ ClientActiveObject::~ClientActiveObject() } ClientActiveObject* ClientActiveObject::create(ActiveObjectType type, - IGameDef *gamedef, ClientEnvironment *env) + Client *client, ClientEnvironment *env) { // Find factory function UNORDERED_MAP<u16, Factory>::iterator n = m_types.find(type); @@ -52,7 +51,7 @@ ClientActiveObject* ClientActiveObject::create(ActiveObjectType type, } Factory f = n->second; - ClientActiveObject *object = (*f)(gamedef, env); + ClientActiveObject *object = (*f)(client, env); return object; } diff --git a/src/clientobject.h b/src/clientobject.h index 83931e438..aa0ec9c56 100644 --- a/src/clientobject.h +++ b/src/clientobject.h @@ -25,20 +25,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <map> #include "util/cpp11_container.h" -/* - -Some planning -------------- - -* Client receives a network packet with information of added objects - in it -* Client supplies the information to its ClientEnvironment -* The environment adds the specified objects to itself - -*/ - class ClientEnvironment; class ITextureSource; +class Client; class IGameDef; class LocalPlayer; struct ItemStack; @@ -47,7 +36,7 @@ class WieldMeshSceneNode; class ClientActiveObject : public ActiveObject { public: - ClientActiveObject(u16 id, IGameDef *gamedef, ClientEnvironment *env); + ClientActiveObject(u16 id, Client *client, ClientEnvironment *env); virtual ~ClientActiveObject(); virtual void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, @@ -58,20 +47,15 @@ public: virtual void updateLightNoCheck(u8 light_at_pos){} virtual v3s16 getLightPosition(){return v3s16(0,0,0);} virtual aabb3f *getSelectionBox() { return NULL; } - virtual bool getCollisionBox(aabb3f *toset){return false;} - virtual bool collideWithObjects(){return false;} - virtual v3f getPosition(){return v3f(0,0,0);} - virtual float getYaw() const {return 0;} - virtual scene::ISceneNode *getSceneNode(){return NULL;} - virtual scene::IMeshSceneNode *getMeshSceneNode(){return NULL;} - virtual scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode(){return NULL;} - virtual WieldMeshSceneNode *getWieldMeshSceneNode(){return NULL;} - virtual scene::IBillboardSceneNode *getSpriteSceneNode(){return NULL;} - virtual bool isPlayer() const {return false;} + virtual bool getCollisionBox(aabb3f *toset) const { return false; } + virtual bool collideWithObjects() const { return false; } + virtual v3f getPosition(){ return v3f(0,0,0); } + virtual float getYaw() const { return 0; } + virtual scene::ISceneNode *getSceneNode() { return NULL; } + virtual scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode() { return NULL; } virtual bool isLocalPlayer() const {return false;} - virtual void setAttachments(){} + virtual void setAttachments() {} virtual bool doShowSelectionBox(){return true;} - virtual void updateCameraOffset(v3s16 camera_offset){}; // Step object in time virtual void step(float dtime, ClientEnvironment *env){} @@ -89,7 +73,7 @@ public: virtual void initialize(const std::string &data){} // Create a certain type of ClientActiveObject - static ClientActiveObject* create(ActiveObjectType type, IGameDef *gamedef, + static ClientActiveObject* create(ActiveObjectType type, Client *client, ClientEnvironment *env); // If returns true, punch will not be sent to the server @@ -99,9 +83,9 @@ public: protected: // Used for creating objects based on type - typedef ClientActiveObject* (*Factory)(IGameDef *gamedef, ClientEnvironment *env); + typedef ClientActiveObject* (*Factory)(Client *client, ClientEnvironment *env); static void registerType(u16 type, Factory f); - IGameDef *m_gamedef; + Client *m_client; ClientEnvironment *m_env; private: // Used for creating objects based on type diff --git a/src/clientsimpleobject.h b/src/clientsimpleobject.h index c94db22f1..f5b79b64f 100644 --- a/src/clientsimpleobject.h +++ b/src/clientsimpleobject.h @@ -29,10 +29,9 @@ protected: public: bool m_to_be_removed; - ClientSimpleObject(): m_to_be_removed(false) {} - virtual ~ClientSimpleObject(){} - virtual void step(float dtime){} + ClientSimpleObject() : m_to_be_removed(false) {} + virtual ~ClientSimpleObject() {} + virtual void step(float dtime) {} }; #endif - diff --git a/src/cloudparams.h b/src/cloudparams.h new file mode 100644 index 000000000..dafec4b27 --- /dev/null +++ b/src/cloudparams.h @@ -0,0 +1,33 @@ +/* +Minetest +Copyright (C) 2017 bendeutsch, Ben Deutsch <ben@bendeutsch.de> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef CLOUDPARAMS_HEADER +#define CLOUDPARAMS_HEADER + +struct CloudParams +{ + float density; + video::SColor color_bright; + video::SColor color_ambient; + float thickness; + float height; + v2f speed; +}; + +#endif diff --git a/src/clouds.cpp b/src/clouds.cpp index 82b63b6b3..10a533cae 100644 --- a/src/clouds.cpp +++ b/src/clouds.cpp @@ -32,6 +32,7 @@ irr::scene::ISceneManager *g_menucloudsmgr = NULL; static void cloud_3d_setting_changed(const std::string &settingname, void *data) { + // TODO: only re-read cloud settings, not height or radius ((Clouds *)data)->readSettings(); } @@ -44,9 +45,10 @@ Clouds::Clouds( ): scene::ISceneNode(parent, mgr, id), m_seed(seed), - m_camera_pos(0,0), - m_time(0), - m_camera_offset(0,0,0) + m_camera_pos(0.0f, 0.0f), + m_origin(0.0f, 0.0f), + m_camera_offset(0.0f, 0.0f, 0.0f), + m_color(1.0f, 1.0f, 1.0f, 1.0f) { m_material.setFlag(video::EMF_LIGHTING, false); //m_material.setFlag(video::EMF_BACK_FACE_CULLING, false); @@ -57,14 +59,18 @@ Clouds::Clouds( //m_material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA; m_material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; + m_params.density = 0.4f; + m_params.thickness = 16.0f; + m_params.color_bright = video::SColor(229, 240, 240, 255); + m_params.color_ambient = video::SColor(255, 0, 0, 0); + m_params.speed = v2f(0.0f, -2.0f); + m_passed_cloud_y = cloudheight; readSettings(); g_settings->registerChangedCallback("enable_3d_clouds", &cloud_3d_setting_changed, this); - m_box = aabb3f(-BS*1000000,m_cloud_y-BS,-BS*1000000, - BS*1000000,m_cloud_y+BS,BS*1000000); - + updateBox(); } Clouds::~Clouds() @@ -88,6 +94,10 @@ void Clouds::OnRegisterSceneNode() void Clouds::render() { + + if (m_params.density <= 0.0f) + return; // no need to do anything + video::IVideoDriver* driver = SceneManager->getVideoDriver(); if(SceneManager->getSceneNodeRenderPass() != scene::ESNRP_TRANSPARENT) @@ -107,15 +117,12 @@ void Clouds::render() Clouds move from Z+ towards Z- */ - const float cloud_size = BS * 64; - const v2f cloud_speed(0, -BS * 2); + static const float cloud_size = BS * 64.0f; const float cloud_full_radius = cloud_size * m_cloud_radius_i; - // Position of cloud noise origin in world coordinates - v2f world_cloud_origin_pos_f = m_time * cloud_speed; // Position of cloud noise origin from the camera - v2f cloud_origin_from_camera_f = world_cloud_origin_pos_f - m_camera_pos; + v2f cloud_origin_from_camera_f = m_origin - m_camera_pos; // The center point of drawing in the noise v2f center_of_drawing_in_noise_f = -cloud_origin_from_camera_f; // The integer center point of drawing in the noise @@ -127,7 +134,7 @@ void Clouds::render() v2f world_center_of_drawing_in_noise_f = v2f( center_of_drawing_in_noise_i.X * cloud_size, center_of_drawing_in_noise_i.Y * cloud_size - ) + world_cloud_origin_pos_f; + ) + m_origin; /*video::SColor c_top(128,b*240,b*240,b*255); video::SColor c_side_1(128,b*230,b*230,b*255); @@ -146,10 +153,6 @@ void Clouds::render() c_bottom_f.r *= 0.80; c_bottom_f.g *= 0.80; c_bottom_f.b *= 0.80; - c_top_f.a = 0.9; - c_side_1_f.a = 0.9; - c_side_2_f.a = 0.9; - c_bottom_f.a = 0.9; video::SColor c_top = c_top_f.toSColor(); video::SColor c_side_1 = c_side_1_f.toSColor(); video::SColor c_side_2 = c_side_2_f.toSColor(); @@ -187,11 +190,14 @@ void Clouds::render() zi + center_of_drawing_in_noise_i.Y ); - double noise = noise2d_perlin( + float noise = noise2d_perlin( (float)p_in_noise_i.X * cloud_size_noise, (float)p_in_noise_i.Y * cloud_size_noise, m_seed, 3, 0.5); - grid[i] = (noise >= 0.4); + // normalize to 0..1 (given 3 octaves) + static const float noise_bound = 1.0f + 0.5f + 0.25f; + float density = noise / noise_bound * 0.5f + 0.5f; + grid[i] = (density < m_params.density); } } @@ -236,8 +242,9 @@ void Clouds::render() v[3].Color.setBlue(255); }*/ - f32 rx = cloud_size/2; - f32 ry = 8 * BS; + f32 rx = cloud_size / 2.0f; + // if clouds are flat, the top layer should be at the given height + f32 ry = m_enable_3d ? m_params.thickness * BS : 0.0f; f32 rz = cloud_size / 2; for(int i=0; i<num_faces_to_draw; i++) @@ -265,8 +272,8 @@ void Clouds::render() } v[0].Pos.set(-rx, ry,-rz); v[1].Pos.set( rx, ry,-rz); - v[2].Pos.set( rx,-ry,-rz); - v[3].Pos.set(-rx,-ry,-rz); + v[2].Pos.set( rx, 0,-rz); + v[3].Pos.set(-rx, 0,-rz); break; case 2: //right if (INAREA(xi + 1, zi, m_cloud_radius_i)) { @@ -280,8 +287,8 @@ void Clouds::render() } v[0].Pos.set( rx, ry,-rz); v[1].Pos.set( rx, ry, rz); - v[2].Pos.set( rx,-ry, rz); - v[3].Pos.set( rx,-ry,-rz); + v[2].Pos.set( rx, 0, rz); + v[3].Pos.set( rx, 0,-rz); break; case 3: // front if (INAREA(xi, zi + 1, m_cloud_radius_i)) { @@ -295,8 +302,8 @@ void Clouds::render() } v[0].Pos.set( rx, ry, rz); v[1].Pos.set(-rx, ry, rz); - v[2].Pos.set(-rx,-ry, rz); - v[3].Pos.set( rx,-ry, rz); + v[2].Pos.set(-rx, 0, rz); + v[3].Pos.set( rx, 0, rz); break; case 4: // left if (INAREA(xi-1, zi, m_cloud_radius_i)) { @@ -310,22 +317,22 @@ void Clouds::render() } v[0].Pos.set(-rx, ry, rz); v[1].Pos.set(-rx, ry,-rz); - v[2].Pos.set(-rx,-ry,-rz); - v[3].Pos.set(-rx,-ry, rz); + v[2].Pos.set(-rx, 0,-rz); + v[3].Pos.set(-rx, 0, rz); break; case 5: // bottom for(int j=0;j<4;j++){ v[j].Color = c_bottom; v[j].Normal.set(0,-1,0); } - v[0].Pos.set( rx,-ry, rz); - v[1].Pos.set(-rx,-ry, rz); - v[2].Pos.set(-rx,-ry,-rz); - v[3].Pos.set( rx,-ry,-rz); + v[0].Pos.set( rx, 0, rz); + v[1].Pos.set(-rx, 0, rz); + v[2].Pos.set(-rx, 0,-rz); + v[3].Pos.set( rx, 0,-rz); break; } - v3f pos(p0.X, m_cloud_y, p0.Y); + v3f pos(p0.X, m_params.height * BS, p0.Y); pos -= intToFloat(m_camera_offset, BS); for(u16 i=0; i<4; i++) @@ -345,22 +352,25 @@ void Clouds::render() void Clouds::step(float dtime) { - m_time += dtime; + m_origin = m_origin + dtime * BS * m_params.speed; } -void Clouds::update(v2f camera_p, video::SColorf color) +void Clouds::update(v2f camera_p, video::SColorf color_diffuse) { m_camera_pos = camera_p; - m_color = color; - //m_brightness = brightness; - //dstream<<"m_brightness="<<m_brightness<<std::endl; + m_color.r = MYMIN(MYMAX(color_diffuse.r * m_params.color_bright.getRed(), + m_params.color_ambient.getRed()), 255) / 255.0f; + m_color.g = MYMIN(MYMAX(color_diffuse.g * m_params.color_bright.getGreen(), + m_params.color_ambient.getGreen()), 255) / 255.0f; + m_color.b = MYMIN(MYMAX(color_diffuse.b * m_params.color_bright.getBlue(), + m_params.color_ambient.getBlue()), 255) / 255.0f; + m_color.a = m_params.color_bright.getAlpha() / 255.0f; } void Clouds::readSettings() { - m_cloud_y = BS * (m_passed_cloud_y ? m_passed_cloud_y : + m_params.height = (m_passed_cloud_y ? m_passed_cloud_y : g_settings->getS16("cloud_height")); m_cloud_radius_i = g_settings->getU16("cloud_radius"); m_enable_3d = g_settings->getBool("enable_3d_clouds"); } - diff --git a/src/clouds.h b/src/clouds.h index 9c6b41786..a0bda28df 100644 --- a/src/clouds.h +++ b/src/clouds.h @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include <iostream> #include "constants.h" +#include "cloudparams.h" // Menu clouds class Clouds; @@ -79,27 +80,68 @@ public: void updateCameraOffset(v3s16 camera_offset) { m_camera_offset = camera_offset; - m_box = aabb3f(-BS * 1000000, m_cloud_y - BS - BS * camera_offset.Y, -BS * 1000000, - BS * 1000000, m_cloud_y + BS - BS * camera_offset.Y, BS * 1000000); + updateBox(); } void readSettings(); + void setDensity(float density) + { + m_params.density = density; + // currently does not need bounding + } + + void setColorBright(const video::SColor &color_bright) + { + m_params.color_bright = color_bright; + } + + void setColorAmbient(const video::SColor &color_ambient) + { + m_params.color_ambient = color_ambient; + } + + void setHeight(float height) + { + m_params.height = height; // add bounding when necessary + updateBox(); + } + + void setSpeed(v2f speed) + { + m_params.speed = speed; + } + + void setThickness(float thickness) + { + m_params.thickness = thickness; + updateBox(); + } + private: + void updateBox() + { + float height_bs = m_params.height * BS; + float thickness_bs = m_params.thickness * BS; + m_box = aabb3f(-BS * 1000000.0f, height_bs - BS * m_camera_offset.Y, -BS * 1000000.0f, + BS * 1000000.0f, height_bs + thickness_bs - BS * m_camera_offset.Y, BS * 1000000.0f); + } + video::SMaterial m_material; aabb3f m_box; s16 m_passed_cloud_y; - float m_cloud_y; u16 m_cloud_radius_i; bool m_enable_3d; - video::SColorf m_color; u32 m_seed; v2f m_camera_pos; - float m_time; + v2f m_origin; + v2f m_speed; v3s16 m_camera_offset; + video::SColorf m_color; + CloudParams m_params; + }; #endif - diff --git a/src/collision.cpp b/src/collision.cpp index 8e5dbcc9b..c0891c152 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -22,11 +22,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "nodedef.h" #include "gamedef.h" -#include "log.h" -#include "environment.h" +#ifndef SERVER +#include "clientenvironment.h" +#endif +#include "serverenvironment.h" #include "serverobject.h" -#include <vector> -#include <set> #include "util/timetaker.h" #include "profiler.h" diff --git a/src/constants.h b/src/constants.h index 55ae9daf3..fb9e97cb3 100644 --- a/src/constants.h +++ b/src/constants.h @@ -85,7 +85,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ // Size of player's main inventory -#define PLAYER_INVENTORY_SIZE (8*4) +#define PLAYER_INVENTORY_SIZE (8 * 4) // Maximum hit points of a player #define PLAYER_MAX_HP 20 @@ -110,10 +110,10 @@ with this program; if not, write to the Free Software Foundation, Inc., // TODO: implement dpi-based scaling for windows and remove this hack #if defined(_WIN32) - #define TTF_DEFAULT_FONT_SIZE (18) +#define TTF_DEFAULT_FONT_SIZE (18) #else - #define TTF_DEFAULT_FONT_SIZE (16) +#define TTF_DEFAULT_FONT_SIZE (16) #endif -#define DEFAULT_FONT_SIZE (10) +#define DEFAULT_FONT_SIZE (10) #endif diff --git a/src/content_abm.cpp b/src/content_abm.cpp index 8694ef981..162f93364 100644 --- a/src/content_abm.cpp +++ b/src/content_abm.cpp @@ -26,11 +26,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "mapblock.h" // For getNodeBlockPos #include "map.h" -#include "scripting_game.h" +#include "scripting_server.h" #include "log.h" -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - -void add_legacy_abms(ServerEnvironment *env, INodeDefManager *nodedef) { - +void add_legacy_abms(ServerEnvironment *env, INodeDefManager *nodedef) +{ } diff --git a/src/content_abm.h b/src/content_abm.h index 0a91a96a2..0fb3a0413 100644 --- a/src/content_abm.h +++ b/src/content_abm.h @@ -30,4 +30,3 @@ class INodeDefManager; void add_legacy_abms(ServerEnvironment *env, INodeDefManager *nodedef); #endif - diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 6b35d5881..d15c53e7a 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -26,13 +26,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_cao.h" #include "util/numeric.h" // For IntervalLimiter #include "util/serialize.h" -#include "util/mathconstants.h" +#include "util/basic_macros.h" #include "client/tile.h" #include "environment.h" #include "collision.h" #include "settings.h" #include "serialization.h" // For decompressZlib -#include "gamedef.h" #include "clientobject.h" #include "mesh.h" #include "itemdef.h" @@ -45,12 +44,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "camera.h" // CameraModes #include "wieldmesh.h" #include "log.h" +#include <algorithm> class Settings; struct ToolCapabilities; -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - UNORDERED_MAP<u16, ClientActiveObject::Factory> ClientActiveObject::m_types; SmoothTranslator::SmoothTranslator(): @@ -140,7 +138,7 @@ static void setBillboardTextureMatrix(scene::IBillboardSceneNode *bill, class TestCAO : public ClientActiveObject { public: - TestCAO(IGameDef *gamedef, ClientEnvironment *env); + TestCAO(Client *client, ClientEnvironment *env); virtual ~TestCAO(); ActiveObjectType getType() const @@ -148,7 +146,7 @@ public: return ACTIVEOBJECT_TYPE_TEST; } - static ClientActiveObject* create(IGameDef *gamedef, ClientEnvironment *env); + static ClientActiveObject* create(Client *client, ClientEnvironment *env); void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, IrrlichtDevice *irr); @@ -161,7 +159,7 @@ public: void processMessage(const std::string &data); - bool getCollisionBox(aabb3f *toset) { return false; } + bool getCollisionBox(aabb3f *toset) const { return false; } private: scene::IMeshSceneNode *m_node; v3f m_position; @@ -170,8 +168,8 @@ private: // Prototype TestCAO proto_TestCAO(NULL, NULL); -TestCAO::TestCAO(IGameDef *gamedef, ClientEnvironment *env): - ClientActiveObject(0, gamedef, env), +TestCAO::TestCAO(Client *client, ClientEnvironment *env): + ClientActiveObject(0, client, env), m_node(NULL), m_position(v3f(0,10*BS,0)) { @@ -182,9 +180,9 @@ TestCAO::~TestCAO() { } -ClientActiveObject* TestCAO::create(IGameDef *gamedef, ClientEnvironment *env) +ClientActiveObject* TestCAO::create(Client *client, ClientEnvironment *env) { - return new TestCAO(gamedef, env); + return new TestCAO(client, env); } void TestCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, @@ -284,7 +282,7 @@ void TestCAO::processMessage(const std::string &data) class ItemCAO : public ClientActiveObject { public: - ItemCAO(IGameDef *gamedef, ClientEnvironment *env); + ItemCAO(Client *client, ClientEnvironment *env); virtual ~ItemCAO(); ActiveObjectType getType() const @@ -292,7 +290,7 @@ public: return ACTIVEOBJECT_TYPE_ITEM; } - static ClientActiveObject* create(IGameDef *gamedef, ClientEnvironment *env); + static ClientActiveObject* create(Client *client, ClientEnvironment *env); void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, IrrlichtDevice *irr); @@ -318,7 +316,7 @@ public: std::string infoText() {return m_infotext;} - bool getCollisionBox(aabb3f *toset) { return false; } + bool getCollisionBox(aabb3f *toset) const { return false; } private: aabb3f m_selection_box; scene::IMeshSceneNode *m_node; @@ -332,13 +330,13 @@ private: // Prototype ItemCAO proto_ItemCAO(NULL, NULL); -ItemCAO::ItemCAO(IGameDef *gamedef, ClientEnvironment *env): - ClientActiveObject(0, gamedef, env), +ItemCAO::ItemCAO(Client *client, ClientEnvironment *env): + ClientActiveObject(0, client, env), m_selection_box(-BS/3.,0.0,-BS/3., BS/3.,BS*2./3.,BS/3.), m_node(NULL), m_position(v3f(0,10*BS,0)) { - if(!gamedef && !env) + if(!client && !env) { ClientActiveObject::registerType(getType(), create); } @@ -348,9 +346,9 @@ ItemCAO::~ItemCAO() { } -ClientActiveObject* ItemCAO::create(IGameDef *gamedef, ClientEnvironment *env) +ClientActiveObject* ItemCAO::create(Client *client, ClientEnvironment *env) { - return new ItemCAO(gamedef, env); + return new ItemCAO(client, env); } void ItemCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, @@ -434,7 +432,7 @@ void ItemCAO::updateNodePos() void ItemCAO::updateInfoText() { try{ - IItemDefManager *idef = m_gamedef->idef(); + IItemDefManager *idef = m_client->idef(); ItemStack item; item.deSerialize(m_itemstring, idef); if(item.isKnown(idef)) @@ -459,10 +457,10 @@ void ItemCAO::updateTexture() std::istringstream is(m_itemstring, std::ios_base::binary); video::ITexture *texture = NULL; try{ - IItemDefManager *idef = m_gamedef->idef(); + IItemDefManager *idef = m_client->idef(); ItemStack item; item.deSerialize(is, idef); - texture = idef->getInventoryTexture(item.getDefinition(idef).name, m_gamedef); + texture = idef->getInventoryTexture(item.getDefinition(idef).name, m_client); } catch(SerializationError &e) { @@ -539,15 +537,15 @@ void ItemCAO::initialize(const std::string &data) #include "genericobject.h" -GenericCAO::GenericCAO(IGameDef *gamedef, ClientEnvironment *env): - ClientActiveObject(0, gamedef, env), +GenericCAO::GenericCAO(Client *client, ClientEnvironment *env): + ClientActiveObject(0, client, env), // m_is_player(false), m_is_local_player(false), // m_smgr(NULL), m_irr(NULL), - m_gamedef(NULL), + m_client(NULL), m_selection_box(-BS/3.,-BS/3.,-BS/3., BS/3.,BS/3.,BS/3.), m_meshnode(NULL), m_animated_meshnode(NULL), @@ -577,19 +575,21 @@ GenericCAO::GenericCAO(IGameDef *gamedef, ClientEnvironment *env): m_anim_framelength(0.2), m_anim_timer(0), m_reset_textures_timer(-1), + m_previous_texture_modifier(""), + m_current_texture_modifier(""), m_visuals_expired(false), m_step_distance_counter(0), m_last_light(255), m_is_visible(false) { - if (gamedef == NULL) { + if (client == NULL) { ClientActiveObject::registerType(getType(), create); } else { - m_gamedef = gamedef; + m_client = client; } } -bool GenericCAO::getCollisionBox(aabb3f *toset) +bool GenericCAO::getCollisionBox(aabb3f *toset) const { if (m_prop.physical) { @@ -606,7 +606,7 @@ bool GenericCAO::getCollisionBox(aabb3f *toset) return false; } -bool GenericCAO::collideWithObjects() +bool GenericCAO::collideWithObjects() const { return m_prop.collideWithObjects; } @@ -706,26 +706,11 @@ scene::ISceneNode* GenericCAO::getSceneNode() return NULL; } -scene::IMeshSceneNode* GenericCAO::getMeshSceneNode() -{ - return m_meshnode; -} - scene::IAnimatedMeshSceneNode* GenericCAO::getAnimatedMeshSceneNode() { return m_animated_meshnode; } -WieldMeshSceneNode* GenericCAO::getWieldMeshSceneNode() -{ - return m_wield_meshnode; -} - -scene::IBillboardSceneNode* GenericCAO::getSpriteSceneNode() -{ - return m_spritenode; -} - void GenericCAO::setChildrenVisible(bool toset) { for (std::vector<u16>::size_type i = 0; i < m_children.size(); i++) { @@ -794,7 +779,7 @@ void GenericCAO::removeFromScene(bool permanent) } if (m_nametag) { - m_gamedef->getCamera()->removeNametag(m_nametag); + m_client->getCamera()->removeNametag(m_nametag); m_nametag = NULL; } } @@ -907,7 +892,7 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, } else if(m_prop.visual == "mesh") { infostream<<"GenericCAO::addToScene(): mesh"<<std::endl; - scene::IAnimatedMesh *mesh = m_gamedef->getMesh(m_prop.mesh); + scene::IAnimatedMesh *mesh = m_client->getMesh(m_prop.mesh); if(mesh) { m_animated_meshnode = smgr->addAnimatedMeshSceneNode(mesh, NULL); @@ -934,33 +919,43 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, errorstream<<"GenericCAO::addToScene(): Could not load mesh "<<m_prop.mesh<<std::endl; } else if(m_prop.visual == "wielditem") { - infostream<<"GenericCAO::addToScene(): wielditem"<<std::endl; - infostream<<"textures: "<<m_prop.textures.size()<<std::endl; - if(m_prop.textures.size() >= 1){ - infostream<<"textures[0]: "<<m_prop.textures[0]<<std::endl; - IItemDefManager *idef = m_gamedef->idef(); - ItemStack item(m_prop.textures[0], 1, 0, "", idef); - - m_wield_meshnode = new WieldMeshSceneNode( - smgr->getRootSceneNode(), smgr, -1); - m_wield_meshnode->setItem(item, m_gamedef); - - m_wield_meshnode->setScale(v3f(m_prop.visual_size.X/2, - m_prop.visual_size.Y/2, - m_prop.visual_size.X/2)); - u8 li = m_last_light; - m_wield_meshnode->setColor(video::SColor(255,li,li,li)); + ItemStack item; + infostream << "GenericCAO::addToScene(): wielditem" << std::endl; + if (m_prop.wield_item == "") { + // Old format, only textures are specified. + infostream << "textures: " << m_prop.textures.size() << std::endl; + if (m_prop.textures.size() >= 1) { + infostream << "textures[0]: " << m_prop.textures[0] + << std::endl; + IItemDefManager *idef = m_client->idef(); + item = ItemStack(m_prop.textures[0], 1, 0, idef); + } + } else { + infostream << "serialized form: " << m_prop.wield_item << std::endl; + item.deSerialize(m_prop.wield_item, m_client->idef()); } + m_wield_meshnode = new WieldMeshSceneNode(smgr->getRootSceneNode(), + smgr, -1); + m_wield_meshnode->setItem(item, m_client); + + m_wield_meshnode->setScale( + v3f(m_prop.visual_size.X / 2, m_prop.visual_size.Y / 2, + m_prop.visual_size.X / 2)); + u8 li = m_last_light; + m_wield_meshnode->setColor(video::SColor(255, li, li, li)); } else { infostream<<"GenericCAO::addToScene(): \""<<m_prop.visual <<"\" not supported"<<std::endl; } - updateTextures(""); + + /* don't update while punch texture modifier is active */ + if (m_reset_textures_timer < 0) + updateTextures(m_current_texture_modifier); scene::ISceneNode *node = getSceneNode(); if (node && m_prop.nametag != "" && !m_is_local_player) { // Add nametag - m_nametag = m_gamedef->getCamera()->addNametag(node, + m_nametag = m_client->getCamera()->addNametag(node, m_prop.nametag, m_prop.nametag_color); } @@ -1032,12 +1027,9 @@ void GenericCAO::updateNodePos() void GenericCAO::step(float dtime, ClientEnvironment *env) { // Handel model of local player instantly to prevent lags - if(m_is_local_player) - { + if (m_is_local_player) { LocalPlayer *player = m_env->getLocalPlayer(); - - if (m_is_visible) - { + if (m_is_visible) { int old_anim = player->last_animation; float old_anim_speed = player->last_animation_speed; m_position = player->getPosition() + v3f(0,BS,0); @@ -1045,7 +1037,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) m_acceleration = v3f(0,0,0); pos_translator.vect_show = m_position; m_yaw = player->getYaw(); - PlayerControl controls = player->getPlayerControl(); + const PlayerControl &controls = player->getPlayerControl(); bool walking = false; if (controls.up || controls.down || controls.left || controls.right || @@ -1059,18 +1051,17 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) // increase speed if using fast or flying fast if((g_settings->getBool("fast_move") && - m_gamedef->checkLocalPrivilege("fast")) && + m_client->checkLocalPrivilege("fast")) && (controls.aux1 || (!player->touching_ground && g_settings->getBool("free_move") && - m_gamedef->checkLocalPrivilege("fly")))) + m_client->checkLocalPrivilege("fly")))) new_speed *= 1.5; // slowdown speed if sneeking - if(controls.sneak && walking) + if (controls.sneak && walking) new_speed /= 2; - if(walking && (controls.LMB || controls.RMB)) - { + if (walking && (controls.LMB || controls.RMB)) { new_anim = player->local_animations[3]; player->last_animation = WD_ANIM; } else if(walking) { @@ -1083,8 +1074,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) // Apply animations if input detected and not attached // or set idle animation - if ((new_anim.X + new_anim.Y) > 0 && !player->isAttached) - { + if ((new_anim.X + new_anim.Y) > 0 && !player->isAttached) { allow_update = true; m_animation_range = new_anim; m_animation_speed = new_speed; @@ -1092,8 +1082,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) } else { player->last_animation = NO_ANIM; - if (old_anim != NO_ANIM) - { + if (old_anim != NO_ANIM) { m_animation_range = player->local_animations[0]; updateAnimation(); } @@ -1130,7 +1119,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) } removeFromScene(false); - addToScene(m_smgr, m_gamedef->tsrc(), m_irr); + addToScene(m_smgr, m_client->tsrc(), m_irr); // Attachments, part 2: Now that the parent has been refreshed, put its attachments back for (std::vector<u16>::size_type i = 0; i < m_children.size(); i++) { @@ -1200,12 +1189,12 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) m_step_distance_counter = 0; if(!m_is_local_player && m_prop.makes_footstep_sound) { - INodeDefManager *ndef = m_gamedef->ndef(); + INodeDefManager *ndef = m_client->ndef(); v3s16 p = floatToInt(getPosition() + v3f(0, (m_prop.collisionbox.MinEdge.Y-0.5)*BS, 0), BS); MapNode n = m_env->getMap().getNodeNoEx(p); SimpleSoundSpec spec = ndef->get(n).sound_footstep; - m_gamedef->sound()->playSoundAt(spec, false, getPosition()); + m_client->sound()->playSoundAt(spec, false, getPosition()); } } } @@ -1224,9 +1213,9 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) if(m_reset_textures_timer >= 0) { m_reset_textures_timer -= dtime; - if(m_reset_textures_timer <= 0){ + if(m_reset_textures_timer <= 0) { m_reset_textures_timer = -1; - updateTextures(""); + updateTextures(m_previous_texture_modifier); } } if(getParent() == NULL && fabs(m_prop.automatic_rotate) > 0.001) @@ -1304,14 +1293,17 @@ void GenericCAO::updateTexturePos() } } -void GenericCAO::updateTextures(const std::string &mod) +void GenericCAO::updateTextures(std::string mod) { - ITextureSource *tsrc = m_gamedef->tsrc(); + ITextureSource *tsrc = m_client->tsrc(); bool use_trilinear_filter = g_settings->getBool("trilinear_filter"); bool use_bilinear_filter = g_settings->getBool("bilinear_filter"); bool use_anisotropic_filter = g_settings->getBool("anisotropic_filter"); + m_previous_texture_modifier = m_current_texture_modifier; + m_current_texture_modifier = mod; + if(m_spritenode) { if(m_prop.visual == "sprite") @@ -1577,6 +1569,10 @@ void GenericCAO::processMessage(const std::string &data) m_initial_tx_basepos_set = true; m_tx_basepos = m_prop.initial_sprite_basepos; } + if (m_is_local_player) { + LocalPlayer *player = m_env->getLocalPlayer(); + player->makes_footstep_sound = m_prop.makes_footstep_sound; + } if ((m_is_player && !m_is_local_player) && m_prop.nametag == "") m_prop.nametag = m_name; @@ -1614,6 +1610,12 @@ void GenericCAO::processMessage(const std::string &data) updateNodePos(); } else if (cmd == GENERIC_CMD_SET_TEXTURE_MOD) { std::string mod = deSerializeString(is); + + // immediatly reset a engine issued texture modifier if a mod sends a different one + if (m_reset_textures_timer > 0) { + m_reset_textures_timer = -1; + updateTextures(m_previous_texture_modifier); + } updateTextures(mod); } else if (cmd == GENERIC_CMD_SET_SPRITE) { v2s16 p = readV2S16(is); @@ -1634,6 +1636,7 @@ void GenericCAO::processMessage(const std::string &data) // these are sent inverted so we get true when the server sends nothing bool sneak = !readU8(is); bool sneak_glitch = !readU8(is); + bool new_move = !readU8(is); if(m_is_local_player) @@ -1644,6 +1647,7 @@ void GenericCAO::processMessage(const std::string &data) player->physics_override_gravity = override_gravity; player->physics_override_sneak = sneak; player->physics_override_sneak_glitch = sneak_glitch; + player->physics_override_new_move = new_move; } } else if (cmd == GENERIC_CMD_SET_ANIMATION) { // TODO: change frames send as v2s32 value @@ -1731,13 +1735,13 @@ void GenericCAO::processMessage(const std::string &data) m_smgr, m_env, m_position, m_prop.visual_size * BS); m_env->addSimpleObject(simple); - } else { + } else if (m_reset_textures_timer < 0) { // TODO: Execute defined fast response // Flashing shall suffice as there is no definition m_reset_textures_timer = 0.05; if(damage >= 2) m_reset_textures_timer += 0.05 * damage; - updateTextures("^[brighten"); + updateTextures(m_current_texture_modifier + "^[brighten"); } } } else if (cmd == GENERIC_CMD_UPDATE_ARMOR_GROUPS) { @@ -1768,7 +1772,7 @@ void GenericCAO::processMessage(const std::string &data) } else { warningstream << FUNCTION_NAME << ": unknown command or outdated client \"" - << cmd << std::endl; + << +cmd << "\"" << std::endl; } } @@ -1779,7 +1783,7 @@ bool GenericCAO::directReportPunch(v3f dir, const ItemStack *punchitem, { assert(punchitem); // pre-condition const ToolCapabilities *toolcap = - &punchitem->getToolCapabilities(m_gamedef->idef()); + &punchitem->getToolCapabilities(m_client->idef()); PunchDamageResult result = getPunchDamage( m_armor_groups, toolcap, @@ -1802,10 +1806,12 @@ bool GenericCAO::directReportPunch(v3f dir, const ItemStack *punchitem, } // TODO: Execute defined fast response // Flashing shall suffice as there is no definition - m_reset_textures_timer = 0.05; - if(result.damage >= 2) - m_reset_textures_timer += 0.05 * result.damage; - updateTextures("^[brighten"); + if (m_reset_textures_timer < 0) { + m_reset_textures_timer = 0.05; + if (result.damage >= 2) + m_reset_textures_timer += 0.05 * result.damage; + updateTextures(m_current_texture_modifier + "^[brighten"); + } } return false; diff --git a/src/content_cao.h b/src/content_cao.h index a158e8296..412cdff12 100644 --- a/src/content_cao.h +++ b/src/content_cao.h @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "itemgroup.h" class Camera; +class Client; struct Nametag; /* @@ -68,7 +69,7 @@ private: // scene::ISceneManager *m_smgr; IrrlichtDevice *m_irr; - IGameDef *m_gamedef; + Client *m_client; aabb3f m_selection_box; scene::IMeshSceneNode *m_meshnode; scene::IAnimatedMeshSceneNode *m_animated_meshnode; @@ -101,6 +102,8 @@ private: float m_anim_timer; ItemGroupList m_armor_groups; float m_reset_textures_timer; + std::string m_previous_texture_modifier; // stores texture modifier before punch update + std::string m_current_texture_modifier; // last applied texture modifier bool m_visuals_expired; float m_step_distance_counter; u8 m_last_light; @@ -109,13 +112,13 @@ private: std::vector<u16> m_children; public: - GenericCAO(IGameDef *gamedef, ClientEnvironment *env); + GenericCAO(Client *client, ClientEnvironment *env); ~GenericCAO(); - static ClientActiveObject* create(IGameDef *gamedef, ClientEnvironment *env) + static ClientActiveObject* create(Client *client, ClientEnvironment *env) { - return new GenericCAO(gamedef, env); + return new GenericCAO(client, env); } inline ActiveObjectType getType() const @@ -129,9 +132,9 @@ public: ClientActiveObject *getParent(); - bool getCollisionBox(aabb3f *toset); + bool getCollisionBox(aabb3f *toset) const; - bool collideWithObjects(); + bool collideWithObjects() const; aabb3f *getSelectionBox(); @@ -143,19 +146,8 @@ public: scene::ISceneNode *getSceneNode(); - scene::IMeshSceneNode *getMeshSceneNode(); - scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode(); - WieldMeshSceneNode *getWieldMeshSceneNode(); - - scene::IBillboardSceneNode *getSpriteSceneNode(); - - inline bool isPlayer() const - { - return m_is_player; - } - inline bool isLocalPlayer() const { return m_is_local_player; @@ -197,7 +189,9 @@ public: void updateTexturePos(); - void updateTextures(const std::string &mod); + // std::string copy is mandatory as mod can be a class member and there is a swap + // on those class members + void updateTextures(std::string mod); void updateAnimation(); diff --git a/src/content_cso.cpp b/src/content_cso.cpp index 0790024fc..aca71212b 100644 --- a/src/content_cso.cpp +++ b/src/content_cso.cpp @@ -20,22 +20,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_cso.h" #include <IBillboardSceneNode.h> #include "client/tile.h" -#include "environment.h" -#include "gamedef.h" -#include "log.h" +#include "clientenvironment.h" +#include "client.h" #include "map.h" -/* -static void setBillboardTextureMatrix(scene::IBillboardSceneNode *bill, - float txs, float tys, int col, int row) -{ - video::SMaterial& material = bill->getMaterial(0); - core::matrix4& matrix = material.getTextureMatrix(0); - matrix.setTextureTranslate(txs*col, tys*row); - matrix.setTextureScale(txs, tys); -} -*/ - class SmokePuffCSO: public ClientSimpleObject { float m_age; diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index 8ce0f1e0a..e6dd8e83e 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -20,1778 +20,1289 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_mapblock.h" #include "util/numeric.h" #include "util/directiontables.h" -#include "mapblock_mesh.h" // For MapBlock_LightColor() and MeshCollector +#include "mapblock_mesh.h" #include "settings.h" #include "nodedef.h" #include "client/tile.h" #include "mesh.h" #include <IMeshManipulator.h> -#include "gamedef.h" +#include "client.h" #include "log.h" #include "noise.h" +#include "util/cpp11.h" +// Distance of light extrapolation (for oversized nodes) +// After this distance, it gives up and considers light level constant +#define SMOOTH_LIGHTING_OVERSIZE 1.0 + +// Node edge count (for glasslike-framed) +#define FRAMED_EDGE_COUNT 12 + +// Node neighbor count, including edge-connected, but not vertex-connected +// (for glasslike-framed) +// Corresponding offsets are listed in g_27dirs +#define FRAMED_NEIGHBOR_COUNT 18 + +static constexpr v3s16 light_dirs[8] = { + v3s16(-1, -1, -1), + v3s16(-1, -1, 1), + v3s16(-1, 1, -1), + v3s16(-1, 1, 1), + v3s16( 1, -1, -1), + v3s16( 1, -1, 1), + v3s16( 1, 1, -1), + v3s16( 1, 1, 1), +}; + +// Standard index set to make a quad on 4 vertices +static constexpr u16 quad_indices[] = {0, 1, 2, 2, 3, 0}; + +const std::string MapblockMeshGenerator::raillike_groupname = "connect_to_raillike"; + +MapblockMeshGenerator::MapblockMeshGenerator(MeshMakeData *input, MeshCollector *output) +{ + data = input; + collector = output; + + nodedef = data->m_client->ndef(); + smgr = data->m_client->getSceneManager(); + meshmanip = smgr->getMeshManipulator(); + + enable_mesh_cache = g_settings->getBool("enable_mesh_cache") && + !data->m_smooth_lighting; // Mesh cache is not supported with smooth lighting + + blockpos_nodes = data->m_blockpos * MAP_BLOCKSIZE; +} + +void MapblockMeshGenerator::useTile(int index, bool disable_backface_culling) +{ + getNodeTileN(n, p, index, data, tile); + if (!data->m_smooth_lighting) + color = encode_light(light, f->light_source); + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { + tile.layers[layer].material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; + if (disable_backface_culling) + tile.layers[layer].material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING; + } +} + +void MapblockMeshGenerator::useDefaultTile(bool set_color) +{ + getNodeTile(n, p, v3s16(0, 0, 0), data, tile); + if (set_color && !data->m_smooth_lighting) + color = encode_light(light, f->light_source); +} + +void MapblockMeshGenerator::getTile(const v3s16& direction, TileSpec &tile) +{ + getNodeTile(n, p, direction, data, tile); +} + +void MapblockMeshGenerator::drawQuad(v3f *coords, const v3s16 &normal) +{ + static const v2f tcoords[4] = {v2f(0, 0), v2f(1, 0), v2f(1, 1), v2f(0, 1)}; + video::S3DVertex vertices[4]; + bool shade_face = !f->light_source && (normal != v3s16(0, 0, 0)); + v3f normal2(normal.X, normal.Y, normal.Z); + for (int j = 0; j < 4; j++) { + vertices[j].Pos = coords[j] + origin; + vertices[j].Normal = normal2; + if (data->m_smooth_lighting) + vertices[j].Color = blendLightColor(coords[j]); + else + vertices[j].Color = color; + if (shade_face) + applyFacesShading(vertices[j].Color, normal2); + vertices[j].TCoords = tcoords[j]; + } + collector->append(tile, vertices, 4, quad_indices, 6); +} // Create a cuboid. -// collector - the MeshCollector for the resulting polygons -// box - the position and size of the box // tiles - the tiles (materials) to use (for all 6 faces) // tilecount - number of entries in tiles, 1<=tilecount<=6 -// c - vertex colour - used for all +// lights - vertex light levels. The order is the same as in light_dirs. +// NULL may be passed if smooth lighting is disabled. // txc - texture coordinates - this is a list of texture coordinates // for the opposite corners of each face - therefore, there -// should be (2+2)*6=24 values in the list. Alternatively, pass -// NULL to use the entire texture for each face. The order of +// should be (2+2)*6=24 values in the list. The order of // the faces in the list is up-down-right-left-back-front -// (compatible with ContentFeatures). If you specified 0,0,1,1 -// for each face, that would be the same as passing NULL. -void makeCuboid(MeshCollector *collector, const aabb3f &box, - TileSpec *tiles, int tilecount, video::SColor &c, const f32* txc) +// (compatible with ContentFeatures). +void MapblockMeshGenerator::drawCuboid(const aabb3f &box, + TileSpec *tiles, int tilecount, const u16 *lights, const f32 *txc) { assert(tilecount >= 1 && tilecount <= 6); // pre-condition v3f min = box.MinEdge; v3f max = box.MaxEdge; - - - if(txc == NULL) { - static const f32 txc_default[24] = { - 0,0,1,1, - 0,0,1,1, - 0,0,1,1, - 0,0,1,1, - 0,0,1,1, - 0,0,1,1 - }; - txc = txc_default; + video::SColor colors[6]; + if (!data->m_smooth_lighting) { + for (int face = 0; face != 6; ++face) { + colors[face] = encode_light(light, f->light_source); + } + if (!f->light_source) { + applyFacesShading(colors[0], v3f(0, 1, 0)); + applyFacesShading(colors[1], v3f(0, -1, 0)); + applyFacesShading(colors[2], v3f(1, 0, 0)); + applyFacesShading(colors[3], v3f(-1, 0, 0)); + applyFacesShading(colors[4], v3f(0, 0, 1)); + applyFacesShading(colors[5], v3f(0, 0, -1)); + } } - video::S3DVertex vertices[24] = - { - // up - video::S3DVertex(min.X,max.Y,max.Z, 0,1,0, c, txc[0],txc[1]), - video::S3DVertex(max.X,max.Y,max.Z, 0,1,0, c, txc[2],txc[1]), - video::S3DVertex(max.X,max.Y,min.Z, 0,1,0, c, txc[2],txc[3]), - video::S3DVertex(min.X,max.Y,min.Z, 0,1,0, c, txc[0],txc[3]), - // down - video::S3DVertex(min.X,min.Y,min.Z, 0,-1,0, c, txc[4],txc[5]), - video::S3DVertex(max.X,min.Y,min.Z, 0,-1,0, c, txc[6],txc[5]), - video::S3DVertex(max.X,min.Y,max.Z, 0,-1,0, c, txc[6],txc[7]), - video::S3DVertex(min.X,min.Y,max.Z, 0,-1,0, c, txc[4],txc[7]), + video::S3DVertex vertices[24] = { + // top + video::S3DVertex(min.X, max.Y, max.Z, 0, 1, 0, colors[0], txc[0], txc[1]), + video::S3DVertex(max.X, max.Y, max.Z, 0, 1, 0, colors[0], txc[2], txc[1]), + video::S3DVertex(max.X, max.Y, min.Z, 0, 1, 0, colors[0], txc[2], txc[3]), + video::S3DVertex(min.X, max.Y, min.Z, 0, 1, 0, colors[0], txc[0], txc[3]), + // bottom + video::S3DVertex(min.X, min.Y, min.Z, 0, -1, 0, colors[1], txc[4], txc[5]), + video::S3DVertex(max.X, min.Y, min.Z, 0, -1, 0, colors[1], txc[6], txc[5]), + video::S3DVertex(max.X, min.Y, max.Z, 0, -1, 0, colors[1], txc[6], txc[7]), + video::S3DVertex(min.X, min.Y, max.Z, 0, -1, 0, colors[1], txc[4], txc[7]), // right - video::S3DVertex(max.X,max.Y,min.Z, 1,0,0, c, txc[ 8],txc[9]), - video::S3DVertex(max.X,max.Y,max.Z, 1,0,0, c, txc[10],txc[9]), - video::S3DVertex(max.X,min.Y,max.Z, 1,0,0, c, txc[10],txc[11]), - video::S3DVertex(max.X,min.Y,min.Z, 1,0,0, c, txc[ 8],txc[11]), + video::S3DVertex(max.X, max.Y, min.Z, 1, 0, 0, colors[2], txc[ 8], txc[9]), + video::S3DVertex(max.X, max.Y, max.Z, 1, 0, 0, colors[2], txc[10], txc[9]), + video::S3DVertex(max.X, min.Y, max.Z, 1, 0, 0, colors[2], txc[10], txc[11]), + video::S3DVertex(max.X, min.Y, min.Z, 1, 0, 0, colors[2], txc[ 8], txc[11]), // left - video::S3DVertex(min.X,max.Y,max.Z, -1,0,0, c, txc[12],txc[13]), - video::S3DVertex(min.X,max.Y,min.Z, -1,0,0, c, txc[14],txc[13]), - video::S3DVertex(min.X,min.Y,min.Z, -1,0,0, c, txc[14],txc[15]), - video::S3DVertex(min.X,min.Y,max.Z, -1,0,0, c, txc[12],txc[15]), + video::S3DVertex(min.X, max.Y, max.Z, -1, 0, 0, colors[3], txc[12], txc[13]), + video::S3DVertex(min.X, max.Y, min.Z, -1, 0, 0, colors[3], txc[14], txc[13]), + video::S3DVertex(min.X, min.Y, min.Z, -1, 0, 0, colors[3], txc[14], txc[15]), + video::S3DVertex(min.X, min.Y, max.Z, -1, 0, 0, colors[3], txc[12], txc[15]), // back - video::S3DVertex(max.X,max.Y,max.Z, 0,0,1, c, txc[16],txc[17]), - video::S3DVertex(min.X,max.Y,max.Z, 0,0,1, c, txc[18],txc[17]), - video::S3DVertex(min.X,min.Y,max.Z, 0,0,1, c, txc[18],txc[19]), - video::S3DVertex(max.X,min.Y,max.Z, 0,0,1, c, txc[16],txc[19]), + video::S3DVertex(max.X, max.Y, max.Z, 0, 0, 1, colors[4], txc[16], txc[17]), + video::S3DVertex(min.X, max.Y, max.Z, 0, 0, 1, colors[4], txc[18], txc[17]), + video::S3DVertex(min.X, min.Y, max.Z, 0, 0, 1, colors[4], txc[18], txc[19]), + video::S3DVertex(max.X, min.Y, max.Z, 0, 0, 1, colors[4], txc[16], txc[19]), // front - video::S3DVertex(min.X,max.Y,min.Z, 0,0,-1, c, txc[20],txc[21]), - video::S3DVertex(max.X,max.Y,min.Z, 0,0,-1, c, txc[22],txc[21]), - video::S3DVertex(max.X,min.Y,min.Z, 0,0,-1, c, txc[22],txc[23]), - video::S3DVertex(min.X,min.Y,min.Z, 0,0,-1, c, txc[20],txc[23]), + video::S3DVertex(min.X, max.Y, min.Z, 0, 0, -1, colors[5], txc[20], txc[21]), + video::S3DVertex(max.X, max.Y, min.Z, 0, 0, -1, colors[5], txc[22], txc[21]), + video::S3DVertex(max.X, min.Y, min.Z, 0, 0, -1, colors[5], txc[22], txc[23]), + video::S3DVertex(min.X, min.Y, min.Z, 0, 0, -1, colors[5], txc[20], txc[23]), + }; + + static const u8 light_indices[24] = { + 3, 7, 6, 2, + 0, 4, 5, 1, + 6, 7, 5, 4, + 3, 2, 0, 1, + 7, 3, 1, 5, + 2, 6, 4, 0 }; - for(int i = 0; i < 6; i++) - { - switch (tiles[MYMIN(i, tilecount-1)].rotation) - { - case 0: - break; - case 1: //R90 - for (int x = 0; x < 4; x++) - vertices[i*4+x].TCoords.rotateBy(90,irr::core::vector2df(0, 0)); - break; - case 2: //R180 - for (int x = 0; x < 4; x++) - vertices[i*4+x].TCoords.rotateBy(180,irr::core::vector2df(0, 0)); - break; - case 3: //R270 - for (int x = 0; x < 4; x++) - vertices[i*4+x].TCoords.rotateBy(270,irr::core::vector2df(0, 0)); - break; - case 4: //FXR90 - for (int x = 0; x < 4; x++){ - vertices[i*4+x].TCoords.X = 1.0 - vertices[i*4+x].TCoords.X; - vertices[i*4+x].TCoords.rotateBy(90,irr::core::vector2df(0, 0)); - } - break; - case 5: //FXR270 - for (int x = 0; x < 4; x++){ - vertices[i*4+x].TCoords.X = 1.0 - vertices[i*4+x].TCoords.X; - vertices[i*4+x].TCoords.rotateBy(270,irr::core::vector2df(0, 0)); - } - break; - case 6: //FYR90 - for (int x = 0; x < 4; x++){ - vertices[i*4+x].TCoords.Y = 1.0 - vertices[i*4+x].TCoords.Y; - vertices[i*4+x].TCoords.rotateBy(90,irr::core::vector2df(0, 0)); - } - break; - case 7: //FYR270 - for (int x = 0; x < 4; x++){ - vertices[i*4+x].TCoords.Y = 1.0 - vertices[i*4+x].TCoords.Y; - vertices[i*4+x].TCoords.rotateBy(270,irr::core::vector2df(0, 0)); - } - break; - case 8: //FX - for (int x = 0; x < 4; x++){ - vertices[i*4+x].TCoords.X = 1.0 - vertices[i*4+x].TCoords.X; - } - break; - case 9: //FY - for (int x = 0; x < 4; x++){ - vertices[i*4+x].TCoords.Y = 1.0 - vertices[i*4+x].TCoords.Y; - } - break; - default: - break; - } + for (int face = 0; face < 6; face++) { + int tileindex = MYMIN(face, tilecount - 1); + const TileSpec &tile = tiles[tileindex]; + for (int j = 0; j < 4; j++) { + video::S3DVertex &vertex = vertices[face * 4 + j]; + v2f &tcoords = vertex.TCoords; + switch (tile.rotation) { + case 0: + break; + case 1: // R90 + tcoords.rotateBy(90, irr::core::vector2df(0, 0)); + break; + case 2: // R180 + tcoords.rotateBy(180, irr::core::vector2df(0, 0)); + break; + case 3: // R270 + tcoords.rotateBy(270, irr::core::vector2df(0, 0)); + break; + case 4: // FXR90 + tcoords.X = 1.0 - tcoords.X; + tcoords.rotateBy(90, irr::core::vector2df(0, 0)); + break; + case 5: // FXR270 + tcoords.X = 1.0 - tcoords.X; + tcoords.rotateBy(270, irr::core::vector2df(0, 0)); + break; + case 6: // FYR90 + tcoords.Y = 1.0 - tcoords.Y; + tcoords.rotateBy(90, irr::core::vector2df(0, 0)); + break; + case 7: // FYR270 + tcoords.Y = 1.0 - tcoords.Y; + tcoords.rotateBy(270, irr::core::vector2df(0, 0)); + break; + case 8: // FX + tcoords.X = 1.0 - tcoords.X; + break; + case 9: // FY + tcoords.Y = 1.0 - tcoords.Y; + break; + default: + break; } - u16 indices[] = {0,1,2,2,3,0}; + } + } + + if (data->m_smooth_lighting) { + for (int j = 0; j < 24; ++j) { + vertices[j].Color = encode_light(lights[light_indices[j]], + f->light_source); + if (!f->light_source) + applyFacesShading(vertices[j].Color, vertices[j].Normal); + } + } + // Add to mesh collector - for (s32 j = 0; j < 24; j += 4) { - int tileindex = MYMIN(j / 4, tilecount - 1); - collector->append(tiles[tileindex], vertices + j, 4, indices, 6); + for (int k = 0; k < 6; ++k) { + int tileindex = MYMIN(k, tilecount - 1); + collector->append(tiles[tileindex], vertices + 4 * k, 4, quad_indices, 6); } } -static inline void getNeighborConnectingFace(v3s16 p, INodeDefManager *nodedef, - MeshMakeData *data, MapNode n, int v, int *neighbors) +// Gets the base lighting values for a node +void MapblockMeshGenerator::getSmoothLightFrame() { - MapNode n2 = data->m_vmanip.getNodeNoEx(p); - if (nodedef->nodeboxConnects(n, n2, v)) - *neighbors |= v; + for (int k = 0; k < 8; ++k) { + u16 light = getSmoothLight(blockpos_nodes + p, light_dirs[k], data); + frame.lightsA[k] = light & 0xff; + frame.lightsB[k] = light >> 8; + } } -// For use in mapblock_mesh_generate_special -// X,Y,Z of position must be -1,0,1 -// This expression is a simplification of -// 3 * 3 * (pos.X + 1) + 3 * (pos.Y + 1) + (pos.Z + 1) -static inline int NeighborToIndex(const v3s16 &pos) +// Calculates vertex light level +// vertex_pos - vertex position in the node (coordinates are clamped to [0.0, 1.0] or so) +u16 MapblockMeshGenerator::blendLight(const v3f &vertex_pos) { - return 9 * pos.X + 3 * pos.Y + pos.Z + 13; + f32 x = core::clamp(vertex_pos.X / BS + 0.5, 0.0 - SMOOTH_LIGHTING_OVERSIZE, 1.0 + SMOOTH_LIGHTING_OVERSIZE); + f32 y = core::clamp(vertex_pos.Y / BS + 0.5, 0.0 - SMOOTH_LIGHTING_OVERSIZE, 1.0 + SMOOTH_LIGHTING_OVERSIZE); + f32 z = core::clamp(vertex_pos.Z / BS + 0.5, 0.0 - SMOOTH_LIGHTING_OVERSIZE, 1.0 + SMOOTH_LIGHTING_OVERSIZE); + f32 lightA = 0.0; + f32 lightB = 0.0; + for (int k = 0; k < 8; ++k) { + f32 dx = (k & 4) ? x : 1 - x; + f32 dy = (k & 2) ? y : 1 - y; + f32 dz = (k & 1) ? z : 1 - z; + lightA += dx * dy * dz * frame.lightsA[k]; + lightB += dx * dy * dz * frame.lightsB[k]; + } + return + core::clamp(core::round32(lightA), 0, 255) | + core::clamp(core::round32(lightB), 0, 255) << 8; } -/* - TODO: Fix alpha blending for special nodes - Currently only the last element rendered is blended correct -*/ -void mapblock_mesh_generate_special(MeshMakeData *data, - MeshCollector &collector) +// Calculates vertex color to be used in mapblock mesh +// vertex_pos - vertex position in the node (coordinates are clamped to [0.0, 1.0] or so) +// tile_color - node's tile color +video::SColor MapblockMeshGenerator::blendLightColor(const v3f &vertex_pos) { - INodeDefManager *nodedef = data->m_gamedef->ndef(); - scene::ISceneManager* smgr = data->m_gamedef->getSceneManager(); - scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator(); + u16 light = blendLight(vertex_pos); + return encode_light(light, f->light_source); +} - // 0ms - //TimeTaker timer("mapblock_mesh_generate_special()"); +video::SColor MapblockMeshGenerator::blendLightColor(const v3f &vertex_pos, + const v3f &vertex_normal) +{ + video::SColor color = blendLightColor(vertex_pos); + if (!f->light_source) + applyFacesShading(color, vertex_normal); + return color; +} - /* - Some settings - */ - bool enable_mesh_cache = g_settings->getBool("enable_mesh_cache"); +void MapblockMeshGenerator::generateCuboidTextureCoords(const aabb3f &box, f32 *coords) +{ + f32 tx1 = (box.MinEdge.X / BS) + 0.5; + f32 ty1 = (box.MinEdge.Y / BS) + 0.5; + f32 tz1 = (box.MinEdge.Z / BS) + 0.5; + f32 tx2 = (box.MaxEdge.X / BS) + 0.5; + f32 ty2 = (box.MaxEdge.Y / BS) + 0.5; + f32 tz2 = (box.MaxEdge.Z / BS) + 0.5; + f32 txc[24] = { + tx1, 1 - tz2, tx2, 1 - tz1, // up + tx1, tz1, tx2, tz2, // down + tz1, 1 - ty2, tz2, 1 - ty1, // right + 1 - tz2, 1 - ty2, 1 - tz1, 1 - ty1, // left + 1 - tx2, 1 - ty2, 1 - tx1, 1 - ty1, // back + tx1, 1 - ty2, tx2, 1 - ty1, // front + }; + for (int i = 0; i != 24; ++i) + coords[i] = txc[i]; +} - v3s16 blockpos_nodes = data->m_blockpos*MAP_BLOCKSIZE; +void MapblockMeshGenerator::drawAutoLightedCuboid(aabb3f box, const f32 *txc, + TileSpec *tiles, int tile_count) +{ + f32 texture_coord_buf[24]; + f32 dx1 = box.MinEdge.X; + f32 dy1 = box.MinEdge.Y; + f32 dz1 = box.MinEdge.Z; + f32 dx2 = box.MaxEdge.X; + f32 dy2 = box.MaxEdge.Y; + f32 dz2 = box.MaxEdge.Z; + box.MinEdge += origin; + box.MaxEdge += origin; + if (!txc) { + generateCuboidTextureCoords(box, texture_coord_buf); + txc = texture_coord_buf; + } + if (!tiles) { + tiles = &tile; + tile_count = 1; + } + if (data->m_smooth_lighting) { + u16 lights[8]; + for (int j = 0; j < 8; ++j) { + v3f d; + d.X = (j & 4) ? dx2 : dx1; + d.Y = (j & 2) ? dy2 : dy1; + d.Z = (j & 1) ? dz2 : dz1; + lights[j] = blendLight(d); + } + drawCuboid(box, tiles, tile_count, lights, txc); + } else { + drawCuboid(box, tiles, tile_count, NULL, txc); + } +} - for(s16 z = 0; z < MAP_BLOCKSIZE; z++) - for(s16 y = 0; y < MAP_BLOCKSIZE; y++) - for(s16 x = 0; x < MAP_BLOCKSIZE; x++) - { - v3s16 p(x,y,z); +/*! + * Returns the i-th special tile for a map node. + */ +static TileSpec getSpecialTile(const ContentFeatures &f, + const MapNode &n, u8 i) +{ + TileSpec copy = f.special_tiles[i]; + for (int layernum = 0; layernum < MAX_TILE_LAYERS; layernum++) { + TileLayer *layer = ©.layers[layernum]; + if (layer->texture_id == 0) + continue; + if (!layer->has_color) + n.getColor(f, &(layer->color)); + } + return copy; +} - MapNode n = data->m_vmanip.getNodeNoEx(blockpos_nodes + p); - const ContentFeatures &f = nodedef->get(n); +void MapblockMeshGenerator::prepareLiquidNodeDrawing() +{ + tile_liquid_top = getSpecialTile(*f, n, 0); + tile_liquid = getSpecialTile(*f, n, 1); + + MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(p.X, p.Y + 1, p.Z)); + c_flowing = nodedef->getId(f->liquid_alternative_flowing); + c_source = nodedef->getId(f->liquid_alternative_source); + top_is_same_liquid = (ntop.getContent() == c_flowing) || (ntop.getContent() == c_source); + + if (data->m_smooth_lighting) + return; // don't need to pre-compute anything in this case + + if (f->light_source != 0) { + // If this liquid emits light and doesn't contain light, draw + // it at what it emits, for an increased effect + light = decode_light(f->light_source); + light = light | (light << 8); + } else if (nodedef->get(ntop).param_type == CPT_LIGHT) { + // Otherwise, use the light of the node on top if possible + light = getInteriorLight(ntop, 0, nodedef); + } - // Only solidness=0 stuff is drawn here - if(f.solidness != 0) + color_liquid_top = encode_light(light, f->light_source); + color = encode_light(light, f->light_source); +} + +void MapblockMeshGenerator::getLiquidNeighborhood() +{ + u8 range = rangelim(nodedef->get(c_flowing).liquid_range, 1, 8); + + for (int w = -1; w <= 1; w++) + for (int u = -1; u <= 1; u++) { + NeighborData &neighbor = liquid_neighbors[w + 1][u + 1]; + v3s16 p2 = p + v3s16(u, 0, w); + MapNode n2 = data->m_vmanip.getNodeNoEx(blockpos_nodes + p2); + neighbor.content = n2.getContent(); + neighbor.level = -0.5 * BS; + neighbor.is_same_liquid = false; + neighbor.top_is_same_liquid = false; + + if (neighbor.content == CONTENT_IGNORE) continue; - switch(f.drawtype){ - default: - infostream << "Got " << f.drawtype << std::endl; - FATAL_ERROR("Unknown drawtype"); - break; - case NDT_AIRLIKE: - break; - case NDT_LIQUID: - { - /* - Add water sources to mesh if using new style - */ - TileSpec tile_liquid = f.special_tiles[0]; - TileSpec tile_liquid_bfculled = getNodeTile(n, p, v3s16(0,0,0), data); - - bool top_is_same_liquid = false; - MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x,y+1,z)); - content_t c_flowing = nodedef->getId(f.liquid_alternative_flowing); - content_t c_source = nodedef->getId(f.liquid_alternative_source); - if(ntop.getContent() == c_flowing || ntop.getContent() == c_source) - top_is_same_liquid = true; - - u16 l = getInteriorLight(n, 0, nodedef); - video::SColor c = MapBlock_LightColor(f.alpha, l, f.light_source); - - /* - Generate sides - */ - v3s16 side_dirs[4] = { - v3s16(1,0,0), - v3s16(-1,0,0), - v3s16(0,0,1), - v3s16(0,0,-1), - }; - for(u32 i=0; i<4; i++) - { - v3s16 dir = side_dirs[i]; - - MapNode neighbor = data->m_vmanip.getNodeNoEx(blockpos_nodes + p + dir); - content_t neighbor_content = neighbor.getContent(); - const ContentFeatures &n_feat = nodedef->get(neighbor_content); - MapNode n_top = data->m_vmanip.getNodeNoEx(blockpos_nodes + p + dir+ v3s16(0,1,0)); - content_t n_top_c = n_top.getContent(); - - if(neighbor_content == CONTENT_IGNORE) - continue; - - /* - If our topside is liquid and neighbor's topside - is liquid, don't draw side face - */ - if(top_is_same_liquid && (n_top_c == c_flowing || - n_top_c == c_source || n_top_c == CONTENT_IGNORE)) - continue; - - // Don't draw face if neighbor is blocking the view - if(n_feat.solidness == 2) - continue; - - bool neighbor_is_same_liquid = (neighbor_content == c_source - || neighbor_content == c_flowing); - - // Don't draw any faces if neighbor same is liquid and top is - // same liquid - if(neighbor_is_same_liquid && !top_is_same_liquid) - continue; - - // Use backface culled material if neighbor doesn't have a - // solidness of 0 - const TileSpec *current_tile = &tile_liquid; - if(n_feat.solidness != 0 || n_feat.visual_solidness != 0) - current_tile = &tile_liquid_bfculled; - - video::S3DVertex vertices[4] = - { - video::S3DVertex(-BS/2,0,BS/2,0,0,0, c, 0,1), - video::S3DVertex(BS/2,0,BS/2,0,0,0, c, 1,1), - video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,0), - video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,0), - }; - - /* - If our topside is liquid, set upper border of face - at upper border of node - */ - if (top_is_same_liquid) { - vertices[2].Pos.Y = 0.5 * BS; - vertices[3].Pos.Y = 0.5 * BS; - } else { - /* - Otherwise upper position of face is liquid level - */ - vertices[2].Pos.Y = 0.5 * BS; - vertices[3].Pos.Y = 0.5 * BS; - } - /* - If neighbor is liquid, lower border of face is liquid level - */ - if (neighbor_is_same_liquid) { - vertices[0].Pos.Y = 0.5 * BS; - vertices[1].Pos.Y = 0.5 * BS; - } else { - /* - If neighbor is not liquid, lower border of face is - lower border of node - */ - vertices[0].Pos.Y = -0.5 * BS; - vertices[1].Pos.Y = -0.5 * BS; - } - - for(s32 j=0; j<4; j++) - { - if(dir == v3s16(0,0,1)) - vertices[j].Pos.rotateXZBy(0); - if(dir == v3s16(0,0,-1)) - vertices[j].Pos.rotateXZBy(180); - if(dir == v3s16(-1,0,0)) - vertices[j].Pos.rotateXZBy(90); - if(dir == v3s16(1,0,-0)) - vertices[j].Pos.rotateXZBy(-90); - - // Do this to not cause glitches when two liquids are - // side-by-side - /*if(neighbor_is_same_liquid == false){ - vertices[j].Pos.X *= 0.98; - vertices[j].Pos.Z *= 0.98; - }*/ - - vertices[j].Pos += intToFloat(p, BS); - } - - u16 indices[] = {0,1,2,2,3,0}; - // Add to mesh collector - collector.append(*current_tile, vertices, 4, indices, 6); - } + if (neighbor.content == c_source) { + neighbor.is_same_liquid = true; + neighbor.level = 0.5 * BS; + } else if (neighbor.content == c_flowing) { + neighbor.is_same_liquid = true; + u8 liquid_level = (n2.param2 & LIQUID_LEVEL_MASK); + if (liquid_level <= LIQUID_LEVEL_MAX + 1 - range) + liquid_level = 0; + else + liquid_level -= (LIQUID_LEVEL_MAX + 1 - range); + neighbor.level = (-0.5 + (liquid_level + 0.5) / range) * BS; + } + + // Check node above neighbor. + // NOTE: This doesn't get executed if neighbor + // doesn't exist + p2.Y++; + n2 = data->m_vmanip.getNodeNoEx(blockpos_nodes + p2); + if (n2.getContent() == c_source || n2.getContent() == c_flowing) + neighbor.top_is_same_liquid = true; + } +} - /* - Generate top - */ - if(top_is_same_liquid) +void MapblockMeshGenerator::calculateCornerLevels() +{ + for (int k = 0; k < 2; k++) + for (int i = 0; i < 2; i++) + corner_levels[k][i] = getCornerLevel(i, k); +} + +f32 MapblockMeshGenerator::getCornerLevel(int i, int k) +{ + float sum = 0; + int count = 0; + int air_count = 0; + for (int dk = 0; dk < 2; dk++) + for (int di = 0; di < 2; di++) { + NeighborData &neighbor_data = liquid_neighbors[k + dk][i + di]; + content_t content = neighbor_data.content; + + // If top is liquid, draw starting from top of node + if (neighbor_data.top_is_same_liquid) + return 0.5 * BS; + + // Source always has the full height + if (content == c_source) + return 0.5 * BS; + + // Flowing liquid has level information + if (content == c_flowing) { + sum += neighbor_data.level; + count++; + } else if (content == CONTENT_AIR) { + air_count++; + if (air_count >= 2) + return -0.5 * BS + 0.2; + } + } + if (count > 0) + return sum / count; + return 0; +} + +void MapblockMeshGenerator::drawLiquidSides() +{ + struct LiquidFaceDesc { + v3s16 dir; // XZ + v3s16 p[2]; // XZ only; 1 means +, 0 means - + }; + struct UV { + int u, v; + }; + static const LiquidFaceDesc base_faces[4] = { + {v3s16( 1, 0, 0), {v3s16(1, 0, 1), v3s16(1, 0, 0)}}, + {v3s16(-1, 0, 0), {v3s16(0, 0, 0), v3s16(0, 0, 1)}}, + {v3s16( 0, 0, 1), {v3s16(0, 0, 1), v3s16(1, 0, 1)}}, + {v3s16( 0, 0, -1), {v3s16(1, 0, 0), v3s16(0, 0, 0)}}, + }; + static const UV base_vertices[4] = { + {0, 1}, + {1, 1}, + {1, 0}, + {0, 0} + }; + for (int i = 0; i < 4; i++) { + const LiquidFaceDesc &face = base_faces[i]; + const NeighborData &neighbor = liquid_neighbors[face.dir.Z + 1][face.dir.X + 1]; + + // No face between nodes of the same liquid, unless there is node + // at the top to which it should be connected. Again, unless the face + // there would be inside the liquid + if (neighbor.is_same_liquid) { + if (!top_is_same_liquid) + continue; + if (neighbor.top_is_same_liquid) continue; + } - video::S3DVertex vertices[4] = - { - video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1), - video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,1), - video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c, 1,0), - video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c, 0,0), - }; - - v3f offset(p.X * BS, (p.Y + 0.5) * BS, p.Z * BS); - for(s32 i=0; i<4; i++) - { - vertices[i].Pos += offset; - } + const ContentFeatures &neighbor_features = nodedef->get(neighbor.content); + // Don't draw face if neighbor is blocking the view + if (neighbor_features.solidness == 2) + continue; - u16 indices[] = {0,1,2,2,3,0}; - // Add to mesh collector - collector.append(tile_liquid, vertices, 4, indices, 6); - break;} - case NDT_FLOWINGLIQUID: - { - /* - Add flowing liquid to mesh - */ - TileSpec tile_liquid = f.special_tiles[0]; - TileSpec tile_liquid_bfculled = f.special_tiles[1]; - - bool top_is_same_liquid = false; - MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x,y+1,z)); - content_t c_flowing = nodedef->getId(f.liquid_alternative_flowing); - content_t c_source = nodedef->getId(f.liquid_alternative_source); - if(ntop.getContent() == c_flowing || ntop.getContent() == c_source) - top_is_same_liquid = true; - - u16 l = 0; - // If this liquid emits light and doesn't contain light, draw - // it at what it emits, for an increased effect - u8 light_source = nodedef->get(n).light_source; - if(light_source != 0){ - l = decode_light(light_source); - l = l | (l<<8); - } - // Use the light of the node on top if possible - else if(nodedef->get(ntop).param_type == CPT_LIGHT) - l = getInteriorLight(ntop, 0, nodedef); - // Otherwise use the light of this node (the liquid) + video::S3DVertex vertices[4]; + for (int j = 0; j < 4; j++) { + const UV &vertex = base_vertices[j]; + const v3s16 &base = face.p[vertex.u]; + v3f pos; + pos.X = (base.X - 0.5) * BS; + pos.Z = (base.Z - 0.5) * BS; + if (vertex.v) + pos.Y = neighbor.is_same_liquid ? corner_levels[base.Z][base.X] : -0.5 * BS; else - l = getInteriorLight(n, 0, nodedef); - video::SColor c = MapBlock_LightColor(f.alpha, l, f.light_source); - - u8 range = rangelim(nodedef->get(c_flowing).liquid_range, 1, 8); - - // Neighbor liquid levels (key = relative position) - // Includes current node - - struct NeighborData { - f32 level; - content_t content; - u8 flags; - }; - NeighborData neighbor_data_matrix[27]; - - const u8 neighborflag_top_is_same_liquid = 0x01; - v3s16 neighbor_dirs[9] = { - v3s16(0,0,0), - v3s16(0,0,1), - v3s16(0,0,-1), - v3s16(1,0,0), - v3s16(-1,0,0), - v3s16(1,0,1), - v3s16(-1,0,-1), - v3s16(1,0,-1), - v3s16(-1,0,1), - }; - for(u32 i=0; i<9; i++) - { - content_t content = CONTENT_AIR; - float level = -0.5 * BS; - u8 flags = 0; - // Check neighbor - v3s16 p2 = p + neighbor_dirs[i]; - MapNode n2 = data->m_vmanip.getNodeNoEx(blockpos_nodes + p2); - if(n2.getContent() != CONTENT_IGNORE) - { - content = n2.getContent(); - - if(n2.getContent() == c_source) - level = 0.5 * BS; - else if(n2.getContent() == c_flowing){ - u8 liquid_level = (n2.param2&LIQUID_LEVEL_MASK); - if (liquid_level <= LIQUID_LEVEL_MAX+1-range) - liquid_level = 0; - else - liquid_level -= (LIQUID_LEVEL_MAX+1-range); - level = (-0.5 + ((float)liquid_level + 0.5) / (float)range) * BS; - } - - // Check node above neighbor. - // NOTE: This doesn't get executed if neighbor - // doesn't exist - p2.Y += 1; - n2 = data->m_vmanip.getNodeNoEx(blockpos_nodes + p2); - if(n2.getContent() == c_source || - n2.getContent() == c_flowing) - flags |= neighborflag_top_is_same_liquid; - } - - NeighborData &neighbor_data = - neighbor_data_matrix[NeighborToIndex(neighbor_dirs[i])]; - - neighbor_data.level = level; - neighbor_data.content = content; - neighbor_data.flags = flags; - } + pos.Y = !top_is_same_liquid ? corner_levels[base.Z][base.X] : 0.5 * BS; + if (data->m_smooth_lighting) + color = blendLightColor(pos); + pos += origin; + vertices[j] = video::S3DVertex(pos.X, pos.Y, pos.Z, 0, 0, 0, color, vertex.u, vertex.v); + }; + collector->append(tile_liquid, vertices, 4, quad_indices, 6); + } +} - // Corner heights (average between four liquids) - f32 corner_levels[4]; - - v3s16 halfdirs[4] = { - v3s16(0,0,0), - v3s16(1,0,0), - v3s16(1,0,1), - v3s16(0,0,1), - }; - for(u32 i=0; i<4; i++) - { - v3s16 cornerdir = halfdirs[i]; - float cornerlevel = 0; - u32 valid_count = 0; - u32 air_count = 0; - for(u32 j=0; j<4; j++) - { - v3s16 neighbordir = cornerdir - halfdirs[j]; - - NeighborData &neighbor_data = - neighbor_data_matrix[NeighborToIndex(neighbordir)]; - content_t content = neighbor_data.content; - // If top is liquid, draw starting from top of node - if (neighbor_data.flags & neighborflag_top_is_same_liquid) - { - cornerlevel = 0.5*BS; - valid_count = 1; - break; - } - // Source is always the same height - else if(content == c_source) - { - cornerlevel = 0.5 * BS; - valid_count = 1; - break; - } - // Flowing liquid has level information - else if(content == c_flowing) - { - cornerlevel += neighbor_data.level; - valid_count++; - } - else if(content == CONTENT_AIR) - { - air_count++; - } - } - if(air_count >= 2) - cornerlevel = -0.5*BS+0.2; - else if(valid_count > 0) - cornerlevel /= valid_count; - corner_levels[i] = cornerlevel; - } +void MapblockMeshGenerator::drawLiquidTop() +{ + // To get backface culling right, the vertices need to go + // clockwise around the front of the face. And we happened to + // calculate corner levels in exact reverse order. + static const int corner_resolve[4][2] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; + + video::S3DVertex vertices[4] = { + video::S3DVertex(-BS / 2, 0, BS / 2, 0, 0, 0, color_liquid_top, 0, 1), + video::S3DVertex( BS / 2, 0, BS / 2, 0, 0, 0, color_liquid_top, 1, 1), + video::S3DVertex( BS / 2, 0, -BS / 2, 0, 0, 0, color_liquid_top, 1, 0), + video::S3DVertex(-BS / 2, 0, -BS / 2, 0, 0, 0, color_liquid_top, 0, 0), + }; - /* - Generate sides - */ - - v3s16 side_dirs[4] = { - v3s16(1,0,0), - v3s16(-1,0,0), - v3s16(0,0,1), - v3s16(0,0,-1), - }; - s16 side_corners[4][2] = { - {1, 2}, - {3, 0}, - {2, 3}, - {0, 1}, - }; - for(u32 i=0; i<4; i++) - { - v3s16 dir = side_dirs[i]; - - NeighborData& neighbor_data = - neighbor_data_matrix[NeighborToIndex(dir)]; - /* - If our topside is liquid and neighbor's topside - is liquid, don't draw side face - */ - if (top_is_same_liquid && - neighbor_data.flags & neighborflag_top_is_same_liquid) - continue; - - content_t neighbor_content = neighbor_data.content; - const ContentFeatures &n_feat = nodedef->get(neighbor_content); - - // Don't draw face if neighbor is blocking the view - if(n_feat.solidness == 2) - continue; - - bool neighbor_is_same_liquid = (neighbor_content == c_source - || neighbor_content == c_flowing); - - // Don't draw any faces if neighbor same is liquid and top is - // same liquid - if(neighbor_is_same_liquid == true - && top_is_same_liquid == false) - continue; - - // Use backface culled material if neighbor doesn't have a - // solidness of 0 - const TileSpec *current_tile = &tile_liquid; - if(n_feat.solidness != 0 || n_feat.visual_solidness != 0) - current_tile = &tile_liquid_bfculled; - - video::S3DVertex vertices[4] = - { - video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1), - video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,1), - video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,0), - video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,0), - }; - - /* - If our topside is liquid, set upper border of face - at upper border of node - */ - if(top_is_same_liquid) - { - vertices[2].Pos.Y = 0.5*BS; - vertices[3].Pos.Y = 0.5*BS; - } - /* - Otherwise upper position of face is corner levels - */ - else - { - vertices[2].Pos.Y = corner_levels[side_corners[i][0]]; - vertices[3].Pos.Y = corner_levels[side_corners[i][1]]; - } - - /* - If neighbor is liquid, lower border of face is corner - liquid levels - */ - if(neighbor_is_same_liquid) - { - vertices[0].Pos.Y = corner_levels[side_corners[i][1]]; - vertices[1].Pos.Y = corner_levels[side_corners[i][0]]; - } - /* - If neighbor is not liquid, lower border of face is - lower border of node - */ - else - { - vertices[0].Pos.Y = -0.5*BS; - vertices[1].Pos.Y = -0.5*BS; - } - - for(s32 j=0; j<4; j++) - { - if(dir == v3s16(0,0,1)) - vertices[j].Pos.rotateXZBy(0); - if(dir == v3s16(0,0,-1)) - vertices[j].Pos.rotateXZBy(180); - if(dir == v3s16(-1,0,0)) - vertices[j].Pos.rotateXZBy(90); - if(dir == v3s16(1,0,-0)) - vertices[j].Pos.rotateXZBy(-90); - - // Do this to not cause glitches when two liquids are - // side-by-side - /*if(neighbor_is_same_liquid == false){ - vertices[j].Pos.X *= 0.98; - vertices[j].Pos.Z *= 0.98; - }*/ - - vertices[j].Pos += intToFloat(p, BS); - } - - u16 indices[] = {0,1,2,2,3,0}; - // Add to mesh collector - collector.append(*current_tile, vertices, 4, indices, 6); - } + for (int i = 0; i < 4; i++) { + int u = corner_resolve[i][0]; + int w = corner_resolve[i][1]; + vertices[i].Pos.Y += corner_levels[w][u]; + if (data->m_smooth_lighting) + vertices[i].Color = blendLightColor(vertices[i].Pos); + vertices[i].Pos += origin; + } - /* - Generate top side, if appropriate - */ - - if(top_is_same_liquid == false) - { - video::S3DVertex vertices[4] = - { - video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1), - video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,1), - video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c, 1,0), - video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c, 0,0), - }; - - // To get backface culling right, the vertices need to go - // clockwise around the front of the face. And we happened to - // calculate corner levels in exact reverse order. - s32 corner_resolve[4] = {3,2,1,0}; - - for(s32 i=0; i<4; i++) - { - //vertices[i].Pos.Y += liquid_level; - //vertices[i].Pos.Y += neighbor_levels[v3s16(0,0,0)]; - s32 j = corner_resolve[i]; - vertices[i].Pos.Y += corner_levels[j]; - vertices[i].Pos += intToFloat(p, BS); - } - - // Default downwards-flowing texture animation goes from - // -Z towards +Z, thus the direction is +Z. - // Rotate texture to make animation go in flow direction - // Positive if liquid moves towards +Z - f32 dz = (corner_levels[side_corners[3][0]] + - corner_levels[side_corners[3][1]]) - - (corner_levels[side_corners[2][0]] + - corner_levels[side_corners[2][1]]); - // Positive if liquid moves towards +X - f32 dx = (corner_levels[side_corners[1][0]] + - corner_levels[side_corners[1][1]]) - - (corner_levels[side_corners[0][0]] + - corner_levels[side_corners[0][1]]); - f32 tcoord_angle = atan2(dz, dx) * core::RADTODEG ; - v2f tcoord_center(0.5, 0.5); - v2f tcoord_translate( - blockpos_nodes.Z + z, - blockpos_nodes.X + x); - tcoord_translate.rotateBy(tcoord_angle); - tcoord_translate.X -= floor(tcoord_translate.X); - tcoord_translate.Y -= floor(tcoord_translate.Y); - - for(s32 i=0; i<4; i++) - { - vertices[i].TCoords.rotateBy( - tcoord_angle, - tcoord_center); - vertices[i].TCoords += tcoord_translate; - } - - v2f t = vertices[0].TCoords; - vertices[0].TCoords = vertices[2].TCoords; - vertices[2].TCoords = t; - - u16 indices[] = {0,1,2,2,3,0}; - // Add to mesh collector - collector.append(tile_liquid, vertices, 4, indices, 6); - } - break;} - case NDT_GLASSLIKE: - { - TileSpec tile = getNodeTile(n, p, v3s16(0,0,0), data); - - u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); - - for(u32 j=0; j<6; j++) - { - // Check this neighbor - v3s16 dir = g_6dirs[j]; - v3s16 n2p = blockpos_nodes + p + dir; - MapNode n2 = data->m_vmanip.getNodeNoEx(n2p); - // Don't make face if neighbor is of same type - if(n2.getContent() == n.getContent()) - continue; - - // The face at Z+ - video::S3DVertex vertices[4] = { - video::S3DVertex(-BS/2,-BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 1,1), - video::S3DVertex(BS/2,-BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 0,1), - video::S3DVertex(BS/2,BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 0,0), - video::S3DVertex(-BS/2,BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 1,0), - }; - - // Rotations in the g_6dirs format - if(j == 0) // Z+ - for(u16 i=0; i<4; i++) - vertices[i].Pos.rotateXZBy(0); - else if(j == 1) // Y+ - for(u16 i=0; i<4; i++) - vertices[i].Pos.rotateYZBy(-90); - else if(j == 2) // X+ - for(u16 i=0; i<4; i++) - vertices[i].Pos.rotateXZBy(-90); - else if(j == 3) // Z- - for(u16 i=0; i<4; i++) - vertices[i].Pos.rotateXZBy(180); - else if(j == 4) // Y- - for(u16 i=0; i<4; i++) - vertices[i].Pos.rotateYZBy(90); - else if(j == 5) // X- - for(u16 i=0; i<4; i++) - vertices[i].Pos.rotateXZBy(90); - - for(u16 i=0; i<4; i++){ - vertices[i].Pos += intToFloat(p, BS); - } - - u16 indices[] = {0,1,2,2,3,0}; - // Add to mesh collector - collector.append(tile, vertices, 4, indices, 6); - } - break;} - case NDT_GLASSLIKE_FRAMED_OPTIONAL: - // This is always pre-converted to something else - FATAL_ERROR("NDT_GLASSLIKE_FRAMED_OPTIONAL not pre-converted as expected"); - break; - case NDT_GLASSLIKE_FRAMED: - { - static const v3s16 dirs[6] = { - v3s16( 0, 1, 0), - v3s16( 0,-1, 0), - v3s16( 1, 0, 0), - v3s16(-1, 0, 0), - v3s16( 0, 0, 1), - v3s16( 0, 0,-1) - }; - - u8 i; - TileSpec tiles[6]; - for (i = 0; i < 6; i++) - tiles[i] = getNodeTile(n, p, dirs[i], data); - - TileSpec glass_tiles[6]; - if (tiles[1].texture && tiles[2].texture && tiles[3].texture) { - glass_tiles[0] = tiles[2]; - glass_tiles[1] = tiles[3]; - glass_tiles[2] = tiles[1]; - glass_tiles[3] = tiles[1]; - glass_tiles[4] = tiles[1]; - glass_tiles[5] = tiles[1]; - } else { - for (i = 0; i < 6; i++) - glass_tiles[i] = tiles[1]; - } + // Default downwards-flowing texture animation goes from + // -Z towards +Z, thus the direction is +Z. + // Rotate texture to make animation go in flow direction + // Positive if liquid moves towards +Z + f32 dz = (corner_levels[0][0] + corner_levels[0][1]) - + (corner_levels[1][0] + corner_levels[1][1]); + // Positive if liquid moves towards +X + f32 dx = (corner_levels[0][0] + corner_levels[1][0]) - + (corner_levels[0][1] + corner_levels[1][1]); + f32 tcoord_angle = atan2(dz, dx) * core::RADTODEG; + v2f tcoord_center(0.5, 0.5); + v2f tcoord_translate(blockpos_nodes.Z + p.Z, blockpos_nodes.X + p.X); + tcoord_translate.rotateBy(tcoord_angle); + tcoord_translate.X -= floor(tcoord_translate.X); + tcoord_translate.Y -= floor(tcoord_translate.Y); + + for (int i = 0; i < 4; i++) { + vertices[i].TCoords.rotateBy(tcoord_angle, tcoord_center); + vertices[i].TCoords += tcoord_translate; + } - u8 param2 = n.getParam2(); - bool H_merge = ! bool(param2 & 128); - bool V_merge = ! bool(param2 & 64); - param2 = param2 & 63; - - u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); - v3f pos = intToFloat(p, BS); - static const float a = BS / 2; - static const float g = a - 0.003; - static const float b = .876 * ( BS / 2 ); - - static const aabb3f frame_edges[12] = { - aabb3f( b, b,-a, a, a, a), // y+ - aabb3f(-a, b,-a,-b, a, a), // y+ - aabb3f( b,-a,-a, a,-b, a), // y- - aabb3f(-a,-a,-a,-b,-b, a), // y- - aabb3f( b,-a, b, a, a, a), // x+ - aabb3f( b,-a,-a, a, a,-b), // x+ - aabb3f(-a,-a, b,-b, a, a), // x- - aabb3f(-a,-a,-a,-b, a,-b), // x- - aabb3f(-a, b, b, a, a, a), // z+ - aabb3f(-a,-a, b, a,-b, a), // z+ - aabb3f(-a,-a,-a, a,-b,-b), // z- - aabb3f(-a, b,-a, a, a,-b) // z- - }; - static const aabb3f glass_faces[6] = { - aabb3f(-g, g,-g, g, g, g), // y+ - aabb3f(-g,-g,-g, g,-g, g), // y- - aabb3f( g,-g,-g, g, g, g), // x+ - aabb3f(-g,-g,-g,-g, g, g), // x- - aabb3f(-g,-g, g, g, g, g), // z+ - aabb3f(-g,-g,-g, g, g,-g) // z- - }; - - // table of node visible faces, 0 = invisible - int visible_faces[6] = {0,0,0,0,0,0}; - - // table of neighbours, 1 = same type, checked with g_26dirs - int nb[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - - // g_26dirs to check when only horizontal merge is allowed - int nb_H_dirs[8] = {0,2,3,5,10,11,12,13}; - - content_t current = n.getContent(); - content_t n2c; - MapNode n2; - v3s16 n2p; - - // neighbours checks for frames visibility - - if (!H_merge && V_merge) { - n2p = blockpos_nodes + p + g_26dirs[1]; - n2 = data->m_vmanip.getNodeNoEx(n2p); - n2c = n2.getContent(); - if (n2c == current || n2c == CONTENT_IGNORE) - nb[1] = 1; - n2p = blockpos_nodes + p + g_26dirs[4]; - n2 = data->m_vmanip.getNodeNoEx(n2p); - n2c = n2.getContent(); - if (n2c == current || n2c == CONTENT_IGNORE) - nb[4] = 1; - } else if (H_merge && !V_merge) { - for(i = 0; i < 8; i++) { - n2p = blockpos_nodes + p + g_26dirs[nb_H_dirs[i]]; - n2 = data->m_vmanip.getNodeNoEx(n2p); - n2c = n2.getContent(); - if (n2c == current || n2c == CONTENT_IGNORE) - nb[nb_H_dirs[i]] = 1; - } - } else if (H_merge && V_merge) { - for(i = 0; i < 18; i++) { - n2p = blockpos_nodes + p + g_26dirs[i]; - n2 = data->m_vmanip.getNodeNoEx(n2p); - n2c = n2.getContent(); - if (n2c == current || n2c == CONTENT_IGNORE) - nb[i] = 1; - } - } + std::swap(vertices[0].TCoords, vertices[2].TCoords); - // faces visibility checks - - if (!V_merge) { - visible_faces[0] = 1; - visible_faces[1] = 1; - } else { - for(i = 0; i < 2; i++) { - n2p = blockpos_nodes + p + dirs[i]; - n2 = data->m_vmanip.getNodeNoEx(n2p); - n2c = n2.getContent(); - if (n2c != current) - visible_faces[i] = 1; - } - } + collector->append(tile_liquid_top, vertices, 4, quad_indices, 6); +} - if (!H_merge) { - visible_faces[2] = 1; - visible_faces[3] = 1; - visible_faces[4] = 1; - visible_faces[5] = 1; - } else { - for(i = 2; i < 6; i++) { - n2p = blockpos_nodes + p + dirs[i]; - n2 = data->m_vmanip.getNodeNoEx(n2p); - n2c = n2.getContent(); - if (n2c != current) - visible_faces[i] = 1; - } - } +void MapblockMeshGenerator::drawLiquidNode() +{ + prepareLiquidNodeDrawing(); + getLiquidNeighborhood(); + calculateCornerLevels(); + drawLiquidSides(); + if (!top_is_same_liquid) + drawLiquidTop(); +} - static const u8 nb_triplet[12*3] = { - 1,2, 7, 1,5, 6, 4,2,15, 4,5,14, - 2,0,11, 2,3,13, 5,0,10, 5,3,12, - 0,1, 8, 0,4,16, 3,4,17, 3,1, 9 - }; - - f32 tx1, ty1, tz1, tx2, ty2, tz2; - aabb3f box; - - for(i = 0; i < 12; i++) - { - int edge_invisible; - if (nb[nb_triplet[i*3+2]]) - edge_invisible = nb[nb_triplet[i*3]] & nb[nb_triplet[i*3+1]]; - else - edge_invisible = nb[nb_triplet[i*3]] ^ nb[nb_triplet[i*3+1]]; - if (edge_invisible) - continue; - box = frame_edges[i]; - box.MinEdge += pos; - box.MaxEdge += pos; - tx1 = (box.MinEdge.X / BS) + 0.5; - ty1 = (box.MinEdge.Y / BS) + 0.5; - tz1 = (box.MinEdge.Z / BS) + 0.5; - tx2 = (box.MaxEdge.X / BS) + 0.5; - ty2 = (box.MaxEdge.Y / BS) + 0.5; - tz2 = (box.MaxEdge.Z / BS) + 0.5; - f32 txc1[24] = { - tx1, 1-tz2, tx2, 1-tz1, - tx1, tz1, tx2, tz2, - tz1, 1-ty2, tz2, 1-ty1, - 1-tz2, 1-ty2, 1-tz1, 1-ty1, - 1-tx2, 1-ty2, 1-tx1, 1-ty1, - tx1, 1-ty2, tx2, 1-ty1, - }; - makeCuboid(&collector, box, &tiles[0], 1, c, txc1); +void MapblockMeshGenerator::drawGlasslikeNode() +{ + useDefaultTile(); + + for (int face = 0; face < 6; face++) { + // Check this neighbor + v3s16 dir = g_6dirs[face]; + v3s16 neighbor_pos = blockpos_nodes + p + dir; + MapNode neighbor = data->m_vmanip.getNodeNoExNoEmerge(neighbor_pos); + // Don't make face if neighbor is of same type + if (neighbor.getContent() == n.getContent()) + continue; + // Face at Z- + v3f vertices[4] = { + v3f(-BS / 2, BS / 2, -BS / 2), + v3f( BS / 2, BS / 2, -BS / 2), + v3f( BS / 2, -BS / 2, -BS / 2), + v3f(-BS / 2, -BS / 2, -BS / 2), + }; + for (int i = 0; i < 4; i++) { + switch (face) { + case D6D_ZP: vertices[i].rotateXZBy(180); break; + case D6D_YP: vertices[i].rotateYZBy( 90); break; + case D6D_XP: vertices[i].rotateXZBy( 90); break; + case D6D_ZN: vertices[i].rotateXZBy( 0); break; + case D6D_YN: vertices[i].rotateYZBy(-90); break; + case D6D_XN: vertices[i].rotateXZBy(-90); break; } + } + drawQuad(vertices, dir); + } +} - for(i = 0; i < 6; i++) - { - if (!visible_faces[i]) - continue; - box = glass_faces[i]; - box.MinEdge += pos; - box.MaxEdge += pos; - tx1 = (box.MinEdge.X / BS) + 0.5; - ty1 = (box.MinEdge.Y / BS) + 0.5; - tz1 = (box.MinEdge.Z / BS) + 0.5; - tx2 = (box.MaxEdge.X / BS) + 0.5; - ty2 = (box.MaxEdge.Y / BS) + 0.5; - tz2 = (box.MaxEdge.Z / BS) + 0.5; - f32 txc2[24] = { - tx1, 1-tz2, tx2, 1-tz1, - tx1, tz1, tx2, tz2, - tz1, 1-ty2, tz2, 1-ty1, - 1-tz2, 1-ty2, 1-tz1, 1-ty1, - 1-tx2, 1-ty2, 1-tx1, 1-ty1, - tx1, 1-ty2, tx2, 1-ty1, - }; - makeCuboid(&collector, box, &glass_tiles[i], 1, c, txc2); - } +void MapblockMeshGenerator::drawGlasslikeFramedNode() +{ + TileSpec tiles[6]; + for (int face = 0; face < 6; face++) + getTile(g_6dirs[face], tiles[face]); + + TileSpec glass_tiles[6]; + if (tiles[1].layers[0].texture && + tiles[2].layers[0].texture && + tiles[3].layers[0].texture) { + glass_tiles[0] = tiles[4]; + glass_tiles[1] = tiles[0]; + glass_tiles[2] = tiles[4]; + glass_tiles[3] = tiles[4]; + glass_tiles[4] = tiles[3]; + glass_tiles[5] = tiles[4]; + } else { + for (int face = 0; face < 6; face++) + glass_tiles[face] = tiles[4]; + } - if (param2 > 0 && f.special_tiles[0].texture) { - // Interior volume level is in range 0 .. 63, - // convert it to -0.5 .. 0.5 - float vlev = (((float)param2 / 63.0 ) * 2.0 - 1.0); - TileSpec interior_tiles[6]; - for (i = 0; i < 6; i++) - interior_tiles[i] = f.special_tiles[0]; - float offset = 0.003; - box = aabb3f(visible_faces[3] ? -b : -a + offset, - visible_faces[1] ? -b : -a + offset, - visible_faces[5] ? -b : -a + offset, - visible_faces[2] ? b : a - offset, - visible_faces[0] ? b * vlev : a * vlev - offset, - visible_faces[4] ? b : a - offset); - box.MinEdge += pos; - box.MaxEdge += pos; - tx1 = (box.MinEdge.X / BS) + 0.5; - ty1 = (box.MinEdge.Y / BS) + 0.5; - tz1 = (box.MinEdge.Z / BS) + 0.5; - tx2 = (box.MaxEdge.X / BS) + 0.5; - ty2 = (box.MaxEdge.Y / BS) + 0.5; - tz2 = (box.MaxEdge.Z / BS) + 0.5; - f32 txc3[24] = { - tx1, 1-tz2, tx2, 1-tz1, - tx1, tz1, tx2, tz2, - tz1, 1-ty2, tz2, 1-ty1, - 1-tz2, 1-ty2, 1-tz1, 1-ty1, - 1-tx2, 1-ty2, 1-tx1, 1-ty1, - tx1, 1-ty2, tx2, 1-ty1, - }; - makeCuboid(&collector, box, interior_tiles, 6, c, txc3); - } - break;} - case NDT_ALLFACES: - { - TileSpec tile_leaves = getNodeTile(n, p, - v3s16(0,0,0), data); - - u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); - - v3f pos = intToFloat(p, BS); - aabb3f box(-BS/2,-BS/2,-BS/2,BS/2,BS/2,BS/2); - box.MinEdge += pos; - box.MaxEdge += pos; - makeCuboid(&collector, box, &tile_leaves, 1, c, NULL); - break;} - case NDT_ALLFACES_OPTIONAL: - // This is always pre-converted to something else - FATAL_ERROR("NDT_ALLFACES_OPTIONAL not pre-converted"); - break; - case NDT_TORCHLIKE: - { - v3s16 dir = n.getWallMountedDir(nodedef); - - u8 tileindex = 0; - if(dir == v3s16(0,-1,0)){ - tileindex = 0; // floor - } else if(dir == v3s16(0,1,0)){ - tileindex = 1; // ceiling - // For backwards compatibility - } else if(dir == v3s16(0,0,0)){ - tileindex = 0; // floor - } else { - tileindex = 2; // side - } + u8 param2 = n.getParam2(); + bool H_merge = !(param2 & 128); + bool V_merge = !(param2 & 64); + param2 &= 63; + + static const float a = BS / 2; + static const float g = a - 0.003; + static const float b = .876 * ( BS / 2 ); + + static const aabb3f frame_edges[FRAMED_EDGE_COUNT] = { + aabb3f( b, b, -a, a, a, a), // y+ + aabb3f(-a, b, -a, -b, a, a), // y+ + aabb3f( b, -a, -a, a, -b, a), // y- + aabb3f(-a, -a, -a, -b, -b, a), // y- + aabb3f( b, -a, b, a, a, a), // x+ + aabb3f( b, -a, -a, a, a, -b), // x+ + aabb3f(-a, -a, b, -b, a, a), // x- + aabb3f(-a, -a, -a, -b, a, -b), // x- + aabb3f(-a, b, b, a, a, a), // z+ + aabb3f(-a, -a, b, a, -b, a), // z+ + aabb3f(-a, -a, -a, a, -b, -b), // z- + aabb3f(-a, b, -a, a, a, -b), // z- + }; + static const aabb3f glass_faces[6] = { + aabb3f(-g, -g, g, g, g, g), // z+ + aabb3f(-g, g, -g, g, g, g), // y+ + aabb3f( g, -g, -g, g, g, g), // x+ + aabb3f(-g, -g, -g, g, g, -g), // z- + aabb3f(-g, -g, -g, g, -g, g), // y- + aabb3f(-g, -g, -g, -g, g, g), // x- + }; - TileSpec tile = getNodeTileN(n, p, tileindex, data); - tile.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING; - tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; - - u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); - - float s = BS/2*f.visual_scale; - // Wall at X+ of node - video::S3DVertex vertices[4] = - { - video::S3DVertex(-s,-s,0, 0,0,0, c, 0,1), - video::S3DVertex( s,-s,0, 0,0,0, c, 1,1), - video::S3DVertex( s, s,0, 0,0,0, c, 1,0), - video::S3DVertex(-s, s,0, 0,0,0, c, 0,0), - }; - - for(s32 i=0; i<4; i++) - { - if(dir == v3s16(1,0,0)) - vertices[i].Pos.rotateXZBy(0); - if(dir == v3s16(-1,0,0)) - vertices[i].Pos.rotateXZBy(180); - if(dir == v3s16(0,0,1)) - vertices[i].Pos.rotateXZBy(90); - if(dir == v3s16(0,0,-1)) - vertices[i].Pos.rotateXZBy(-90); - if(dir == v3s16(0,-1,0)) - vertices[i].Pos.rotateXZBy(45); - if(dir == v3s16(0,1,0)) - vertices[i].Pos.rotateXZBy(-45); - - vertices[i].Pos += intToFloat(p, BS); - } + // tables of neighbour (connect if same type and merge allowed), + // checked with g_26dirs + + // 1 = connect, 0 = face visible + bool nb[FRAMED_NEIGHBOR_COUNT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + + // 1 = check + static const bool check_nb_vertical [FRAMED_NEIGHBOR_COUNT] = {0,1,0,0,1,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}; + static const bool check_nb_horizontal [FRAMED_NEIGHBOR_COUNT] = {1,0,1,1,0,1, 0,0,0,0, 1,1,1,1, 0,0,0,0}; + static const bool check_nb_all [FRAMED_NEIGHBOR_COUNT] = {1,1,1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}; + const bool *check_nb = check_nb_all; + + // neighbours checks for frames visibility + if (H_merge || V_merge) { + if (!H_merge) + check_nb = check_nb_vertical; // vertical-only merge + if (!V_merge) + check_nb = check_nb_horizontal; // horizontal-only merge + content_t current = n.getContent(); + for (int i = 0; i < FRAMED_NEIGHBOR_COUNT; i++) { + if (!check_nb[i]) + continue; + v3s16 n2p = blockpos_nodes + p + g_26dirs[i]; + MapNode n2 = data->m_vmanip.getNodeNoEx(n2p); + content_t n2c = n2.getContent(); + if (n2c == current || n2c == CONTENT_IGNORE) + nb[i] = 1; + } + } - u16 indices[] = {0,1,2,2,3,0}; - // Add to mesh collector - collector.append(tile, vertices, 4, indices, 6); - break;} - case NDT_SIGNLIKE: - { - TileSpec tile = getNodeTileN(n, p, 0, data); - tile.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING; - tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; - - u16 l = getInteriorLight(n, 0, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); - - float d = (float)BS/16; - float s = BS/2*f.visual_scale; - // Wall at X+ of node - video::S3DVertex vertices[4] = - { - video::S3DVertex(BS/2-d, s, s, 0,0,0, c, 0,0), - video::S3DVertex(BS/2-d, s, -s, 0,0,0, c, 1,0), - video::S3DVertex(BS/2-d, -s, -s, 0,0,0, c, 1,1), - video::S3DVertex(BS/2-d, -s, s, 0,0,0, c, 0,1), - }; - - v3s16 dir = n.getWallMountedDir(nodedef); - - for(s32 i=0; i<4; i++) - { - if(dir == v3s16(1,0,0)) - vertices[i].Pos.rotateXZBy(0); - if(dir == v3s16(-1,0,0)) - vertices[i].Pos.rotateXZBy(180); - if(dir == v3s16(0,0,1)) - vertices[i].Pos.rotateXZBy(90); - if(dir == v3s16(0,0,-1)) - vertices[i].Pos.rotateXZBy(-90); - if(dir == v3s16(0,-1,0)) - vertices[i].Pos.rotateXYBy(-90); - if(dir == v3s16(0,1,0)) - vertices[i].Pos.rotateXYBy(90); - - vertices[i].Pos += intToFloat(p, BS); - } + // edge visibility - u16 indices[] = {0,1,2,2,3,0}; - // Add to mesh collector - collector.append(tile, vertices, 4, indices, 6); - break;} - case NDT_PLANTLIKE: - { - PseudoRandom rng(x<<8 | z | y<<16); - - TileSpec tile = getNodeTileN(n, p, 0, data); - tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; - - u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); - - float s = BS / 2 * f.visual_scale; - // add sqrt(2) visual scale - if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x10) != 0)) - s *= 1.41421; - - float random_offset_X = .0; - float random_offset_Z = .0; - if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x8) != 0)) { - random_offset_X = BS * ((rng.next() % 16 / 16.0) * 0.29 - 0.145); - random_offset_Z = BS * ((rng.next() % 16 / 16.0) * 0.29 - 0.145); - } + static const u8 nb_triplet[FRAMED_EDGE_COUNT][3] = { + {1, 2, 7}, {1, 5, 6}, {4, 2, 15}, {4, 5, 14}, + {2, 0, 11}, {2, 3, 13}, {5, 0, 10}, {5, 3, 12}, + {0, 1, 8}, {0, 4, 16}, {3, 4, 17}, {3, 1, 9}, + }; - for (int j = 0; j < 4; j++) { - video::S3DVertex vertices[4] = - { - video::S3DVertex(-s,-BS/2, 0, 0,0,0, c, 0,1), - video::S3DVertex( s,-BS/2, 0, 0,0,0, c, 1,1), - video::S3DVertex( s,-BS/2 + s*2,0, 0,0,0, c, 1,0), - video::S3DVertex(-s,-BS/2 + s*2,0, 0,0,0, c, 0,0), - }; - - float rotate_degree = 0; - u8 p2mesh = 0; - if (f.param_type_2 == CPT2_DEGROTATE) - rotate_degree = n.param2 * 2; - if (f.param_type_2 != CPT2_MESHOPTIONS) { - if (j == 0) { - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(46 + rotate_degree); - } else if (j == 1) { - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(-44 + rotate_degree); - } - } else { - p2mesh = n.param2 & 0x7; - switch (p2mesh) { - case 0: - // x - if (j == 0) { - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(46); - } else if (j == 1) { - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(-44); - } - break; - case 1: - // + - if (j == 0) { - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(91); - } else if (j == 1) { - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(1); - } - break; - case 2: - // * - if (j == 0) { - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(121); - } else if (j == 1) { - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(241); - } else { // (j == 2) - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(1); - } - break; - case 3: - // # - switch (j) { - case 0: - for (u16 i = 0; i < 4; i++) { - vertices[i].Pos.rotateXZBy(1); - vertices[i].Pos.Z += BS / 4; - } - break; - case 1: - for (u16 i = 0; i < 4; i++) { - vertices[i].Pos.rotateXZBy(91); - vertices[i].Pos.X += BS / 4; - } - break; - case 2: - for (u16 i = 0; i < 4; i++) { - vertices[i].Pos.rotateXZBy(181); - vertices[i].Pos.Z -= BS / 4; - } - break; - case 3: - for (u16 i = 0; i < 4; i++) { - vertices[i].Pos.rotateXZBy(271); - vertices[i].Pos.X -= BS / 4; - } - break; - } - break; - case 4: - // outward leaning #-like - switch (j) { - case 0: - for (u16 i = 2; i < 4; i++) - vertices[i].Pos.Z -= BS / 2; - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(1); - break; - case 1: - for (u16 i = 2; i < 4; i++) - vertices[i].Pos.Z -= BS / 2; - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(91); - break; - case 2: - for (u16 i = 2; i < 4; i++) - vertices[i].Pos.Z -= BS / 2; - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(181); - break; - case 3: - for (u16 i = 2; i < 4; i++) - vertices[i].Pos.Z -= BS / 2; - for (u16 i = 0; i < 4; i++) - vertices[i].Pos.rotateXZBy(271); - break; - } - break; - } - } - - for (int i = 0; i < 4; i++) { - vertices[i].Pos *= f.visual_scale; - vertices[i].Pos.Y += BS/2 * (f.visual_scale - 1); - vertices[i].Pos += intToFloat(p, BS); - // move to a random spot to avoid moire - if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x8) != 0)) { - vertices[i].Pos.X += random_offset_X; - vertices[i].Pos.Z += random_offset_Z; - } - // randomly move each face up/down - if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x20) != 0)) { - PseudoRandom yrng(j | x<<16 | z<<8 | y<<24 ); - vertices[i].Pos.Y -= BS * ((yrng.next() % 16 / 16.0) * 0.125); - } - } - - u16 indices[] = {0, 1, 2, 2, 3, 0}; - // Add to mesh collector - collector.append(tile, vertices, 4, indices, 6); - - // stop adding faces for meshes with less than 4 faces - if (f.param_type_2 == CPT2_MESHOPTIONS) { - if (((p2mesh == 0) || (p2mesh == 1)) && (j == 1)) - break; - else if ((p2mesh == 2) && (j == 2)) - break; - } else if (j == 1) { - break; - } + tile = tiles[1]; + for (int edge = 0; edge < FRAMED_EDGE_COUNT; edge++) { + bool edge_invisible; + if (nb[nb_triplet[edge][2]]) + edge_invisible = nb[nb_triplet[edge][0]] & nb[nb_triplet[edge][1]]; + else + edge_invisible = nb[nb_triplet[edge][0]] ^ nb[nb_triplet[edge][1]]; + if (edge_invisible) + continue; + drawAutoLightedCuboid(frame_edges[edge]); + } - } - break;} - case NDT_FIRELIKE: - { - TileSpec tile = getNodeTileN(n, p, 0, data); - tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; - - u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); - - float s = BS / 2 * f.visual_scale; - - content_t current = n.getContent(); - content_t n2c; - MapNode n2; - v3s16 n2p; - - static const v3s16 dirs[6] = { - v3s16( 0, 1, 0), - v3s16( 0, -1, 0), - v3s16( 1, 0, 0), - v3s16(-1, 0, 0), - v3s16( 0, 0, 1), - v3s16( 0, 0, -1) - }; - - int doDraw[6] = {0, 0, 0, 0, 0, 0}; - - bool drawAllFaces = true; - - // Check for adjacent nodes - for (int i = 0; i < 6; i++) { - n2p = blockpos_nodes + p + dirs[i]; - n2 = data->m_vmanip.getNodeNoEx(n2p); - n2c = n2.getContent(); - if (n2c != CONTENT_IGNORE && n2c != CONTENT_AIR && n2c != current) { - doDraw[i] = 1; - if (drawAllFaces) - drawAllFaces = false; - - } - } + for (int face = 0; face < 6; face++) { + if (nb[face]) + continue; + tile = glass_tiles[face]; + drawAutoLightedCuboid(glass_faces[face]); + } - for (int j = 0; j < 6; j++) { - - video::S3DVertex vertices[4] = { - video::S3DVertex(-s, -BS / 2, 0, 0, 0, 0, c, 0, 1), - video::S3DVertex( s, -BS / 2, 0, 0, 0, 0, c, 1, 1), - video::S3DVertex( s, -BS / 2 + s * 2, 0, 0, 0, 0, c, 1, 0), - video::S3DVertex(-s, -BS / 2 + s * 2, 0, 0, 0, 0, c, 0, 0), - }; - - // Calculate which faces should be drawn, (top or sides) - if (j == 0 && (drawAllFaces || - (doDraw[3] == 1 || doDraw[1] == 1))) { - for (int i = 0; i < 4; i++) { - vertices[i].Pos.rotateXZBy(90); - vertices[i].Pos.rotateXYBy(-10); - vertices[i].Pos.X -= 4.0; - } - } else if (j == 1 && (drawAllFaces || - (doDraw[5] == 1 || doDraw[1] == 1))) { - for (int i = 0; i < 4; i++) { - vertices[i].Pos.rotateXZBy(180); - vertices[i].Pos.rotateYZBy(10); - vertices[i].Pos.Z -= 4.0; - } - } else if (j == 2 && (drawAllFaces || - (doDraw[2] == 1 || doDraw[1] == 1))) { - for (int i = 0; i < 4; i++) { - vertices[i].Pos.rotateXZBy(270); - vertices[i].Pos.rotateXYBy(10); - vertices[i].Pos.X += 4.0; - } - } else if (j == 3 && (drawAllFaces || - (doDraw[4] == 1 || doDraw[1] == 1))) { - for (int i = 0; i < 4; i++) { - vertices[i].Pos.rotateYZBy(-10); - vertices[i].Pos.Z += 4.0; - } - // Center cross-flames - } else if (j == 4 && (drawAllFaces || doDraw[1] == 1)) { - for (int i = 0; i < 4; i++) { - vertices[i].Pos.rotateXZBy(45); - } - } else if (j == 5 && (drawAllFaces || doDraw[1] == 1)) { - for (int i = 0; i < 4; i++) { - vertices[i].Pos.rotateXZBy(-45); - } - // Render flames on bottom of node above - } else if (j == 0 && doDraw[0] == 1 && doDraw[1] == 0) { - for (int i = 0; i < 4; i++) { - vertices[i].Pos.rotateYZBy(70); - vertices[i].Pos.rotateXZBy(90); - vertices[i].Pos.Y += 4.84; - vertices[i].Pos.X -= 4.7; - } - } else if (j == 1 && doDraw[0] == 1 && doDraw[1] == 0) { - for (int i = 0; i < 4; i++) { - vertices[i].Pos.rotateYZBy(70); - vertices[i].Pos.rotateXZBy(180); - vertices[i].Pos.Y += 4.84; - vertices[i].Pos.Z -= 4.7; - } - } else if (j == 2 && doDraw[0] == 1 && doDraw[1] == 0) { - for (int i = 0; i < 4; i++) { - vertices[i].Pos.rotateYZBy(70); - vertices[i].Pos.rotateXZBy(270); - vertices[i].Pos.Y += 4.84; - vertices[i].Pos.X += 4.7; - } - } else if (j == 3 && doDraw[0] == 1 && doDraw[1] == 0) { - for (int i = 0; i < 4; i++) { - vertices[i].Pos.rotateYZBy(70); - vertices[i].Pos.Y += 4.84; - vertices[i].Pos.Z += 4.7; - } - } else { - // Skip faces that aren't adjacent to a node - continue; - } - - for (int i = 0; i < 4; i++) { - vertices[i].Pos *= f.visual_scale; - vertices[i].Pos += intToFloat(p, BS); - } - - u16 indices[] = {0, 1, 2, 2, 3, 0}; - // Add to mesh collector - collector.append(tile, vertices, 4, indices, 6); - } - break;} - case NDT_FENCELIKE: - { - TileSpec tile = getNodeTile(n, p, v3s16(0,0,0), data); - TileSpec tile_nocrack = tile; - tile_nocrack.material_flags &= ~MATERIAL_FLAG_CRACK; - - // Put wood the right way around in the posts - TileSpec tile_rot = tile; - tile_rot.rotation = 1; - - u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); - - const f32 post_rad=(f32)BS/8; - const f32 bar_rad=(f32)BS/16; - const f32 bar_len=(f32)(BS/2)-post_rad; - - v3f pos = intToFloat(p, BS); - - // The post - always present - aabb3f post(-post_rad,-BS/2,-post_rad,post_rad,BS/2,post_rad); - post.MinEdge += pos; - post.MaxEdge += pos; - f32 postuv[24]={ - 6/16.,6/16.,10/16.,10/16., - 6/16.,6/16.,10/16.,10/16., - 0/16.,0,4/16.,1, - 4/16.,0,8/16.,1, - 8/16.,0,12/16.,1, - 12/16.,0,16/16.,1}; - makeCuboid(&collector, post, &tile_rot, 1, c, postuv); - - // Now a section of fence, +X, if there's a post there - v3s16 p2 = p; - p2.X++; - MapNode n2 = data->m_vmanip.getNodeNoEx(blockpos_nodes + p2); - const ContentFeatures *f2 = &nodedef->get(n2); - if(f2->drawtype == NDT_FENCELIKE) - { - aabb3f bar(-bar_len+BS/2,-bar_rad+BS/4,-bar_rad, - bar_len+BS/2,bar_rad+BS/4,bar_rad); - bar.MinEdge += pos; - bar.MaxEdge += pos; - f32 xrailuv[24]={ - 0/16.,2/16.,16/16.,4/16., - 0/16.,4/16.,16/16.,6/16., - 6/16.,6/16.,8/16.,8/16., - 10/16.,10/16.,12/16.,12/16., - 0/16.,8/16.,16/16.,10/16., - 0/16.,14/16.,16/16.,16/16.}; - makeCuboid(&collector, bar, &tile_nocrack, 1, - c, xrailuv); - bar.MinEdge.Y -= BS/2; - bar.MaxEdge.Y -= BS/2; - makeCuboid(&collector, bar, &tile_nocrack, 1, - c, xrailuv); - } + // Optionally render internal liquid level defined by param2 + // Liquid is textured with 1 tile defined in nodedef 'special_tiles' + if (param2 > 0 && f->param_type_2 == CPT2_GLASSLIKE_LIQUID_LEVEL && + f->special_tiles[0].layers[0].texture) { + // Internal liquid level has param2 range 0 .. 63, + // convert it to -0.5 .. 0.5 + float vlev = (param2 / 63.0) * 2.0 - 1.0; + tile = getSpecialTile(*f, n, 0); + drawAutoLightedCuboid(aabb3f(-(nb[5] ? g : b), + -(nb[4] ? g : b), + -(nb[3] ? g : b), + (nb[2] ? g : b), + (nb[1] ? g : b) * vlev, + (nb[0] ? g : b))); + } +} - // Now a section of fence, +Z, if there's a post there - p2 = p; - p2.Z++; - n2 = data->m_vmanip.getNodeNoEx(blockpos_nodes + p2); - f2 = &nodedef->get(n2); - if(f2->drawtype == NDT_FENCELIKE) - { - aabb3f bar(-bar_rad,-bar_rad+BS/4,-bar_len+BS/2, - bar_rad,bar_rad+BS/4,bar_len+BS/2); - bar.MinEdge += pos; - bar.MaxEdge += pos; - f32 zrailuv[24]={ - 3/16.,1/16.,5/16.,5/16., // cannot rotate; stretch - 4/16.,1/16.,6/16.,5/16., // for wood texture instead - 0/16.,9/16.,16/16.,11/16., - 0/16.,6/16.,16/16.,8/16., - 6/16.,6/16.,8/16.,8/16., - 10/16.,10/16.,12/16.,12/16.}; - makeCuboid(&collector, bar, &tile_nocrack, 1, - c, zrailuv); - bar.MinEdge.Y -= BS/2; - bar.MaxEdge.Y -= BS/2; - makeCuboid(&collector, bar, &tile_nocrack, 1, - c, zrailuv); - } - break;} - case NDT_RAILLIKE: - { - bool is_rail_x[6]; /* (-1,-1,0) X (1,-1,0) (-1,0,0) X (1,0,0) (-1,1,0) X (1,1,0) */ - bool is_rail_z[6]; - - content_t thiscontent = n.getContent(); - std::string groupname = "connect_to_raillike"; // name of the group that enables connecting to raillike nodes of different kind - int self_group = ((ItemGroupList) nodedef->get(n).groups)[groupname]; - - u8 index = 0; - for (s8 y0 = -1; y0 <= 1; y0++) { - // Prevent from indexing never used coordinates - for (s8 xz = -1; xz <= 1; xz++) { - if (xz == 0) - continue; - MapNode n_xy = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x + xz, y + y0, z)); - MapNode n_zy = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x, y + y0, z + xz)); - const ContentFeatures &def_xy = nodedef->get(n_xy); - const ContentFeatures &def_zy = nodedef->get(n_zy); - - // Check if current node would connect with the rail - is_rail_x[index] = ((def_xy.drawtype == NDT_RAILLIKE - && ((ItemGroupList) def_xy.groups)[groupname] == self_group) - || n_xy.getContent() == thiscontent); - - is_rail_z[index] = ((def_zy.drawtype == NDT_RAILLIKE - && ((ItemGroupList) def_zy.groups)[groupname] == self_group) - || n_zy.getContent() == thiscontent); - index++; - } - } +void MapblockMeshGenerator::drawAllfacesNode() +{ + static const aabb3f box(-BS / 2, -BS / 2, -BS / 2, BS / 2, BS / 2, BS / 2); + useDefaultTile(false); + drawAutoLightedCuboid(box); +} - bool is_rail_x_all[2]; // [0] = negative x, [1] = positive x coordinate from the current node position - bool is_rail_z_all[2]; - is_rail_x_all[0] = is_rail_x[0] || is_rail_x[2] || is_rail_x[4]; - is_rail_x_all[1] = is_rail_x[1] || is_rail_x[3] || is_rail_x[5]; - is_rail_z_all[0] = is_rail_z[0] || is_rail_z[2] || is_rail_z[4]; - is_rail_z_all[1] = is_rail_z[1] || is_rail_z[3] || is_rail_z[5]; - - // reasonable default, flat straight unrotated rail - bool is_straight = true; - int adjacencies = 0; - int angle = 0; - u8 tileindex = 0; - - // check for sloped rail - if (is_rail_x[4] || is_rail_x[5] || is_rail_z[4] || is_rail_z[5]) { - adjacencies = 5; // 5 means sloped - is_straight = true; // sloped is always straight - } else { - // is really straight, rails on both sides - is_straight = (is_rail_x_all[0] && is_rail_x_all[1]) || (is_rail_z_all[0] && is_rail_z_all[1]); - adjacencies = is_rail_x_all[0] + is_rail_x_all[1] + is_rail_z_all[0] + is_rail_z_all[1]; - } +void MapblockMeshGenerator::drawTorchlikeNode() +{ + u8 wall = n.getWallMounted(nodedef); + u8 tileindex = 0; + switch (wall) { + case DWM_YP: tileindex = 1; break; // ceiling + case DWM_YN: tileindex = 0; break; // floor + default: tileindex = 2; // side (or invalid—should we care?) + } + useTile(tileindex, true); + + float size = BS / 2 * f->visual_scale; + v3f vertices[4] = { + v3f(-size, size, 0), + v3f( size, size, 0), + v3f( size, -size, 0), + v3f(-size, -size, 0), + }; + for (int i = 0; i < 4; i++) { + switch (wall) { + case DWM_YP: vertices[i].rotateXZBy(-45); break; + case DWM_YN: vertices[i].rotateXZBy( 45); break; + case DWM_XP: vertices[i].rotateXZBy( 0); break; + case DWM_XN: vertices[i].rotateXZBy(180); break; + case DWM_ZP: vertices[i].rotateXZBy( 90); break; + case DWM_ZN: vertices[i].rotateXZBy(-90); break; + } + } + drawQuad(vertices); +} - switch (adjacencies) { - case 1: - if (is_rail_x_all[0] || is_rail_x_all[1]) - angle = 90; - break; - case 2: - if (!is_straight) - tileindex = 1; // curved - if (is_rail_x_all[0] && is_rail_x_all[1]) - angle = 90; - if (is_rail_z_all[0] && is_rail_z_all[1]) { - if (is_rail_z[4]) - angle = 180; - } - else if (is_rail_x_all[0] && is_rail_z_all[0]) - angle = 270; - else if (is_rail_x_all[0] && is_rail_z_all[1]) - angle = 180; - else if (is_rail_x_all[1] && is_rail_z_all[1]) - angle = 90; - break; - case 3: - // here is where the potential to 'switch' a junction is, but not implemented at present - tileindex = 2; // t-junction - if(!is_rail_x_all[1]) - angle = 180; - if(!is_rail_z_all[0]) - angle = 90; - if(!is_rail_z_all[1]) - angle = 270; - break; - case 4: - tileindex = 3; // crossing - break; - case 5: //sloped - if (is_rail_z[4]) - angle = 180; - if (is_rail_x[4]) - angle = 90; - if (is_rail_x[5]) - angle = -90; - break; - default: - break; - } +void MapblockMeshGenerator::drawSignlikeNode() +{ + u8 wall = n.getWallMounted(nodedef); + useTile(0, true); + static const float offset = BS / 16; + float size = BS / 2 * f->visual_scale; + // Wall at X+ of node + v3f vertices[4] = { + v3f(BS / 2 - offset, size, size), + v3f(BS / 2 - offset, size, -size), + v3f(BS / 2 - offset, -size, -size), + v3f(BS / 2 - offset, -size, size), + }; + for (int i = 0; i < 4; i++) { + switch (wall) { + case DWM_YP: vertices[i].rotateXYBy( 90); break; + case DWM_YN: vertices[i].rotateXYBy(-90); break; + case DWM_XP: vertices[i].rotateXZBy( 0); break; + case DWM_XN: vertices[i].rotateXZBy(180); break; + case DWM_ZP: vertices[i].rotateXZBy( 90); break; + case DWM_ZN: vertices[i].rotateXZBy(-90); break; + } + } + drawQuad(vertices); +} - TileSpec tile = getNodeTileN(n, p, tileindex, data); - tile.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING; - tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; - - u16 l = getInteriorLight(n, 0, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); - - float d = (float)BS/64; - float s = BS/2; - - short g = -1; - if (is_rail_x[4] || is_rail_x[5] || is_rail_z[4] || is_rail_z[5]) - g = 1; //Object is at a slope - - video::S3DVertex vertices[4] = - { - video::S3DVertex(-s, -s+d,-s, 0,0,0, c,0,1), - video::S3DVertex( s, -s+d,-s, 0,0,0, c,1,1), - video::S3DVertex( s, g*s+d, s, 0,0,0, c,1,0), - video::S3DVertex(-s, g*s+d, s, 0,0,0, c,0,0), - }; - - for(s32 i=0; i<4; i++) - { - if(angle != 0) - vertices[i].Pos.rotateXZBy(angle); - vertices[i].Pos += intToFloat(p, BS); - } +void MapblockMeshGenerator::drawPlantlikeQuad(float rotation, float quad_offset, + bool offset_top_only) +{ + v3f vertices[4] = { + v3f(-scale, -BS / 2 + scale * 2, 0), + v3f( scale, -BS / 2 + scale * 2, 0), + v3f( scale, -BS / 2, 0), + v3f(-scale, -BS / 2, 0), + }; + if (random_offset_Y) { + PseudoRandom yrng(face_num++ | p.X << 16 | p.Z << 8 | p.Y << 24); + offset.Y = BS * ((yrng.next() % 16 / 16.0) * 0.125); + } + int offset_count = offset_top_only ? 2 : 4; + for (int i = 0; i < offset_count; i++) + vertices[i].Z += quad_offset; + for (int i = 0; i < 4; i++) { + vertices[i].rotateXZBy(rotation + rotate_degree); + vertices[i] += offset; + } + drawQuad(vertices); +} - u16 indices[] = {0,1,2,2,3,0}; - collector.append(tile, vertices, 4, indices, 6); - break;} - case NDT_NODEBOX: - { - static const v3s16 tile_dirs[6] = { - v3s16(0, 1, 0), - v3s16(0, -1, 0), - v3s16(1, 0, 0), - v3s16(-1, 0, 0), - v3s16(0, 0, 1), - v3s16(0, 0, -1) - }; - TileSpec tiles[6]; - - u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); - - v3f pos = intToFloat(p, BS); - - int neighbors = 0; - - // locate possible neighboring nodes to connect to - if (f.node_box.type == NODEBOX_CONNECTED) { - v3s16 p2 = p; - - p2.Y++; - getNeighborConnectingFace(blockpos_nodes + p2, nodedef, data, n, 1, &neighbors); - - p2 = p; - p2.Y--; - getNeighborConnectingFace(blockpos_nodes + p2, nodedef, data, n, 2, &neighbors); - - p2 = p; - p2.Z--; - getNeighborConnectingFace(blockpos_nodes + p2, nodedef, data, n, 4, &neighbors); - - p2 = p; - p2.X--; - getNeighborConnectingFace(blockpos_nodes + p2, nodedef, data, n, 8, &neighbors); - - p2 = p; - p2.Z++; - getNeighborConnectingFace(blockpos_nodes + p2, nodedef, data, n, 16, &neighbors); - - p2 = p; - p2.X++; - getNeighborConnectingFace(blockpos_nodes + p2, nodedef, data, n, 32, &neighbors); - } +void MapblockMeshGenerator::drawPlantlikeNode() +{ + useTile(0, false); + draw_style = PLANT_STYLE_CROSS; + scale = BS / 2 * f->visual_scale; + offset = v3f(0, 0, 0); + rotate_degree = 0; + random_offset_Y = false; + face_num = 0; + + switch (f->param_type_2) { + case CPT2_MESHOPTIONS: + draw_style = PlantlikeStyle(n.param2 & MO_MASK_STYLE); + if (n.param2 & MO_BIT_SCALE_SQRT2) + scale *= 1.41421; + if (n.param2 & MO_BIT_RANDOM_OFFSET) { + PseudoRandom rng(p.X << 8 | p.Z | p.Y << 16); + offset.X = BS * ((rng.next() % 16 / 16.0) * 0.29 - 0.145); + offset.Z = BS * ((rng.next() % 16 / 16.0) * 0.29 - 0.145); + } + if (n.param2 & MO_BIT_RANDOM_OFFSET_Y) + random_offset_Y = true; + break; - std::vector<aabb3f> boxes; - n.getNodeBoxes(nodedef, &boxes, neighbors); - for(std::vector<aabb3f>::iterator - i = boxes.begin(); - i != boxes.end(); ++i) - { - for(int j = 0; j < 6; j++) - { - // Handles facedir rotation for textures - tiles[j] = getNodeTile(n, p, tile_dirs[j], data); - } - aabb3f box = *i; - box.MinEdge += pos; - box.MaxEdge += pos; - - f32 temp; - if (box.MinEdge.X > box.MaxEdge.X) - { - temp=box.MinEdge.X; - box.MinEdge.X=box.MaxEdge.X; - box.MaxEdge.X=temp; - } - if (box.MinEdge.Y > box.MaxEdge.Y) - { - temp=box.MinEdge.Y; - box.MinEdge.Y=box.MaxEdge.Y; - box.MaxEdge.Y=temp; - } - if (box.MinEdge.Z > box.MaxEdge.Z) - { - temp=box.MinEdge.Z; - box.MinEdge.Z=box.MaxEdge.Z; - box.MaxEdge.Z=temp; - } - - // - // Compute texture coords - f32 tx1 = (box.MinEdge.X/BS)+0.5; - f32 ty1 = (box.MinEdge.Y/BS)+0.5; - f32 tz1 = (box.MinEdge.Z/BS)+0.5; - f32 tx2 = (box.MaxEdge.X/BS)+0.5; - f32 ty2 = (box.MaxEdge.Y/BS)+0.5; - f32 tz2 = (box.MaxEdge.Z/BS)+0.5; - f32 txc[24] = { - // up - tx1, 1-tz2, tx2, 1-tz1, - // down - tx1, tz1, tx2, tz2, - // right - tz1, 1-ty2, tz2, 1-ty1, - // left - 1-tz2, 1-ty2, 1-tz1, 1-ty1, - // back - 1-tx2, 1-ty2, 1-tx1, 1-ty1, - // front - tx1, 1-ty2, tx2, 1-ty1, - }; - makeCuboid(&collector, box, tiles, 6, c, txc); - } - break;} - case NDT_MESH: - { - v3f pos = intToFloat(p, BS); - video::SColor c = MapBlock_LightColor(255, getInteriorLight(n, 1, nodedef), f.light_source); - - u8 facedir = 0; - if (f.param_type_2 == CPT2_FACEDIR) { - facedir = n.getFaceDir(nodedef); - } else if (f.param_type_2 == CPT2_WALLMOUNTED) { - //convert wallmounted to 6dfacedir. - //when cache enabled, it is already converted - facedir = n.getWallMounted(nodedef); - if (!enable_mesh_cache) { - static const u8 wm_to_6d[6] = {20, 0, 16+1, 12+3, 8, 4+2}; - facedir = wm_to_6d[facedir]; - } - } + case CPT2_DEGROTATE: + rotate_degree = n.param2 * 2; + break; + + default: + break; + } + + switch (draw_style) { + case PLANT_STYLE_CROSS: + drawPlantlikeQuad(46); + drawPlantlikeQuad(-44); + break; + + case PLANT_STYLE_CROSS2: + drawPlantlikeQuad(91); + drawPlantlikeQuad(1); + break; + + case PLANT_STYLE_STAR: + drawPlantlikeQuad(121); + drawPlantlikeQuad(241); + drawPlantlikeQuad(1); + break; + + case PLANT_STYLE_HASH: + drawPlantlikeQuad( 1, BS / 4); + drawPlantlikeQuad( 91, BS / 4); + drawPlantlikeQuad(181, BS / 4); + drawPlantlikeQuad(271, BS / 4); + break; + + case PLANT_STYLE_HASH2: + drawPlantlikeQuad( 1, -BS / 2, true); + drawPlantlikeQuad( 91, -BS / 2, true); + drawPlantlikeQuad(181, -BS / 2, true); + drawPlantlikeQuad(271, -BS / 2, true); + break; + } +} + +void MapblockMeshGenerator::drawFirelikeQuad(float rotation, float opening_angle, + float offset_h, float offset_v) +{ + v3f vertices[4] = { + v3f(-scale, -BS / 2 + scale * 2, 0), + v3f( scale, -BS / 2 + scale * 2, 0), + v3f( scale, -BS / 2, 0), + v3f(-scale, -BS / 2, 0), + }; + for (int i = 0; i < 4; i++) { + vertices[i].rotateYZBy(opening_angle); + vertices[i].Z += offset_h; + vertices[i].rotateXZBy(rotation); + vertices[i].Y += offset_v; + } + drawQuad(vertices); +} + +void MapblockMeshGenerator::drawFirelikeNode() +{ + useTile(0, false); + scale = BS / 2 * f->visual_scale; + + // Check for adjacent nodes + bool neighbors = false; + bool neighbor[6] = {0, 0, 0, 0, 0, 0}; + content_t current = n.getContent(); + for (int i = 0; i < 6; i++) { + v3s16 n2p = blockpos_nodes + p + g_6dirs[i]; + MapNode n2 = data->m_vmanip.getNodeNoEx(n2p); + content_t n2c = n2.getContent(); + if (n2c != CONTENT_IGNORE && n2c != CONTENT_AIR && n2c != current) { + neighbor[i] = true; + neighbors = true; + } + } + bool drawBasicFire = neighbor[D6D_YN] || !neighbors; + bool drawBottomFire = neighbor[D6D_YP]; + + if (drawBasicFire || neighbor[D6D_ZP]) + drawFirelikeQuad(0, -10, 0.4 * BS); + else if (drawBottomFire) + drawFirelikeQuad(0, 70, 0.47 * BS, 0.484 * BS); + + if (drawBasicFire || neighbor[D6D_XN]) + drawFirelikeQuad(90, -10, 0.4 * BS); + else if (drawBottomFire) + drawFirelikeQuad(90, 70, 0.47 * BS, 0.484 * BS); + + if (drawBasicFire || neighbor[D6D_ZN]) + drawFirelikeQuad(180, -10, 0.4 * BS); + else if (drawBottomFire) + drawFirelikeQuad(180, 70, 0.47 * BS, 0.484 * BS); + + if (drawBasicFire || neighbor[D6D_XP]) + drawFirelikeQuad(270, -10, 0.4 * BS); + else if (drawBottomFire) + drawFirelikeQuad(270, 70, 0.47 * BS, 0.484 * BS); + + if (drawBasicFire) { + drawFirelikeQuad(45, 0, 0.0); + drawFirelikeQuad(-45, 0, 0.0); + } +} + +void MapblockMeshGenerator::drawFencelikeNode() +{ + useDefaultTile(false); + TileSpec tile_nocrack = tile; + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) + tile_nocrack.layers[layer].material_flags &= ~MATERIAL_FLAG_CRACK; + + // Put wood the right way around in the posts + TileSpec tile_rot = tile; + tile_rot.rotation = 1; + + static const f32 post_rad = BS / 8; + static const f32 bar_rad = BS / 16; + static const f32 bar_len = BS / 2 - post_rad; + + // The post - always present + static const aabb3f post(-post_rad, -BS / 2, -post_rad, + post_rad, BS / 2, post_rad); + static const f32 postuv[24] = { + 0.375, 0.375, 0.625, 0.625, + 0.375, 0.375, 0.625, 0.625, + 0.000, 0.000, 0.250, 1.000, + 0.250, 0.000, 0.500, 1.000, + 0.500, 0.000, 0.750, 1.000, + 0.750, 0.000, 1.000, 1.000, + }; + tile = tile_rot; + drawAutoLightedCuboid(post, postuv); + + tile = tile_nocrack; + + // Now a section of fence, +X, if there's a post there + v3s16 p2 = p; + p2.X++; + MapNode n2 = data->m_vmanip.getNodeNoEx(blockpos_nodes + p2); + const ContentFeatures *f2 = &nodedef->get(n2); + if (f2->drawtype == NDT_FENCELIKE) { + static const aabb3f bar_x1(BS / 2 - bar_len, BS / 4 - bar_rad, -bar_rad, + BS / 2 + bar_len, BS / 4 + bar_rad, bar_rad); + static const aabb3f bar_x2(BS / 2 - bar_len, -BS / 4 - bar_rad, -bar_rad, + BS / 2 + bar_len, -BS / 4 + bar_rad, bar_rad); + static const f32 xrailuv[24] = { + 0.000, 0.125, 1.000, 0.250, + 0.000, 0.250, 1.000, 0.375, + 0.375, 0.375, 0.500, 0.500, + 0.625, 0.625, 0.750, 0.750, + 0.000, 0.500, 1.000, 0.625, + 0.000, 0.875, 1.000, 1.000, + }; + drawAutoLightedCuboid(bar_x1, xrailuv); + drawAutoLightedCuboid(bar_x2, xrailuv); + } + + // Now a section of fence, +Z, if there's a post there + p2 = p; + p2.Z++; + n2 = data->m_vmanip.getNodeNoEx(blockpos_nodes + p2); + f2 = &nodedef->get(n2); + if (f2->drawtype == NDT_FENCELIKE) { + static const aabb3f bar_z1(-bar_rad, BS / 4 - bar_rad, BS / 2 - bar_len, + bar_rad, BS / 4 + bar_rad, BS / 2 + bar_len); + static const aabb3f bar_z2(-bar_rad, -BS / 4 - bar_rad, BS / 2 - bar_len, + bar_rad, -BS / 4 + bar_rad, BS / 2 + bar_len); + static const f32 zrailuv[24] = { + 0.1875, 0.0625, 0.3125, 0.3125, // cannot rotate; stretch + 0.2500, 0.0625, 0.3750, 0.3125, // for wood texture instead + 0.0000, 0.5625, 1.0000, 0.6875, + 0.0000, 0.3750, 1.0000, 0.5000, + 0.3750, 0.3750, 0.5000, 0.5000, + 0.6250, 0.6250, 0.7500, 0.7500, + }; + drawAutoLightedCuboid(bar_z1, zrailuv); + drawAutoLightedCuboid(bar_z2, zrailuv); + } +} + +bool MapblockMeshGenerator::isSameRail(v3s16 dir) +{ + MapNode node2 = data->m_vmanip.getNodeNoEx(blockpos_nodes + p + dir); + if (node2.getContent() == n.getContent()) + return true; + const ContentFeatures &def2 = nodedef->get(node2); + return ((def2.drawtype == NDT_RAILLIKE) && + (def2.getGroup(raillike_groupname) == raillike_group)); +} + +void MapblockMeshGenerator::drawRaillikeNode() +{ + static const v3s16 direction[4] = { + v3s16( 0, 0, 1), + v3s16( 0, 0, -1), + v3s16(-1, 0, 0), + v3s16( 1, 0, 0), + }; + static const int slope_angle[4] = {0, 180, 90, -90}; + + enum RailTile { + straight, + curved, + junction, + cross, + }; + struct RailDesc { + int tile_index; + int angle; + }; + static const RailDesc rail_kinds[16] = { + // +x -x -z +z + //------------- + {straight, 0}, // . . . . + {straight, 0}, // . . . +Z + {straight, 0}, // . . -Z . + {straight, 0}, // . . -Z +Z + {straight, 90}, // . -X . . + { curved, 180}, // . -X . +Z + { curved, 270}, // . -X -Z . + {junction, 180}, // . -X -Z +Z + {straight, 90}, // +X . . . + { curved, 90}, // +X . . +Z + { curved, 0}, // +X . -Z . + {junction, 0}, // +X . -Z +Z + {straight, 90}, // +X -X . . + {junction, 90}, // +X -X . +Z + {junction, 270}, // +X -X -Z . + { cross, 0}, // +X -X -Z +Z + }; + + raillike_group = nodedef->get(n).getGroup(raillike_groupname); + + int code = 0; + int angle; + int tile_index; + bool sloped = false; + for (int dir = 0; dir < 4; dir++) { + bool rail_above = isSameRail(direction[dir] + v3s16(0, 1, 0)); + if (rail_above) { + sloped = true; + angle = slope_angle[dir]; + } + if (rail_above || + isSameRail(direction[dir]) || + isSameRail(direction[dir] + v3s16(0, -1, 0))) + code |= 1 << dir; + } + + if (sloped) { + tile_index = straight; + } else { + tile_index = rail_kinds[code].tile_index; + angle = rail_kinds[code].angle; + } + + useTile(tile_index, true); + + static const float offset = BS / 64; + static const float size = BS / 2; + float y2 = sloped ? size : -size; + v3f vertices[4] = { + v3f(-size, y2 + offset, size), + v3f( size, y2 + offset, size), + v3f( size, -size + offset, -size), + v3f(-size, -size + offset, -size), + }; + if (angle) + for (int i = 0; i < 4; i++) + vertices[i].rotateXZBy(angle); + drawQuad(vertices); +} - if (f.mesh_ptr[facedir]) { - // use cached meshes - for(u16 j = 0; j < f.mesh_ptr[0]->getMeshBufferCount(); j++) { - scene::IMeshBuffer *buf = f.mesh_ptr[facedir]->getMeshBuffer(j); - collector.append(getNodeTileN(n, p, j, data), - (video::S3DVertex *)buf->getVertices(), buf->getVertexCount(), - buf->getIndices(), buf->getIndexCount(), pos, c); - } - } else if (f.mesh_ptr[0]) { - // no cache, clone and rotate mesh - scene::IMesh* mesh = cloneMesh(f.mesh_ptr[0]); - rotateMeshBy6dFacedir(mesh, facedir); - recalculateBoundingBox(mesh); - meshmanip->recalculateNormals(mesh, true, false); - for(u16 j = 0; j < mesh->getMeshBufferCount(); j++) { - scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); - collector.append(getNodeTileN(n, p, j, data), - (video::S3DVertex *)buf->getVertices(), buf->getVertexCount(), - buf->getIndices(), buf->getIndexCount(), pos, c); - } - mesh->drop(); +void MapblockMeshGenerator::drawNodeboxNode() +{ + static const v3s16 tile_dirs[6] = { + v3s16(0, 1, 0), + v3s16(0, -1, 0), + v3s16(1, 0, 0), + v3s16(-1, 0, 0), + v3s16(0, 0, 1), + v3s16(0, 0, -1) + }; + + // we have this order for some reason... + static const v3s16 connection_dirs[6] = { + v3s16( 0, 1, 0), // top + v3s16( 0, -1, 0), // bottom + v3s16( 0, 0, -1), // front + v3s16(-1, 0, 0), // left + v3s16( 0, 0, 1), // back + v3s16( 1, 0, 0), // right + }; + + TileSpec tiles[6]; + for (int face = 0; face < 6; face++) { + // Handles facedir rotation for textures + getTile(tile_dirs[face], tiles[face]); + } + + // locate possible neighboring nodes to connect to + int neighbors_set = 0; + if (f->node_box.type == NODEBOX_CONNECTED) { + for (int dir = 0; dir != 6; dir++) { + int flag = 1 << dir; + v3s16 p2 = blockpos_nodes + p + connection_dirs[dir]; + MapNode n2 = data->m_vmanip.getNodeNoEx(p2); + if (nodedef->nodeboxConnects(n, n2, flag)) + neighbors_set |= flag; + } + } + + std::vector<aabb3f> boxes; + n.getNodeBoxes(nodedef, &boxes, neighbors_set); + for (std::vector<aabb3f>::iterator i = boxes.begin(); i != boxes.end(); ++i) + drawAutoLightedCuboid(*i, NULL, tiles, 6); +} + +void MapblockMeshGenerator::drawMeshNode() +{ + u8 facedir = 0; + scene::IMesh* mesh; + bool private_mesh; // as a grab/drop pair is not thread-safe + + if (f->param_type_2 == CPT2_FACEDIR || + f->param_type_2 == CPT2_COLORED_FACEDIR) { + facedir = n.getFaceDir(nodedef); + } else if (f->param_type_2 == CPT2_WALLMOUNTED || + f->param_type_2 == CPT2_COLORED_WALLMOUNTED) { + // Convert wallmounted to 6dfacedir. + // When cache enabled, it is already converted. + facedir = n.getWallMounted(nodedef); + if (!enable_mesh_cache) { + static const u8 wm_to_6d[6] = {20, 0, 16 + 1, 12 + 3, 8, 4 + 2}; + facedir = wm_to_6d[facedir]; + } + } + + if (!data->m_smooth_lighting && f->mesh_ptr[facedir]) { + // use cached meshes + private_mesh = false; + mesh = f->mesh_ptr[facedir]; + } else if (f->mesh_ptr[0]) { + // no cache, clone and rotate mesh + private_mesh = true; + mesh = cloneMesh(f->mesh_ptr[0]); + rotateMeshBy6dFacedir(mesh, facedir); + recalculateBoundingBox(mesh); + meshmanip->recalculateNormals(mesh, true, false); + } else + return; + + int mesh_buffer_count = mesh->getMeshBufferCount(); + for (int j = 0; j < mesh_buffer_count; j++) { + useTile(j, false); + scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); + video::S3DVertex *vertices = (video::S3DVertex *)buf->getVertices(); + int vertex_count = buf->getVertexCount(); + + if (data->m_smooth_lighting) { + // Mesh is always private here. So the lighting is applied to each + // vertex right here. + for (int k = 0; k < vertex_count; k++) { + video::S3DVertex &vertex = vertices[k]; + vertex.Color = blendLightColor(vertex.Pos, vertex.Normal); + vertex.Pos += origin; } - break;} + collector->append(tile, vertices, vertex_count, + buf->getIndices(), buf->getIndexCount()); + } else { + // Don't modify the mesh, it may not be private here. + // Instead, let the collector process colors, etc. + collector->append(tile, vertices, vertex_count, + buf->getIndices(), buf->getIndexCount(), origin, + color, f->light_source); } } + if (private_mesh) + mesh->drop(); } +// also called when the drawtype is known but should have been pre-converted +void MapblockMeshGenerator::errorUnknownDrawtype() +{ + infostream << "Got drawtype " << f->drawtype << std::endl; + FATAL_ERROR("Unknown drawtype"); +} + +void MapblockMeshGenerator::drawNode() +{ + if (data->m_smooth_lighting) + getSmoothLightFrame(); + else + light = getInteriorLight(n, 1, nodedef); + switch (f->drawtype) { + case NDT_FLOWINGLIQUID: drawLiquidNode(); break; + case NDT_GLASSLIKE: drawGlasslikeNode(); break; + case NDT_GLASSLIKE_FRAMED: drawGlasslikeFramedNode(); break; + case NDT_ALLFACES: drawAllfacesNode(); break; + case NDT_TORCHLIKE: drawTorchlikeNode(); break; + case NDT_SIGNLIKE: drawSignlikeNode(); break; + case NDT_PLANTLIKE: drawPlantlikeNode(); break; + case NDT_FIRELIKE: drawFirelikeNode(); break; + case NDT_FENCELIKE: drawFencelikeNode(); break; + case NDT_RAILLIKE: drawRaillikeNode(); break; + case NDT_NODEBOX: drawNodeboxNode(); break; + case NDT_MESH: drawMeshNode(); break; + default: errorUnknownDrawtype(); break; + } +} + +/* + TODO: Fix alpha blending for special nodes + Currently only the last element rendered is blended correct +*/ +void MapblockMeshGenerator::generate() +{ + for (p.Z = 0; p.Z < MAP_BLOCKSIZE; p.Z++) + for (p.Y = 0; p.Y < MAP_BLOCKSIZE; p.Y++) + for (p.X = 0; p.X < MAP_BLOCKSIZE; p.X++) { + n = data->m_vmanip.getNodeNoEx(blockpos_nodes + p); + f = &nodedef->get(n); + // Solid nodes are drawn by MapBlockMesh + if (f->solidness != 0) + continue; + if (f->drawtype == NDT_AIRLIKE) + continue; + origin = intToFloat(p, BS); + drawNode(); + } +} diff --git a/src/content_mapblock.h b/src/content_mapblock.h index bb1e129da..2c6a4969e 100644 --- a/src/content_mapblock.h +++ b/src/content_mapblock.h @@ -19,11 +19,128 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef CONTENT_MAPBLOCK_HEADER #define CONTENT_MAPBLOCK_HEADER +#include "util/numeric.h" +#include "nodedef.h" +#include <IMeshManipulator.h> struct MeshMakeData; struct MeshCollector; -void mapblock_mesh_generate_special(MeshMakeData *data, - MeshCollector &collector); -#endif +struct LightFrame +{ + f32 lightsA[8]; + f32 lightsB[8]; +}; + +class MapblockMeshGenerator +{ +public: + MeshMakeData *data; + MeshCollector *collector; + + INodeDefManager *nodedef; + scene::ISceneManager *smgr; + scene::IMeshManipulator *meshmanip; + +// options + bool enable_mesh_cache; + +// current node + v3s16 blockpos_nodes; + v3s16 p; + v3f origin; + MapNode n; + const ContentFeatures *f; + u16 light; + LightFrame frame; + video::SColor color; + TileSpec tile; + float scale; + +// lighting + void getSmoothLightFrame(); + u16 blendLight(const v3f &vertex_pos); + video::SColor blendLightColor(const v3f &vertex_pos); + video::SColor blendLightColor(const v3f &vertex_pos, const v3f &vertex_normal); + + void useTile(int index, bool disable_backface_culling); + void useDefaultTile(bool set_color = true); + void getTile(const v3s16 &direction, TileSpec &tile); + +// face drawing + void drawQuad(v3f *vertices, const v3s16 &normal = v3s16(0, 0, 0)); + +// cuboid drawing! + void drawCuboid(const aabb3f &box, TileSpec *tiles, int tilecount, + const u16 *lights , const f32 *txc); + void generateCuboidTextureCoords(aabb3f const &box, f32 *coords); + void drawAutoLightedCuboid(aabb3f box, const f32 *txc = NULL, + TileSpec *tiles = NULL, int tile_count = 0); + +// liquid-specific + bool top_is_same_liquid; + TileSpec tile_liquid; + TileSpec tile_liquid_top; + content_t c_flowing; + content_t c_source; + video::SColor color_liquid_top; + struct NeighborData { + f32 level; + content_t content; + bool is_same_liquid; + bool top_is_same_liquid; + }; + NeighborData liquid_neighbors[3][3]; + f32 corner_levels[2][2]; + void prepareLiquidNodeDrawing(); + void getLiquidNeighborhood(); + void calculateCornerLevels(); + f32 getCornerLevel(int i, int k); + void drawLiquidSides(); + void drawLiquidTop(); + +// raillike-specific + // name of the group that enables connecting to raillike nodes of different kind + static const std::string raillike_groupname; + int raillike_group; + bool isSameRail(v3s16 dir); + +// plantlike-specific + PlantlikeStyle draw_style; + v3f offset; + int rotate_degree; + bool random_offset_Y; + int face_num; + + void drawPlantlikeQuad(float rotation, float quad_offset = 0, + bool offset_top_only = false); + +// firelike-specific + void drawFirelikeQuad(float rotation, float opening_angle, + float offset_h, float offset_v = 0.0); + +// drawtypes + void drawLiquidNode(); + void drawGlasslikeNode(); + void drawGlasslikeFramedNode(); + void drawAllfacesNode(); + void drawTorchlikeNode(); + void drawSignlikeNode(); + void drawPlantlikeNode(); + void drawFirelikeNode(); + void drawFencelikeNode(); + void drawRaillikeNode(); + void drawNodeboxNode(); + void drawMeshNode(); + +// common + void errorUnknownDrawtype(); + void drawNode(); + +public: + MapblockMeshGenerator(MeshMakeData *input, MeshCollector *output); + void generate(); +}; + +#endif diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 77ab51a02..be1c52fe6 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -19,18 +19,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_sao.h" #include "util/serialize.h" -#include "util/mathconstants.h" #include "collision.h" #include "environment.h" -#include "settings.h" -#include "serialization.h" // For compressZlib #include "tool.h" // For ToolCapabilities #include "gamedef.h" +#include "nodedef.h" #include "remoteplayer.h" #include "server.h" -#include "scripting_game.h" +#include "scripting_server.h" #include "genericobject.h" -#include "log.h" std::map<u16, ServerActiveObject::Factory> ServerActiveObject::m_types; @@ -93,13 +90,8 @@ public: } } - bool getCollisionBox(aabb3f *toset) { - return false; - } - - bool collideWithObjects() { - return false; - } + bool getCollisionBox(aabb3f *toset) const { return false; } + bool collideWithObjects() const { return false; } private: float m_timer1; @@ -110,6 +102,133 @@ private: TestSAO proto_TestSAO(NULL, v3f(0,0,0)); /* + UnitSAO + */ + +UnitSAO::UnitSAO(ServerEnvironment *env, v3f pos): + ServerActiveObject(env, pos), + m_hp(-1), + m_yaw(0), + m_properties_sent(true), + m_armor_groups_sent(false), + m_animation_range(0,0), + m_animation_speed(0), + m_animation_blend(0), + m_animation_loop(true), + m_animation_sent(false), + m_bone_position_sent(false), + m_attachment_parent_id(0), + m_attachment_sent(false) +{ + // Initialize something to armor groups + m_armor_groups["fleshy"] = 100; +} + +bool UnitSAO::isAttached() const +{ + if (!m_attachment_parent_id) + return false; + // Check if the parent still exists + ServerActiveObject *obj = m_env->getActiveObject(m_attachment_parent_id); + if (obj) + return true; + return false; +} + +void UnitSAO::setArmorGroups(const ItemGroupList &armor_groups) +{ + m_armor_groups = armor_groups; + m_armor_groups_sent = false; +} + +const ItemGroupList &UnitSAO::getArmorGroups() +{ + return m_armor_groups; +} + +void UnitSAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop) +{ + // store these so they can be updated to clients + m_animation_range = frame_range; + m_animation_speed = frame_speed; + m_animation_blend = frame_blend; + m_animation_loop = frame_loop; + m_animation_sent = false; +} + +void UnitSAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop) +{ + *frame_range = m_animation_range; + *frame_speed = m_animation_speed; + *frame_blend = m_animation_blend; + *frame_loop = m_animation_loop; +} + +void UnitSAO::setBonePosition(const std::string &bone, v3f position, v3f rotation) +{ + // store these so they can be updated to clients + m_bone_position[bone] = core::vector2d<v3f>(position, rotation); + m_bone_position_sent = false; +} + +void UnitSAO::getBonePosition(const std::string &bone, v3f *position, v3f *rotation) +{ + *position = m_bone_position[bone].X; + *rotation = m_bone_position[bone].Y; +} + +void UnitSAO::setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation) +{ + // Attachments need to be handled on both the server and client. + // If we just attach on the server, we can only copy the position of the parent. Attachments + // are still sent to clients at an interval so players might see them lagging, plus we can't + // read and attach to skeletal bones. + // If we just attach on the client, the server still sees the child at its original location. + // This breaks some things so we also give the server the most accurate representation + // even if players only see the client changes. + + m_attachment_parent_id = parent_id; + m_attachment_bone = bone; + m_attachment_position = position; + m_attachment_rotation = rotation; + m_attachment_sent = false; +} + +void UnitSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, + v3f *rotation) +{ + *parent_id = m_attachment_parent_id; + *bone = m_attachment_bone; + *position = m_attachment_position; + *rotation = m_attachment_rotation; +} + +void UnitSAO::addAttachmentChild(int child_id) +{ + m_attachment_child_ids.insert(child_id); +} + +void UnitSAO::removeAttachmentChild(int child_id) +{ + m_attachment_child_ids.erase(child_id); +} + +const UNORDERED_SET<int> &UnitSAO::getAttachmentChildIds() +{ + return m_attachment_child_ids; +} + +ObjectProperties* UnitSAO::accessObjectProperties() +{ + return &m_prop; +} + +void UnitSAO::notifyObjectPropertiesModified() +{ + m_properties_sent = false; +} + +/* LuaEntitySAO */ @@ -124,29 +243,18 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos, m_registered(false), m_velocity(0,0,0), m_acceleration(0,0,0), - m_properties_sent(true), m_last_sent_yaw(0), m_last_sent_position(0,0,0), m_last_sent_velocity(0,0,0), m_last_sent_position_timer(0), m_last_sent_move_precision(0), - m_armor_groups_sent(false), - m_animation_speed(0), - m_animation_blend(0), - m_animation_loop(true), - m_animation_sent(false), - m_bone_position_sent(false), - m_attachment_parent_id(0), - m_attachment_sent(false) + m_current_texture_modifier("") { // Only register type if no environment supplied if(env == NULL){ ServerActiveObject::registerType(getType(), create); return; } - - // Initialize something to armor groups - m_armor_groups["fleshy"] = 100; } LuaEntitySAO::~LuaEntitySAO() @@ -218,17 +326,6 @@ ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos, return sao; } -bool LuaEntitySAO::isAttached() -{ - if(!m_attachment_parent_id) - return false; - // Check if the parent still exists - ServerActiveObject *obj = m_env->getActiveObject(m_attachment_parent_id); - if(obj) - return true; - return false; -} - void LuaEntitySAO::step(float dtime, bool send_recommended) { if(!m_properties_sent) @@ -272,7 +369,7 @@ void LuaEntitySAO::step(float dtime, bool send_recommended) v3f p_pos = m_base_position; v3f p_velocity = m_velocity; v3f p_acceleration = m_acceleration; - moveresult = collisionMoveSimple(m_env,m_env->getGameDef(), + moveresult = collisionMoveSimple(m_env, m_env->getGameDef(), pos_max_d, box, m_prop.stepheight, dtime, &p_pos, &p_velocity, p_acceleration, this, m_prop.collideWithObjects); @@ -309,6 +406,20 @@ void LuaEntitySAO::step(float dtime, bool send_recommended) m_env->getScriptIface()->luaentity_Step(m_id, dtime); } + // Remove LuaEntity beyond terrain edges + { + ServerMap *map = dynamic_cast<ServerMap *>(&m_env->getMap()); + assert(map); + if (!m_pending_deactivation && + map->saoPositionOverLimit(m_base_position)) { + infostream << "Remove SAO " << m_id << "(" << m_init_name + << "), outside of limits" << std::endl; + m_pending_deactivation = true; + m_removed = true; + return; + } + } + if(send_recommended == false) return; @@ -373,59 +484,48 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version) { std::ostringstream os(std::ios::binary); - if(protocol_version >= 14) - { - writeU8(os, 1); // version - os<<serializeString(""); // name - writeU8(os, 0); // is_player - writeS16(os, getId()); //id - writeV3F1000(os, m_base_position); - writeF1000(os, m_yaw); - writeS16(os, m_hp); - - std::ostringstream msg_os(std::ios::binary); - msg_os << serializeLongString(getPropertyPacket()); // message 1 - msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2 - msg_os << serializeLongString(gob_cmd_update_animation( - m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3 - for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator - ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) { - msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first, - (*ii).second.X, (*ii).second.Y)); // m_bone_position.size - } - msg_os << serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, - m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4 - int message_count = 4 + m_bone_position.size(); - for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin(); - (ii != m_attachment_child_ids.end()); ++ii) { - if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) { - message_count++; - msg_os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(), - obj->getClientInitializationData(protocol_version))); - } - } + // protocol >= 14 + writeU8(os, 1); // version + os << serializeString(""); // name + writeU8(os, 0); // is_player + writeS16(os, getId()); //id + writeV3F1000(os, m_base_position); + writeF1000(os, m_yaw); + writeS16(os, m_hp); - writeU8(os, message_count); - os.write(msg_os.str().c_str(), msg_os.str().size()); + std::ostringstream msg_os(std::ios::binary); + msg_os << serializeLongString(getPropertyPacket()); // message 1 + msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2 + msg_os << serializeLongString(gob_cmd_update_animation( + m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3 + for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator + ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) { + msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first, + (*ii).second.X, (*ii).second.Y)); // m_bone_position.size } - else - { - writeU8(os, 0); // version - os<<serializeString(""); // name - writeU8(os, 0); // is_player - writeV3F1000(os, m_base_position); - writeF1000(os, m_yaw); - writeS16(os, m_hp); - writeU8(os, 2); // number of messages stuffed in here - os<<serializeLongString(getPropertyPacket()); // message 1 - os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2 + msg_os << serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, + m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4 + int message_count = 4 + m_bone_position.size(); + for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin(); + (ii != m_attachment_child_ids.end()); ++ii) { + if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) { + message_count++; + msg_os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(), + obj->getClientInitializationData(protocol_version))); + } } + msg_os << serializeLongString(gob_cmd_set_texture_mod(m_current_texture_modifier)); + message_count++; + + writeU8(os, message_count); + os.write(msg_os.str().c_str(), msg_os.str().size()); + // return result return os.str(); } -std::string LuaEntitySAO::getStaticData() +void LuaEntitySAO::getStaticData(std::string *result) const { verbosestream<<FUNCTION_NAME<<std::endl; std::ostringstream os(std::ios::binary); @@ -447,7 +547,7 @@ std::string LuaEntitySAO::getStaticData() writeV3F1000(os, m_velocity); // yaw writeF1000(os, m_yaw); - return os.str(); + *result = os.str(); } int LuaEntitySAO::punch(v3f dir, @@ -478,28 +578,32 @@ int LuaEntitySAO::punch(v3f dir, punchitem, time_from_last_punch); - if (result.did_punch) { - setHP(getHP() - result.damage); + bool damage_handled = m_env->getScriptIface()->luaentity_Punch(m_id, puncher, + time_from_last_punch, toolcap, dir, result.did_punch ? result.damage : 0); - if (result.damage > 0) { - std::string punchername = puncher ? puncher->getDescription() : "nil"; + if (!damage_handled) { + if (result.did_punch) { + setHP(getHP() - result.damage); - actionstream << getDescription() << " punched by " - << punchername << ", damage " << result.damage - << " hp, health now " << getHP() << " hp" << std::endl; - } + if (result.damage > 0) { + std::string punchername = puncher ? puncher->getDescription() : "nil"; - std::string str = gob_cmd_punched(result.damage, getHP()); - // create message and add to list - ActiveObjectMessage aom(getId(), true, str); - m_messages_out.push(aom); + actionstream << getDescription() << " punched by " + << punchername << ", damage " << result.damage + << " hp, health now " << getHP() << " hp" << std::endl; + } + + std::string str = gob_cmd_punched(result.damage, getHP()); + // create message and add to list + ActiveObjectMessage aom(getId(), true, str); + m_messages_out.push(aom); + } } if (getHP() == 0) m_removed = true; - m_env->getScriptIface()->luaentity_Punch(m_id, puncher, - time_from_last_punch, toolcap, dir); + return result.wear; } @@ -558,97 +662,6 @@ s16 LuaEntitySAO::getHP() const return m_hp; } -void LuaEntitySAO::setArmorGroups(const ItemGroupList &armor_groups) -{ - m_armor_groups = armor_groups; - m_armor_groups_sent = false; -} - -ItemGroupList LuaEntitySAO::getArmorGroups() -{ - return m_armor_groups; -} - -void LuaEntitySAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop) -{ - m_animation_range = frame_range; - m_animation_speed = frame_speed; - m_animation_blend = frame_blend; - m_animation_loop = frame_loop; - m_animation_sent = false; -} - -void LuaEntitySAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop) -{ - *frame_range = m_animation_range; - *frame_speed = m_animation_speed; - *frame_blend = m_animation_blend; - *frame_loop = m_animation_loop; -} - -void LuaEntitySAO::setBonePosition(const std::string &bone, v3f position, v3f rotation) -{ - m_bone_position[bone] = core::vector2d<v3f>(position, rotation); - m_bone_position_sent = false; -} - -void LuaEntitySAO::getBonePosition(const std::string &bone, v3f *position, v3f *rotation) -{ - *position = m_bone_position[bone].X; - *rotation = m_bone_position[bone].Y; -} - -void LuaEntitySAO::setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation) -{ - // Attachments need to be handled on both the server and client. - // If we just attach on the server, we can only copy the position of the parent. Attachments - // are still sent to clients at an interval so players might see them lagging, plus we can't - // read and attach to skeletal bones. - // If we just attach on the client, the server still sees the child at its original location. - // This breaks some things so we also give the server the most accurate representation - // even if players only see the client changes. - - m_attachment_parent_id = parent_id; - m_attachment_bone = bone; - m_attachment_position = position; - m_attachment_rotation = rotation; - m_attachment_sent = false; -} - -void LuaEntitySAO::getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) -{ - *parent_id = m_attachment_parent_id; - *bone = m_attachment_bone; - *position = m_attachment_position; - *rotation = m_attachment_rotation; -} - -void LuaEntitySAO::addAttachmentChild(int child_id) -{ - m_attachment_child_ids.insert(child_id); -} - -void LuaEntitySAO::removeAttachmentChild(int child_id) -{ - m_attachment_child_ids.erase(child_id); -} - -UNORDERED_SET<int> LuaEntitySAO::getAttachmentChildIds() -{ - return m_attachment_child_ids; -} - -ObjectProperties* LuaEntitySAO::accessObjectProperties() -{ - return &m_prop; -} - -void LuaEntitySAO::notifyObjectPropertiesModified() -{ - m_properties_sent = false; -} - void LuaEntitySAO::setVelocity(v3f velocity) { m_velocity = velocity; @@ -672,11 +685,17 @@ v3f LuaEntitySAO::getAcceleration() void LuaEntitySAO::setTextureMod(const std::string &mod) { std::string str = gob_cmd_set_texture_mod(mod); + m_current_texture_modifier = mod; // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push(aom); } +std::string LuaEntitySAO::getTextureMod() const +{ + return m_current_texture_modifier; +} + void LuaEntitySAO::setSprite(v2s16 p, int num_frames, float framelength, bool select_horiz_by_yawpitch) { @@ -731,7 +750,8 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end) m_messages_out.push(aom); } -bool LuaEntitySAO::getCollisionBox(aabb3f *toset) { +bool LuaEntitySAO::getCollisionBox(aabb3f *toset) const +{ if (m_prop.physical) { //update collision box @@ -747,7 +767,8 @@ bool LuaEntitySAO::getCollisionBox(aabb3f *toset) { return false; } -bool LuaEntitySAO::collideWithObjects(){ +bool LuaEntitySAO::collideWithObjects() const +{ return m_prop.collideWithObjects; } @@ -757,47 +778,41 @@ bool LuaEntitySAO::collideWithObjects(){ // No prototype, PlayerSAO does not need to be deserialized -PlayerSAO::PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer): +PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, u16 peer_id_, + bool is_singleplayer): UnitSAO(env_, v3f(0,0,0)), - m_player(NULL), + m_player(player_), m_peer_id(peer_id_), m_inventory(NULL), m_damage(0), m_last_good_position(0,0,0), + m_time_from_last_teleport(0), m_time_from_last_punch(0), m_nocheat_dig_pos(32767, 32767, 32767), m_nocheat_dig_time(0), m_wield_index(0), m_position_not_sent(false), - m_armor_groups_sent(false), - m_properties_sent(true), m_is_singleplayer(is_singleplayer), - m_animation_speed(0), - m_animation_blend(0), - m_animation_loop(true), - m_animation_sent(false), - m_bone_position_sent(false), - m_attachment_parent_id(0), - m_attachment_sent(false), m_breath(PLAYER_MAX_BREATH), m_pitch(0), m_fov(0), m_wanted_range(0), + m_extended_attributes_modified(false), // public m_physics_override_speed(1), m_physics_override_jump(1), m_physics_override_gravity(1), m_physics_override_sneak(true), - m_physics_override_sneak_glitch(true), + m_physics_override_sneak_glitch(false), + m_physics_override_new_move(true), m_physics_override_sent(false) { assert(m_peer_id != 0); // pre-condition - m_armor_groups["fleshy"] = 100; m_prop.hp_max = PLAYER_MAX_HP; m_prop.physical = false; m_prop.weight = 75; - m_prop.collisionbox = aabb3f(-1/3.,-1.0,-1/3., 1/3.,1.0,1/3.); + m_prop.collisionbox = aabb3f(-0.3f, -1.0f, -0.3f, 0.3f, 0.75f, 0.3f); // start of default appearance, this should be overwritten by LUA m_prop.visual = "upright_sprite"; m_prop.visual_size = v2f(1, 2); @@ -819,7 +834,7 @@ PlayerSAO::~PlayerSAO() delete m_inventory; } -void PlayerSAO::initialize(RemotePlayer *player, const std::set<std::string> &privs) +void PlayerSAO::finalize(RemotePlayer *player, const std::set<std::string> &privs) { assert(player); m_player = player; @@ -827,6 +842,11 @@ void PlayerSAO::initialize(RemotePlayer *player, const std::set<std::string> &pr m_inventory = &m_player->inventory; } +v3f PlayerSAO::getEyeOffset() const +{ + return v3f(0, BS * 1.625f, 0); +} + std::string PlayerSAO::getDescription() { return std::string("player ") + m_player->getName(); @@ -855,93 +875,113 @@ void PlayerSAO::removingFromEnvironment() } } -bool PlayerSAO::isStaticAllowed() const -{ - return false; -} - std::string PlayerSAO::getClientInitializationData(u16 protocol_version) { std::ostringstream os(std::ios::binary); - if(protocol_version >= 15) - { - writeU8(os, 1); // version - os<<serializeString(m_player->getName()); // name - writeU8(os, 1); // is_player - writeS16(os, getId()); //id - writeV3F1000(os, m_base_position + v3f(0,BS*1,0)); - writeF1000(os, m_yaw); - writeS16(os, getHP()); - - std::ostringstream msg_os(std::ios::binary); - msg_os << serializeLongString(getPropertyPacket()); // message 1 - msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2 - msg_os << serializeLongString(gob_cmd_update_animation( - m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3 - for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator - ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) { - msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first, - (*ii).second.X, (*ii).second.Y)); // m_bone_position.size - } - msg_os << serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, - m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4 - msg_os << serializeLongString(gob_cmd_update_physics_override(m_physics_override_speed, - m_physics_override_jump, m_physics_override_gravity, m_physics_override_sneak, - m_physics_override_sneak_glitch)); // 5 - // (GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES) : Deprecated, for backwards compatibility only. - msg_os << serializeLongString(gob_cmd_update_nametag_attributes(m_prop.nametag_color)); // 6 - int message_count = 6 + m_bone_position.size(); - for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin(); - ii != m_attachment_child_ids.end(); ++ii) { - if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) { - message_count++; - msg_os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(), - obj->getClientInitializationData(protocol_version))); - } - } - - writeU8(os, message_count); - os.write(msg_os.str().c_str(), msg_os.str().size()); + // Protocol >= 15 + writeU8(os, 1); // version + os << serializeString(m_player->getName()); // name + writeU8(os, 1); // is_player + writeS16(os, getId()); //id + writeV3F1000(os, m_base_position + v3f(0,BS*1,0)); + writeF1000(os, m_yaw); + writeS16(os, getHP()); + + std::ostringstream msg_os(std::ios::binary); + msg_os << serializeLongString(getPropertyPacket()); // message 1 + msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2 + msg_os << serializeLongString(gob_cmd_update_animation( + m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3 + for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator + ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) { + msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first, + (*ii).second.X, (*ii).second.Y)); // m_bone_position.size } - else - { - writeU8(os, 0); // version - os<<serializeString(m_player->getName()); // name - writeU8(os, 1); // is_player - writeV3F1000(os, m_base_position + v3f(0,BS*1,0)); - writeF1000(os, m_yaw); - writeS16(os, getHP()); - writeU8(os, 2); // number of messages stuffed in here - os<<serializeLongString(getPropertyPacket()); // message 1 - os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2 + msg_os << serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, + m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4 + msg_os << serializeLongString(gob_cmd_update_physics_override(m_physics_override_speed, + m_physics_override_jump, m_physics_override_gravity, m_physics_override_sneak, + m_physics_override_sneak_glitch, m_physics_override_new_move)); // 5 + // (GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES) : Deprecated, for backwards compatibility only. + msg_os << serializeLongString(gob_cmd_update_nametag_attributes(m_prop.nametag_color)); // 6 + int message_count = 6 + m_bone_position.size(); + for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin(); + ii != m_attachment_child_ids.end(); ++ii) { + if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) { + message_count++; + msg_os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(), + obj->getClientInitializationData(protocol_version))); + } } + writeU8(os, message_count); + os.write(msg_os.str().c_str(), msg_os.str().size()); + // return result return os.str(); } -std::string PlayerSAO::getStaticData() -{ - FATAL_ERROR("Deprecated function (?)"); - return ""; -} - -bool PlayerSAO::isAttached() +void PlayerSAO::getStaticData(std::string *result) const { - if(!m_attachment_parent_id) - return false; - // Check if the parent still exists - ServerActiveObject *obj = m_env->getActiveObject(m_attachment_parent_id); - if(obj) - return true; - return false; + FATAL_ERROR("Deprecated function"); } void PlayerSAO::step(float dtime, bool send_recommended) { - if(!m_properties_sent) - { + if (m_drowning_interval.step(dtime, 2.0)) { + // get head position + v3s16 p = floatToInt(m_base_position + v3f(0, BS * 1.6, 0), BS); + MapNode n = m_env->getMap().getNodeNoEx(p); + const ContentFeatures &c = m_env->getGameDef()->ndef()->get(n); + // If node generates drown + if (c.drowning > 0 && m_hp > 0) { + if (m_breath > 0) + setBreath(m_breath - 1); + + // No more breath, damage player + if (m_breath == 0) { + setHP(m_hp - c.drowning); + m_env->getGameDef()->SendPlayerHPOrDie(this); + } + } + } + + if (m_breathing_interval.step(dtime, 0.5)) { + // get head position + v3s16 p = floatToInt(m_base_position + v3f(0, BS * 1.6, 0), BS); + MapNode n = m_env->getMap().getNodeNoEx(p); + const ContentFeatures &c = m_env->getGameDef()->ndef()->get(n); + // If player is alive & no drowning, breath + if (m_hp > 0 && m_breath < PLAYER_MAX_BREATH && c.drowning == 0) + setBreath(m_breath + 1); + } + + if (m_node_hurt_interval.step(dtime, 1.0)) { + // Feet, middle and head + v3s16 p1 = floatToInt(m_base_position + v3f(0, BS*0.1, 0), BS); + MapNode n1 = m_env->getMap().getNodeNoEx(p1); + v3s16 p2 = floatToInt(m_base_position + v3f(0, BS*0.8, 0), BS); + MapNode n2 = m_env->getMap().getNodeNoEx(p2); + v3s16 p3 = floatToInt(m_base_position + v3f(0, BS*1.6, 0), BS); + MapNode n3 = m_env->getMap().getNodeNoEx(p3); + + u32 damage_per_second = 0; + damage_per_second = MYMAX(damage_per_second, + m_env->getGameDef()->ndef()->get(n1).damage_per_second); + damage_per_second = MYMAX(damage_per_second, + m_env->getGameDef()->ndef()->get(n2).damage_per_second); + damage_per_second = MYMAX(damage_per_second, + m_env->getGameDef()->ndef()->get(n3).damage_per_second); + + if (damage_per_second != 0 && m_hp > 0) { + s16 newhp = ((s32) damage_per_second > m_hp ? 0 : m_hp - damage_per_second); + setHP(newhp); + m_env->getGameDef()->SendPlayerHPOrDie(this); + } + } + + if (!m_properties_sent) { m_properties_sent = true; std::string str = getPropertyPacket(); // create message and add to list @@ -957,7 +997,7 @@ void PlayerSAO::step(float dtime, bool send_recommended) m_attachment_position = v3f(0,0,0); m_attachment_rotation = v3f(0,0,0); setBasePosition(m_last_good_position); - ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id); + m_env->getGameDef()->SendMovePlayer(m_peer_id); } //dstream<<"PlayerSAO::step: dtime: "<<dtime<<std::endl; @@ -973,6 +1013,7 @@ void PlayerSAO::step(float dtime, bool send_recommended) // Increment cheat prevention timers m_dig_pool.add(dtime); m_move_pool.add(dtime); + m_time_from_last_teleport += dtime; m_time_from_last_punch += dtime; m_nocheat_dig_time += dtime; @@ -1024,7 +1065,8 @@ void PlayerSAO::step(float dtime, bool send_recommended) m_physics_override_sent = true; std::string str = gob_cmd_update_physics_override(m_physics_override_speed, m_physics_override_jump, m_physics_override_gravity, - m_physics_override_sneak, m_physics_override_sneak_glitch); + m_physics_override_sneak, m_physics_override_sneak_glitch, + m_physics_override_new_move); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push(aom); @@ -1079,7 +1121,9 @@ void PlayerSAO::setPos(const v3f &pos) setBasePosition(pos); // Movement caused by this command is always valid m_last_good_position = pos; - ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id); + m_move_pool.empty(); + m_time_from_last_teleport = 0.0; + m_env->getGameDef()->SendMovePlayer(m_peer_id); } void PlayerSAO::moveTo(v3f pos, bool continuous) @@ -1090,7 +1134,9 @@ void PlayerSAO::moveTo(v3f pos, bool continuous) setBasePosition(pos); // Movement caused by this command is always valid m_last_good_position = pos; - ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id); + m_move_pool.empty(); + m_time_from_last_teleport = 0.0; + m_env->getGameDef()->SendMovePlayer(m_peer_id); } void PlayerSAO::setYaw(const float yaw) @@ -1120,7 +1166,7 @@ void PlayerSAO::setWantedRange(const s16 range) void PlayerSAO::setYawAndSend(const float yaw) { setYaw(yaw); - ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id); + m_env->getGameDef()->SendMovePlayer(m_peer_id); } void PlayerSAO::setPitch(const float pitch) @@ -1134,7 +1180,7 @@ void PlayerSAO::setPitch(const float pitch) void PlayerSAO::setPitchAndSend(const float pitch) { setPitch(pitch); - ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id); + m_env->getGameDef()->SendMovePlayer(m_peer_id); } int PlayerSAO::punch(v3f dir, @@ -1198,10 +1244,6 @@ int PlayerSAO::punch(v3f dir, return hitparams.wear; } -void PlayerSAO::rightClick(ServerActiveObject *) -{ -} - s16 PlayerSAO::readDamage() { s16 damage = m_damage; @@ -1237,105 +1279,15 @@ void PlayerSAO::setHP(s16 hp) m_properties_sent = false; } -void PlayerSAO::setBreath(const u16 breath) +void PlayerSAO::setBreath(const u16 breath, bool send) { if (m_player && breath != m_breath) m_player->setDirty(true); - m_breath = breath; -} + m_breath = MYMIN(breath, PLAYER_MAX_BREATH); -void PlayerSAO::setArmorGroups(const ItemGroupList &armor_groups) -{ - m_armor_groups = armor_groups; - m_armor_groups_sent = false; -} - -ItemGroupList PlayerSAO::getArmorGroups() -{ - return m_armor_groups; -} - -void PlayerSAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop) -{ - // store these so they can be updated to clients - m_animation_range = frame_range; - m_animation_speed = frame_speed; - m_animation_blend = frame_blend; - m_animation_loop = frame_loop; - m_animation_sent = false; -} - -void PlayerSAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop) -{ - *frame_range = m_animation_range; - *frame_speed = m_animation_speed; - *frame_blend = m_animation_blend; - *frame_loop = m_animation_loop; -} - -void PlayerSAO::setBonePosition(const std::string &bone, v3f position, v3f rotation) -{ - // store these so they can be updated to clients - m_bone_position[bone] = core::vector2d<v3f>(position, rotation); - m_bone_position_sent = false; -} - -void PlayerSAO::getBonePosition(const std::string &bone, v3f *position, v3f *rotation) -{ - *position = m_bone_position[bone].X; - *rotation = m_bone_position[bone].Y; -} - -void PlayerSAO::setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation) -{ - // Attachments need to be handled on both the server and client. - // If we just attach on the server, we can only copy the position of the parent. Attachments - // are still sent to clients at an interval so players might see them lagging, plus we can't - // read and attach to skeletal bones. - // If we just attach on the client, the server still sees the child at its original location. - // This breaks some things so we also give the server the most accurate representation - // even if players only see the client changes. - - m_attachment_parent_id = parent_id; - m_attachment_bone = bone; - m_attachment_position = position; - m_attachment_rotation = rotation; - m_attachment_sent = false; -} - -void PlayerSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) -{ - *parent_id = m_attachment_parent_id; - *bone = m_attachment_bone; - *position = m_attachment_position; - *rotation = m_attachment_rotation; -} - -void PlayerSAO::addAttachmentChild(int child_id) -{ - m_attachment_child_ids.insert(child_id); -} - -void PlayerSAO::removeAttachmentChild(int child_id) -{ - m_attachment_child_ids.erase(child_id); -} - -UNORDERED_SET<int> PlayerSAO::getAttachmentChildIds() -{ - return m_attachment_child_ids; -} - -ObjectProperties* PlayerSAO::accessObjectProperties() -{ - return &m_prop; -} - -void PlayerSAO::notifyObjectPropertiesModified() -{ - m_properties_sent = false; + if (send) + m_env->getGameDef()->SendPlayerBreath(this); } Inventory* PlayerSAO::getInventory() @@ -1366,6 +1318,16 @@ ItemStack PlayerSAO::getWieldedItem() const const InventoryList *mlist = inv->getList(getWieldList()); if (mlist && getWieldIndex() < (s32)mlist->getSize()) ret = mlist->getItem(getWieldIndex()); + return ret; +} + +ItemStack PlayerSAO::getWieldedItemOrHand() const +{ + const Inventory *inv = getInventory(); + ItemStack ret; + const InventoryList *mlist = inv->getList(getWieldList()); + if (mlist && getWieldIndex() < (s32)mlist->getSize()) + ret = mlist->getItem(getWieldIndex()); if (ret.name.empty()) { const InventoryList *hlist = inv->getList("hand"); if (hlist) @@ -1380,14 +1342,6 @@ bool PlayerSAO::setWieldedItem(const ItemStack &item) if (inv) { InventoryList *mlist = inv->getList(getWieldList()); if (mlist) { - ItemStack olditem = mlist->getItem(getWieldIndex()); - if (olditem.name.empty()) { - InventoryList *hlist = inv->getList("hand"); - if (hlist) { - hlist->changeItem(0, item); - return true; - } - } mlist->changeItem(getWieldIndex(), item); return true; } @@ -1472,24 +1426,25 @@ bool PlayerSAO::checkMovementCheat() if (m_move_pool.grab(required_time)) { m_last_good_position = m_base_position; } else { - actionstream << "Player " << m_player->getName() - << " moved too fast; resetting position" - << std::endl; + const float LAG_POOL_MIN = 5.0; + float lag_pool_max = m_env->getMaxLagEstimate() * 2.0; + lag_pool_max = MYMAX(lag_pool_max, LAG_POOL_MIN); + if (m_time_from_last_teleport > lag_pool_max) { + actionstream << "Player " << m_player->getName() + << " moved too fast; resetting position" + << std::endl; + cheated = true; + } setBasePosition(m_last_good_position); - cheated = true; } return cheated; } -bool PlayerSAO::getCollisionBox(aabb3f *toset) +bool PlayerSAO::getCollisionBox(aabb3f *toset) const { - *toset = aabb3f(-BS * 0.30, 0.0, -BS * 0.30, BS * 0.30, BS * 1.75, BS * 0.30); + *toset = aabb3f(-0.3f * BS, 0.0f, -0.3f * BS, 0.3f * BS, 1.75f * BS, 0.3f * BS); + toset->MinEdge += m_base_position; toset->MaxEdge += m_base_position; return true; } - -bool PlayerSAO::collideWithObjects() -{ - return true; -} diff --git a/src/content_sao.h b/src/content_sao.h index 86255183d..0dad54805 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -20,17 +20,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef CONTENT_SAO_HEADER #define CONTENT_SAO_HEADER +#include <util/numeric.h> #include "serverobject.h" #include "itemgroup.h" #include "object_properties.h" -#include "constants.h" class UnitSAO: public ServerActiveObject { public: - UnitSAO(ServerEnvironment *env, v3f pos): - ServerActiveObject(env, pos), - m_hp(-1), m_yaw(0) {} + UnitSAO(ServerEnvironment *env, v3f pos); virtual ~UnitSAO() {} virtual void setYaw(const float yaw) { m_yaw = yaw; } @@ -42,9 +40,47 @@ public: s16 getHP() const { return m_hp; } // Use a function, if isDead can be defined by other conditions bool isDead() const { return m_hp == 0; } + + bool isAttached() const; + void setArmorGroups(const ItemGroupList &armor_groups); + const ItemGroupList &getArmorGroups(); + void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop); + void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop); + void setBonePosition(const std::string &bone, v3f position, v3f rotation); + void getBonePosition(const std::string &bone, v3f *position, v3f *rotation); + void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); + void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); + void addAttachmentChild(int child_id); + void removeAttachmentChild(int child_id); + const UNORDERED_SET<int> &getAttachmentChildIds(); + ObjectProperties* accessObjectProperties(); + void notifyObjectPropertiesModified(); protected: s16 m_hp; float m_yaw; + + bool m_properties_sent; + struct ObjectProperties m_prop; + + ItemGroupList m_armor_groups; + bool m_armor_groups_sent; + + v2f m_animation_range; + float m_animation_speed; + float m_animation_blend; + bool m_animation_loop; + bool m_animation_sent; + + // Stores position and rotation for each bone name + UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position; + bool m_bone_position_sent; + + int m_attachment_parent_id; + UNORDERED_SET<int> m_attachment_child_ids; + std::string m_attachment_bone; + v3f m_attachment_position; + v3f m_attachment_rotation; + bool m_attachment_sent; }; /* @@ -64,10 +100,9 @@ public: virtual void addedToEnvironment(u32 dtime_s); static ServerActiveObject* create(ServerEnvironment *env, v3f pos, const std::string &data); - bool isAttached(); void step(float dtime, bool send_recommended); std::string getClientInitializationData(u16 protocol_version); - std::string getStaticData(); + void getStaticData(std::string *result) const; int punch(v3f dir, const ToolCapabilities *toolcap=NULL, ServerActiveObject *puncher=NULL, @@ -79,19 +114,6 @@ public: std::string getDescription(); void setHP(s16 hp); s16 getHP() const; - void setArmorGroups(const ItemGroupList &armor_groups); - ItemGroupList getArmorGroups(); - void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop); - void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop); - void setBonePosition(const std::string &bone, v3f position, v3f rotation); - void getBonePosition(const std::string &bone, v3f *position, v3f *rotation); - void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); - void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); - void addAttachmentChild(int child_id); - void removeAttachmentChild(int child_id); - UNORDERED_SET<int> getAttachmentChildIds(); - ObjectProperties* accessObjectProperties(); - void notifyObjectPropertiesModified(); /* LuaEntitySAO-specific */ void setVelocity(v3f velocity); v3f getVelocity(); @@ -99,11 +121,12 @@ public: v3f getAcceleration(); void setTextureMod(const std::string &mod); + std::string getTextureMod() const; void setSprite(v2s16 p, int num_frames, float framelength, bool select_horiz_by_yawpitch); std::string getName(); - bool getCollisionBox(aabb3f *toset); - bool collideWithObjects(); + bool getCollisionBox(aabb3f *toset) const; + bool collideWithObjects() const; private: std::string getPropertyPacket(); void sendPosition(bool do_interpolate, bool is_movement_end); @@ -111,36 +134,16 @@ private: std::string m_init_name; std::string m_init_state; bool m_registered; - struct ObjectProperties m_prop; v3f m_velocity; v3f m_acceleration; - ItemGroupList m_armor_groups; - - bool m_properties_sent; float m_last_sent_yaw; v3f m_last_sent_position; v3f m_last_sent_velocity; float m_last_sent_position_timer; float m_last_sent_move_precision; - bool m_armor_groups_sent; - - v2f m_animation_range; - float m_animation_speed; - float m_animation_blend; - bool m_animation_loop; - bool m_animation_sent; - - UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position; - bool m_bone_position_sent; - - int m_attachment_parent_id; - UNORDERED_SET<int> m_attachment_child_ids; - std::string m_attachment_bone; - v3f m_attachment_position; - v3f m_attachment_rotation; - bool m_attachment_sent; + std::string m_current_texture_modifier; }; /* @@ -154,18 +157,26 @@ class LagPool public: LagPool(): m_pool(15), m_max(15) {} + void setMax(float new_max) { m_max = new_max; if(m_pool > new_max) m_pool = new_max; } + void add(float dtime) { m_pool -= dtime; if(m_pool < 0) m_pool = 0; } + + void empty() + { + m_pool = m_max; + } + bool grab(float dtime) { if(dtime <= 0) @@ -177,12 +188,13 @@ public: } }; +typedef UNORDERED_MAP<std::string, std::string> PlayerAttributes; class RemotePlayer; class PlayerSAO : public UnitSAO { public: - PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer); + PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, u16 peer_id_, bool is_singleplayer); ~PlayerSAO(); ActiveObjectType getType() const { return ACTIVEOBJECT_TYPE_PLAYER; } @@ -196,10 +208,9 @@ public: void addedToEnvironment(u32 dtime_s); void removingFromEnvironment(); - bool isStaticAllowed() const; + bool isStaticAllowed() const { return false; } std::string getClientInitializationData(u16 protocol_version); - std::string getStaticData(); - bool isAttached(); + void getStaticData(std::string *result) const; void step(float dtime, bool send_recommended); void setBasePosition(const v3f &position); void setPos(const v3f &pos); @@ -227,25 +238,12 @@ public: const ToolCapabilities *toolcap, ServerActiveObject *puncher, float time_from_last_punch); - void rightClick(ServerActiveObject *clicker); + void rightClick(ServerActiveObject *clicker) {} void setHP(s16 hp); void setHPRaw(s16 hp) { m_hp = hp; } s16 readDamage(); u16 getBreath() const { return m_breath; } - void setBreath(const u16 breath); - void setArmorGroups(const ItemGroupList &armor_groups); - ItemGroupList getArmorGroups(); - void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop); - void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop); - void setBonePosition(const std::string &bone, v3f position, v3f rotation); - void getBonePosition(const std::string &bone, v3f *position, v3f *rotation); - void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); - void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); - void addAttachmentChild(int child_id); - void removeAttachmentChild(int child_id); - UNORDERED_SET<int> getAttachmentChildIds(); - ObjectProperties* accessObjectProperties(); - void notifyObjectPropertiesModified(); + void setBreath(const u16 breath, bool send = true); /* Inventory interface @@ -256,11 +254,55 @@ public: InventoryLocation getInventoryLocation() const; std::string getWieldList() const; ItemStack getWieldedItem() const; + ItemStack getWieldedItemOrHand() const; bool setWieldedItem(const ItemStack &item); int getWieldIndex() const; void setWieldIndex(int i); /* + Modding interface + */ + inline void setExtendedAttribute(const std::string &attr, const std::string &value) + { + m_extra_attributes[attr] = value; + m_extended_attributes_modified = true; + } + + inline bool getExtendedAttribute(const std::string &attr, std::string *value) + { + if (m_extra_attributes.find(attr) == m_extra_attributes.end()) + return false; + + *value = m_extra_attributes[attr]; + return true; + } + + inline void removeExtendedAttribute(const std::string &attr) + { + PlayerAttributes::iterator it = m_extra_attributes.find(attr); + if (it == m_extra_attributes.end()) + return; + + m_extra_attributes.erase(it); + m_extended_attributes_modified = true; + } + + inline const PlayerAttributes &getExtendedAttributes() + { + return m_extra_attributes; + } + + inline bool extendedAttributesModified() const + { + return m_extended_attributes_modified; + } + + inline void setExtendedAttributeModified(bool v) + { + m_extended_attributes_modified = v; + } + + /* PlayerSAO-specific */ @@ -314,13 +356,13 @@ public: m_is_singleplayer = is_singleplayer; } - bool getCollisionBox(aabb3f *toset); - bool collideWithObjects(); + bool getCollisionBox(aabb3f *toset) const; + bool collideWithObjects() const { return true; } - void initialize(RemotePlayer *player, const std::set<std::string> &privs); + void finalize(RemotePlayer *player, const std::set<std::string> &privs); v3f getEyePosition() const { return m_base_position + getEyeOffset(); } - v3f getEyeOffset() const { return v3f(0, BS * 1.625f, 0); } + v3f getEyeOffset() const; private: std::string getPropertyPacket(); @@ -335,47 +377,37 @@ private: LagPool m_dig_pool; LagPool m_move_pool; v3f m_last_good_position; + float m_time_from_last_teleport; float m_time_from_last_punch; v3s16 m_nocheat_dig_pos; float m_nocheat_dig_time; + // Timers + IntervalLimiter m_breathing_interval; + IntervalLimiter m_drowning_interval; + IntervalLimiter m_node_hurt_interval; + int m_wield_index; bool m_position_not_sent; - ItemGroupList m_armor_groups; - bool m_armor_groups_sent; - bool m_properties_sent; - struct ObjectProperties m_prop; // Cached privileges for enforcement std::set<std::string> m_privs; bool m_is_singleplayer; - v2f m_animation_range; - float m_animation_speed; - float m_animation_blend; - bool m_animation_loop; - bool m_animation_sent; - - // Stores position and rotation for each bone name - UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position; - bool m_bone_position_sent; - - int m_attachment_parent_id; - UNORDERED_SET<int> m_attachment_child_ids; - std::string m_attachment_bone; - v3f m_attachment_position; - v3f m_attachment_rotation; - bool m_attachment_sent; u16 m_breath; f32 m_pitch; f32 m_fov; s16 m_wanted_range; + + PlayerAttributes m_extra_attributes; + bool m_extended_attributes_modified; public: float m_physics_override_speed; float m_physics_override_jump; float m_physics_override_gravity; bool m_physics_override_sneak; bool m_physics_override_sneak_glitch; + bool m_physics_override_new_move; bool m_physics_override_sent; }; diff --git a/src/craftdef.cpp b/src/craftdef.cpp index 45d3018a7..286d1eada 100644 --- a/src/craftdef.cpp +++ b/src/craftdef.cpp @@ -139,7 +139,7 @@ static std::vector<ItemStack> craftGetItems( for (std::vector<std::string>::size_type i = 0; i < items.size(); i++) { result.push_back(ItemStack(std::string(items[i]), (u16)1, - (u16)0, "", gamedef->getItemDefManager())); + (u16)0, gamedef->getItemDefManager())); } return result; } @@ -1126,4 +1126,3 @@ IWritableCraftDefManager* createCraftDefManager() { return new CCraftDefManager(); } - diff --git a/src/craftdef.h b/src/craftdef.h index 695ee0c2c..bdd741f7c 100644 --- a/src/craftdef.h +++ b/src/craftdef.h @@ -97,7 +97,7 @@ struct CraftOutput CraftOutput(): item(""), time(0) {} - CraftOutput(std::string item_, float time_): + CraftOutput(const std::string &item_, float time_): item(item_), time(time_) {} std::string dump() const; @@ -124,7 +124,7 @@ struct CraftReplacements CraftReplacements(): pairs() {} - CraftReplacements(std::vector<std::pair<std::string, std::string> > pairs_): + CraftReplacements(const std::vector<std::pair<std::string, std::string> > &pairs_): pairs(pairs_) {} std::string dump() const; @@ -359,10 +359,13 @@ public: CraftDefinitionFuel(): recipe(""), hash_inited(false), burntime() {} - CraftDefinitionFuel(std::string recipe_, + CraftDefinitionFuel(const std::string &recipe_, float burntime_, const CraftReplacements &replacements_): - recipe(recipe_), hash_inited(false), burntime(burntime_), replacements(replacements_) + recipe(recipe_), + hash_inited(false), + burntime(burntime_), + replacements(replacements_) {} virtual ~CraftDefinitionFuel(){} diff --git a/src/database-dummy.h b/src/database-dummy.h index 72100edd0..7d1cb2279 100644 --- a/src/database-dummy.h +++ b/src/database-dummy.h @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "database.h" #include "irrlichttypes.h" -class Database_Dummy : public Database +class Database_Dummy : public MapDatabase, public PlayerDatabase { public: bool saveBlock(const v3s16 &pos, const std::string &data); @@ -33,9 +33,15 @@ public: bool deleteBlock(const v3s16 &pos); void listAllLoadableBlocks(std::vector<v3s16> &dst); + void savePlayer(RemotePlayer *player) {} + bool loadPlayer(RemotePlayer *player, PlayerSAO *sao) { return true; } + bool removePlayer(const std::string &name) { return true; } + void listPlayers(std::vector<std::string> &) {} + + void beginSave() {} + void endSave() {} private: std::map<s64, std::string> m_database; }; #endif - diff --git a/src/database-files.cpp b/src/database-files.cpp new file mode 100644 index 000000000..3b130f91b --- /dev/null +++ b/src/database-files.cpp @@ -0,0 +1,179 @@ +/* +Minetest +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include <cassert> +#include <json/json.h> +#include "database-files.h" +#include "content_sao.h" +#include "remoteplayer.h" +#include "settings.h" +#include "porting.h" +#include "filesys.h" + +// !!! WARNING !!! +// This backend is intended to be used on Minetest 0.4.16 only for the transition backend +// for player files + +void PlayerDatabaseFiles::serialize(std::ostringstream &os, RemotePlayer *player) +{ + // Utilize a Settings object for storing values + Settings args; + args.setS32("version", 1); + args.set("name", player->getName()); + + sanity_check(player->getPlayerSAO()); + args.setS32("hp", player->getPlayerSAO()->getHP()); + args.setV3F("position", player->getPlayerSAO()->getBasePosition()); + args.setFloat("pitch", player->getPlayerSAO()->getPitch()); + args.setFloat("yaw", player->getPlayerSAO()->getYaw()); + args.setS32("breath", player->getPlayerSAO()->getBreath()); + + std::string extended_attrs = ""; + player->serializeExtraAttributes(extended_attrs); + args.set("extended_attributes", extended_attrs); + + args.writeLines(os); + + os << "PlayerArgsEnd\n"; + + player->inventory.serialize(os); +} + +void PlayerDatabaseFiles::savePlayer(RemotePlayer *player) +{ + std::string savedir = m_savedir + DIR_DELIM; + std::string path = savedir + player->getName(); + bool path_found = false; + RemotePlayer testplayer("", NULL); + + for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES && !path_found; i++) { + if (!fs::PathExists(path)) { + path_found = true; + continue; + } + + // Open and deserialize file to check player name + std::ifstream is(path.c_str(), std::ios_base::binary); + if (!is.good()) { + errorstream << "Failed to open " << path << std::endl; + return; + } + + testplayer.deSerialize(is, path, NULL); + is.close(); + if (strcmp(testplayer.getName(), player->getName()) == 0) { + path_found = true; + continue; + } + + path = savedir + player->getName() + itos(i); + } + + if (!path_found) { + errorstream << "Didn't find free file for player " << player->getName() + << std::endl; + return; + } + + // Open and serialize file + std::ostringstream ss(std::ios_base::binary); + serialize(ss, player); + if (!fs::safeWriteToFile(path, ss.str())) { + infostream << "Failed to write " << path << std::endl; + } + player->setModified(false); +} + +bool PlayerDatabaseFiles::removePlayer(const std::string &name) +{ + std::string players_path = m_savedir + DIR_DELIM; + std::string path = players_path + name; + + RemotePlayer temp_player("", NULL); + for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) { + // Open file and deserialize + std::ifstream is(path.c_str(), std::ios_base::binary); + if (!is.good()) + continue; + + temp_player.deSerialize(is, path, NULL); + is.close(); + + if (temp_player.getName() == name) { + fs::DeleteSingleFileOrEmptyDirectory(path); + return true; + } + + path = players_path + name + itos(i); + } + + return false; +} + +bool PlayerDatabaseFiles::loadPlayer(RemotePlayer *player, PlayerSAO *sao) +{ + std::string players_path = m_savedir + DIR_DELIM; + std::string path = players_path + player->getName(); + + const std::string player_to_load = player->getName(); + for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) { + // Open file and deserialize + std::ifstream is(path.c_str(), std::ios_base::binary); + if (!is.good()) + continue; + + player->deSerialize(is, path, sao); + is.close(); + + if (player->getName() == player_to_load) + return true; + + path = players_path + player_to_load + itos(i); + } + + infostream << "Player file for player " << player_to_load << " not found" << std::endl; + return false; +} + +void PlayerDatabaseFiles::listPlayers(std::vector<std::string> &res) +{ + std::vector<fs::DirListNode> files = fs::GetDirListing(m_savedir); + // list files into players directory + for (std::vector<fs::DirListNode>::const_iterator it = files.begin(); it != + files.end(); ++it) { + // Ignore directories + if (it->dir) + continue; + + const std::string &filename = it->name; + std::string full_path = m_savedir + DIR_DELIM + filename; + std::ifstream is(full_path.c_str(), std::ios_base::binary); + if (!is.good()) + continue; + + RemotePlayer player(filename.c_str(), NULL); + // Null env & dummy peer_id + PlayerSAO playerSAO(NULL, &player, 15789, false); + + player.deSerialize(is, "", &playerSAO); + is.close(); + + res.push_back(player.getName()); + } +} diff --git a/src/database-files.h b/src/database-files.h new file mode 100644 index 000000000..888362249 --- /dev/null +++ b/src/database-files.h @@ -0,0 +1,46 @@ +/* +Minetest +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef DATABASE_FILES_HEADER +#define DATABASE_FILES_HEADER + +// !!! WARNING !!! +// This backend is intended to be used on Minetest 0.4.16 only for the transition backend +// for player files + +#include "database.h" + +class PlayerDatabaseFiles : public PlayerDatabase +{ +public: + PlayerDatabaseFiles(const std::string &savedir) : m_savedir(savedir) {} + virtual ~PlayerDatabaseFiles() {} + + void savePlayer(RemotePlayer *player); + bool loadPlayer(RemotePlayer *player, PlayerSAO *sao); + bool removePlayer(const std::string &name); + void listPlayers(std::vector<std::string> &res); + +private: + void serialize(std::ostringstream &os, RemotePlayer *player); + + std::string m_savedir; +}; + +#endif diff --git a/src/database-leveldb.h b/src/database-leveldb.h index 3993db0c3..52ccebe70 100644 --- a/src/database-leveldb.h +++ b/src/database-leveldb.h @@ -24,11 +24,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #if USE_LEVELDB +#include <string> #include "database.h" #include "leveldb/db.h" -#include <string> -class Database_LevelDB : public Database +class Database_LevelDB : public MapDatabase { public: Database_LevelDB(const std::string &savedir); @@ -39,6 +39,8 @@ public: bool deleteBlock(const v3s16 &pos); void listAllLoadableBlocks(std::vector<v3s16> &dst); + void beginSave() {} + void endSave() {} private: leveldb::DB *m_database; }; @@ -46,4 +48,3 @@ private: #endif // USE_LEVELDB #endif - diff --git a/src/database-postgresql.cpp b/src/database-postgresql.cpp index 3b6b42aea..a6b62bad5 100644 --- a/src/database-postgresql.cpp +++ b/src/database-postgresql.cpp @@ -39,13 +39,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "exceptions.h" #include "settings.h" +#include "content_sao.h" +#include "remoteplayer.h" -Database_PostgreSQL::Database_PostgreSQL(const Settings &conf) : - m_connect_string(""), +Database_PostgreSQL::Database_PostgreSQL(const std::string &connect_string) : + m_connect_string(connect_string), m_conn(NULL), m_pgversion(0) { - if (!conf.getNoEx("pgsql_connection", m_connect_string)) { + if (m_connect_string.empty()) { throw SettingNotFoundException( "Set pgsql_connection string in world.mt to " "use the postgresql backend\n" @@ -57,8 +59,6 @@ Database_PostgreSQL::Database_PostgreSQL(const Settings &conf) : "DELETE rights on the database.\n" "Don't create mt_user as a SUPERUSER!"); } - - connectToDatabase(); } Database_PostgreSQL::~Database_PostgreSQL() @@ -80,12 +80,12 @@ void Database_PostgreSQL::connectToDatabase() /* * We are using UPSERT feature from PostgreSQL 9.5 - * to have the better performance, - * set the minimum version to 90500 + * to have the better performance where possible. */ if (m_pgversion < 90500) { - throw DatabaseException("PostgreSQL database error: " - "Server version 9.5 or greater required."); + warningstream << "Your PostgreSQL server lacks UPSERT " + << "support. Use version 9.5 or better if possible." + << std::endl; } infostream << "PostgreSQL Database: Version " << m_pgversion @@ -118,26 +118,6 @@ bool Database_PostgreSQL::initialized() const return (PQstatus(m_conn) == CONNECTION_OK); } -void Database_PostgreSQL::initStatements() -{ - prepareStatement("read_block", - "SELECT data FROM blocks " - "WHERE posX = $1::int4 AND posY = $2::int4 AND " - "posZ = $3::int4"); - - prepareStatement("write_block", - "INSERT INTO blocks (posX, posY, posZ, data) VALUES " - "($1::int4, $2::int4, $3::int4, $4::bytea) " - "ON CONFLICT ON CONSTRAINT blocks_pkey DO " - "UPDATE SET data = $4::bytea"); - - prepareStatement("delete_block", "DELETE FROM blocks WHERE " - "posX = $1::int4 AND posY = $2::int4 AND posZ = $3::int4"); - - prepareStatement("list_all_loadable_blocks", - "SELECT posX, posY, posZ FROM blocks"); -} - PGresult *Database_PostgreSQL::checkResults(PGresult *result, bool clear) { ExecStatusType statusType = PQresultStatus(result); @@ -159,30 +139,21 @@ PGresult *Database_PostgreSQL::checkResults(PGresult *result, bool clear) return result; } -void Database_PostgreSQL::createDatabase() +void Database_PostgreSQL::createTableIfNotExists(const std::string &table_name, + const std::string &definition) { - PGresult *result = checkResults(PQexec(m_conn, - "SELECT relname FROM pg_class WHERE relname='blocks';"), - false); + std::string sql_check_table = "SELECT relname FROM pg_class WHERE relname='" + + table_name + "';"; + PGresult *result = checkResults(PQexec(m_conn, sql_check_table.c_str()), false); // If table doesn't exist, create it if (!PQntuples(result)) { - static const char* dbcreate_sql = "CREATE TABLE blocks (" - "posX INT NOT NULL," - "posY INT NOT NULL," - "posZ INT NOT NULL," - "data BYTEA," - "PRIMARY KEY (posX,posY,posZ)" - ");"; - checkResults(PQexec(m_conn, dbcreate_sql)); + checkResults(PQexec(m_conn, definition.c_str())); } PQclear(result); - - infostream << "PostgreSQL: Game Database was inited." << std::endl; } - void Database_PostgreSQL::beginSave() { verifyDatabase(); @@ -194,14 +165,70 @@ void Database_PostgreSQL::endSave() checkResults(PQexec(m_conn, "COMMIT;")); } -bool Database_PostgreSQL::saveBlock(const v3s16 &pos, - const std::string &data) +MapDatabasePostgreSQL::MapDatabasePostgreSQL(const std::string &connect_string): + Database_PostgreSQL(connect_string), + MapDatabase() +{ + connectToDatabase(); +} + + +void MapDatabasePostgreSQL::createDatabase() +{ + createTableIfNotExists("blocks", + "CREATE TABLE blocks (" + "posX INT NOT NULL," + "posY INT NOT NULL," + "posZ INT NOT NULL," + "data BYTEA," + "PRIMARY KEY (posX,posY,posZ)" + ");" + ); + + infostream << "PostgreSQL: Map Database was initialized." << std::endl; +} + +void MapDatabasePostgreSQL::initStatements() +{ + prepareStatement("read_block", + "SELECT data FROM blocks " + "WHERE posX = $1::int4 AND posY = $2::int4 AND " + "posZ = $3::int4"); + + if (getPGVersion() < 90500) { + prepareStatement("write_block_insert", + "INSERT INTO blocks (posX, posY, posZ, data) SELECT " + "$1::int4, $2::int4, $3::int4, $4::bytea " + "WHERE NOT EXISTS (SELECT true FROM blocks " + "WHERE posX = $1::int4 AND posY = $2::int4 AND " + "posZ = $3::int4)"); + + prepareStatement("write_block_update", + "UPDATE blocks SET data = $4::bytea " + "WHERE posX = $1::int4 AND posY = $2::int4 AND " + "posZ = $3::int4"); + } else { + prepareStatement("write_block", + "INSERT INTO blocks (posX, posY, posZ, data) VALUES " + "($1::int4, $2::int4, $3::int4, $4::bytea) " + "ON CONFLICT ON CONSTRAINT blocks_pkey DO " + "UPDATE SET data = $4::bytea"); + } + + prepareStatement("delete_block", "DELETE FROM blocks WHERE " + "posX = $1::int4 AND posY = $2::int4 AND posZ = $3::int4"); + + prepareStatement("list_all_loadable_blocks", + "SELECT posX, posY, posZ FROM blocks"); +} + +bool MapDatabasePostgreSQL::saveBlock(const v3s16 &pos, const std::string &data) { // Verify if we don't overflow the platform integer with the mapblock size if (data.size() > INT_MAX) { errorstream << "Database_PostgreSQL::saveBlock: Data truncation! " - << "data.size() over 0xFFFF (== " << data.size() - << ")" << std::endl; + << "data.size() over 0xFFFFFFFF (== " << data.size() + << ")" << std::endl; return false; } @@ -218,12 +245,16 @@ bool Database_PostgreSQL::saveBlock(const v3s16 &pos, }; const int argFmt[] = { 1, 1, 1, 1 }; - execPrepared("write_block", ARRLEN(args), args, argLen, argFmt); + if (getPGVersion() < 90500) { + execPrepared("write_block_update", ARRLEN(args), args, argLen, argFmt); + execPrepared("write_block_insert", ARRLEN(args), args, argLen, argFmt); + } else { + execPrepared("write_block", ARRLEN(args), args, argLen, argFmt); + } return true; } -void Database_PostgreSQL::loadBlock(const v3s16 &pos, - std::string *block) +void MapDatabasePostgreSQL::loadBlock(const v3s16 &pos, std::string *block) { verifyDatabase(); @@ -237,19 +268,17 @@ void Database_PostgreSQL::loadBlock(const v3s16 &pos, const int argFmt[] = { 1, 1, 1 }; PGresult *results = execPrepared("read_block", ARRLEN(args), args, - argLen, argFmt, false); + argLen, argFmt, false); *block = ""; - if (PQntuples(results)) { - *block = std::string(PQgetvalue(results, 0, 0), - PQgetlength(results, 0, 0)); - } + if (PQntuples(results)) + *block = std::string(PQgetvalue(results, 0, 0), PQgetlength(results, 0, 0)); PQclear(results); } -bool Database_PostgreSQL::deleteBlock(const v3s16 &pos) +bool MapDatabasePostgreSQL::deleteBlock(const v3s16 &pos) { verifyDatabase(); @@ -262,24 +291,344 @@ bool Database_PostgreSQL::deleteBlock(const v3s16 &pos) const int argLen[] = { sizeof(x), sizeof(y), sizeof(z) }; const int argFmt[] = { 1, 1, 1 }; - execPrepared("read_block", ARRLEN(args), args, argLen, argFmt); + execPrepared("delete_block", ARRLEN(args), args, argLen, argFmt); return true; } -void Database_PostgreSQL::listAllLoadableBlocks(std::vector<v3s16> &dst) +void MapDatabasePostgreSQL::listAllLoadableBlocks(std::vector<v3s16> &dst) { verifyDatabase(); PGresult *results = execPrepared("list_all_loadable_blocks", 0, - NULL, NULL, NULL, false, false); + NULL, NULL, NULL, false, false); int numrows = PQntuples(results); - for (int row = 0; row < numrows; ++row) { + for (int row = 0; row < numrows; ++row) dst.push_back(pg_to_v3s16(results, 0, 0)); + + PQclear(results); +} + +/* + * Player Database + */ +PlayerDatabasePostgreSQL::PlayerDatabasePostgreSQL(const std::string &connect_string): + Database_PostgreSQL(connect_string), + PlayerDatabase() +{ + connectToDatabase(); +} + + +void PlayerDatabasePostgreSQL::createDatabase() +{ + createTableIfNotExists("player", + "CREATE TABLE player (" + "name VARCHAR(60) NOT NULL," + "pitch NUMERIC(15, 7) NOT NULL," + "yaw NUMERIC(15, 7) NOT NULL," + "posX NUMERIC(15, 7) NOT NULL," + "posY NUMERIC(15, 7) NOT NULL," + "posZ NUMERIC(15, 7) NOT NULL," + "hp INT NOT NULL," + "breath INT NOT NULL," + "creation_date TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW()," + "modification_date TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW()," + "PRIMARY KEY (name)" + ");" + ); + + createTableIfNotExists("player_inventories", + "CREATE TABLE player_inventories (" + "player VARCHAR(60) NOT NULL," + "inv_id INT NOT NULL," + "inv_width INT NOT NULL," + "inv_name TEXT NOT NULL DEFAULT ''," + "inv_size INT NOT NULL," + "PRIMARY KEY(player, inv_id)," + "CONSTRAINT player_inventories_fkey FOREIGN KEY (player) REFERENCES " + "player (name) ON DELETE CASCADE" + ");" + ); + + createTableIfNotExists("player_inventory_items", + "CREATE TABLE player_inventory_items (" + "player VARCHAR(60) NOT NULL," + "inv_id INT NOT NULL," + "slot_id INT NOT NULL," + "item TEXT NOT NULL DEFAULT ''," + "PRIMARY KEY(player, inv_id, slot_id)," + "CONSTRAINT player_inventory_items_fkey FOREIGN KEY (player) REFERENCES " + "player (name) ON DELETE CASCADE" + ");" + ); + + createTableIfNotExists("player_metadata", + "CREATE TABLE player_metadata (" + "player VARCHAR(60) NOT NULL," + "attr VARCHAR(256) NOT NULL," + "value TEXT," + "PRIMARY KEY(player, attr)," + "CONSTRAINT player_metadata_fkey FOREIGN KEY (player) REFERENCES " + "player (name) ON DELETE CASCADE" + ");" + ); + + infostream << "PostgreSQL: Player Database was inited." << std::endl; +} + +void PlayerDatabasePostgreSQL::initStatements() +{ + if (getPGVersion() < 90500) { + prepareStatement("create_player", + "INSERT INTO player(name, pitch, yaw, posX, posY, posZ, hp, breath) VALUES " + "($1, $2, $3, $4, $5, $6, $7::int, $8::int)"); + + prepareStatement("update_player", + "UPDATE SET pitch = $2, yaw = $3, posX = $4, posY = $5, posZ = $6, hp = $7::int, " + "breath = $8::int, modification_date = NOW() WHERE name = $1"); + } else { + prepareStatement("save_player", + "INSERT INTO player(name, pitch, yaw, posX, posY, posZ, hp, breath) VALUES " + "($1, $2, $3, $4, $5, $6, $7::int, $8::int)" + "ON CONFLICT ON CONSTRAINT player_pkey DO UPDATE SET pitch = $2, yaw = $3, " + "posX = $4, posY = $5, posZ = $6, hp = $7::int, breath = $8::int, " + "modification_date = NOW()"); } + prepareStatement("remove_player", "DELETE FROM player WHERE name = $1"); + + prepareStatement("load_player_list", "SELECT name FROM player"); + + prepareStatement("remove_player_inventories", + "DELETE FROM player_inventories WHERE player = $1"); + + prepareStatement("remove_player_inventory_items", + "DELETE FROM player_inventory_items WHERE player = $1"); + + prepareStatement("add_player_inventory", + "INSERT INTO player_inventories (player, inv_id, inv_width, inv_name, inv_size) VALUES " + "($1, $2::int, $3::int, $4, $5::int)"); + + prepareStatement("add_player_inventory_item", + "INSERT INTO player_inventory_items (player, inv_id, slot_id, item) VALUES " + "($1, $2::int, $3::int, $4)"); + + prepareStatement("load_player_inventories", + "SELECT inv_id, inv_width, inv_name, inv_size FROM player_inventories " + "WHERE player = $1 ORDER BY inv_id"); + + prepareStatement("load_player_inventory_items", + "SELECT slot_id, item FROM player_inventory_items WHERE " + "player = $1 AND inv_id = $2::int"); + + prepareStatement("load_player", + "SELECT pitch, yaw, posX, posY, posZ, hp, breath FROM player WHERE name = $1"); + + prepareStatement("remove_player_metadata", + "DELETE FROM player_metadata WHERE player = $1"); + + prepareStatement("save_player_metadata", + "INSERT INTO player_metadata (player, attr, value) VALUES ($1, $2, $3)"); + + prepareStatement("load_player_metadata", + "SELECT attr, value FROM player_metadata WHERE player = $1"); + +} + +bool PlayerDatabasePostgreSQL::playerDataExists(const std::string &playername) +{ + verifyDatabase(); + + const char *values[] = { playername.c_str() }; + PGresult *results = execPrepared("load_player", 1, values, false); + + bool res = (PQntuples(results) > 0); + PQclear(results); + return res; +} + +void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player) +{ + PlayerSAO* sao = player->getPlayerSAO(); + if (!sao) + return; + + verifyDatabase(); + + v3f pos = sao->getBasePosition(); + std::string pitch = ftos(sao->getPitch()); + std::string yaw = ftos(sao->getYaw()); + std::string posx = ftos(pos.X); + std::string posy = ftos(pos.Y); + std::string posz = ftos(pos.Z); + std::string hp = itos(sao->getHP()); + std::string breath = itos(sao->getBreath()); + const char *values[] = { + player->getName(), + pitch.c_str(), + yaw.c_str(), + posx.c_str(), posy.c_str(), posz.c_str(), + hp.c_str(), + breath.c_str() + }; + + const char* rmvalues[] = { player->getName() }; + beginSave(); + + if (getPGVersion() < 90500) { + if (!playerDataExists(player->getName())) + execPrepared("create_player", 8, values, true, false); + else + execPrepared("update_player", 8, values, true, false); + } + else + execPrepared("save_player", 8, values, true, false); + + // Write player inventories + execPrepared("remove_player_inventories", 1, rmvalues); + execPrepared("remove_player_inventory_items", 1, rmvalues); + + std::vector<const InventoryList*> inventory_lists = sao->getInventory()->getLists(); + for (u16 i = 0; i < inventory_lists.size(); i++) { + const InventoryList* list = inventory_lists[i]; + std::string name = list->getName(), width = itos(list->getWidth()), + inv_id = itos(i), lsize = itos(list->getSize()); + + const char* inv_values[] = { + player->getName(), + inv_id.c_str(), + width.c_str(), + name.c_str(), + lsize.c_str() + }; + execPrepared("add_player_inventory", 5, inv_values); + + for (u32 j = 0; j < list->getSize(); j++) { + std::ostringstream os; + list->getItem(j).serialize(os); + std::string itemStr = os.str(), slotId = itos(j); + + const char* invitem_values[] = { + player->getName(), + inv_id.c_str(), + slotId.c_str(), + itemStr.c_str() + }; + execPrepared("add_player_inventory_item", 4, invitem_values); + } + } + + execPrepared("remove_player_metadata", 1, rmvalues); + const PlayerAttributes &attrs = sao->getExtendedAttributes(); + for (PlayerAttributes::const_iterator it = attrs.begin(); it != attrs.end(); ++it) { + const char *meta_values[] = { + player->getName(), + it->first.c_str(), + it->second.c_str() + }; + execPrepared("save_player_metadata", 3, meta_values); + } + endSave(); +} + +bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao) +{ + sanity_check(sao); + verifyDatabase(); + + const char *values[] = { player->getName() }; + PGresult *results = execPrepared("load_player", 1, values, false, false); + + // Player not found, return not found + if (!PQntuples(results)) { + PQclear(results); + return false; + } + + sao->setPitch(pg_to_float(results, 0, 0)); + sao->setYaw(pg_to_float(results, 0, 1)); + sao->setBasePosition(v3f( + pg_to_float(results, 0, 2), + pg_to_float(results, 0, 3), + pg_to_float(results, 0, 4)) + ); + sao->setHPRaw((s16) pg_to_int(results, 0, 5)); + sao->setBreath((u16) pg_to_int(results, 0, 6), false); + + PQclear(results); + + // Load inventory + results = execPrepared("load_player_inventories", 1, values, false, false); + + int resultCount = PQntuples(results); + + for (int row = 0; row < resultCount; ++row) { + InventoryList* invList = player->inventory. + addList(PQgetvalue(results, row, 2), pg_to_uint(results, row, 3)); + invList->setWidth(pg_to_uint(results, row, 1)); + + u32 invId = pg_to_uint(results, row, 0); + std::string invIdStr = itos(invId); + + const char* values2[] = { + player->getName(), + invIdStr.c_str() + }; + PGresult *results2 = execPrepared("load_player_inventory_items", 2, + values2, false, false); + + int resultCount2 = PQntuples(results2); + for (int row2 = 0; row2 < resultCount2; row2++) { + const std::string itemStr = PQgetvalue(results2, row2, 1); + if (itemStr.length() > 0) { + ItemStack stack; + stack.deSerialize(itemStr); + invList->addItem(pg_to_uint(results2, row2, 0), stack); + } + } + PQclear(results2); + } + + PQclear(results); + + results = execPrepared("load_player_metadata", 1, values, false); + + int numrows = PQntuples(results); + for (int row = 0; row < numrows; row++) { + sao->setExtendedAttribute(PQgetvalue(results, row, 0),PQgetvalue(results, row, 1)); + } + + PQclear(results); + + return true; +} + +bool PlayerDatabasePostgreSQL::removePlayer(const std::string &name) +{ + if (!playerDataExists(name)) + return false; + + verifyDatabase(); + + const char *values[] = { name.c_str() }; + execPrepared("remove_player", 1, values); + + return true; +} + +void PlayerDatabasePostgreSQL::listPlayers(std::vector<std::string> &res) +{ + verifyDatabase(); + + PGresult *results = execPrepared("load_player_list", 0, NULL, false); + + int numrows = PQntuples(results); + for (int row = 0; row < numrows; row++) + res.push_back(PQgetvalue(results, row, 0)); + PQclear(results); } diff --git a/src/database-postgresql.h b/src/database-postgresql.h index 1cfa544e3..d6f208fd9 100644 --- a/src/database-postgresql.h +++ b/src/database-postgresql.h @@ -27,53 +27,33 @@ with this program; if not, write to the Free Software Foundation, Inc., class Settings; -class Database_PostgreSQL : public Database +class Database_PostgreSQL: public Database { public: - Database_PostgreSQL(const Settings &conf); + Database_PostgreSQL(const std::string &connect_string); ~Database_PostgreSQL(); void beginSave(); void endSave(); - bool saveBlock(const v3s16 &pos, const std::string &data); - void loadBlock(const v3s16 &pos, std::string *block); - bool deleteBlock(const v3s16 &pos); - void listAllLoadableBlocks(std::vector<v3s16> &dst); bool initialized() const; -private: - // Database initialization - void connectToDatabase(); - void initStatements(); - void createDatabase(); - inline void prepareStatement(const std::string &name, const std::string &sql) +protected: + // Conversion helpers + inline int pg_to_int(PGresult *res, int row, int col) { - checkResults(PQprepare(m_conn, name.c_str(), sql.c_str(), 0, NULL)); + return atoi(PQgetvalue(res, row, col)); } - // Database connectivity checks - void ping(); - void verifyDatabase(); - - // Database usage - PGresult *checkResults(PGresult *res, bool clear = true); - - inline PGresult *execPrepared(const char *stmtName, const int paramsNumber, - const void **params, - const int *paramsLengths = NULL, const int *paramsFormats = NULL, - bool clear = true, bool nobinary = true) + inline u32 pg_to_uint(PGresult *res, int row, int col) { - return checkResults(PQexecPrepared(m_conn, stmtName, paramsNumber, - (const char* const*) params, paramsLengths, paramsFormats, - nobinary ? 1 : 0), clear); + return (u32) atoi(PQgetvalue(res, row, col)); } - // Conversion helpers - inline int pg_to_int(PGresult *res, int row, int col) + inline float pg_to_float(PGresult *res, int row, int col) { - return atoi(PQgetvalue(res, row, col)); + return (float) atof(PQgetvalue(res, row, col)); } inline v3s16 pg_to_v3s16(PGresult *res, int row, int col) @@ -85,11 +65,86 @@ private: ); } + inline PGresult *execPrepared(const char *stmtName, const int paramsNumber, + const void **params, + const int *paramsLengths = NULL, const int *paramsFormats = NULL, + bool clear = true, bool nobinary = true) + { + return checkResults(PQexecPrepared(m_conn, stmtName, paramsNumber, + (const char* const*) params, paramsLengths, paramsFormats, + nobinary ? 1 : 0), clear); + } + + inline PGresult *execPrepared(const char *stmtName, const int paramsNumber, + const char **params, bool clear = true, bool nobinary = true) + { + return execPrepared(stmtName, paramsNumber, + (const void **)params, NULL, NULL, clear, nobinary); + } + + void createTableIfNotExists(const std::string &table_name, const std::string &definition); + void verifyDatabase(); + + // Database initialization + void connectToDatabase(); + virtual void createDatabase() = 0; + virtual void initStatements() = 0; + inline void prepareStatement(const std::string &name, const std::string &sql) + { + checkResults(PQprepare(m_conn, name.c_str(), sql.c_str(), 0, NULL)); + } + + const int getPGVersion() const { return m_pgversion; } +private: + // Database connectivity checks + void ping(); + + // Database usage + PGresult *checkResults(PGresult *res, bool clear = true); + // Attributes std::string m_connect_string; PGconn *m_conn; int m_pgversion; }; +class MapDatabasePostgreSQL : private Database_PostgreSQL, public MapDatabase +{ +public: + MapDatabasePostgreSQL(const std::string &connect_string); + virtual ~MapDatabasePostgreSQL() {} + + bool saveBlock(const v3s16 &pos, const std::string &data); + void loadBlock(const v3s16 &pos, std::string *block); + bool deleteBlock(const v3s16 &pos); + void listAllLoadableBlocks(std::vector<v3s16> &dst); + + void beginSave() { Database_PostgreSQL::beginSave(); } + void endSave() { Database_PostgreSQL::endSave(); } + +protected: + virtual void createDatabase(); + virtual void initStatements(); +}; + +class PlayerDatabasePostgreSQL : private Database_PostgreSQL, public PlayerDatabase +{ +public: + PlayerDatabasePostgreSQL(const std::string &connect_string); + virtual ~PlayerDatabasePostgreSQL() {} + + void savePlayer(RemotePlayer *player); + bool loadPlayer(RemotePlayer *player, PlayerSAO *sao); + bool removePlayer(const std::string &name); + void listPlayers(std::vector<std::string> &res); + +protected: + virtual void createDatabase(); + virtual void initStatements(); + +private: + bool playerDataExists(const std::string &playername); +}; + #endif diff --git a/src/database-redis.cpp b/src/database-redis.cpp index 3bcedad9b..93e6717fa 100644 --- a/src/database-redis.cpp +++ b/src/database-redis.cpp @@ -44,7 +44,8 @@ Database_Redis::Database_Redis(Settings &conf) } const char *addr = tmp.c_str(); int port = conf.exists("redis_port") ? conf.getU16("redis_port") : 6379; - ctx = redisConnect(addr, port); + // if redis_address contains '/' assume unix socket, else hostname/ip + ctx = tmp.find('/') != std::string::npos ? redisConnectUnix(addr) : redisConnect(addr, port); if (!ctx) { throw DatabaseException("Cannot allocate redis context"); } else if (ctx->err) { @@ -52,6 +53,18 @@ Database_Redis::Database_Redis(Settings &conf) redisFree(ctx); throw DatabaseException(err); } + if (conf.exists("redis_password")) { + tmp = conf.get("redis_password"); + redisReply *reply = static_cast<redisReply *>(redisCommand(ctx, "AUTH %s", tmp.c_str())); + if (!reply) + throw DatabaseException("Redis authentication failed"); + if (reply->type == REDIS_REPLY_ERROR) { + std::string err = "Redis authentication failed: " + std::string(reply->str, reply->len); + freeReplyObject(reply); + throw DatabaseException(err); + } + freeReplyObject(reply); + } } Database_Redis::~Database_Redis() diff --git a/src/database-redis.h b/src/database-redis.h index 3addaa20a..fa15dd8a7 100644 --- a/src/database-redis.h +++ b/src/database-redis.h @@ -24,13 +24,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #if USE_REDIS -#include "database.h" #include <hiredis.h> #include <string> +#include "database.h" class Settings; -class Database_Redis : public Database +class Database_Redis : public MapDatabase { public: Database_Redis(Settings &conf); @@ -52,4 +52,3 @@ private: #endif // USE_REDIS #endif - diff --git a/src/database-sqlite3.cpp b/src/database-sqlite3.cpp index 095d485c0..7bc87a7d0 100644 --- a/src/database-sqlite3.cpp +++ b/src/database-sqlite3.cpp @@ -33,6 +33,8 @@ SQLite format specification: #include "settings.h" #include "porting.h" #include "util/string.h" +#include "content_sao.h" +#include "remoteplayer.h" #include <cassert> @@ -69,7 +71,7 @@ int Database_SQLite3::busyHandler(void *data, int count) { s64 &first_time = reinterpret_cast<s64 *>(data)[0]; s64 &prev_time = reinterpret_cast<s64 *>(data)[1]; - s64 cur_time = getTimeMs(); + s64 cur_time = porting::getTimeMs(); if (count == 0) { first_time = cur_time; @@ -111,27 +113,26 @@ int Database_SQLite3::busyHandler(void *data, int count) } -Database_SQLite3::Database_SQLite3(const std::string &savedir) : +Database_SQLite3::Database_SQLite3(const std::string &savedir, const std::string &dbname) : + m_database(NULL), m_initialized(false), m_savedir(savedir), - m_database(NULL), - m_stmt_read(NULL), - m_stmt_write(NULL), - m_stmt_list(NULL), - m_stmt_delete(NULL), + m_dbname(dbname), m_stmt_begin(NULL), m_stmt_end(NULL) { } -void Database_SQLite3::beginSave() { +void Database_SQLite3::beginSave() +{ verifyDatabase(); SQLRES(sqlite3_step(m_stmt_begin), SQLITE_DONE, "Failed to start SQLite3 transaction"); sqlite3_reset(m_stmt_begin); } -void Database_SQLite3::endSave() { +void Database_SQLite3::endSave() +{ verifyDatabase(); SQLRES(sqlite3_step(m_stmt_end), SQLITE_DONE, "Failed to commit SQLite3 transaction"); @@ -142,7 +143,7 @@ void Database_SQLite3::openDatabase() { if (m_database) return; - std::string dbp = m_savedir + DIR_DELIM + "map.sqlite"; + std::string dbp = m_savedir + DIR_DELIM + m_dbname + ".sqlite"; // Open the database connection @@ -170,6 +171,8 @@ void Database_SQLite3::openDatabase() + itos(g_settings->getU16("sqlite_synchronous")); SQLOK(sqlite3_exec(m_database, query_str.c_str(), NULL, NULL, NULL), "Failed to modify sqlite3 synchronous mode"); + SQLOK(sqlite3_exec(m_database, "PRAGMA foreign_keys = ON", NULL, NULL, NULL), + "Failed to enable sqlite3 foreign key support"); } void Database_SQLite3::verifyDatabase() @@ -178,8 +181,61 @@ void Database_SQLite3::verifyDatabase() openDatabase(); - PREPARE_STATEMENT(begin, "BEGIN"); - PREPARE_STATEMENT(end, "COMMIT"); + PREPARE_STATEMENT(begin, "BEGIN;"); + PREPARE_STATEMENT(end, "COMMIT;"); + + initStatements(); + + m_initialized = true; +} + +Database_SQLite3::~Database_SQLite3() +{ + FINALIZE_STATEMENT(m_stmt_begin) + FINALIZE_STATEMENT(m_stmt_end) + + SQLOK_ERRSTREAM(sqlite3_close(m_database), "Failed to close database"); +} + +/* + * Map database + */ + +MapDatabaseSQLite3::MapDatabaseSQLite3(const std::string &savedir): + Database_SQLite3(savedir, "map"), + MapDatabase(), + m_stmt_read(NULL), + m_stmt_write(NULL), + m_stmt_list(NULL), + m_stmt_delete(NULL) +{ + +} + +MapDatabaseSQLite3::~MapDatabaseSQLite3() +{ + FINALIZE_STATEMENT(m_stmt_read) + FINALIZE_STATEMENT(m_stmt_write) + FINALIZE_STATEMENT(m_stmt_list) + FINALIZE_STATEMENT(m_stmt_delete) +} + + +void MapDatabaseSQLite3::createDatabase() +{ + assert(m_database); // Pre-condition + + SQLOK(sqlite3_exec(m_database, + "CREATE TABLE IF NOT EXISTS `blocks` (\n" + " `pos` INT PRIMARY KEY,\n" + " `data` BLOB\n" + ");\n", + NULL, NULL, NULL), + "Failed to create database table"); +} + +void MapDatabaseSQLite3::initStatements() +{ PREPARE_STATEMENT(read, "SELECT `data` FROM `blocks` WHERE `pos` = ? LIMIT 1"); #ifdef __ANDROID__ PREPARE_STATEMENT(write, "INSERT INTO `blocks` (`pos`, `data`) VALUES (?, ?)"); @@ -189,18 +245,16 @@ void Database_SQLite3::verifyDatabase() PREPARE_STATEMENT(delete, "DELETE FROM `blocks` WHERE `pos` = ?"); PREPARE_STATEMENT(list, "SELECT `pos` FROM `blocks`"); - m_initialized = true; - verbosestream << "ServerMap: SQLite3 database opened." << std::endl; } -inline void Database_SQLite3::bindPos(sqlite3_stmt *stmt, const v3s16 &pos, int index) +inline void MapDatabaseSQLite3::bindPos(sqlite3_stmt *stmt, const v3s16 &pos, int index) { SQLOK(sqlite3_bind_int64(stmt, index, getBlockAsInteger(pos)), "Internal error: failed to bind query at " __FILE__ ":" TOSTRING(__LINE__)); } -bool Database_SQLite3::deleteBlock(const v3s16 &pos) +bool MapDatabaseSQLite3::deleteBlock(const v3s16 &pos) { verifyDatabase(); @@ -216,7 +270,7 @@ bool Database_SQLite3::deleteBlock(const v3s16 &pos) return good; } -bool Database_SQLite3::saveBlock(const v3s16 &pos, const std::string &data) +bool MapDatabaseSQLite3::saveBlock(const v3s16 &pos, const std::string &data) { verifyDatabase(); @@ -243,7 +297,7 @@ bool Database_SQLite3::saveBlock(const v3s16 &pos, const std::string &data) return true; } -void Database_SQLite3::loadBlock(const v3s16 &pos, std::string *block) +void MapDatabaseSQLite3::loadBlock(const v3s16 &pos, std::string *block) { verifyDatabase(); @@ -264,37 +318,312 @@ void Database_SQLite3::loadBlock(const v3s16 &pos, std::string *block) sqlite3_reset(m_stmt_read); } -void Database_SQLite3::createDatabase() +void MapDatabaseSQLite3::listAllLoadableBlocks(std::vector<v3s16> &dst) +{ + verifyDatabase(); + + while (sqlite3_step(m_stmt_list) == SQLITE_ROW) + dst.push_back(getIntegerAsBlock(sqlite3_column_int64(m_stmt_list, 0))); + + sqlite3_reset(m_stmt_list); +} + +/* + * Player Database + */ + +PlayerDatabaseSQLite3::PlayerDatabaseSQLite3(const std::string &savedir): + Database_SQLite3(savedir, "players"), + PlayerDatabase(), + m_stmt_player_load(NULL), + m_stmt_player_add(NULL), + m_stmt_player_update(NULL), + m_stmt_player_remove(NULL), + m_stmt_player_list(NULL), + m_stmt_player_load_inventory(NULL), + m_stmt_player_load_inventory_items(NULL), + m_stmt_player_add_inventory(NULL), + m_stmt_player_add_inventory_items(NULL), + m_stmt_player_remove_inventory(NULL), + m_stmt_player_remove_inventory_items(NULL), + m_stmt_player_metadata_load(NULL), + m_stmt_player_metadata_remove(NULL), + m_stmt_player_metadata_add(NULL) +{ + +} +PlayerDatabaseSQLite3::~PlayerDatabaseSQLite3() +{ + FINALIZE_STATEMENT(m_stmt_player_load) + FINALIZE_STATEMENT(m_stmt_player_add) + FINALIZE_STATEMENT(m_stmt_player_update) + FINALIZE_STATEMENT(m_stmt_player_remove) + FINALIZE_STATEMENT(m_stmt_player_list) + FINALIZE_STATEMENT(m_stmt_player_add_inventory) + FINALIZE_STATEMENT(m_stmt_player_add_inventory_items) + FINALIZE_STATEMENT(m_stmt_player_remove_inventory) + FINALIZE_STATEMENT(m_stmt_player_remove_inventory_items) + FINALIZE_STATEMENT(m_stmt_player_load_inventory) + FINALIZE_STATEMENT(m_stmt_player_load_inventory_items) + FINALIZE_STATEMENT(m_stmt_player_metadata_load) + FINALIZE_STATEMENT(m_stmt_player_metadata_add) + FINALIZE_STATEMENT(m_stmt_player_metadata_remove) +}; + + +void PlayerDatabaseSQLite3::createDatabase() { assert(m_database); // Pre-condition + SQLOK(sqlite3_exec(m_database, - "CREATE TABLE IF NOT EXISTS `blocks` (\n" - " `pos` INT PRIMARY KEY,\n" - " `data` BLOB\n" - ");\n", + "CREATE TABLE IF NOT EXISTS `player` (" + "`name` VARCHAR(50) NOT NULL," + "`pitch` NUMERIC(11, 4) NOT NULL," + "`yaw` NUMERIC(11, 4) NOT NULL," + "`posX` NUMERIC(11, 4) NOT NULL," + "`posY` NUMERIC(11, 4) NOT NULL," + "`posZ` NUMERIC(11, 4) NOT NULL," + "`hp` INT NOT NULL," + "`breath` INT NOT NULL," + "`creation_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP," + "`modification_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP," + "PRIMARY KEY (`name`));", NULL, NULL, NULL), - "Failed to create database table"); + "Failed to create player table"); + + SQLOK(sqlite3_exec(m_database, + "CREATE TABLE IF NOT EXISTS `player_metadata` (" + " `player` VARCHAR(50) NOT NULL," + " `metadata` VARCHAR(256) NOT NULL," + " `value` TEXT," + " PRIMARY KEY(`player`, `metadata`)," + " FOREIGN KEY (`player`) REFERENCES player (`name`) ON DELETE CASCADE );", + NULL, NULL, NULL), + "Failed to create player metadata table"); + + SQLOK(sqlite3_exec(m_database, + "CREATE TABLE IF NOT EXISTS `player_inventories` (" + " `player` VARCHAR(50) NOT NULL," + " `inv_id` INT NOT NULL," + " `inv_width` INT NOT NULL," + " `inv_name` TEXT NOT NULL DEFAULT ''," + " `inv_size` INT NOT NULL," + " PRIMARY KEY(player, inv_id)," + " FOREIGN KEY (`player`) REFERENCES player (`name`) ON DELETE CASCADE );", + NULL, NULL, NULL), + "Failed to create player inventory table"); + + SQLOK(sqlite3_exec(m_database, + "CREATE TABLE `player_inventory_items` (" + " `player` VARCHAR(50) NOT NULL," + " `inv_id` INT NOT NULL," + " `slot_id` INT NOT NULL," + " `item` TEXT NOT NULL DEFAULT ''," + " PRIMARY KEY(player, inv_id, slot_id)," + " FOREIGN KEY (`player`) REFERENCES player (`name`) ON DELETE CASCADE );", + NULL, NULL, NULL), + "Failed to create player inventory items table"); } -void Database_SQLite3::listAllLoadableBlocks(std::vector<v3s16> &dst) +void PlayerDatabaseSQLite3::initStatements() +{ + PREPARE_STATEMENT(player_load, "SELECT `pitch`, `yaw`, `posX`, `posY`, `posZ`, `hp`, " + "`breath`" + "FROM `player` WHERE `name` = ?") + PREPARE_STATEMENT(player_add, "INSERT INTO `player` (`name`, `pitch`, `yaw`, `posX`, " + "`posY`, `posZ`, `hp`, `breath`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)") + PREPARE_STATEMENT(player_update, "UPDATE `player` SET `pitch` = ?, `yaw` = ?, " + "`posX` = ?, `posY` = ?, `posZ` = ?, `hp` = ?, `breath` = ?, " + "`modification_date` = CURRENT_TIMESTAMP WHERE `name` = ?") + PREPARE_STATEMENT(player_remove, "DELETE FROM `player` WHERE `name` = ?") + PREPARE_STATEMENT(player_list, "SELECT `name` FROM `player`") + + PREPARE_STATEMENT(player_add_inventory, "INSERT INTO `player_inventories` " + "(`player`, `inv_id`, `inv_width`, `inv_name`, `inv_size`) VALUES (?, ?, ?, ?, ?)") + PREPARE_STATEMENT(player_add_inventory_items, "INSERT INTO `player_inventory_items` " + "(`player`, `inv_id`, `slot_id`, `item`) VALUES (?, ?, ?, ?)") + PREPARE_STATEMENT(player_remove_inventory, "DELETE FROM `player_inventories` " + "WHERE `player` = ?") + PREPARE_STATEMENT(player_remove_inventory_items, "DELETE FROM `player_inventory_items` " + "WHERE `player` = ?") + PREPARE_STATEMENT(player_load_inventory, "SELECT `inv_id`, `inv_width`, `inv_name`, " + "`inv_size` FROM `player_inventories` WHERE `player` = ? ORDER BY inv_id") + PREPARE_STATEMENT(player_load_inventory_items, "SELECT `slot_id`, `item` " + "FROM `player_inventory_items` WHERE `player` = ? AND `inv_id` = ?") + + PREPARE_STATEMENT(player_metadata_load, "SELECT `metadata`, `value` FROM " + "`player_metadata` WHERE `player` = ?") + PREPARE_STATEMENT(player_metadata_add, "INSERT INTO `player_metadata` " + "(`player`, `metadata`, `value`) VALUES (?, ?, ?)") + PREPARE_STATEMENT(player_metadata_remove, "DELETE FROM `player_metadata` " + "WHERE `player` = ?") + verbosestream << "ServerEnvironment: SQLite3 database opened (players)." << std::endl; +} + +bool PlayerDatabaseSQLite3::playerDataExists(const std::string &name) { verifyDatabase(); + str_to_sqlite(m_stmt_player_load, 1, name); + bool res = (sqlite3_step(m_stmt_player_load) == SQLITE_ROW); + sqlite3_reset(m_stmt_player_load); + return res; +} - while (sqlite3_step(m_stmt_list) == SQLITE_ROW) { - dst.push_back(getIntegerAsBlock(sqlite3_column_int64(m_stmt_list, 0))); +void PlayerDatabaseSQLite3::savePlayer(RemotePlayer *player) +{ + PlayerSAO* sao = player->getPlayerSAO(); + sanity_check(sao); + + const v3f &pos = sao->getBasePosition(); + // Begin save in brace is mandatory + if (!playerDataExists(player->getName())) { + beginSave(); + str_to_sqlite(m_stmt_player_add, 1, player->getName()); + double_to_sqlite(m_stmt_player_add, 2, sao->getPitch()); + double_to_sqlite(m_stmt_player_add, 3, sao->getYaw()); + double_to_sqlite(m_stmt_player_add, 4, pos.X); + double_to_sqlite(m_stmt_player_add, 5, pos.Y); + double_to_sqlite(m_stmt_player_add, 6, pos.Z); + int64_to_sqlite(m_stmt_player_add, 7, sao->getHP()); + int64_to_sqlite(m_stmt_player_add, 8, sao->getBreath()); + + sqlite3_vrfy(sqlite3_step(m_stmt_player_add), SQLITE_DONE); + sqlite3_reset(m_stmt_player_add); + } else { + beginSave(); + double_to_sqlite(m_stmt_player_update, 1, sao->getPitch()); + double_to_sqlite(m_stmt_player_update, 2, sao->getYaw()); + double_to_sqlite(m_stmt_player_update, 3, pos.X); + double_to_sqlite(m_stmt_player_update, 4, pos.Y); + double_to_sqlite(m_stmt_player_update, 5, pos.Z); + int64_to_sqlite(m_stmt_player_update, 6, sao->getHP()); + int64_to_sqlite(m_stmt_player_update, 7, sao->getBreath()); + str_to_sqlite(m_stmt_player_update, 8, player->getName()); + + sqlite3_vrfy(sqlite3_step(m_stmt_player_update), SQLITE_DONE); + sqlite3_reset(m_stmt_player_update); } - sqlite3_reset(m_stmt_list); + + // Write player inventories + str_to_sqlite(m_stmt_player_remove_inventory, 1, player->getName()); + sqlite3_vrfy(sqlite3_step(m_stmt_player_remove_inventory), SQLITE_DONE); + sqlite3_reset(m_stmt_player_remove_inventory); + + str_to_sqlite(m_stmt_player_remove_inventory_items, 1, player->getName()); + sqlite3_vrfy(sqlite3_step(m_stmt_player_remove_inventory_items), SQLITE_DONE); + sqlite3_reset(m_stmt_player_remove_inventory_items); + + std::vector<const InventoryList*> inventory_lists = sao->getInventory()->getLists(); + for (u16 i = 0; i < inventory_lists.size(); i++) { + const InventoryList* list = inventory_lists[i]; + + str_to_sqlite(m_stmt_player_add_inventory, 1, player->getName()); + int_to_sqlite(m_stmt_player_add_inventory, 2, i); + int_to_sqlite(m_stmt_player_add_inventory, 3, list->getWidth()); + str_to_sqlite(m_stmt_player_add_inventory, 4, list->getName()); + int_to_sqlite(m_stmt_player_add_inventory, 5, list->getSize()); + sqlite3_vrfy(sqlite3_step(m_stmt_player_add_inventory), SQLITE_DONE); + sqlite3_reset(m_stmt_player_add_inventory); + + for (u32 j = 0; j < list->getSize(); j++) { + std::ostringstream os; + list->getItem(j).serialize(os); + std::string itemStr = os.str(); + + str_to_sqlite(m_stmt_player_add_inventory_items, 1, player->getName()); + int_to_sqlite(m_stmt_player_add_inventory_items, 2, i); + int_to_sqlite(m_stmt_player_add_inventory_items, 3, j); + str_to_sqlite(m_stmt_player_add_inventory_items, 4, itemStr); + sqlite3_vrfy(sqlite3_step(m_stmt_player_add_inventory_items), SQLITE_DONE); + sqlite3_reset(m_stmt_player_add_inventory_items); + } + } + + str_to_sqlite(m_stmt_player_metadata_remove, 1, player->getName()); + sqlite3_vrfy(sqlite3_step(m_stmt_player_metadata_remove), SQLITE_DONE); + sqlite3_reset(m_stmt_player_metadata_remove); + + const PlayerAttributes &attrs = sao->getExtendedAttributes(); + for (PlayerAttributes::const_iterator it = attrs.begin(); it != attrs.end(); ++it) { + str_to_sqlite(m_stmt_player_metadata_add, 1, player->getName()); + str_to_sqlite(m_stmt_player_metadata_add, 2, it->first); + str_to_sqlite(m_stmt_player_metadata_add, 3, it->second); + sqlite3_vrfy(sqlite3_step(m_stmt_player_metadata_add), SQLITE_DONE); + sqlite3_reset(m_stmt_player_metadata_add); + } + + endSave(); } -Database_SQLite3::~Database_SQLite3() +bool PlayerDatabaseSQLite3::loadPlayer(RemotePlayer *player, PlayerSAO *sao) { - FINALIZE_STATEMENT(m_stmt_read) - FINALIZE_STATEMENT(m_stmt_write) - FINALIZE_STATEMENT(m_stmt_list) - FINALIZE_STATEMENT(m_stmt_begin) - FINALIZE_STATEMENT(m_stmt_end) - FINALIZE_STATEMENT(m_stmt_delete) + verifyDatabase(); - SQLOK_ERRSTREAM(sqlite3_close(m_database), "Failed to close database"); + str_to_sqlite(m_stmt_player_load, 1, player->getName()); + if (sqlite3_step(m_stmt_player_load) != SQLITE_ROW) { + sqlite3_reset(m_stmt_player_load); + return false; + } + sao->setPitch(sqlite_to_float(m_stmt_player_load, 0)); + sao->setYaw(sqlite_to_float(m_stmt_player_load, 1)); + sao->setBasePosition(sqlite_to_v3f(m_stmt_player_load, 2)); + sao->setHPRaw((s16) MYMIN(sqlite_to_int(m_stmt_player_load, 5), S16_MAX)); + sao->setBreath((u16) MYMIN(sqlite_to_int(m_stmt_player_load, 6), U16_MAX), false); + sqlite3_reset(m_stmt_player_load); + + // Load inventory + str_to_sqlite(m_stmt_player_load_inventory, 1, player->getName()); + while (sqlite3_step(m_stmt_player_load_inventory) == SQLITE_ROW) { + InventoryList *invList = player->inventory.addList( + sqlite_to_string(m_stmt_player_load_inventory, 2), + sqlite_to_uint(m_stmt_player_load_inventory, 3)); + invList->setWidth(sqlite_to_uint(m_stmt_player_load_inventory, 1)); + + u32 invId = sqlite_to_uint(m_stmt_player_load_inventory, 0); + + str_to_sqlite(m_stmt_player_load_inventory_items, 1, player->getName()); + int_to_sqlite(m_stmt_player_load_inventory_items, 2, invId); + while (sqlite3_step(m_stmt_player_load_inventory_items) == SQLITE_ROW) { + const std::string itemStr = sqlite_to_string(m_stmt_player_load_inventory_items, 1); + if (itemStr.length() > 0) { + ItemStack stack; + stack.deSerialize(itemStr); + invList->addItem(sqlite_to_uint(m_stmt_player_load_inventory_items, 0), stack); + } + } + sqlite3_reset(m_stmt_player_load_inventory_items); + } + + sqlite3_reset(m_stmt_player_load_inventory); + + str_to_sqlite(m_stmt_player_metadata_load, 1, sao->getPlayer()->getName()); + while (sqlite3_step(m_stmt_player_metadata_load) == SQLITE_ROW) { + std::string attr = sqlite_to_string(m_stmt_player_metadata_load, 0); + std::string value = sqlite_to_string(m_stmt_player_metadata_load, 1); + + sao->setExtendedAttribute(attr, value); + } + sqlite3_reset(m_stmt_player_metadata_load); + return true; +} + +bool PlayerDatabaseSQLite3::removePlayer(const std::string &name) +{ + if (!playerDataExists(name)) + return false; + + str_to_sqlite(m_stmt_player_remove, 1, name); + sqlite3_vrfy(sqlite3_step(m_stmt_player_remove), SQLITE_DONE); + sqlite3_reset(m_stmt_player_remove); + return true; } +void PlayerDatabaseSQLite3::listPlayers(std::vector<std::string> &res) +{ + verifyDatabase(); + + while (sqlite3_step(m_stmt_player_list) == SQLITE_ROW) + res.push_back(sqlite_to_string(m_stmt_player_list, 0)); + + sqlite3_reset(m_stmt_player_list); +} diff --git a/src/database-sqlite3.h b/src/database-sqlite3.h index debbc9d8b..3244facc9 100644 --- a/src/database-sqlite3.h +++ b/src/database-sqlite3.h @@ -20,47 +20,109 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef DATABASE_SQLITE3_HEADER #define DATABASE_SQLITE3_HEADER -#include "database.h" +#include <cstring> #include <string> +#include "database.h" +#include "exceptions.h" extern "C" { - #include "sqlite3.h" +#include "sqlite3.h" } class Database_SQLite3 : public Database { public: - Database_SQLite3(const std::string &savedir); - ~Database_SQLite3(); + virtual ~Database_SQLite3(); void beginSave(); void endSave(); - bool saveBlock(const v3s16 &pos, const std::string &data); - void loadBlock(const v3s16 &pos, std::string *block); - bool deleteBlock(const v3s16 &pos); - void listAllLoadableBlocks(std::vector<v3s16> &dst); bool initialized() const { return m_initialized; } +protected: + Database_SQLite3(const std::string &savedir, const std::string &dbname); -private: - // Open the database - void openDatabase(); - // Create the database structure - void createDatabase(); // Open and initialize the database if needed void verifyDatabase(); - void bindPos(sqlite3_stmt *stmt, const v3s16 &pos, int index=1); + // Convertors + inline void str_to_sqlite(sqlite3_stmt *s, int iCol, const std::string &str) const + { + sqlite3_vrfy(sqlite3_bind_text(s, iCol, str.c_str(), str.size(), NULL)); + } + + inline void str_to_sqlite(sqlite3_stmt *s, int iCol, const char *str) const + { + sqlite3_vrfy(sqlite3_bind_text(s, iCol, str, strlen(str), NULL)); + } + + inline void int_to_sqlite(sqlite3_stmt *s, int iCol, int val) const + { + sqlite3_vrfy(sqlite3_bind_int(s, iCol, val)); + } + + inline void int64_to_sqlite(sqlite3_stmt *s, int iCol, s64 val) const + { + sqlite3_vrfy(sqlite3_bind_int64(s, iCol, (sqlite3_int64) val)); + } + + inline void double_to_sqlite(sqlite3_stmt *s, int iCol, double val) const + { + sqlite3_vrfy(sqlite3_bind_double(s, iCol, val)); + } + + inline std::string sqlite_to_string(sqlite3_stmt *s, int iCol) + { + const char* text = reinterpret_cast<const char*>(sqlite3_column_text(s, iCol)); + return std::string(text ? text : ""); + } + + inline s32 sqlite_to_int(sqlite3_stmt *s, int iCol) + { + return sqlite3_column_int(s, iCol); + } + + inline u32 sqlite_to_uint(sqlite3_stmt *s, int iCol) + { + return (u32) sqlite3_column_int(s, iCol); + } + + inline float sqlite_to_float(sqlite3_stmt *s, int iCol) + { + return (float) sqlite3_column_double(s, iCol); + } + + inline const v3f sqlite_to_v3f(sqlite3_stmt *s, int iCol) + { + return v3f(sqlite_to_float(s, iCol), sqlite_to_float(s, iCol + 1), + sqlite_to_float(s, iCol + 2)); + } + + // Query verifiers helpers + inline void sqlite3_vrfy(int s, const std::string &m = "", int r = SQLITE_OK) const + { + if (s != r) + throw DatabaseException(m + ": " + sqlite3_errmsg(m_database)); + } + + inline void sqlite3_vrfy(const int s, const int r, const std::string &m = "") const + { + sqlite3_vrfy(s, m, r); + } + + // Create the database structure + virtual void createDatabase() = 0; + virtual void initStatements() = 0; + + sqlite3 *m_database; +private: + // Open the database + void openDatabase(); bool m_initialized; std::string m_savedir; + std::string m_dbname; - sqlite3 *m_database; - sqlite3_stmt *m_stmt_read; - sqlite3_stmt *m_stmt_write; - sqlite3_stmt *m_stmt_list; - sqlite3_stmt *m_stmt_delete; sqlite3_stmt *m_stmt_begin; sqlite3_stmt *m_stmt_end; @@ -69,5 +131,66 @@ private: static int busyHandler(void *data, int count); }; -#endif +class MapDatabaseSQLite3 : private Database_SQLite3, public MapDatabase +{ +public: + MapDatabaseSQLite3(const std::string &savedir); + virtual ~MapDatabaseSQLite3(); + + bool saveBlock(const v3s16 &pos, const std::string &data); + void loadBlock(const v3s16 &pos, std::string *block); + bool deleteBlock(const v3s16 &pos); + void listAllLoadableBlocks(std::vector<v3s16> &dst); + + void beginSave() { Database_SQLite3::beginSave(); } + void endSave() { Database_SQLite3::endSave(); } +protected: + virtual void createDatabase(); + virtual void initStatements(); + +private: + void bindPos(sqlite3_stmt *stmt, const v3s16 &pos, int index = 1); + + // Map + sqlite3_stmt *m_stmt_read; + sqlite3_stmt *m_stmt_write; + sqlite3_stmt *m_stmt_list; + sqlite3_stmt *m_stmt_delete; +}; + +class PlayerDatabaseSQLite3 : private Database_SQLite3, public PlayerDatabase +{ +public: + PlayerDatabaseSQLite3(const std::string &savedir); + virtual ~PlayerDatabaseSQLite3(); + void savePlayer(RemotePlayer *player); + bool loadPlayer(RemotePlayer *player, PlayerSAO *sao); + bool removePlayer(const std::string &name); + void listPlayers(std::vector<std::string> &res); + +protected: + virtual void createDatabase(); + virtual void initStatements(); + +private: + bool playerDataExists(const std::string &name); + + // Players + sqlite3_stmt *m_stmt_player_load; + sqlite3_stmt *m_stmt_player_add; + sqlite3_stmt *m_stmt_player_update; + sqlite3_stmt *m_stmt_player_remove; + sqlite3_stmt *m_stmt_player_list; + sqlite3_stmt *m_stmt_player_load_inventory; + sqlite3_stmt *m_stmt_player_load_inventory_items; + sqlite3_stmt *m_stmt_player_add_inventory; + sqlite3_stmt *m_stmt_player_add_inventory_items; + sqlite3_stmt *m_stmt_player_remove_inventory; + sqlite3_stmt *m_stmt_player_remove_inventory_items; + sqlite3_stmt *m_stmt_player_metadata_load; + sqlite3_stmt *m_stmt_player_metadata_remove; + sqlite3_stmt *m_stmt_player_metadata_add; +}; + +#endif diff --git a/src/database.cpp b/src/database.cpp index 262d475ec..8e1483893 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -48,7 +48,7 @@ static inline s64 pythonmodulo(s64 i, s16 mod) } -s64 Database::getBlockAsInteger(const v3s16 &pos) +s64 MapDatabase::getBlockAsInteger(const v3s16 &pos) { return (u64) pos.Z * 0x1000000 + (u64) pos.Y * 0x1000 + @@ -56,7 +56,7 @@ s64 Database::getBlockAsInteger(const v3s16 &pos) } -v3s16 Database::getIntegerAsBlock(s64 i) +v3s16 MapDatabase::getIntegerAsBlock(s64 i) { v3s16 pos; pos.X = unsigned_to_signed(pythonmodulo(i, 4096), 2048); diff --git a/src/database.h b/src/database.h index 0cf75232f..5a2b844fd 100644 --- a/src/database.h +++ b/src/database.h @@ -20,22 +20,24 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef DATABASE_HEADER #define DATABASE_HEADER -#include <vector> #include <string> +#include <vector> #include "irr_v3d.h" #include "irrlichttypes.h" - -#ifndef PP - #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" -#endif +#include "util/basic_macros.h" class Database { public: - virtual ~Database() {} + virtual void beginSave() = 0; + virtual void endSave() = 0; + virtual bool initialized() const { return true; } +}; - virtual void beginSave() {} - virtual void endSave() {} +class MapDatabase : public Database +{ +public: + virtual ~MapDatabase() {} virtual bool saveBlock(const v3s16 &pos, const std::string &data) = 0; virtual void loadBlock(const v3s16 &pos, std::string *block) = 0; @@ -45,9 +47,19 @@ public: static v3s16 getIntegerAsBlock(s64 i); virtual void listAllLoadableBlocks(std::vector<v3s16> &dst) = 0; +}; - virtual bool initialized() const { return true; } +class PlayerSAO; +class RemotePlayer; + +class PlayerDatabase +{ +public: + virtual ~PlayerDatabase() {} + virtual void savePlayer(RemotePlayer *player) = 0; + virtual bool loadPlayer(RemotePlayer *player, PlayerSAO *sao) = 0; + virtual bool removePlayer(const std::string &name) = 0; + virtual void listPlayers(std::vector<std::string> &res) = 0; }; #endif - diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 0b4be6322..0a44069fd 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -23,14 +23,43 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "config.h" #include "constants.h" #include "porting.h" +#include "util/string.h" void set_default_settings(Settings *settings) { // Client and server - + settings->setDefault("language", ""); settings->setDefault("name", ""); + settings->setDefault("bind_address", ""); + settings->setDefault("serverlist_url", "servers.minetest.net"); + + // Client + settings->setDefault("address", ""); + settings->setDefault("enable_sound", "true"); + settings->setDefault("sound_volume", "0.8"); + settings->setDefault("enable_mesh_cache", "false"); + settings->setDefault("mesh_generation_interval", "0"); + settings->setDefault("meshgen_block_cache_size", "20"); + settings->setDefault("enable_vbo", "true"); + settings->setDefault("free_move", "false"); + settings->setDefault("fast_move", "false"); + settings->setDefault("noclip", "false"); + settings->setDefault("screenshot_path", "."); + settings->setDefault("screenshot_format", "png"); + settings->setDefault("screenshot_quality", "0"); + settings->setDefault("client_unload_unused_data_timeout", "600"); + settings->setDefault("client_mapblock_limit", "5000"); + settings->setDefault("enable_build_where_you_stand", "false" ); + settings->setDefault("send_pre_v25_init", "false"); + settings->setDefault("curl_timeout", "5000"); + settings->setDefault("curl_parallel_limit", "8"); + settings->setDefault("curl_file_download_timeout", "300000"); + settings->setDefault("curl_verify_cert", "true"); + settings->setDefault("enable_remote_media_server", "true"); + settings->setDefault("enable_client_modding", "false"); + settings->setDefault("max_out_chat_queue_size", "20"); - // Client stuff + // Keymap settings->setDefault("remote_port", "30000"); settings->setDefault("keymap_forward", "KEY_KEY_W"); settings->setDefault("keymap_autorun", ""); @@ -45,38 +74,33 @@ void set_default_settings(Settings *settings) settings->setDefault("keymap_special1", "KEY_KEY_E"); settings->setDefault("keymap_chat", "KEY_KEY_T"); settings->setDefault("keymap_cmd", "/"); + settings->setDefault("keymap_cmd_local", "."); settings->setDefault("keymap_minimap", "KEY_F9"); settings->setDefault("keymap_console", "KEY_F10"); settings->setDefault("keymap_rangeselect", "KEY_KEY_R"); settings->setDefault("keymap_freemove", "KEY_KEY_K"); settings->setDefault("keymap_fastmove", "KEY_KEY_J"); settings->setDefault("keymap_noclip", "KEY_KEY_H"); + settings->setDefault("keymap_hotbar_next", "KEY_KEY_N"); + settings->setDefault("keymap_hotbar_previous", "KEY_KEY_B"); + settings->setDefault("keymap_mute", "KEY_KEY_M"); + settings->setDefault("keymap_increase_volume", ""); + settings->setDefault("keymap_decrease_volume", ""); settings->setDefault("keymap_cinematic", ""); - settings->setDefault("keymap_screenshot", "KEY_F12"); settings->setDefault("keymap_toggle_hud", "KEY_F1"); settings->setDefault("keymap_toggle_chat", "KEY_F2"); settings->setDefault("keymap_toggle_force_fog_off", "KEY_F3"); - settings->setDefault("keymap_toggle_update_camera", #if DEBUG - "KEY_F4"); + settings->setDefault("keymap_toggle_update_camera", "KEY_F4"); #else - ""); + settings->setDefault("keymap_toggle_update_camera", ""); #endif settings->setDefault("keymap_toggle_debug", "KEY_F5"); settings->setDefault("keymap_toggle_profiler", "KEY_F6"); settings->setDefault("keymap_camera_mode", "KEY_F7"); + settings->setDefault("keymap_screenshot", "KEY_F12"); settings->setDefault("keymap_increase_viewing_range_min", "+"); settings->setDefault("keymap_decrease_viewing_range_min", "-"); - settings->setDefault("enable_build_where_you_stand", "false" ); - settings->setDefault("3d_mode", "none"); - settings->setDefault("3d_paralax_strength", "0.025"); - settings->setDefault("aux1_descends", "false"); - settings->setDefault("doubletap_jump", "false"); - settings->setDefault("always_fly_fast", "true"); - settings->setDefault("directional_colored_fog", "true"); - settings->setDefault("tooltip_show_delay", "400"); - settings->setDefault("zoom_fov", "15"); - // Some (temporary) keys for debugging settings->setDefault("keymap_print_debug_stacks", "KEY_KEY_P"); settings->setDefault("keymap_quicktune_prev", "KEY_HOME"); @@ -84,53 +108,41 @@ void set_default_settings(Settings *settings) settings->setDefault("keymap_quicktune_dec", "KEY_NEXT"); settings->setDefault("keymap_quicktune_inc", "KEY_PRIOR"); - // Show debug info by default? - #ifdef NDEBUG + // Visuals +#ifdef NDEBUG settings->setDefault("show_debug", "false"); - #else +#else settings->setDefault("show_debug", "true"); - #endif - +#endif + settings->setDefault("fsaa", "0"); + settings->setDefault("undersampling", "0"); + settings->setDefault("enable_fog", "true"); + settings->setDefault("fog_start", "0.4"); + settings->setDefault("3d_mode", "none"); + settings->setDefault("3d_paralax_strength", "0.025"); + settings->setDefault("tooltip_show_delay", "400"); + settings->setDefault("zoom_fov", "15"); settings->setDefault("fps_max", "60"); settings->setDefault("pause_fps_max", "20"); settings->setDefault("viewing_range", "100"); - settings->setDefault("map_generation_limit", "31000"); settings->setDefault("screenW", "800"); settings->setDefault("screenH", "600"); + settings->setDefault("autosave_screensize", "true"); settings->setDefault("fullscreen", "false"); settings->setDefault("fullscreen_bpp", "24"); - settings->setDefault("fsaa", "0"); settings->setDefault("vsync", "false"); - settings->setDefault("address", ""); - settings->setDefault("random_input", "false"); - settings->setDefault("client_unload_unused_data_timeout", "600"); - settings->setDefault("client_mapblock_limit", "5000"); - settings->setDefault("enable_fog", "true"); - settings->setDefault("fog_start", "0.4"); settings->setDefault("fov", "72"); - settings->setDefault("view_bobbing", "true"); settings->setDefault("leaves_style", "fancy"); settings->setDefault("connected_glass", "false"); settings->setDefault("smooth_lighting", "true"); - settings->setDefault("display_gamma", "1.8"); + settings->setDefault("display_gamma", "2.2"); settings->setDefault("texture_path", ""); settings->setDefault("shader_path", ""); settings->setDefault("video_driver", "opengl"); - settings->setDefault("free_move", "false"); - settings->setDefault("noclip", "false"); - settings->setDefault("continuous_forward", "false"); - settings->setDefault("enable_joysticks", "false"); - settings->setDefault("repeat_joystick_button_time", "0.17"); - settings->setDefault("joystick_frustum_sensitivity", "170"); settings->setDefault("cinematic", "false"); settings->setDefault("camera_smoothing", "0"); settings->setDefault("cinematic_camera_smoothing", "0.7"); - settings->setDefault("fast_move", "false"); - settings->setDefault("invert_mouse", "false"); settings->setDefault("enable_clouds", "true"); - settings->setDefault("screenshot_path", "."); - settings->setDefault("screenshot_format", "png"); - settings->setDefault("screenshot_quality", "0"); settings->setDefault("view_bobbing_amount", "1.0"); settings->setDefault("fall_bobbing_amount", "0.0"); settings->setDefault("enable_3d_clouds", "true"); @@ -138,11 +150,11 @@ void set_default_settings(Settings *settings) settings->setDefault("cloud_radius", "12"); settings->setDefault("menu_clouds", "true"); settings->setDefault("opaque_water", "false"); + settings->setDefault("console_height", "1.0"); settings->setDefault("console_color", "(0,0,0)"); settings->setDefault("console_alpha", "200"); settings->setDefault("selectionbox_color", "(0,0,0)"); settings->setDefault("selectionbox_width", "2"); - settings->setDefault("inventory_items_animations", "false"); settings->setDefault("node_highlighting", "box"); settings->setDefault("crosshair_color", "(255,255,255)"); settings->setDefault("crosshair_alpha", "255"); @@ -150,20 +162,27 @@ void set_default_settings(Settings *settings) settings->setDefault("gui_scaling", "1.0"); settings->setDefault("gui_scaling_filter", "false"); settings->setDefault("gui_scaling_filter_txr2img", "true"); - settings->setDefault("mouse_sensitivity", "0.2"); - settings->setDefault("enable_sound", "true"); - settings->setDefault("sound_volume", "0.8"); settings->setDefault("desynchronize_mapblock_texture_animation", "true"); settings->setDefault("hud_hotbar_max_width", "1.0"); settings->setDefault("enable_local_map_saving", "false"); settings->setDefault("show_entity_selectionbox", "true"); + settings->setDefault("texture_clean_transparent", "false"); + settings->setDefault("texture_min_size", "64"); + settings->setDefault("ambient_occlusion_gamma", "2.2"); + settings->setDefault("enable_shaders", "true"); + settings->setDefault("enable_particles", "true"); + + settings->setDefault("enable_minimap", "true"); + settings->setDefault("minimap_shape_round", "true"); + settings->setDefault("minimap_double_scan_height", "true"); + // Effects + settings->setDefault("directional_colored_fog", "true"); + settings->setDefault("inventory_items_animations", "false"); settings->setDefault("mip_map", "false"); settings->setDefault("anisotropic_filter", "false"); settings->setDefault("bilinear_filter", "false"); settings->setDefault("trilinear_filter", "false"); - settings->setDefault("texture_clean_transparent", "false"); - settings->setDefault("texture_min_size", "64"); settings->setDefault("tone_mapping", "false"); settings->setDefault("enable_bumpmapping", "false"); settings->setDefault("enable_parallax_occlusion", "false"); @@ -180,82 +199,80 @@ void set_default_settings(Settings *settings) settings->setDefault("water_wave_speed", "5.0"); settings->setDefault("enable_waving_leaves", "false"); settings->setDefault("enable_waving_plants", "false"); - settings->setDefault("ambient_occlusion_gamma", "2.2"); - settings->setDefault("enable_shaders", "true"); - settings->setDefault("repeat_rightclick_time", "0.25"); - settings->setDefault("enable_particles", "true"); - settings->setDefault("enable_mesh_cache", "false"); - settings->setDefault("enable_vbo", "true"); - settings->setDefault("enable_minimap", "true"); - settings->setDefault("minimap_shape_round", "true"); - settings->setDefault("minimap_double_scan_height", "true"); - - settings->setDefault("send_pre_v25_init", "false"); - settings->setDefault("curl_timeout", "5000"); - settings->setDefault("curl_parallel_limit", "8"); - settings->setDefault("curl_file_download_timeout", "300000"); - settings->setDefault("curl_verify_cert", "true"); - - settings->setDefault("enable_remote_media_server", "true"); + // Input + settings->setDefault("invert_mouse", "false"); + settings->setDefault("mouse_sensitivity", "0.2"); + settings->setDefault("repeat_rightclick_time", "0.25"); + settings->setDefault("random_input", "false"); + settings->setDefault("aux1_descends", "false"); + settings->setDefault("doubletap_jump", "false"); + settings->setDefault("always_fly_fast", "true"); + settings->setDefault("continuous_forward", "false"); + settings->setDefault("enable_joysticks", "false"); + settings->setDefault("joystick_id", "0"); + settings->setDefault("joystick_type", ""); + settings->setDefault("repeat_joystick_button_time", "0.17"); + settings->setDefault("joystick_frustum_sensitivity", "170"); - settings->setDefault("serverlist_url", "servers.minetest.net"); + // Main menu + settings->setDefault("main_menu_path", ""); + settings->setDefault("main_menu_mod_mgr", "1"); + settings->setDefault("main_menu_game_mgr", "0"); + settings->setDefault("modstore_download_url", "https://forum.minetest.net/media/"); + settings->setDefault("modstore_listmods_url", "https://forum.minetest.net/mmdb/mods/"); + settings->setDefault("modstore_details_url", "https://forum.minetest.net/mmdb/mod/*/"); settings->setDefault("serverlist_file", "favoriteservers.txt"); - settings->setDefault("server_announce", "false"); - settings->setDefault("server_url", ""); - settings->setDefault("server_address", ""); - settings->setDefault("server_name", ""); - settings->setDefault("server_description", ""); - - settings->setDefault("disable_escape_sequences", "false"); #if USE_FREETYPE settings->setDefault("freetype", "true"); - settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "liberationsans.ttf")); + settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "Arimo-Regular.ttf")); settings->setDefault("font_shadow", "1"); settings->setDefault("font_shadow_alpha", "127"); - settings->setDefault("mono_font_path", porting::getDataPath("fonts" DIR_DELIM "liberationmono.ttf")); + settings->setDefault("mono_font_path", porting::getDataPath("fonts" DIR_DELIM "Cousine-Regular.ttf")); settings->setDefault("fallback_font_path", porting::getDataPath("fonts" DIR_DELIM "DroidSansFallbackFull.ttf")); settings->setDefault("fallback_font_shadow", "1"); settings->setDefault("fallback_font_shadow_alpha", "128"); - std::stringstream fontsize; - fontsize << TTF_DEFAULT_FONT_SIZE; + std::string font_size_str = std::to_string(TTF_DEFAULT_FONT_SIZE); - settings->setDefault("font_size", fontsize.str()); - settings->setDefault("mono_font_size", fontsize.str()); - settings->setDefault("fallback_font_size", fontsize.str()); + settings->setDefault("fallback_font_size", font_size_str); #else settings->setDefault("freetype", "false"); - settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "lucida_sans")); + settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "mono_dejavu_sans")); settings->setDefault("mono_font_path", porting::getDataPath("fonts" DIR_DELIM "mono_dejavu_sans")); - std::stringstream fontsize; - fontsize << DEFAULT_FONT_SIZE; - - settings->setDefault("font_size", fontsize.str()); - settings->setDefault("mono_font_size", fontsize.str()); + std::string font_size_str = std::to_string(DEFAULT_FONT_SIZE); #endif + settings->setDefault("font_size", font_size_str); + settings->setDefault("mono_font_size", font_size_str); + + + // Server + settings->setDefault("disable_escape_sequences", "false"); - // Server stuff - // "map-dir" doesn't exist by default. + // Network + settings->setDefault("enable_ipv6", "true"); + settings->setDefault("ipv6_server", "false"); settings->setDefault("workaround_window_size","5"); settings->setDefault("max_packets_per_iteration","1024"); settings->setDefault("port", "30000"); - settings->setDefault("bind_address", ""); + settings->setDefault("strict_protocol_version_checking", "false"); + settings->setDefault("player_transfer_distance", "0"); + settings->setDefault("max_simultaneous_block_sends_per_client", "10"); + settings->setDefault("max_simultaneous_block_sends_server_total", "40"); + settings->setDefault("time_send_interval", "5"); + settings->setDefault("default_game", "minetest"); settings->setDefault("motd", ""); settings->setDefault("max_users", "15"); - settings->setDefault("strict_protocol_version_checking", "false"); settings->setDefault("creative_mode", "false"); + settings->setDefault("show_statusline_on_connect", "true"); settings->setDefault("enable_damage", "true"); - settings->setDefault("fixed_map_seed", ""); - settings->setDefault("give_initial_stuff", "false"); settings->setDefault("default_password", ""); settings->setDefault("default_privs", "interact, shout"); - settings->setDefault("player_transfer_distance", "0"); settings->setDefault("enable_pvp", "true"); settings->setDefault("disallow_empty_password", "false"); settings->setDefault("disable_anticheat", "false"); @@ -271,18 +288,14 @@ void set_default_settings(Settings *settings) settings->setDefault("ask_reconnect_on_crash", "false"); settings->setDefault("profiler_print_interval", "0"); - settings->setDefault("enable_mapgen_debug_info", "false"); settings->setDefault("active_object_send_range_blocks", "3"); - settings->setDefault("active_block_range", "2"); + settings->setDefault("active_block_range", "3"); //settings->setDefault("max_simultaneous_block_sends_per_client", "1"); // This causes frametime jitter on client side, or does it? - settings->setDefault("max_simultaneous_block_sends_per_client", "10"); - settings->setDefault("max_simultaneous_block_sends_server_total", "40"); settings->setDefault("max_block_send_distance", "9"); - settings->setDefault("max_block_generate_distance", "7"); settings->setDefault("block_send_optimize_distance", "4"); + settings->setDefault("server_side_occlusion_culling", "true"); settings->setDefault("max_clearobjects_extra_loaded_blocks", "4096"); - settings->setDefault("time_send_interval", "5"); settings->setDefault("time_speed", "72"); settings->setDefault("server_unload_unused_data_timeout", "29"); settings->setDefault("max_objects_per_block", "64"); @@ -295,7 +308,7 @@ void set_default_settings(Settings *settings) settings->setDefault("dedicated_server_step", "0.1"); settings->setDefault("active_block_mgmt_interval", "2.0"); settings->setDefault("abm_interval", "1.0"); - settings->setDefault("nodetimer_interval", "1.0"); + settings->setDefault("nodetimer_interval", "0.2"); settings->setDefault("ignore_world_load_errors", "false"); settings->setDefault("remote_media", ""); settings->setDefault("debug_log_level", "action"); @@ -303,49 +316,48 @@ void set_default_settings(Settings *settings) settings->setDefault("emergequeue_limit_diskonly", "32"); settings->setDefault("emergequeue_limit_generate", "32"); settings->setDefault("num_emerge_threads", "1"); - settings->setDefault("secure.enable_security", "false"); + settings->setDefault("secure.enable_security", "true"); settings->setDefault("secure.trusted_mods", ""); settings->setDefault("secure.http_mods", ""); - // physics stuff + // Physics settings->setDefault("movement_acceleration_default", "3"); settings->setDefault("movement_acceleration_air", "2"); settings->setDefault("movement_acceleration_fast", "10"); settings->setDefault("movement_speed_walk", "4"); settings->setDefault("movement_speed_crouch", "1.35"); settings->setDefault("movement_speed_fast", "20"); - settings->setDefault("movement_speed_climb", "2"); + settings->setDefault("movement_speed_climb", "3"); settings->setDefault("movement_speed_jump", "6.5"); settings->setDefault("movement_liquid_fluidity", "1"); settings->setDefault("movement_liquid_fluidity_smooth", "0.5"); settings->setDefault("movement_liquid_sink", "10"); settings->setDefault("movement_gravity", "9.81"); - //liquid stuff + // Liquids settings->setDefault("liquid_loop_max", "100000"); settings->setDefault("liquid_queue_purge_time", "0"); settings->setDefault("liquid_update", "1.0"); - //mapgen stuff + // Mapgen settings->setDefault("mg_name", "v7"); settings->setDefault("water_level", "1"); + settings->setDefault("mapgen_limit", "31000"); settings->setDefault("chunksize", "5"); settings->setDefault("mg_flags", "dungeons"); + settings->setDefault("fixed_map_seed", ""); + settings->setDefault("max_block_generate_distance", "7"); + settings->setDefault("enable_mapgen_debug_info", "false"); - // IPv6 - settings->setDefault("enable_ipv6", "true"); - settings->setDefault("ipv6_server", "false"); - - settings->setDefault("main_menu_path", ""); - settings->setDefault("main_menu_mod_mgr", "1"); - settings->setDefault("main_menu_game_mgr", "0"); - settings->setDefault("modstore_download_url", "https://forum.minetest.net/media/"); - settings->setDefault("modstore_listmods_url", "https://forum.minetest.net/mmdb/mods/"); - settings->setDefault("modstore_details_url", "https://forum.minetest.net/mmdb/mod/*/"); + // Server list announcing + settings->setDefault("server_announce", "false"); + settings->setDefault("server_url", ""); + settings->setDefault("server_address", ""); + settings->setDefault("server_name", ""); + settings->setDefault("server_description", ""); settings->setDefault("high_precision_fpu", "true"); - - settings->setDefault("language", ""); + settings->setDefault("enable_console", "false"); #ifdef __ANDROID__ settings->setDefault("screenW", "0"); @@ -375,13 +387,12 @@ void set_default_settings(Settings *settings) settings->setDefault("viewing_range", "25"); settings->setDefault("inventory_image_hack", "false"); - //check for device with small screen + // Check for a device with a small screen float x_inches = ((double) porting::getDisplaySize().X / (160 * porting::getDisplayDensity())); if (x_inches < 3.5) { settings->setDefault("hud_scaling", "0.6"); - } - else if (x_inches < 4.5) { + } else if (x_inches < 4.5) { settings->setDefault("hud_scaling", "0.7"); } settings->setDefault("curl_verify_cert","false"); @@ -393,7 +404,7 @@ void set_default_settings(Settings *settings) void override_default_settings(Settings *settings, Settings *from) { std::vector<std::string> names = from->getNames(); - for(size_t i=0; i<names.size(); i++){ + for (size_t i = 0; i < names.size(); i++) { const std::string &name = names[i]; settings->setDefault(name, from->get(name)); } diff --git a/src/defaultsettings.h b/src/defaultsettings.h index 20274a003..21c51396f 100644 --- a/src/defaultsettings.h +++ b/src/defaultsettings.h @@ -36,4 +36,3 @@ void set_default_settings(Settings *settings); void override_default_settings(Settings *settings, Settings *from); #endif - diff --git a/src/drawscene.cpp b/src/drawscene.cpp index c6abda4ac..59f9b8375 100644 --- a/src/drawscene.cpp +++ b/src/drawscene.cpp @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/timetaker.h" #include "fontengine.h" #include "guiscalingfilter.h" +#include "filesys.h" typedef enum { LEFT = -1, @@ -383,6 +384,10 @@ void draw_pageflip_3d_mode(Camera& camera, bool show_hud, bool draw_wield_tool, Client& client, gui::IGUIEnvironment* guienv, video::SColor skycolor) { +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 + errorstream << "Pageflip 3D mode is not supported" + << " with your Irrlicht version!" << std::endl; +#else /* preserve old setup*/ irr::core::vector3df oldPosition = camera.getCameraNode()->getPosition(); irr::core::vector3df oldTarget = camera.getCameraNode()->getTarget(); @@ -451,12 +456,40 @@ void draw_pageflip_3d_mode(Camera& camera, bool show_hud, camera.getCameraNode()->setPosition(oldPosition); camera.getCameraNode()->setTarget(oldTarget); +#endif +} + +// returns (size / coef), rounded upwards +inline int scaledown(int coef, int size) +{ + return (size + coef - 1) / coef; } -void draw_plain(Camera &camera, bool show_hud, Hud &hud, - video::IVideoDriver *driver, bool draw_wield_tool, - Client &client, gui::IGUIEnvironment *guienv) +void draw_plain(Camera &camera, bool show_hud, + Hud &hud, video::IVideoDriver *driver, + scene::ISceneManager *smgr, const v2u32 &screensize, + bool draw_wield_tool, Client &client, gui::IGUIEnvironment *guienv, + video::SColor skycolor) { + // Undersampling-specific stuff + static video::ITexture *image = NULL; + static v2u32 last_pixelated_size = v2u32(0, 0); + int undersampling = g_settings->getU16("undersampling"); + v2u32 pixelated_size; + v2u32 dest_size; + if (undersampling > 0) { + pixelated_size = v2u32(scaledown(undersampling, screensize.X), + scaledown(undersampling, screensize.Y)); + dest_size = v2u32(undersampling * pixelated_size.X, undersampling * pixelated_size.Y); + if (pixelated_size != last_pixelated_size) { + init_texture(driver, pixelated_size, &image, "mt_drawimage_img1"); + last_pixelated_size = pixelated_size; + } + driver->setRenderTarget(image, true, true, skycolor); + } + + // Render + smgr->drawAll(); driver->setTransform(video::ETS_WORLD, core::IdentityMatrix); if (show_hud) { hud.drawSelectionMesh(); @@ -464,11 +497,19 @@ void draw_plain(Camera &camera, bool show_hud, Hud &hud, camera.drawWieldedTool(); } } + + // Upscale lowres render + if (undersampling > 0) { + driver->setRenderTarget(0, true, true); + driver->draw2DImage(image, + irr::core::rect<s32>(0, 0, dest_size.X, dest_size.Y), + irr::core::rect<s32>(0, 0, pixelated_size.X, pixelated_size.Y)); + } } void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr, - Camera &camera, Client& client, LocalPlayer *player, Hud &hud, - Mapper &mapper, gui::IGUIEnvironment *guienv, + Camera &camera, Client &client, LocalPlayer *player, Hud &hud, + Minimap *mapper, gui::IGUIEnvironment *guienv, const v2u32 &screensize, const video::SColor &skycolor, bool show_hud, bool show_minimap) { @@ -488,9 +529,7 @@ void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr, catch(SettingNotFoundException) {} #endif - std::string draw_mode = g_settings->get("3d_mode"); - - smgr->drawAll(); + const std::string &draw_mode = g_settings->get("3d_mode"); if (draw_mode == "anaglyph") { @@ -525,7 +564,7 @@ void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr, } else { draw_plain(camera, show_hud, hud, driver, - draw_wield_tool, client, guienv); + smgr, screensize, draw_wield_tool, client, guienv, skycolor); } /* @@ -545,8 +584,8 @@ void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr, hud.drawLuaElements(camera.getOffset()); camera.drawNametags(); - if (show_minimap) - mapper.drawMinimap(); + if (mapper && show_minimap) + mapper->drawMinimap(); } guienv->drawAll(); @@ -560,7 +599,8 @@ void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr, Additionally, a progressbar can be drawn when percent is set between 0 and 100. */ void draw_load_screen(const std::wstring &text, IrrlichtDevice* device, - gui::IGUIEnvironment* guienv, float dtime, int percent, bool clouds ) + gui::IGUIEnvironment* guienv, ITextureSource *tsrc, + float dtime, int percent, bool clouds) { video::IVideoDriver* driver = device->getVideoDriver(); v2u32 screensize = porting::getWindowSize(); @@ -585,30 +625,49 @@ void draw_load_screen(const std::wstring &text, IrrlichtDevice* device, driver->beginScene(true, true, video::SColor(255, 0, 0, 0)); // draw progress bar - if ((percent >= 0) && (percent <= 100)) - { - v2s32 barsize( - // 342 is (approximately) 256/0.75 to keep bar on same size as - // before with default settings - 342 * porting::getDisplayDensity() * - g_settings->getFloat("gui_scaling"), - g_fontengine->getTextHeight() * 2); - - core::rect<s32> barrect(center - barsize / 2, center + barsize / 2); - driver->draw2DRectangle(video::SColor(255, 255, 255, 255),barrect, NULL); // border - driver->draw2DRectangle(video::SColor(255, 64, 64, 64), core::rect<s32> ( - barrect.UpperLeftCorner + 1, - barrect.LowerRightCorner-1), NULL); // black inside the bar - driver->draw2DRectangle(video::SColor(255, 128, 128, 128), core::rect<s32> ( - barrect.UpperLeftCorner + 1, - core::vector2d<s32>( - barrect.LowerRightCorner.X - - (barsize.X - 1) + percent * (barsize.X - 2) / 100, - barrect.LowerRightCorner.Y - 1)), NULL); // the actual progress + if ((percent >= 0) && (percent <= 100)) { + video::ITexture *progress_img = tsrc->getTexture("progress_bar.png"); + video::ITexture *progress_img_bg = tsrc->getTexture("progress_bar_bg.png"); + + if (progress_img && progress_img_bg) { +#ifndef __ANDROID__ + const core::dimension2d<u32> &img_size = progress_img_bg->getSize(); + u32 imgW = rangelim(img_size.Width, 200, 600); + u32 imgH = rangelim(img_size.Height, 24, 72); +#else + const core::dimension2d<u32> img_size(256, 48); + float imgRatio = (float) img_size.Height / img_size.Width; + u32 imgW = screensize.X / 2.2f; + u32 imgH = floor(imgW * imgRatio); +#endif + v2s32 img_pos((screensize.X - imgW) / 2, (screensize.Y - imgH) / 2); + + draw2DImageFilterScaled( + driver, progress_img_bg, + core::rect<s32>(img_pos.X, + img_pos.Y, + img_pos.X + imgW, + img_pos.Y + imgH), + core::rect<s32>(0, 0, + img_size.Width, + img_size.Height), + 0, 0, true); + + draw2DImageFilterScaled( + driver, progress_img, + core::rect<s32>(img_pos.X, + img_pos.Y, + img_pos.X + (percent * imgW) / 100, + img_pos.Y + imgH), + core::rect<s32>(0, 0, + (percent * img_size.Width) / 100, + img_size.Height), + 0, 0, true); + } } + guienv->drawAll(); driver->endScene(); - guitext->remove(); //return guitext; diff --git a/src/drawscene.h b/src/drawscene.h index 364fcd499..99ff1a6bc 100644 --- a/src/drawscene.h +++ b/src/drawscene.h @@ -27,12 +27,12 @@ with this program; if not, write to the Free Software Foundation, Inc., void draw_load_screen(const std::wstring &text, IrrlichtDevice *device, - gui::IGUIEnvironment *guienv, float dtime = 0, int percent = 0, - bool clouds = true); + gui::IGUIEnvironment *guienv, ITextureSource *tsrc, float dtime = 0, + int percent = 0, bool clouds = true); void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr, Camera &camera, Client &client, LocalPlayer *player, - Hud &hud, Mapper &mapper, gui::IGUIEnvironment *guienv, + Hud &hud, Minimap *mapper, gui::IGUIEnvironment *guienv, const v2u32 &screensize, const video::SColor &skycolor, bool show_hud, bool show_minimap); diff --git a/src/dungeongen.cpp b/src/dungeongen.cpp index 78573da04..6cef3f88d 100644 --- a/src/dungeongen.cpp +++ b/src/dungeongen.cpp @@ -52,6 +52,7 @@ DungeonGen::DungeonGen(INodeDefManager *ndef, if (dparams) { memcpy(&dp, dparams, sizeof(dp)); } else { + // Default dungeon parameters dp.seed = 0; dp.c_water = ndef->getId("mapgen_water_source"); @@ -63,14 +64,20 @@ DungeonGen::DungeonGen(INodeDefManager *ndef, if (dp.c_river_water == CONTENT_IGNORE) dp.c_river_water = ndef->getId("mapgen_water_source"); - dp.diagonal_dirs = false; - dp.holesize = v3s16(1, 2, 1); - dp.roomsize = v3s16(0, 0, 0); - dp.rooms_min = 2; - dp.rooms_max = 16; - dp.y_min = -MAX_MAP_GENERATION_LIMIT; - dp.y_max = MAX_MAP_GENERATION_LIMIT; - dp.notifytype = GENNOTIFY_DUNGEON; + dp.diagonal_dirs = false; + dp.only_in_ground = true; + dp.holesize = v3s16(1, 2, 1); + dp.corridor_len_min = 1; + dp.corridor_len_max = 13; + dp.room_size_min = v3s16(4, 4, 4); + dp.room_size_max = v3s16(8, 6, 8); + dp.room_size_large_min = v3s16(8, 8, 8); + dp.room_size_large_max = v3s16(16, 16, 16); + dp.rooms_min = 2; + dp.rooms_max = 16; + dp.y_min = -MAX_MAP_GENERATION_LIMIT; + dp.y_max = MAX_MAP_GENERATION_LIMIT; + dp.notifytype = GENNOTIFY_DUNGEON; dp.np_density = nparams_dungeon_density; dp.np_alt_wall = nparams_dungeon_alt_wall; @@ -97,16 +104,19 @@ void DungeonGen::generate(MMVManip *vm, u32 bseed, v3s16 nmin, v3s16 nmax) // Dungeon generator doesn't modify places which have this set vm->clearFlag(VMANIP_FLAG_DUNGEON_INSIDE | VMANIP_FLAG_DUNGEON_PRESERVE); - // Set all air and water to be untouchable - // to make dungeons open to caves and open air - for (s16 z = nmin.Z; z <= nmax.Z; z++) { - for (s16 y = nmin.Y; y <= nmax.Y; y++) { - u32 i = vm->m_area.index(nmin.X, y, z); - for (s16 x = nmin.X; x <= nmax.X; x++) { - content_t c = vm->m_data[i].getContent(); - if (c == CONTENT_AIR || c == dp.c_water || c == dp.c_river_water) - vm->m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE; - i++; + if (dp.only_in_ground) { + // Set all air and water to be untouchable + // to make dungeons open to caves and open air + for (s16 z = nmin.Z; z <= nmax.Z; z++) { + for (s16 y = nmin.Y; y <= nmax.Y; y++) { + u32 i = vm->m_area.index(nmin.X, y, z); + for (s16 x = nmin.X; x <= nmax.X; x++) { + content_t c = vm->m_data[i].getContent(); + if (c == CONTENT_AIR || c == dp.c_water || + c == dp.c_river_water) + vm->m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE; + i++; + } } } } @@ -142,21 +152,25 @@ void DungeonGen::makeDungeon(v3s16 start_padding) v3s16 roomplace; /* - Find place for first room + Find place for first room. + There is a 1 in 4 chance of the first room being 'large', + all other rooms are not 'large'. */ bool fits = false; for (u32 i = 0; i < 100 && !fits; i++) { bool is_large_room = ((random.next() & 3) == 1); if (is_large_room) { - roomsize.Z = random.range(8, 16); - roomsize.Y = random.range(8, 16); - roomsize.X = random.range(8, 16); + roomsize.Z = random.range( + dp.room_size_large_min.Z, dp.room_size_large_max.Z); + roomsize.Y = random.range( + dp.room_size_large_min.Y, dp.room_size_large_max.Y); + roomsize.X = random.range( + dp.room_size_large_min.X, dp.room_size_large_max.X); } else { - roomsize.Z = random.range(4, 8); - roomsize.Y = random.range(4, 6); - roomsize.X = random.range(4, 8); + roomsize.Z = random.range(dp.room_size_min.Z, dp.room_size_max.Z); + roomsize.Y = random.range(dp.room_size_min.Y, dp.room_size_max.Y); + roomsize.X = random.range(dp.room_size_min.X, dp.room_size_max.X); } - roomsize += dp.roomsize; // start_padding is used to disallow starting the generation of // a dungeon in a neighboring generation chunk @@ -246,10 +260,9 @@ void DungeonGen::makeDungeon(v3s16 start_padding) makeCorridor(doorplace, doordir, corridor_end, corridor_end_dir); // Find a place for a random sized room - roomsize.Z = random.range(4, 8); - roomsize.Y = random.range(4, 6); - roomsize.X = random.range(4, 8); - roomsize += dp.roomsize; + roomsize.Z = random.range(dp.room_size_min.Z, dp.room_size_max.Z); + roomsize.Y = random.range(dp.room_size_min.Y, dp.room_size_max.Y); + roomsize.X = random.range(dp.room_size_min.X, dp.room_size_max.X); m_pos = corridor_end; m_dir = corridor_end_dir; @@ -397,13 +410,8 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir, makeHole(doorplace); v3s16 p0 = doorplace; v3s16 dir = doordir; - u32 length; - /*if (random.next() % 2) - length = random.range(1, 13); - else - length = random.range(1, 6);*/ - length = random.range(1, 13); - u32 partlength = random.range(1, 13); + u32 length = random.range(dp.corridor_len_min, dp.corridor_len_max); + u32 partlength = random.range(dp.corridor_len_min, dp.corridor_len_max); u32 partcount = 0; s16 make_stairs = 0; @@ -415,8 +423,8 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir, if (partcount != 0) p.Y += make_stairs; - if (vm->m_area.contains(p) && vm->m_area.contains(p + v3s16(0, 1, 0)) && - vm->m_area.contains(v3s16(p.X - dir.X, p.Y - 1, p.Z - dir.Z))) { + // Check segment of minimum size corridor is in voxelmanip + if (vm->m_area.contains(p) && vm->m_area.contains(p + v3s16(0, 1, 0))) { if (make_stairs) { makeFill(p + v3s16(-1, -1, -1), dp.holesize + v3s16(2, 3, 2), @@ -437,14 +445,24 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir, // rotate face 180 deg if // making stairs backwards int facedir = dir_to_facedir(dir * make_stairs); - - u32 vi = vm->m_area.index(p.X - dir.X, p.Y - 1, p.Z - dir.Z); - if (vm->m_data[vi].getContent() == dp.c_wall) - vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir); - - vi = vm->m_area.index(p.X, p.Y, p.Z); - if (vm->m_data[vi].getContent() == dp.c_wall) - vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir); + v3s16 ps = p; + u16 stair_width = (dir.Z != 0) ? dp.holesize.X : dp.holesize.Z; + // Stair width direction vector + v3s16 swv = (dir.Z != 0) ? v3s16(1, 0, 0) : v3s16(0, 0, 1); + + for (u16 st = 0; st < stair_width; st++) { + u32 vi = vm->m_area.index(ps.X - dir.X, ps.Y - 1, ps.Z - dir.Z); + if (vm->m_area.contains(ps + v3s16(-dir.X, -1, -dir.Z)) && + vm->m_data[vi].getContent() == dp.c_wall) + vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir); + + vi = vm->m_area.index(ps.X, ps.Y, ps.Z); + if (vm->m_area.contains(ps) && + vm->m_data[vi].getContent() == dp.c_wall) + vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir); + + ps += swv; + } } } else { makeFill(p + v3s16(-1, -1, -1), @@ -546,7 +564,6 @@ bool DungeonGen::findPlaceForRoomDoor(v3s16 roomsize, v3s16 &result_doorplace, continue; v3s16 roomplace; // X east, Z north, Y up -#if 1 if (doordir == v3s16(1, 0, 0)) // X+ roomplace = doorplace + v3s16(0, -1, random.range(-roomsize.Z + 2, -2)); @@ -559,17 +576,6 @@ bool DungeonGen::findPlaceForRoomDoor(v3s16 roomsize, v3s16 &result_doorplace, if (doordir == v3s16(0, 0, -1)) // Z- roomplace = doorplace + v3s16(random.range(-roomsize.X + 2, -2), -1, -roomsize.Z + 1); -#endif -#if 0 - if (doordir == v3s16(1, 0, 0)) // X+ - roomplace = doorplace + v3s16(0, -1, -roomsize.Z / 2); - if (doordir == v3s16(-1, 0, 0)) // X- - roomplace = doorplace + v3s16(-roomsize.X+1,-1,-roomsize.Z / 2); - if (doordir == v3s16(0, 0, 1)) // Z+ - roomplace = doorplace + v3s16(-roomsize.X / 2, -1, 0); - if (doordir == v3s16(0, 0, -1)) // Z- - roomplace = doorplace + v3s16(-roomsize.X / 2, -1, -roomsize.Z + 1); -#endif // Check fit bool fits = true; @@ -612,7 +618,7 @@ v3s16 rand_ortho_dir(PseudoRandom &random, bool diagonal_dirs) dir.Z = random.next() % 3 - 1; dir.Y = 0; dir.X = random.next() % 3 - 1; - } while ((dir.X == 0 && dir.Z == 0) && trycount < 10); + } while ((dir.X == 0 || dir.Z == 0) && trycount < 10); return dir; } else { diff --git a/src/dungeongen.h b/src/dungeongen.h index 30786b9f3..4bd208330 100644 --- a/src/dungeongen.h +++ b/src/dungeongen.h @@ -48,8 +48,14 @@ struct DungeonParams { content_t c_stair; bool diagonal_dirs; + bool only_in_ground; v3s16 holesize; - v3s16 roomsize; + u16 corridor_len_min; + u16 corridor_len_max; + v3s16 room_size_min; + v3s16 room_size_max; + v3s16 room_size_large_min; + v3s16 room_size_large_max; u16 rooms_min; u16 rooms_max; s16 y_min; diff --git a/src/emerge.cpp b/src/emerge.cpp index 25b2e924b..d24971e44 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -40,7 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mg_schematic.h" #include "nodedef.h" #include "profiler.h" -#include "scripting_game.h" +#include "scripting_server.h" #include "server.h" #include "serverobject.h" #include "settings.h" @@ -89,13 +89,13 @@ private: //// EmergeManager //// -EmergeManager::EmergeManager(IGameDef *gamedef) +EmergeManager::EmergeManager(Server *server) { - this->ndef = gamedef->getNodeDefManager(); - this->biomemgr = new BiomeManager(gamedef); - this->oremgr = new OreManager(gamedef); - this->decomgr = new DecorationManager(gamedef); - this->schemmgr = new SchematicManager(gamedef); + this->ndef = server->getNodeDefManager(); + this->biomemgr = new BiomeManager(server); + this->oremgr = new OreManager(server); + this->decomgr = new DecorationManager(server); + this->schemmgr = new SchematicManager(server); this->gen_notify_on = 0; // Note that accesses to this variable are not synchronized. @@ -128,7 +128,7 @@ EmergeManager::EmergeManager(IGameDef *gamedef) m_qlimit_generate = 1; for (s16 i = 0; i < nthreads; i++) - m_threads.push_back(new EmergeThread((Server *)gamedef, i)); + m_threads.push_back(new EmergeThread(server, i)); infostream << "EmergeManager: using " << nthreads << " threads" << std::endl; } @@ -174,6 +174,9 @@ bool EmergeManager::initMapgens(MapgenParams *params) Mapgen *EmergeManager::getCurrentMapgen() { + if (!m_threads_active) + return NULL; + for (u32 i = 0; i != m_threads.size(); i++) { if (m_threads[i]->isCurrentThread()) return m_threads[i]->m_mapgen; @@ -564,7 +567,7 @@ MapBlock *EmergeThread::finishGen(v3s16 pos, BlockMakeData *bmdata, m_server->getScriptIface()->environment_OnGenerated( minp, maxp, m_mapgen->blockseed); } catch (LuaError &e) { - m_server->setAsyncFatalError("Lua: " + std::string(e.what())); + m_server->setAsyncFatalError("Lua: finishGen" + std::string(e.what())); } EMERGE_DBG_OUT("ended up with: " << analyze_block(block)); @@ -603,7 +606,7 @@ void *EmergeThread::run() continue; } - if (blockpos_over_limit(pos)) + if (blockpos_over_max_limit(pos)) continue; bool allow_gen = bedata.flags & BLOCK_EMERGE_ALLOW_GEN; diff --git a/src/emerge.h b/src/emerge.h index 71ad97da3..76653e6cd 100644 --- a/src/emerge.h +++ b/src/emerge.h @@ -42,6 +42,7 @@ class BiomeManager; class OreManager; class DecorationManager; class SchematicManager; +class Server; // Structure containing inputs/outputs for chunk generation struct BlockMakeData { @@ -115,7 +116,7 @@ public: SchematicManager *schemmgr; // Methods - EmergeManager(IGameDef *gamedef); + EmergeManager(Server *server); ~EmergeManager(); bool initMapgens(MapgenParams *mgparams); diff --git a/src/environment.cpp b/src/environment.cpp index 13c64b37c..4e782db81 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -19,47 +19,22 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <fstream> #include "environment.h" -#include "filesys.h" -#include "porting.h" #include "collision.h" -#include "content_mapnode.h" -#include "mapblock.h" #include "serverobject.h" -#include "content_sao.h" -#include "settings.h" -#include "log.h" -#include "profiler.h" -#include "scripting_game.h" -#include "nodedef.h" -#include "nodemetadata.h" -#include "gamedef.h" -#ifndef SERVER -#include "clientmap.h" -#include "localplayer.h" -#include "mapblock_mesh.h" -#include "event.h" -#endif +#include "scripting_server.h" #include "server.h" #include "daynightratio.h" -#include "map.h" #include "emerge.h" -#include "util/serialize.h" -#include "threading/mutex_auto_lock.h" -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" -#define LBM_NAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_:" - -// A number that is much smaller than the timeout for particle spawners should/could ever be -#define PARTICLE_SPAWNER_NO_EXPIRY -1024.f - -Environment::Environment(): +Environment::Environment(IGameDef *gamedef): m_time_of_day_speed(0), m_time_of_day(9000), m_time_of_day_f(9000./24000), m_time_conversion_skew(0.0f), m_enable_day_night_ratio_override(false), - m_day_night_ratio_override(0.0f) + m_day_night_ratio_override(0.0f), + m_gamedef(gamedef) { m_cache_enable_shaders = g_settings->getBool("enable_shaders"); m_cache_active_block_mgmt_interval = g_settings->getFloat("active_block_mgmt_interval"); @@ -95,7 +70,7 @@ void Environment::setTimeOfDay(u32 time) { MutexAutoLock lock(this->m_time_lock); if (m_time_of_day > time) - m_day_count++; + ++m_day_count; m_time_of_day = time; m_time_of_day_f = (float)time / 24000.0; } @@ -128,7 +103,7 @@ void Environment::stepTimeOfDay(float dtime) // Sync at overflow if (m_time_of_day + units >= 24000) { sync_f = true; - m_day_count++; + ++m_day_count; } m_time_of_day = (m_time_of_day + units) % 24000; if (sync_f) @@ -151,2699 +126,3 @@ u32 Environment::getDayCount() // Atomic<u32> counter return m_day_count; } - - -/* - ABMWithState -*/ - -ABMWithState::ABMWithState(ActiveBlockModifier *abm_): - abm(abm_), - timer(0) -{ - // Initialize timer to random value to spread processing - float itv = abm->getTriggerInterval(); - itv = MYMAX(0.001, itv); // No less than 1ms - int minval = MYMAX(-0.51*itv, -60); // Clamp to - int maxval = MYMIN(0.51*itv, 60); // +-60 seconds - timer = myrand_range(minval, maxval); -} - -/* - LBMManager -*/ - -void LBMContentMapping::deleteContents() -{ - for (std::vector<LoadingBlockModifierDef *>::iterator it = lbm_list.begin(); - it != lbm_list.end(); ++it) { - delete *it; - } -} - -void LBMContentMapping::addLBM(LoadingBlockModifierDef *lbm_def, IGameDef *gamedef) -{ - // Add the lbm_def to the LBMContentMapping. - // Unknown names get added to the global NameIdMapping. - INodeDefManager *nodedef = gamedef->ndef(); - - lbm_list.push_back(lbm_def); - - for (std::set<std::string>::const_iterator it = lbm_def->trigger_contents.begin(); - it != lbm_def->trigger_contents.end(); ++it) { - std::set<content_t> c_ids; - bool found = nodedef->getIds(*it, c_ids); - if (!found) { - content_t c_id = gamedef->allocateUnknownNodeId(*it); - if (c_id == CONTENT_IGNORE) { - // Seems it can't be allocated. - warningstream << "Could not internalize node name \"" << *it - << "\" while loading LBM \"" << lbm_def->name << "\"." << std::endl; - continue; - } - c_ids.insert(c_id); - } - - for (std::set<content_t>::const_iterator iit = - c_ids.begin(); iit != c_ids.end(); ++iit) { - content_t c_id = *iit; - map[c_id].push_back(lbm_def); - } - } -} - -const std::vector<LoadingBlockModifierDef *> * - LBMContentMapping::lookup(content_t c) const -{ - container_map::const_iterator it = map.find(c); - if (it == map.end()) - return NULL; - // This first dereferences the iterator, returning - // a std::vector<LoadingBlockModifierDef *> - // reference, then we convert it to a pointer. - return &(it->second); -} - -LBMManager::~LBMManager() -{ - for (std::map<std::string, LoadingBlockModifierDef *>::iterator it = - m_lbm_defs.begin(); it != m_lbm_defs.end(); ++it) { - delete it->second; - } - for (lbm_lookup_map::iterator it = m_lbm_lookup.begin(); - it != m_lbm_lookup.end(); ++it) { - (it->second).deleteContents(); - } -} - -void LBMManager::addLBMDef(LoadingBlockModifierDef *lbm_def) -{ - // Precondition, in query mode the map isn't used anymore - FATAL_ERROR_IF(m_query_mode == true, - "attempted to modify LBMManager in query mode"); - - if (!string_allowed(lbm_def->name, LBM_NAME_ALLOWED_CHARS)) { - throw ModError("Error adding LBM \"" + lbm_def->name + - "\": Does not follow naming conventions: " - "Only chararacters [a-z0-9_:] are allowed."); - } - - m_lbm_defs[lbm_def->name] = lbm_def; -} - -void LBMManager::loadIntroductionTimes(const std::string ×, - IGameDef *gamedef, u32 now) -{ - m_query_mode = true; - - // name -> time map. - // Storing it in a map first instead of - // handling the stuff directly in the loop - // removes all duplicate entries. - // TODO make this std::unordered_map - std::map<std::string, u32> introduction_times; - - /* - The introduction times string consists of name~time entries, - with each entry terminated by a semicolon. The time is decimal. - */ - - size_t idx = 0; - size_t idx_new; - while ((idx_new = times.find(";", idx)) != std::string::npos) { - std::string entry = times.substr(idx, idx_new - idx); - std::vector<std::string> components = str_split(entry, '~'); - if (components.size() != 2) - throw SerializationError("Introduction times entry \"" - + entry + "\" requires exactly one '~'!"); - const std::string &name = components[0]; - u32 time = from_string<u32>(components[1]); - introduction_times[name] = time; - idx = idx_new + 1; - } - - // Put stuff from introduction_times into m_lbm_lookup - for (std::map<std::string, u32>::const_iterator it = introduction_times.begin(); - it != introduction_times.end(); ++it) { - const std::string &name = it->first; - u32 time = it->second; - - std::map<std::string, LoadingBlockModifierDef *>::iterator def_it = - m_lbm_defs.find(name); - if (def_it == m_lbm_defs.end()) { - // This seems to be an LBM entry for - // an LBM we haven't loaded. Discard it. - continue; - } - LoadingBlockModifierDef *lbm_def = def_it->second; - if (lbm_def->run_at_every_load) { - // This seems to be an LBM entry for - // an LBM that runs at every load. - // Don't add it just yet. - continue; - } - - m_lbm_lookup[time].addLBM(lbm_def, gamedef); - - // Erase the entry so that we know later - // what elements didn't get put into m_lbm_lookup - m_lbm_defs.erase(name); - } - - // Now also add the elements from m_lbm_defs to m_lbm_lookup - // that weren't added in the previous step. - // They are introduced first time to this world, - // or are run at every load (introducement time hardcoded to U32_MAX). - - LBMContentMapping &lbms_we_introduce_now = m_lbm_lookup[now]; - LBMContentMapping &lbms_running_always = m_lbm_lookup[U32_MAX]; - - for (std::map<std::string, LoadingBlockModifierDef *>::iterator it = - m_lbm_defs.begin(); it != m_lbm_defs.end(); ++it) { - if (it->second->run_at_every_load) { - lbms_running_always.addLBM(it->second, gamedef); - } else { - lbms_we_introduce_now.addLBM(it->second, gamedef); - } - } - - // Clear the list, so that we don't delete remaining elements - // twice in the destructor - m_lbm_defs.clear(); -} - -std::string LBMManager::createIntroductionTimesString() -{ - // Precondition, we must be in query mode - FATAL_ERROR_IF(m_query_mode == false, - "attempted to query on non fully set up LBMManager"); - - std::ostringstream oss; - for (lbm_lookup_map::iterator it = m_lbm_lookup.begin(); - it != m_lbm_lookup.end(); ++it) { - u32 time = it->first; - std::vector<LoadingBlockModifierDef *> &lbm_list = it->second.lbm_list; - for (std::vector<LoadingBlockModifierDef *>::iterator iit = lbm_list.begin(); - iit != lbm_list.end(); ++iit) { - // Don't add if the LBM runs at every load, - // then introducement time is hardcoded - // and doesn't need to be stored - if ((*iit)->run_at_every_load) - continue; - oss << (*iit)->name << "~" << time << ";"; - } - } - return oss.str(); -} - -void LBMManager::applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp) -{ - // Precondition, we need m_lbm_lookup to be initialized - FATAL_ERROR_IF(m_query_mode == false, - "attempted to query on non fully set up LBMManager"); - v3s16 pos_of_block = block->getPosRelative(); - v3s16 pos; - MapNode n; - content_t c; - lbm_lookup_map::const_iterator it = getLBMsIntroducedAfter(stamp); - for (pos.X = 0; pos.X < MAP_BLOCKSIZE; pos.X++) - for (pos.Y = 0; pos.Y < MAP_BLOCKSIZE; pos.Y++) - for (pos.Z = 0; pos.Z < MAP_BLOCKSIZE; pos.Z++) - { - n = block->getNodeNoEx(pos); - c = n.getContent(); - for (LBMManager::lbm_lookup_map::const_iterator iit = it; - iit != m_lbm_lookup.end(); ++iit) { - const std::vector<LoadingBlockModifierDef *> *lbm_list = - iit->second.lookup(c); - if (!lbm_list) - continue; - for (std::vector<LoadingBlockModifierDef *>::const_iterator iit = - lbm_list->begin(); iit != lbm_list->end(); ++iit) { - (*iit)->trigger(env, pos + pos_of_block, n); - } - } - } -} - -/* - ActiveBlockList -*/ - -void fillRadiusBlock(v3s16 p0, s16 r, std::set<v3s16> &list) -{ - v3s16 p; - for(p.X=p0.X-r; p.X<=p0.X+r; p.X++) - for(p.Y=p0.Y-r; p.Y<=p0.Y+r; p.Y++) - for(p.Z=p0.Z-r; p.Z<=p0.Z+r; p.Z++) - { - // Set in list - list.insert(p); - } -} - -void ActiveBlockList::update(std::vector<v3s16> &active_positions, - s16 radius, - std::set<v3s16> &blocks_removed, - std::set<v3s16> &blocks_added) -{ - /* - Create the new list - */ - std::set<v3s16> newlist = m_forceloaded_list; - for(std::vector<v3s16>::iterator i = active_positions.begin(); - i != active_positions.end(); ++i) - { - fillRadiusBlock(*i, radius, newlist); - } - - /* - Find out which blocks on the old list are not on the new list - */ - // Go through old list - for(std::set<v3s16>::iterator i = m_list.begin(); - i != m_list.end(); ++i) - { - v3s16 p = *i; - // If not on new list, it's been removed - if(newlist.find(p) == newlist.end()) - blocks_removed.insert(p); - } - - /* - Find out which blocks on the new list are not on the old list - */ - // Go through new list - for(std::set<v3s16>::iterator i = newlist.begin(); - i != newlist.end(); ++i) - { - v3s16 p = *i; - // If not on old list, it's been added - if(m_list.find(p) == m_list.end()) - blocks_added.insert(p); - } - - /* - Update m_list - */ - m_list.clear(); - for(std::set<v3s16>::iterator i = newlist.begin(); - i != newlist.end(); ++i) - { - v3s16 p = *i; - m_list.insert(p); - } -} - -/* - ServerEnvironment -*/ - -ServerEnvironment::ServerEnvironment(ServerMap *map, - GameScripting *scriptIface, IGameDef *gamedef, - const std::string &path_world) : - m_map(map), - m_script(scriptIface), - m_gamedef(gamedef), - m_path_world(path_world), - m_send_recommended_timer(0), - m_active_block_interval_overload_skip(0), - m_game_time(0), - m_game_time_fraction_counter(0), - m_last_clear_objects_time(0), - m_recommended_send_interval(0.1), - m_max_lag_estimate(0.1) -{ -} - -ServerEnvironment::~ServerEnvironment() -{ - // Clear active block list. - // This makes the next one delete all active objects. - m_active_blocks.clear(); - - // Convert all objects to static and delete the active objects - deactivateFarObjects(true); - - // Drop/delete map - m_map->drop(); - - // Delete ActiveBlockModifiers - for (std::vector<ABMWithState>::iterator - i = m_abms.begin(); i != m_abms.end(); ++i){ - delete i->abm; - } - - // Deallocate players - for (std::vector<RemotePlayer *>::iterator i = m_players.begin(); - i != m_players.end(); ++i) { - delete (*i); - } -} - -Map & ServerEnvironment::getMap() -{ - return *m_map; -} - -ServerMap & ServerEnvironment::getServerMap() -{ - return *m_map; -} - -RemotePlayer *ServerEnvironment::getPlayer(const u16 peer_id) -{ - for (std::vector<RemotePlayer *>::iterator i = m_players.begin(); - i != m_players.end(); ++i) { - RemotePlayer *player = *i; - if (player->peer_id == peer_id) - return player; - } - return NULL; -} - -RemotePlayer *ServerEnvironment::getPlayer(const char* name) -{ - for (std::vector<RemotePlayer *>::iterator i = m_players.begin(); - i != m_players.end(); ++i) { - RemotePlayer *player = *i; - if (strcmp(player->getName(), name) == 0) - return player; - } - return NULL; -} - -void ServerEnvironment::addPlayer(RemotePlayer *player) -{ - DSTACK(FUNCTION_NAME); - /* - Check that peer_ids are unique. - Also check that names are unique. - Exception: there can be multiple players with peer_id=0 - */ - // If peer id is non-zero, it has to be unique. - if (player->peer_id != 0) - FATAL_ERROR_IF(getPlayer(player->peer_id) != NULL, "Peer id not unique"); - // Name has to be unique. - FATAL_ERROR_IF(getPlayer(player->getName()) != NULL, "Player name not unique"); - // Add. - m_players.push_back(player); -} - -void ServerEnvironment::removePlayer(RemotePlayer *player) -{ - for (std::vector<RemotePlayer *>::iterator it = m_players.begin(); - it != m_players.end(); ++it) { - if ((*it) == player) { - delete *it; - m_players.erase(it); - return; - } - } -} - -bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16 *p) -{ - float distance = pos1.getDistanceFrom(pos2); - - //calculate normalized direction vector - v3f normalized_vector = v3f((pos2.X - pos1.X)/distance, - (pos2.Y - pos1.Y)/distance, - (pos2.Z - pos1.Z)/distance); - - //find out if there's a node on path between pos1 and pos2 - for (float i = 1; i < distance; i += stepsize) { - v3s16 pos = floatToInt(v3f(normalized_vector.X * i, - normalized_vector.Y * i, - normalized_vector.Z * i) +pos1,BS); - - MapNode n = getMap().getNodeNoEx(pos); - - if(n.param0 != CONTENT_AIR) { - if (p) { - *p = pos; - } - return false; - } - } - return true; -} - -void ServerEnvironment::kickAllPlayers(AccessDeniedCode reason, - const std::string &str_reason, bool reconnect) -{ - for (std::vector<RemotePlayer *>::iterator it = m_players.begin(); - it != m_players.end(); ++it) { - RemotePlayer *player = dynamic_cast<RemotePlayer *>(*it); - ((Server*)m_gamedef)->DenyAccessVerCompliant(player->peer_id, - player->protocol_version, reason, str_reason, reconnect); - } -} - -void ServerEnvironment::saveLoadedPlayers() -{ - std::string players_path = m_path_world + DIR_DELIM "players"; - fs::CreateDir(players_path); - - for (std::vector<RemotePlayer *>::iterator it = m_players.begin(); - it != m_players.end(); - ++it) { - if ((*it)->checkModified()) { - (*it)->save(players_path, m_gamedef); - } - } -} - -void ServerEnvironment::savePlayer(RemotePlayer *player) -{ - std::string players_path = m_path_world + DIR_DELIM "players"; - fs::CreateDir(players_path); - - player->save(players_path, m_gamedef); -} - -RemotePlayer *ServerEnvironment::loadPlayer(const std::string &playername, PlayerSAO *sao) -{ - bool newplayer = false; - bool found = false; - std::string players_path = m_path_world + DIR_DELIM "players" DIR_DELIM; - std::string path = players_path + playername; - - RemotePlayer *player = getPlayer(playername.c_str()); - if (!player) { - player = new RemotePlayer("", m_gamedef->idef()); - newplayer = true; - } - - for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) { - //// Open file and deserialize - std::ifstream is(path.c_str(), std::ios_base::binary); - if (!is.good()) - continue; - - player->deSerialize(is, path, sao); - is.close(); - - if (player->getName() == playername) { - found = true; - break; - } - - path = players_path + playername + itos(i); - } - - if (!found) { - infostream << "Player file for player " << playername - << " not found" << std::endl; - if (newplayer) - delete player; - - return NULL; - } - - if (newplayer) { - addPlayer(player); - } - player->setModified(false); - return player; -} - -void ServerEnvironment::saveMeta() -{ - std::string path = m_path_world + DIR_DELIM "env_meta.txt"; - - // Open file and serialize - std::ostringstream ss(std::ios_base::binary); - - Settings args; - args.setU64("game_time", m_game_time); - args.setU64("time_of_day", getTimeOfDay()); - args.setU64("last_clear_objects_time", m_last_clear_objects_time); - args.setU64("lbm_introduction_times_version", 1); - args.set("lbm_introduction_times", - m_lbm_mgr.createIntroductionTimesString()); - args.setU64("day_count", m_day_count); - args.writeLines(ss); - ss<<"EnvArgsEnd\n"; - - if(!fs::safeWriteToFile(path, ss.str())) - { - infostream<<"ServerEnvironment::saveMeta(): Failed to write " - <<path<<std::endl; - throw SerializationError("Couldn't save env meta"); - } -} - -void ServerEnvironment::loadMeta() -{ - std::string path = m_path_world + DIR_DELIM "env_meta.txt"; - - // Open file and deserialize - std::ifstream is(path.c_str(), std::ios_base::binary); - if (!is.good()) { - infostream << "ServerEnvironment::loadMeta(): Failed to open " - << path << std::endl; - throw SerializationError("Couldn't load env meta"); - } - - Settings args; - - if (!args.parseConfigLines(is, "EnvArgsEnd")) { - throw SerializationError("ServerEnvironment::loadMeta(): " - "EnvArgsEnd not found!"); - } - - try { - m_game_time = args.getU64("game_time"); - } catch (SettingNotFoundException &e) { - // Getting this is crucial, otherwise timestamps are useless - throw SerializationError("Couldn't load env meta game_time"); - } - - setTimeOfDay(args.exists("time_of_day") ? - // set day to morning by default - args.getU64("time_of_day") : 9000); - - m_last_clear_objects_time = args.exists("last_clear_objects_time") ? - // If missing, do as if clearObjects was never called - args.getU64("last_clear_objects_time") : 0; - - std::string lbm_introduction_times = ""; - try { - u64 ver = args.getU64("lbm_introduction_times_version"); - if (ver == 1) { - lbm_introduction_times = args.get("lbm_introduction_times"); - } else { - infostream << "ServerEnvironment::loadMeta(): Non-supported" - << " introduction time version " << ver << std::endl; - } - } catch (SettingNotFoundException &e) { - // No problem, this is expected. Just continue with an empty string - } - m_lbm_mgr.loadIntroductionTimes(lbm_introduction_times, m_gamedef, m_game_time); - - m_day_count = args.exists("day_count") ? - args.getU64("day_count") : 0; -} - -void ServerEnvironment::loadDefaultMeta() -{ - m_lbm_mgr.loadIntroductionTimes("", m_gamedef, m_game_time); -} - -struct ActiveABM -{ - ActiveBlockModifier *abm; - int chance; - std::set<content_t> required_neighbors; -}; - -class ABMHandler -{ -private: - ServerEnvironment *m_env; - std::map<content_t, std::vector<ActiveABM> > m_aabms; -public: - ABMHandler(std::vector<ABMWithState> &abms, - float dtime_s, ServerEnvironment *env, - bool use_timers): - m_env(env) - { - if(dtime_s < 0.001) - return; - INodeDefManager *ndef = env->getGameDef()->ndef(); - for(std::vector<ABMWithState>::iterator - i = abms.begin(); i != abms.end(); ++i) { - ActiveBlockModifier *abm = i->abm; - float trigger_interval = abm->getTriggerInterval(); - if(trigger_interval < 0.001) - trigger_interval = 0.001; - float actual_interval = dtime_s; - if(use_timers){ - i->timer += dtime_s; - if(i->timer < trigger_interval) - continue; - i->timer -= trigger_interval; - actual_interval = trigger_interval; - } - float chance = abm->getTriggerChance(); - if(chance == 0) - chance = 1; - ActiveABM aabm; - aabm.abm = abm; - if(abm->getSimpleCatchUp()) { - float intervals = actual_interval / trigger_interval; - if(intervals == 0) - continue; - aabm.chance = chance / intervals; - if(aabm.chance == 0) - aabm.chance = 1; - } else { - aabm.chance = chance; - } - // Trigger neighbors - std::set<std::string> required_neighbors_s - = abm->getRequiredNeighbors(); - for(std::set<std::string>::iterator - i = required_neighbors_s.begin(); - i != required_neighbors_s.end(); ++i) - { - ndef->getIds(*i, aabm.required_neighbors); - } - // Trigger contents - std::set<std::string> contents_s = abm->getTriggerContents(); - for(std::set<std::string>::iterator - i = contents_s.begin(); i != contents_s.end(); ++i) - { - std::set<content_t> ids; - ndef->getIds(*i, ids); - for(std::set<content_t>::const_iterator k = ids.begin(); - k != ids.end(); ++k) - { - content_t c = *k; - std::map<content_t, std::vector<ActiveABM> >::iterator j; - j = m_aabms.find(c); - if(j == m_aabms.end()){ - std::vector<ActiveABM> aabmlist; - m_aabms[c] = aabmlist; - j = m_aabms.find(c); - } - j->second.push_back(aabm); - } - } - } - } - // Find out how many objects the given block and its neighbours contain. - // Returns the number of objects in the block, and also in 'wider' the - // number of objects in the block and all its neighbours. The latter - // may an estimate if any neighbours are unloaded. - u32 countObjects(MapBlock *block, ServerMap * map, u32 &wider) - { - wider = 0; - u32 wider_unknown_count = 0; - for(s16 x=-1; x<=1; x++) - for(s16 y=-1; y<=1; y++) - for(s16 z=-1; z<=1; z++) - { - MapBlock *block2 = map->getBlockNoCreateNoEx( - block->getPos() + v3s16(x,y,z)); - if(block2==NULL){ - wider_unknown_count++; - continue; - } - wider += block2->m_static_objects.m_active.size() - + block2->m_static_objects.m_stored.size(); - } - // Extrapolate - u32 active_object_count = block->m_static_objects.m_active.size(); - u32 wider_known_count = 3*3*3 - wider_unknown_count; - wider += wider_unknown_count * wider / wider_known_count; - return active_object_count; - - } - void apply(MapBlock *block) - { - if(m_aabms.empty()) - return; - - ServerMap *map = &m_env->getServerMap(); - - u32 active_object_count_wider; - u32 active_object_count = this->countObjects(block, map, active_object_count_wider); - m_env->m_added_objects = 0; - - v3s16 p0; - for(p0.X=0; p0.X<MAP_BLOCKSIZE; p0.X++) - for(p0.Y=0; p0.Y<MAP_BLOCKSIZE; p0.Y++) - for(p0.Z=0; p0.Z<MAP_BLOCKSIZE; p0.Z++) - { - MapNode n = block->getNodeNoEx(p0); - content_t c = n.getContent(); - v3s16 p = p0 + block->getPosRelative(); - - std::map<content_t, std::vector<ActiveABM> >::iterator j; - j = m_aabms.find(c); - if(j == m_aabms.end()) - continue; - - for(std::vector<ActiveABM>::iterator - i = j->second.begin(); i != j->second.end(); ++i) { - if(myrand() % i->chance != 0) - continue; - - // Check neighbors - if(!i->required_neighbors.empty()) - { - v3s16 p1; - for(p1.X = p.X-1; p1.X <= p.X+1; p1.X++) - for(p1.Y = p.Y-1; p1.Y <= p.Y+1; p1.Y++) - for(p1.Z = p.Z-1; p1.Z <= p.Z+1; p1.Z++) - { - if(p1 == p) - continue; - MapNode n = map->getNodeNoEx(p1); - content_t c = n.getContent(); - std::set<content_t>::const_iterator k; - k = i->required_neighbors.find(c); - if(k != i->required_neighbors.end()){ - goto neighbor_found; - } - } - // No required neighbor found - continue; - } -neighbor_found: - - // Call all the trigger variations - i->abm->trigger(m_env, p, n); - i->abm->trigger(m_env, p, n, - active_object_count, active_object_count_wider); - - // Count surrounding objects again if the abms added any - if(m_env->m_added_objects > 0) { - active_object_count = countObjects(block, map, active_object_count_wider); - m_env->m_added_objects = 0; - } - } - } - } -}; - -void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime) -{ - // Reset usage timer immediately, otherwise a block that becomes active - // again at around the same time as it would normally be unloaded will - // get unloaded incorrectly. (I think this still leaves a small possibility - // of a race condition between this and server::AsyncRunStep, which only - // some kind of synchronisation will fix, but it at least reduces the window - // of opportunity for it to break from seconds to nanoseconds) - block->resetUsageTimer(); - - // Get time difference - u32 dtime_s = 0; - u32 stamp = block->getTimestamp(); - if (m_game_time > stamp && stamp != BLOCK_TIMESTAMP_UNDEFINED) - dtime_s = m_game_time - stamp; - dtime_s += additional_dtime; - - /*infostream<<"ServerEnvironment::activateBlock(): block timestamp: " - <<stamp<<", game time: "<<m_game_time<<std::endl;*/ - - // Remove stored static objects if clearObjects was called since block's timestamp - if (stamp == BLOCK_TIMESTAMP_UNDEFINED || stamp < m_last_clear_objects_time) { - block->m_static_objects.m_stored.clear(); - // do not set changed flag to avoid unnecessary mapblock writes - } - - // Set current time as timestamp - block->setTimestampNoChangedFlag(m_game_time); - - /*infostream<<"ServerEnvironment::activateBlock(): block is " - <<dtime_s<<" seconds old."<<std::endl;*/ - - // Activate stored objects - activateObjects(block, dtime_s); - - /* Handle LoadingBlockModifiers */ - m_lbm_mgr.applyLBMs(this, block, stamp); - - // Run node timers - std::vector<NodeTimer> elapsed_timers = - block->m_node_timers.step((float)dtime_s); - if (!elapsed_timers.empty()) { - MapNode n; - for (std::vector<NodeTimer>::iterator - i = elapsed_timers.begin(); - i != elapsed_timers.end(); ++i){ - n = block->getNodeNoEx(i->position); - v3s16 p = i->position + block->getPosRelative(); - if (m_script->node_on_timer(p, n, i->elapsed)) - block->setNodeTimer(NodeTimer(i->timeout, 0, i->position)); - } - } - - /* Handle ActiveBlockModifiers */ - ABMHandler abmhandler(m_abms, dtime_s, this, false); - abmhandler.apply(block); -} - -void ServerEnvironment::addActiveBlockModifier(ActiveBlockModifier *abm) -{ - m_abms.push_back(ABMWithState(abm)); -} - -void ServerEnvironment::addLoadingBlockModifierDef(LoadingBlockModifierDef *lbm) -{ - m_lbm_mgr.addLBMDef(lbm); -} - -bool ServerEnvironment::setNode(v3s16 p, const MapNode &n) -{ - INodeDefManager *ndef = m_gamedef->ndef(); - MapNode n_old = m_map->getNodeNoEx(p); - - // Call destructor - if (ndef->get(n_old).has_on_destruct) - m_script->node_on_destruct(p, n_old); - - // Replace node - if (!m_map->addNodeWithEvent(p, n)) - return false; - - // Update active VoxelManipulator if a mapgen thread - m_map->updateVManip(p); - - // Call post-destructor - if (ndef->get(n_old).has_after_destruct) - m_script->node_after_destruct(p, n_old); - - // Call constructor - if (ndef->get(n).has_on_construct) - m_script->node_on_construct(p, n); - - return true; -} - -bool ServerEnvironment::removeNode(v3s16 p) -{ - INodeDefManager *ndef = m_gamedef->ndef(); - MapNode n_old = m_map->getNodeNoEx(p); - - // Call destructor - if (ndef->get(n_old).has_on_destruct) - m_script->node_on_destruct(p, n_old); - - // Replace with air - // This is slightly optimized compared to addNodeWithEvent(air) - if (!m_map->removeNodeWithEvent(p)) - return false; - - // Update active VoxelManipulator if a mapgen thread - m_map->updateVManip(p); - - // Call post-destructor - if (ndef->get(n_old).has_after_destruct) - m_script->node_after_destruct(p, n_old); - - // Air doesn't require constructor - return true; -} - -bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n) -{ - if (!m_map->addNodeWithEvent(p, n, false)) - return false; - - // Update active VoxelManipulator if a mapgen thread - m_map->updateVManip(p); - - return true; -} - -void ServerEnvironment::getObjectsInsideRadius(std::vector<u16> &objects, v3f pos, float radius) -{ - for (ActiveObjectMap::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - ServerActiveObject* obj = i->second; - u16 id = i->first; - v3f objectpos = obj->getBasePosition(); - if (objectpos.getDistanceFrom(pos) > radius) - continue; - objects.push_back(id); - } -} - -void ServerEnvironment::clearObjects(ClearObjectsMode mode) -{ - infostream << "ServerEnvironment::clearObjects(): " - << "Removing all active objects" << std::endl; - std::vector<u16> objects_to_remove; - for (ActiveObjectMap::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - ServerActiveObject* obj = i->second; - if (obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) - continue; - u16 id = i->first; - // Delete static object if block is loaded - if (obj->m_static_exists) { - MapBlock *block = m_map->getBlockNoCreateNoEx(obj->m_static_block); - if (block) { - block->m_static_objects.remove(id); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_CLEAR_ALL_OBJECTS); - obj->m_static_exists = false; - } - } - // If known by some client, don't delete immediately - if (obj->m_known_by_count > 0) { - obj->m_pending_deactivation = true; - obj->m_removed = true; - continue; - } - - // Tell the object about removal - obj->removingFromEnvironment(); - // Deregister in scripting api - m_script->removeObjectReference(obj); - - // Delete active object - if (obj->environmentDeletes()) - delete obj; - // Id to be removed from m_active_objects - objects_to_remove.push_back(id); - } - - // Remove references from m_active_objects - for (std::vector<u16>::iterator i = objects_to_remove.begin(); - i != objects_to_remove.end(); ++i) { - m_active_objects.erase(*i); - } - - // Get list of loaded blocks - std::vector<v3s16> loaded_blocks; - infostream << "ServerEnvironment::clearObjects(): " - << "Listing all loaded blocks" << std::endl; - m_map->listAllLoadedBlocks(loaded_blocks); - infostream << "ServerEnvironment::clearObjects(): " - << "Done listing all loaded blocks: " - << loaded_blocks.size()<<std::endl; - - // Get list of loadable blocks - std::vector<v3s16> loadable_blocks; - if (mode == CLEAR_OBJECTS_MODE_FULL) { - infostream << "ServerEnvironment::clearObjects(): " - << "Listing all loadable blocks" << std::endl; - m_map->listAllLoadableBlocks(loadable_blocks); - infostream << "ServerEnvironment::clearObjects(): " - << "Done listing all loadable blocks: " - << loadable_blocks.size() << std::endl; - } else { - loadable_blocks = loaded_blocks; - } - - infostream << "ServerEnvironment::clearObjects(): " - << "Now clearing objects in " << loadable_blocks.size() - << " blocks" << std::endl; - - // Grab a reference on each loaded block to avoid unloading it - for (std::vector<v3s16>::iterator i = loaded_blocks.begin(); - i != loaded_blocks.end(); ++i) { - v3s16 p = *i; - MapBlock *block = m_map->getBlockNoCreateNoEx(p); - assert(block != NULL); - block->refGrab(); - } - - // Remove objects in all loadable blocks - u32 unload_interval = U32_MAX; - if (mode == CLEAR_OBJECTS_MODE_FULL) { - unload_interval = g_settings->getS32("max_clearobjects_extra_loaded_blocks"); - unload_interval = MYMAX(unload_interval, 1); - } - u32 report_interval = loadable_blocks.size() / 10; - u32 num_blocks_checked = 0; - u32 num_blocks_cleared = 0; - u32 num_objs_cleared = 0; - for (std::vector<v3s16>::iterator i = loadable_blocks.begin(); - i != loadable_blocks.end(); ++i) { - v3s16 p = *i; - MapBlock *block = m_map->emergeBlock(p, false); - if (!block) { - errorstream << "ServerEnvironment::clearObjects(): " - << "Failed to emerge block " << PP(p) << std::endl; - continue; - } - u32 num_stored = block->m_static_objects.m_stored.size(); - u32 num_active = block->m_static_objects.m_active.size(); - if (num_stored != 0 || num_active != 0) { - block->m_static_objects.m_stored.clear(); - block->m_static_objects.m_active.clear(); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_CLEAR_ALL_OBJECTS); - num_objs_cleared += num_stored + num_active; - num_blocks_cleared++; - } - num_blocks_checked++; - - if (report_interval != 0 && - num_blocks_checked % report_interval == 0) { - float percent = 100.0 * (float)num_blocks_checked / - loadable_blocks.size(); - infostream << "ServerEnvironment::clearObjects(): " - << "Cleared " << num_objs_cleared << " objects" - << " in " << num_blocks_cleared << " blocks (" - << percent << "%)" << std::endl; - } - if (num_blocks_checked % unload_interval == 0) { - m_map->unloadUnreferencedBlocks(); - } - } - m_map->unloadUnreferencedBlocks(); - - // Drop references that were added above - for (std::vector<v3s16>::iterator i = loaded_blocks.begin(); - i != loaded_blocks.end(); ++i) { - v3s16 p = *i; - MapBlock *block = m_map->getBlockNoCreateNoEx(p); - assert(block); - block->refDrop(); - } - - m_last_clear_objects_time = m_game_time; - - infostream << "ServerEnvironment::clearObjects(): " - << "Finished: Cleared " << num_objs_cleared << " objects" - << " in " << num_blocks_cleared << " blocks" << std::endl; -} - -void ServerEnvironment::step(float dtime) -{ - DSTACK(FUNCTION_NAME); - - //TimeTaker timer("ServerEnv step"); - - /* Step time of day */ - stepTimeOfDay(dtime); - - // Update this one - // NOTE: This is kind of funny on a singleplayer game, but doesn't - // really matter that much. - static const float server_step = g_settings->getFloat("dedicated_server_step"); - m_recommended_send_interval = server_step; - - /* - Increment game time - */ - { - m_game_time_fraction_counter += dtime; - u32 inc_i = (u32)m_game_time_fraction_counter; - m_game_time += inc_i; - m_game_time_fraction_counter -= (float)inc_i; - } - - /* - Handle players - */ - { - ScopeProfiler sp(g_profiler, "SEnv: handle players avg", SPT_AVG); - for (std::vector<RemotePlayer *>::iterator i = m_players.begin(); - i != m_players.end(); ++i) { - RemotePlayer *player = dynamic_cast<RemotePlayer *>(*i); - assert(player); - - // Ignore disconnected players - if(player->peer_id == 0) - continue; - - // Move - player->move(dtime, this, 100*BS); - } - } - - /* - Manage active block list - */ - if (m_active_blocks_management_interval.step(dtime, m_cache_active_block_mgmt_interval)) { - ScopeProfiler sp(g_profiler, "SEnv: manage act. block list avg per interval", SPT_AVG); - /* - Get player block positions - */ - std::vector<v3s16> players_blockpos; - for (std::vector<RemotePlayer *>::iterator i = m_players.begin(); - i != m_players.end(); ++i) { - RemotePlayer *player = dynamic_cast<RemotePlayer *>(*i); - assert(player); - - // Ignore disconnected players - if (player->peer_id == 0) - continue; - - PlayerSAO *playersao = player->getPlayerSAO(); - assert(playersao); - - v3s16 blockpos = getNodeBlockPos( - floatToInt(playersao->getBasePosition(), BS)); - players_blockpos.push_back(blockpos); - } - - /* - Update list of active blocks, collecting changes - */ - static const s16 active_block_range = g_settings->getS16("active_block_range"); - std::set<v3s16> blocks_removed; - std::set<v3s16> blocks_added; - m_active_blocks.update(players_blockpos, active_block_range, - blocks_removed, blocks_added); - - /* - Handle removed blocks - */ - - // Convert active objects that are no more in active blocks to static - deactivateFarObjects(false); - - for(std::set<v3s16>::iterator - i = blocks_removed.begin(); - i != blocks_removed.end(); ++i) { - v3s16 p = *i; - - /* infostream<<"Server: Block " << PP(p) - << " became inactive"<<std::endl; */ - - MapBlock *block = m_map->getBlockNoCreateNoEx(p); - if(block==NULL) - continue; - - // Set current time as timestamp (and let it set ChangedFlag) - block->setTimestamp(m_game_time); - } - - /* - Handle added blocks - */ - - for(std::set<v3s16>::iterator - i = blocks_added.begin(); - i != blocks_added.end(); ++i) - { - v3s16 p = *i; - - MapBlock *block = m_map->getBlockOrEmerge(p); - if(block==NULL){ - m_active_blocks.m_list.erase(p); - continue; - } - - activateBlock(block); - /* infostream<<"Server: Block " << PP(p) - << " became active"<<std::endl; */ - } - } - - /* - Mess around in active blocks - */ - if (m_active_blocks_nodemetadata_interval.step(dtime, m_cache_nodetimer_interval)) { - ScopeProfiler sp(g_profiler, "SEnv: mess in act. blocks avg per interval", SPT_AVG); - - float dtime = m_cache_nodetimer_interval; - - for(std::set<v3s16>::iterator - i = m_active_blocks.m_list.begin(); - i != m_active_blocks.m_list.end(); ++i) - { - v3s16 p = *i; - - /*infostream<<"Server: Block ("<<p.X<<","<<p.Y<<","<<p.Z - <<") being handled"<<std::endl;*/ - - MapBlock *block = m_map->getBlockNoCreateNoEx(p); - if(block==NULL) - continue; - - // Reset block usage timer - block->resetUsageTimer(); - - // Set current time as timestamp - block->setTimestampNoChangedFlag(m_game_time); - // If time has changed much from the one on disk, - // set block to be saved when it is unloaded - if(block->getTimestamp() > block->getDiskTimestamp() + 60) - block->raiseModified(MOD_STATE_WRITE_AT_UNLOAD, - MOD_REASON_BLOCK_EXPIRED); - - // Run node timers - std::vector<NodeTimer> elapsed_timers = - block->m_node_timers.step((float)dtime); - if (!elapsed_timers.empty()) { - MapNode n; - for (std::vector<NodeTimer>::iterator i = elapsed_timers.begin(); - i != elapsed_timers.end(); ++i) { - n = block->getNodeNoEx(i->position); - p = i->position + block->getPosRelative(); - if (m_script->node_on_timer(p, n, i->elapsed)) { - block->setNodeTimer(NodeTimer( - i->timeout, 0, i->position)); - } - } - } - } - } - - if (m_active_block_modifier_interval.step(dtime, m_cache_abm_interval)) - do{ // breakable - if(m_active_block_interval_overload_skip > 0){ - ScopeProfiler sp(g_profiler, "SEnv: ABM overload skips"); - m_active_block_interval_overload_skip--; - break; - } - ScopeProfiler sp(g_profiler, "SEnv: modify in blocks avg per interval", SPT_AVG); - TimeTaker timer("modify in active blocks per interval"); - - // Initialize handling of ActiveBlockModifiers - ABMHandler abmhandler(m_abms, m_cache_abm_interval, this, true); - - for(std::set<v3s16>::iterator - i = m_active_blocks.m_list.begin(); - i != m_active_blocks.m_list.end(); ++i) - { - v3s16 p = *i; - - /*infostream<<"Server: Block ("<<p.X<<","<<p.Y<<","<<p.Z - <<") being handled"<<std::endl;*/ - - MapBlock *block = m_map->getBlockNoCreateNoEx(p); - if(block == NULL) - continue; - - // Set current time as timestamp - block->setTimestampNoChangedFlag(m_game_time); - - /* Handle ActiveBlockModifiers */ - abmhandler.apply(block); - } - - u32 time_ms = timer.stop(true); - u32 max_time_ms = 200; - if(time_ms > max_time_ms){ - warningstream<<"active block modifiers took " - <<time_ms<<"ms (longer than " - <<max_time_ms<<"ms)"<<std::endl; - m_active_block_interval_overload_skip = (time_ms / max_time_ms) + 1; - } - }while(0); - - /* - Step script environment (run global on_step()) - */ - m_script->environment_Step(dtime); - - /* - Step active objects - */ - { - ScopeProfiler sp(g_profiler, "SEnv: step act. objs avg", SPT_AVG); - //TimeTaker timer("Step active objects"); - - g_profiler->avg("SEnv: num of objects", m_active_objects.size()); - - // This helps the objects to send data at the same time - bool send_recommended = false; - m_send_recommended_timer += dtime; - if(m_send_recommended_timer > getSendRecommendedInterval()) - { - m_send_recommended_timer -= getSendRecommendedInterval(); - send_recommended = true; - } - - for(ActiveObjectMap::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - ServerActiveObject* obj = i->second; - // Don't step if is to be removed or stored statically - if(obj->m_removed || obj->m_pending_deactivation) - continue; - // Step object - obj->step(dtime, send_recommended); - // Read messages from object - while(!obj->m_messages_out.empty()) - { - m_active_object_messages.push( - obj->m_messages_out.front()); - obj->m_messages_out.pop(); - } - } - } - - /* - Manage active objects - */ - if(m_object_management_interval.step(dtime, 0.5)) - { - ScopeProfiler sp(g_profiler, "SEnv: remove removed objs avg /.5s", SPT_AVG); - /* - Remove objects that satisfy (m_removed && m_known_by_count==0) - */ - removeRemovedObjects(); - } - - /* - Manage particle spawner expiration - */ - if (m_particle_management_interval.step(dtime, 1.0)) { - for (UNORDERED_MAP<u32, float>::iterator i = m_particle_spawners.begin(); - i != m_particle_spawners.end(); ) { - //non expiring spawners - if (i->second == PARTICLE_SPAWNER_NO_EXPIRY) { - ++i; - continue; - } - - i->second -= 1.0f; - if (i->second <= 0.f) - m_particle_spawners.erase(i++); - else - ++i; - } - } -} - -u32 ServerEnvironment::addParticleSpawner(float exptime) -{ - // Timers with lifetime 0 do not expire - float time = exptime > 0.f ? exptime : PARTICLE_SPAWNER_NO_EXPIRY; - - u32 id = 0; - for (;;) { // look for unused particlespawner id - id++; - UNORDERED_MAP<u32, float>::iterator f = m_particle_spawners.find(id); - if (f == m_particle_spawners.end()) { - m_particle_spawners[id] = time; - break; - } - } - return id; -} - -u32 ServerEnvironment::addParticleSpawner(float exptime, u16 attached_id) -{ - u32 id = addParticleSpawner(exptime); - m_particle_spawner_attachments[id] = attached_id; - if (ServerActiveObject *obj = getActiveObject(attached_id)) { - obj->attachParticleSpawner(id); - } - return id; -} - -void ServerEnvironment::deleteParticleSpawner(u32 id, bool remove_from_object) -{ - m_particle_spawners.erase(id); - UNORDERED_MAP<u32, u16>::iterator it = m_particle_spawner_attachments.find(id); - if (it != m_particle_spawner_attachments.end()) { - u16 obj_id = (*it).second; - ServerActiveObject *sao = getActiveObject(obj_id); - if (sao != NULL && remove_from_object) { - sao->detachParticleSpawner(id); - } - m_particle_spawner_attachments.erase(id); - } -} - -ServerActiveObject* ServerEnvironment::getActiveObject(u16 id) -{ - ActiveObjectMap::iterator n = m_active_objects.find(id); - return (n != m_active_objects.end() ? n->second : NULL); -} - -bool isFreeServerActiveObjectId(u16 id, ActiveObjectMap &objects) -{ - if (id == 0) - return false; - - return objects.find(id) == objects.end(); -} - -u16 getFreeServerActiveObjectId(ActiveObjectMap &objects) -{ - //try to reuse id's as late as possible - static u16 last_used_id = 0; - u16 startid = last_used_id; - for(;;) - { - last_used_id ++; - if(isFreeServerActiveObjectId(last_used_id, objects)) - return last_used_id; - - if(last_used_id == startid) - return 0; - } -} - -u16 ServerEnvironment::addActiveObject(ServerActiveObject *object) -{ - assert(object); // Pre-condition - m_added_objects++; - u16 id = addActiveObjectRaw(object, true, 0); - return id; -} - -/* - Finds out what new objects have been added to - inside a radius around a position -*/ -void ServerEnvironment::getAddedActiveObjects(PlayerSAO *playersao, s16 radius, - s16 player_radius, - std::set<u16> ¤t_objects, - std::queue<u16> &added_objects) -{ - f32 radius_f = radius * BS; - f32 player_radius_f = player_radius * BS; - - if (player_radius_f < 0) - player_radius_f = 0; - /* - Go through the object list, - - discard m_removed objects, - - discard objects that are too far away, - - discard objects that are found in current_objects. - - add remaining objects to added_objects - */ - for (ActiveObjectMap::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - u16 id = i->first; - - // Get object - ServerActiveObject *object = i->second; - if (object == NULL) - continue; - - // Discard if removed or deactivating - if(object->m_removed || object->m_pending_deactivation) - continue; - - f32 distance_f = object->getBasePosition(). - getDistanceFrom(playersao->getBasePosition()); - if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - // Discard if too far - if (distance_f > player_radius_f && player_radius_f != 0) - continue; - } else if (distance_f > radius_f) - continue; - - // Discard if already on current_objects - std::set<u16>::iterator n; - n = current_objects.find(id); - if(n != current_objects.end()) - continue; - // Add to added_objects - added_objects.push(id); - } -} - -/* - Finds out what objects have been removed from - inside a radius around a position -*/ -void ServerEnvironment::getRemovedActiveObjects(PlayerSAO *playersao, s16 radius, - s16 player_radius, - std::set<u16> ¤t_objects, - std::queue<u16> &removed_objects) -{ - f32 radius_f = radius * BS; - f32 player_radius_f = player_radius * BS; - - if (player_radius_f < 0) - player_radius_f = 0; - /* - Go through current_objects; object is removed if: - - object is not found in m_active_objects (this is actually an - error condition; objects should be set m_removed=true and removed - only after all clients have been informed about removal), or - - object has m_removed=true, or - - object is too far away - */ - for(std::set<u16>::iterator - i = current_objects.begin(); - i != current_objects.end(); ++i) - { - u16 id = *i; - ServerActiveObject *object = getActiveObject(id); - - if (object == NULL) { - infostream << "ServerEnvironment::getRemovedActiveObjects():" - << " object in current_objects is NULL" << std::endl; - removed_objects.push(id); - continue; - } - - if (object->m_removed || object->m_pending_deactivation) { - removed_objects.push(id); - continue; - } - - f32 distance_f = object->getBasePosition().getDistanceFrom(playersao->getBasePosition()); - if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - if (distance_f <= player_radius_f || player_radius_f == 0) - continue; - } else if (distance_f <= radius_f) - continue; - - // Object is no longer visible - removed_objects.push(id); - } -} - -void ServerEnvironment::setStaticForActiveObjectsInBlock( - v3s16 blockpos, bool static_exists, v3s16 static_block) -{ - MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos); - if (!block) - return; - - for (std::map<u16, StaticObject>::iterator - so_it = block->m_static_objects.m_active.begin(); - so_it != block->m_static_objects.m_active.end(); ++so_it) { - // Get the ServerActiveObject counterpart to this StaticObject - ActiveObjectMap::iterator ao_it = m_active_objects.find(so_it->first); - if (ao_it == m_active_objects.end()) { - // If this ever happens, there must be some kind of nasty bug. - errorstream << "ServerEnvironment::setStaticForObjectsInBlock(): " - "Object from MapBlock::m_static_objects::m_active not found " - "in m_active_objects"; - continue; - } - - ServerActiveObject *sao = ao_it->second; - sao->m_static_exists = static_exists; - sao->m_static_block = static_block; - } -} - -ActiveObjectMessage ServerEnvironment::getActiveObjectMessage() -{ - if(m_active_object_messages.empty()) - return ActiveObjectMessage(0); - - ActiveObjectMessage message = m_active_object_messages.front(); - m_active_object_messages.pop(); - return message; -} - -/* - ************ Private methods ************* -*/ - -u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object, - bool set_changed, u32 dtime_s) -{ - assert(object); // Pre-condition - if(object->getId() == 0){ - u16 new_id = getFreeServerActiveObjectId(m_active_objects); - if(new_id == 0) - { - errorstream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"no free ids available"<<std::endl; - if(object->environmentDeletes()) - delete object; - return 0; - } - object->setId(new_id); - } - else{ - verbosestream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"supplied with id "<<object->getId()<<std::endl; - } - - if(!isFreeServerActiveObjectId(object->getId(), m_active_objects)) { - errorstream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"id is not free ("<<object->getId()<<")"<<std::endl; - if(object->environmentDeletes()) - delete object; - return 0; - } - - if (objectpos_over_limit(object->getBasePosition())) { - v3f p = object->getBasePosition(); - errorstream << "ServerEnvironment::addActiveObjectRaw(): " - << "object position (" << p.X << "," << p.Y << "," << p.Z - << ") outside maximum range" << std::endl; - if (object->environmentDeletes()) - delete object; - return 0; - } - - /*infostream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"added (id="<<object->getId()<<")"<<std::endl;*/ - - m_active_objects[object->getId()] = object; - - verbosestream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"Added id="<<object->getId()<<"; there are now " - <<m_active_objects.size()<<" active objects." - <<std::endl; - - // Register reference in scripting api (must be done before post-init) - m_script->addObjectReference(object); - // Post-initialize object - object->addedToEnvironment(dtime_s); - - // Add static data to block - if(object->isStaticAllowed()) - { - // Add static object to active static list of the block - v3f objectpos = object->getBasePosition(); - std::string staticdata = object->getStaticData(); - StaticObject s_obj(object->getType(), objectpos, staticdata); - // Add to the block where the object is located in - v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); - MapBlock *block = m_map->emergeBlock(blockpos); - if(block){ - block->m_static_objects.m_active[object->getId()] = s_obj; - object->m_static_exists = true; - object->m_static_block = blockpos; - - if(set_changed) - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_ADD_ACTIVE_OBJECT_RAW); - } else { - v3s16 p = floatToInt(objectpos, BS); - errorstream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"could not emerge block for storing id="<<object->getId() - <<" statically (pos="<<PP(p)<<")"<<std::endl; - } - } - - return object->getId(); -} - -/* - Remove objects that satisfy (m_removed && m_known_by_count==0) -*/ -void ServerEnvironment::removeRemovedObjects() -{ - std::vector<u16> objects_to_remove; - for(ActiveObjectMap::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - u16 id = i->first; - ServerActiveObject* obj = i->second; - // This shouldn't happen but check it - if(obj == NULL) - { - infostream<<"NULL object found in ServerEnvironment" - <<" while finding removed objects. id="<<id<<std::endl; - // Id to be removed from m_active_objects - objects_to_remove.push_back(id); - continue; - } - - /* - We will delete objects that are marked as removed or thatare - waiting for deletion after deactivation - */ - if (!obj->m_removed && !obj->m_pending_deactivation) - continue; - - /* - Delete static data from block if is marked as removed - */ - if(obj->m_static_exists && obj->m_removed) - { - MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); - if (block) { - block->m_static_objects.remove(id); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_REMOVE_OBJECTS_REMOVE); - obj->m_static_exists = false; - } else { - infostream<<"Failed to emerge block from which an object to " - <<"be removed was loaded from. id="<<id<<std::endl; - } - } - - // If m_known_by_count > 0, don't actually remove. On some future - // invocation this will be 0, which is when removal will continue. - if(obj->m_known_by_count > 0) - continue; - - /* - Move static data from active to stored if not marked as removed - */ - if(obj->m_static_exists && !obj->m_removed){ - MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); - if (block) { - std::map<u16, StaticObject>::iterator i = - block->m_static_objects.m_active.find(id); - if(i != block->m_static_objects.m_active.end()){ - block->m_static_objects.m_stored.push_back(i->second); - block->m_static_objects.m_active.erase(id); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_REMOVE_OBJECTS_DEACTIVATE); - } - } else { - infostream<<"Failed to emerge block from which an object to " - <<"be deactivated was loaded from. id="<<id<<std::endl; - } - } - - // Tell the object about removal - obj->removingFromEnvironment(); - // Deregister in scripting api - m_script->removeObjectReference(obj); - - // Delete - if(obj->environmentDeletes()) - delete obj; - - // Id to be removed from m_active_objects - objects_to_remove.push_back(id); - } - // Remove references from m_active_objects - for(std::vector<u16>::iterator i = objects_to_remove.begin(); - i != objects_to_remove.end(); ++i) { - m_active_objects.erase(*i); - } -} - -static void print_hexdump(std::ostream &o, const std::string &data) -{ - const int linelength = 16; - for(int l=0; ; l++){ - int i0 = linelength * l; - bool at_end = false; - int thislinelength = linelength; - if(i0 + thislinelength > (int)data.size()){ - thislinelength = data.size() - i0; - at_end = true; - } - for(int di=0; di<linelength; di++){ - int i = i0 + di; - char buf[4]; - if(di<thislinelength) - snprintf(buf, 4, "%.2x ", data[i]); - else - snprintf(buf, 4, " "); - o<<buf; - } - o<<" "; - for(int di=0; di<thislinelength; di++){ - int i = i0 + di; - if(data[i] >= 32) - o<<data[i]; - else - o<<"."; - } - o<<std::endl; - if(at_end) - break; - } -} - -/* - Convert stored objects from blocks near the players to active. -*/ -void ServerEnvironment::activateObjects(MapBlock *block, u32 dtime_s) -{ - if(block == NULL) - return; - - // Ignore if no stored objects (to not set changed flag) - if(block->m_static_objects.m_stored.empty()) - return; - - verbosestream<<"ServerEnvironment::activateObjects(): " - <<"activating objects of block "<<PP(block->getPos()) - <<" ("<<block->m_static_objects.m_stored.size() - <<" objects)"<<std::endl; - bool large_amount = (block->m_static_objects.m_stored.size() > g_settings->getU16("max_objects_per_block")); - if (large_amount) { - errorstream<<"suspiciously large amount of objects detected: " - <<block->m_static_objects.m_stored.size()<<" in " - <<PP(block->getPos()) - <<"; removing all of them."<<std::endl; - // Clear stored list - block->m_static_objects.m_stored.clear(); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_TOO_MANY_OBJECTS); - return; - } - - // Activate stored objects - std::vector<StaticObject> new_stored; - for (std::vector<StaticObject>::iterator - i = block->m_static_objects.m_stored.begin(); - i != block->m_static_objects.m_stored.end(); ++i) { - StaticObject &s_obj = *i; - - // Create an active object from the data - ServerActiveObject *obj = ServerActiveObject::create - ((ActiveObjectType) s_obj.type, this, 0, s_obj.pos, s_obj.data); - // If couldn't create object, store static data back. - if(obj == NULL) { - errorstream<<"ServerEnvironment::activateObjects(): " - <<"failed to create active object from static object " - <<"in block "<<PP(s_obj.pos/BS) - <<" type="<<(int)s_obj.type<<" data:"<<std::endl; - print_hexdump(verbosestream, s_obj.data); - - new_stored.push_back(s_obj); - continue; - } - verbosestream<<"ServerEnvironment::activateObjects(): " - <<"activated static object pos="<<PP(s_obj.pos/BS) - <<" type="<<(int)s_obj.type<<std::endl; - // This will also add the object to the active static list - addActiveObjectRaw(obj, false, dtime_s); - } - // Clear stored list - block->m_static_objects.m_stored.clear(); - // Add leftover failed stuff to stored list - for(std::vector<StaticObject>::iterator - i = new_stored.begin(); - i != new_stored.end(); ++i) { - StaticObject &s_obj = *i; - block->m_static_objects.m_stored.push_back(s_obj); - } - - // Turn the active counterparts of activated objects not pending for - // deactivation - for(std::map<u16, StaticObject>::iterator - i = block->m_static_objects.m_active.begin(); - i != block->m_static_objects.m_active.end(); ++i) - { - u16 id = i->first; - ServerActiveObject *object = getActiveObject(id); - assert(object); - object->m_pending_deactivation = false; - } - - /* - Note: Block hasn't really been modified here. - The objects have just been activated and moved from the stored - static list to the active static list. - As such, the block is essentially the same. - Thus, do not call block->raiseModified(MOD_STATE_WRITE_NEEDED). - Otherwise there would be a huge amount of unnecessary I/O. - */ -} - -/* - Convert objects that are not standing inside active blocks to static. - - If m_known_by_count != 0, active object is not deleted, but static - data is still updated. - - If force_delete is set, active object is deleted nevertheless. It - shall only be set so in the destructor of the environment. - - If block wasn't generated (not in memory or on disk), -*/ -void ServerEnvironment::deactivateFarObjects(bool force_delete) -{ - std::vector<u16> objects_to_remove; - for(ActiveObjectMap::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - ServerActiveObject* obj = i->second; - assert(obj); - - // Do not deactivate if static data creation not allowed - if(!force_delete && !obj->isStaticAllowed()) - continue; - - // If pending deactivation, let removeRemovedObjects() do it - if(!force_delete && obj->m_pending_deactivation) - continue; - - u16 id = i->first; - v3f objectpos = obj->getBasePosition(); - - // The block in which the object resides in - v3s16 blockpos_o = getNodeBlockPos(floatToInt(objectpos, BS)); - - // If object's static data is stored in a deactivated block and object - // is actually located in an active block, re-save to the block in - // which the object is actually located in. - if(!force_delete && - obj->m_static_exists && - !m_active_blocks.contains(obj->m_static_block) && - m_active_blocks.contains(blockpos_o)) - { - v3s16 old_static_block = obj->m_static_block; - - // Save to block where object is located - MapBlock *block = m_map->emergeBlock(blockpos_o, false); - if(!block){ - errorstream<<"ServerEnvironment::deactivateFarObjects(): " - <<"Could not save object id="<<id - <<" to it's current block "<<PP(blockpos_o) - <<std::endl; - continue; - } - std::string staticdata_new = obj->getStaticData(); - StaticObject s_obj(obj->getType(), objectpos, staticdata_new); - block->m_static_objects.insert(id, s_obj); - obj->m_static_block = blockpos_o; - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_STATIC_DATA_ADDED); - - // Delete from block where object was located - block = m_map->emergeBlock(old_static_block, false); - if(!block){ - errorstream<<"ServerEnvironment::deactivateFarObjects(): " - <<"Could not delete object id="<<id - <<" from it's previous block "<<PP(old_static_block) - <<std::endl; - continue; - } - block->m_static_objects.remove(id); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_STATIC_DATA_REMOVED); - continue; - } - - // If block is active, don't remove - if(!force_delete && m_active_blocks.contains(blockpos_o)) - continue; - - verbosestream<<"ServerEnvironment::deactivateFarObjects(): " - <<"deactivating object id="<<id<<" on inactive block " - <<PP(blockpos_o)<<std::endl; - - // If known by some client, don't immediately delete. - bool pending_delete = (obj->m_known_by_count > 0 && !force_delete); - - /* - Update the static data - */ - - if(obj->isStaticAllowed()) - { - // Create new static object - std::string staticdata_new = obj->getStaticData(); - StaticObject s_obj(obj->getType(), objectpos, staticdata_new); - - bool stays_in_same_block = false; - bool data_changed = true; - - if (obj->m_static_exists) { - if (obj->m_static_block == blockpos_o) - stays_in_same_block = true; - - MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); - - if (block) { - std::map<u16, StaticObject>::iterator n = - block->m_static_objects.m_active.find(id); - if (n != block->m_static_objects.m_active.end()) { - StaticObject static_old = n->second; - - float save_movem = obj->getMinimumSavedMovement(); - - if (static_old.data == staticdata_new && - (static_old.pos - objectpos).getLength() < save_movem) - data_changed = false; - } else { - errorstream<<"ServerEnvironment::deactivateFarObjects(): " - <<"id="<<id<<" m_static_exists=true but " - <<"static data doesn't actually exist in " - <<PP(obj->m_static_block)<<std::endl; - } - } - } - - bool shall_be_written = (!stays_in_same_block || data_changed); - - // Delete old static object - if(obj->m_static_exists) - { - MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); - if(block) - { - block->m_static_objects.remove(id); - obj->m_static_exists = false; - // Only mark block as modified if data changed considerably - if(shall_be_written) - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_STATIC_DATA_CHANGED); - } - } - - // Add to the block where the object is located in - v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); - // Get or generate the block - MapBlock *block = NULL; - try{ - block = m_map->emergeBlock(blockpos); - } catch(InvalidPositionException &e){ - // Handled via NULL pointer - // NOTE: emergeBlock's failure is usually determined by it - // actually returning NULL - } - - if(block) - { - if (block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")) { - warningstream << "ServerEnv: Trying to store id = " << obj->getId() - << " statically but block " << PP(blockpos) - << " already contains " - << block->m_static_objects.m_stored.size() - << " objects." - << " Forcing delete." << std::endl; - force_delete = true; - } else { - // If static counterpart already exists in target block, - // remove it first. - // This shouldn't happen because the object is removed from - // the previous block before this according to - // obj->m_static_block, but happens rarely for some unknown - // reason. Unsuccessful attempts have been made to find - // said reason. - if(id && block->m_static_objects.m_active.find(id) != block->m_static_objects.m_active.end()){ - warningstream<<"ServerEnv: Performing hack #83274" - <<std::endl; - block->m_static_objects.remove(id); - } - // Store static data - u16 store_id = pending_delete ? id : 0; - block->m_static_objects.insert(store_id, s_obj); - - // Only mark block as modified if data changed considerably - if(shall_be_written) - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_STATIC_DATA_CHANGED); - - obj->m_static_exists = true; - obj->m_static_block = block->getPos(); - } - } - else{ - if(!force_delete){ - v3s16 p = floatToInt(objectpos, BS); - errorstream<<"ServerEnv: Could not find or generate " - <<"a block for storing id="<<obj->getId() - <<" statically (pos="<<PP(p)<<")"<<std::endl; - continue; - } - } - } - - /* - If known by some client, set pending deactivation. - Otherwise delete it immediately. - */ - - if(pending_delete && !force_delete) - { - verbosestream<<"ServerEnvironment::deactivateFarObjects(): " - <<"object id="<<id<<" is known by clients" - <<"; not deleting yet"<<std::endl; - - obj->m_pending_deactivation = true; - continue; - } - - verbosestream<<"ServerEnvironment::deactivateFarObjects(): " - <<"object id="<<id<<" is not known by clients" - <<"; deleting"<<std::endl; - - // Tell the object about removal - obj->removingFromEnvironment(); - // Deregister in scripting api - m_script->removeObjectReference(obj); - - // Delete active object - if(obj->environmentDeletes()) - delete obj; - // Id to be removed from m_active_objects - objects_to_remove.push_back(id); - } - - // Remove references from m_active_objects - for(std::vector<u16>::iterator i = objects_to_remove.begin(); - i != objects_to_remove.end(); ++i) { - m_active_objects.erase(*i); - } -} - -#ifndef SERVER - -#include "clientsimpleobject.h" - -/* - ClientEnvironment -*/ - -ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, - ITextureSource *texturesource, IGameDef *gamedef, - IrrlichtDevice *irr): - m_map(map), - m_local_player(NULL), - m_smgr(smgr), - m_texturesource(texturesource), - m_gamedef(gamedef), - m_irr(irr) -{ - char zero = 0; - memset(attachement_parent_ids, zero, sizeof(attachement_parent_ids)); -} - -ClientEnvironment::~ClientEnvironment() -{ - // delete active objects - for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - delete i->second; - } - - for(std::vector<ClientSimpleObject*>::iterator - i = m_simple_objects.begin(); i != m_simple_objects.end(); ++i) { - delete *i; - } - - // Drop/delete map - m_map->drop(); -} - -Map & ClientEnvironment::getMap() -{ - return *m_map; -} - -ClientMap & ClientEnvironment::getClientMap() -{ - return *m_map; -} - -void ClientEnvironment::setLocalPlayer(LocalPlayer *player) -{ - DSTACK(FUNCTION_NAME); - /* - It is a failure if already is a local player - */ - FATAL_ERROR_IF(m_local_player != NULL, - "Local player already allocated"); - - m_local_player = player; -} - -void ClientEnvironment::step(float dtime) -{ - DSTACK(FUNCTION_NAME); - - /* Step time of day */ - stepTimeOfDay(dtime); - - // Get some settings - bool fly_allowed = m_gamedef->checkLocalPrivilege("fly"); - bool free_move = fly_allowed && g_settings->getBool("free_move"); - - // Get local player - LocalPlayer *lplayer = getLocalPlayer(); - assert(lplayer); - // collision info queue - std::vector<CollisionInfo> player_collisions; - - /* - Get the speed the player is going - */ - bool is_climbing = lplayer->is_climbing; - - f32 player_speed = lplayer->getSpeed().getLength(); - - /* - Maximum position increment - */ - //f32 position_max_increment = 0.05*BS; - f32 position_max_increment = 0.1*BS; - - // Maximum time increment (for collision detection etc) - // time = distance / speed - f32 dtime_max_increment = 1; - if(player_speed > 0.001) - dtime_max_increment = position_max_increment / player_speed; - - // Maximum time increment is 10ms or lower - if(dtime_max_increment > 0.01) - dtime_max_increment = 0.01; - - // Don't allow overly huge dtime - if(dtime > 0.5) - dtime = 0.5; - - f32 dtime_downcount = dtime; - - /* - Stuff that has a maximum time increment - */ - - u32 loopcount = 0; - do - { - loopcount++; - - f32 dtime_part; - if(dtime_downcount > dtime_max_increment) - { - dtime_part = dtime_max_increment; - dtime_downcount -= dtime_part; - } - else - { - dtime_part = dtime_downcount; - /* - Setting this to 0 (no -=dtime_part) disables an infinite loop - when dtime_part is so small that dtime_downcount -= dtime_part - does nothing - */ - dtime_downcount = 0; - } - - /* - Handle local player - */ - - { - // Apply physics - if(!free_move && !is_climbing) - { - // Gravity - v3f speed = lplayer->getSpeed(); - if(!lplayer->in_liquid) - speed.Y -= lplayer->movement_gravity * lplayer->physics_override_gravity * dtime_part * 2; - - // Liquid floating / sinking - if(lplayer->in_liquid && !lplayer->swimming_vertical) - speed.Y -= lplayer->movement_liquid_sink * dtime_part * 2; - - // Liquid resistance - if(lplayer->in_liquid_stable || lplayer->in_liquid) - { - // How much the node's viscosity blocks movement, ranges between 0 and 1 - // Should match the scale at which viscosity increase affects other liquid attributes - const f32 viscosity_factor = 0.3; - - v3f d_wanted = -speed / lplayer->movement_liquid_fluidity; - f32 dl = d_wanted.getLength(); - if(dl > lplayer->movement_liquid_fluidity_smooth) - dl = lplayer->movement_liquid_fluidity_smooth; - dl *= (lplayer->liquid_viscosity * viscosity_factor) + (1 - viscosity_factor); - - v3f d = d_wanted.normalize() * dl; - speed += d; - } - - lplayer->setSpeed(speed); - } - - /* - Move the lplayer. - This also does collision detection. - */ - lplayer->move(dtime_part, this, position_max_increment, - &player_collisions); - } - } - while(dtime_downcount > 0.001); - - //std::cout<<"Looped "<<loopcount<<" times."<<std::endl; - - for(std::vector<CollisionInfo>::iterator i = player_collisions.begin(); - i != player_collisions.end(); ++i) { - CollisionInfo &info = *i; - v3f speed_diff = info.new_speed - info.old_speed;; - // Handle only fall damage - // (because otherwise walking against something in fast_move kills you) - if(speed_diff.Y < 0 || info.old_speed.Y >= 0) - continue; - // Get rid of other components - speed_diff.X = 0; - speed_diff.Z = 0; - f32 pre_factor = 1; // 1 hp per node/s - f32 tolerance = BS*14; // 5 without damage - f32 post_factor = 1; // 1 hp per node/s - if(info.type == COLLISION_NODE) - { - const ContentFeatures &f = m_gamedef->ndef()-> - get(m_map->getNodeNoEx(info.node_p)); - // Determine fall damage multiplier - int addp = itemgroup_get(f.groups, "fall_damage_add_percent"); - pre_factor = 1.0 + (float)addp/100.0; - } - float speed = pre_factor * speed_diff.getLength(); - if(speed > tolerance) - { - f32 damage_f = (speed - tolerance)/BS * post_factor; - u16 damage = (u16)(damage_f+0.5); - if(damage != 0){ - damageLocalPlayer(damage, true); - MtEvent *e = new SimpleTriggerEvent("PlayerFallingDamage"); - m_gamedef->event()->put(e); - } - } - } - - /* - A quick draft of lava damage - */ - if(m_lava_hurt_interval.step(dtime, 1.0)) - { - v3f pf = lplayer->getPosition(); - - // Feet, middle and head - v3s16 p1 = floatToInt(pf + v3f(0, BS*0.1, 0), BS); - MapNode n1 = m_map->getNodeNoEx(p1); - v3s16 p2 = floatToInt(pf + v3f(0, BS*0.8, 0), BS); - MapNode n2 = m_map->getNodeNoEx(p2); - v3s16 p3 = floatToInt(pf + v3f(0, BS*1.6, 0), BS); - MapNode n3 = m_map->getNodeNoEx(p3); - - u32 damage_per_second = 0; - damage_per_second = MYMAX(damage_per_second, - m_gamedef->ndef()->get(n1).damage_per_second); - damage_per_second = MYMAX(damage_per_second, - m_gamedef->ndef()->get(n2).damage_per_second); - damage_per_second = MYMAX(damage_per_second, - m_gamedef->ndef()->get(n3).damage_per_second); - - if(damage_per_second != 0) - { - damageLocalPlayer(damage_per_second, true); - } - } - - /* - Drowning - */ - if(m_drowning_interval.step(dtime, 2.0)) - { - v3f pf = lplayer->getPosition(); - - // head - v3s16 p = floatToInt(pf + v3f(0, BS*1.6, 0), BS); - MapNode n = m_map->getNodeNoEx(p); - ContentFeatures c = m_gamedef->ndef()->get(n); - u8 drowning_damage = c.drowning; - if(drowning_damage > 0 && lplayer->hp > 0){ - u16 breath = lplayer->getBreath(); - if(breath > 10){ - breath = 11; - } - if(breath > 0){ - breath -= 1; - } - lplayer->setBreath(breath); - updateLocalPlayerBreath(breath); - } - - if(lplayer->getBreath() == 0 && drowning_damage > 0){ - damageLocalPlayer(drowning_damage, true); - } - } - if(m_breathing_interval.step(dtime, 0.5)) - { - v3f pf = lplayer->getPosition(); - - // head - v3s16 p = floatToInt(pf + v3f(0, BS*1.6, 0), BS); - MapNode n = m_map->getNodeNoEx(p); - ContentFeatures c = m_gamedef->ndef()->get(n); - if (!lplayer->hp){ - lplayer->setBreath(11); - } - else if(c.drowning == 0){ - u16 breath = lplayer->getBreath(); - if(breath <= 10){ - breath += 1; - lplayer->setBreath(breath); - updateLocalPlayerBreath(breath); - } - } - } - - // Update lighting on local player (used for wield item) - u32 day_night_ratio = getDayNightRatio(); - { - // Get node at head - - // On InvalidPositionException, use this as default - // (day: LIGHT_SUN, night: 0) - MapNode node_at_lplayer(CONTENT_AIR, 0x0f, 0); - - v3s16 p = lplayer->getLightPosition(); - node_at_lplayer = m_map->getNodeNoEx(p); - - u16 light = getInteriorLight(node_at_lplayer, 0, m_gamedef->ndef()); - u8 day = light & 0xff; - u8 night = (light >> 8) & 0xff; - finalColorBlend(lplayer->light_color, day, night, day_night_ratio); - } - - /* - Step active objects and update lighting of them - */ - - g_profiler->avg("CEnv: num of objects", m_active_objects.size()); - bool update_lighting = m_active_object_light_update_interval.step(dtime, 0.21); - for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - ClientActiveObject* obj = i->second; - // Step object - obj->step(dtime, this); - - if(update_lighting) - { - // Update lighting - u8 light = 0; - bool pos_ok; - - // Get node at head - v3s16 p = obj->getLightPosition(); - MapNode n = m_map->getNodeNoEx(p, &pos_ok); - if (pos_ok) - light = n.getLightBlend(day_night_ratio, m_gamedef->ndef()); - else - light = blend_light(day_night_ratio, LIGHT_SUN, 0); - - obj->updateLight(light); - } - } - - /* - Step and handle simple objects - */ - g_profiler->avg("CEnv: num of simple objects", m_simple_objects.size()); - for(std::vector<ClientSimpleObject*>::iterator - i = m_simple_objects.begin(); i != m_simple_objects.end();) { - std::vector<ClientSimpleObject*>::iterator cur = i; - ClientSimpleObject *simple = *cur; - - simple->step(dtime); - if(simple->m_to_be_removed) { - delete simple; - i = m_simple_objects.erase(cur); - } - else { - ++i; - } - } -} - -void ClientEnvironment::addSimpleObject(ClientSimpleObject *simple) -{ - m_simple_objects.push_back(simple); -} - -GenericCAO* ClientEnvironment::getGenericCAO(u16 id) -{ - ClientActiveObject *obj = getActiveObject(id); - if (obj && obj->getType() == ACTIVEOBJECT_TYPE_GENERIC) - return (GenericCAO*) obj; - else - return NULL; -} - -ClientActiveObject* ClientEnvironment::getActiveObject(u16 id) -{ - UNORDERED_MAP<u16, ClientActiveObject*>::iterator n = m_active_objects.find(id); - if (n == m_active_objects.end()) - return NULL; - return n->second; -} - -bool isFreeClientActiveObjectId(const u16 id, - UNORDERED_MAP<u16, ClientActiveObject*> &objects) -{ - if(id == 0) - return false; - - return objects.find(id) == objects.end(); -} - -u16 getFreeClientActiveObjectId(UNORDERED_MAP<u16, ClientActiveObject*> &objects) -{ - //try to reuse id's as late as possible - static u16 last_used_id = 0; - u16 startid = last_used_id; - for(;;) { - last_used_id ++; - if (isFreeClientActiveObjectId(last_used_id, objects)) - return last_used_id; - - if (last_used_id == startid) - return 0; - } -} - -u16 ClientEnvironment::addActiveObject(ClientActiveObject *object) -{ - assert(object); // Pre-condition - if(object->getId() == 0) - { - u16 new_id = getFreeClientActiveObjectId(m_active_objects); - if(new_id == 0) - { - infostream<<"ClientEnvironment::addActiveObject(): " - <<"no free ids available"<<std::endl; - delete object; - return 0; - } - object->setId(new_id); - } - if (!isFreeClientActiveObjectId(object->getId(), m_active_objects)) { - infostream<<"ClientEnvironment::addActiveObject(): " - <<"id is not free ("<<object->getId()<<")"<<std::endl; - delete object; - return 0; - } - infostream<<"ClientEnvironment::addActiveObject(): " - <<"added (id="<<object->getId()<<")"<<std::endl; - m_active_objects[object->getId()] = object; - object->addToScene(m_smgr, m_texturesource, m_irr); - { // Update lighting immediately - u8 light = 0; - bool pos_ok; - - // Get node at head - v3s16 p = object->getLightPosition(); - MapNode n = m_map->getNodeNoEx(p, &pos_ok); - if (pos_ok) - light = n.getLightBlend(getDayNightRatio(), m_gamedef->ndef()); - else - light = blend_light(getDayNightRatio(), LIGHT_SUN, 0); - - object->updateLight(light); - } - return object->getId(); -} - -void ClientEnvironment::addActiveObject(u16 id, u8 type, - const std::string &init_data) -{ - ClientActiveObject* obj = - ClientActiveObject::create((ActiveObjectType) type, m_gamedef, this); - if(obj == NULL) - { - infostream<<"ClientEnvironment::addActiveObject(): " - <<"id="<<id<<" type="<<type<<": Couldn't create object" - <<std::endl; - return; - } - - obj->setId(id); - - try - { - obj->initialize(init_data); - } - catch(SerializationError &e) - { - errorstream<<"ClientEnvironment::addActiveObject():" - <<" id="<<id<<" type="<<type - <<": SerializationError in initialize(): " - <<e.what() - <<": init_data="<<serializeJsonString(init_data) - <<std::endl; - } - - addActiveObject(obj); -} - -void ClientEnvironment::removeActiveObject(u16 id) -{ - verbosestream<<"ClientEnvironment::removeActiveObject(): " - <<"id="<<id<<std::endl; - ClientActiveObject* obj = getActiveObject(id); - if (obj == NULL) { - infostream<<"ClientEnvironment::removeActiveObject(): " - <<"id="<<id<<" not found"<<std::endl; - return; - } - obj->removeFromScene(true); - delete obj; - m_active_objects.erase(id); -} - -void ClientEnvironment::processActiveObjectMessage(u16 id, const std::string &data) -{ - ClientActiveObject *obj = getActiveObject(id); - if (obj == NULL) { - infostream << "ClientEnvironment::processActiveObjectMessage():" - << " got message for id=" << id << ", which doesn't exist." - << std::endl; - return; - } - - try { - obj->processMessage(data); - } catch (SerializationError &e) { - errorstream<<"ClientEnvironment::processActiveObjectMessage():" - << " id=" << id << " type=" << obj->getType() - << " SerializationError in processMessage(): " << e.what() - << std::endl; - } -} - -/* - Callbacks for activeobjects -*/ - -void ClientEnvironment::damageLocalPlayer(u8 damage, bool handle_hp) -{ - LocalPlayer *lplayer = getLocalPlayer(); - assert(lplayer); - - if (handle_hp) { - if (lplayer->hp > damage) - lplayer->hp -= damage; - else - lplayer->hp = 0; - } - - ClientEnvEvent event; - event.type = CEE_PLAYER_DAMAGE; - event.player_damage.amount = damage; - event.player_damage.send_to_server = handle_hp; - m_client_event_queue.push(event); -} - -void ClientEnvironment::updateLocalPlayerBreath(u16 breath) -{ - ClientEnvEvent event; - event.type = CEE_PLAYER_BREATH; - event.player_breath.amount = breath; - m_client_event_queue.push(event); -} - -/* - Client likes to call these -*/ - -void ClientEnvironment::getActiveObjects(v3f origin, f32 max_d, - std::vector<DistanceSortedActiveObject> &dest) -{ - for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - ClientActiveObject* obj = i->second; - - f32 d = (obj->getPosition() - origin).getLength(); - - if(d > max_d) - continue; - - DistanceSortedActiveObject dso(obj, d); - - dest.push_back(dso); - } -} - -ClientEnvEvent ClientEnvironment::getClientEvent() -{ - ClientEnvEvent event; - if(m_client_event_queue.empty()) - event.type = CEE_NONE; - else { - event = m_client_event_queue.front(); - m_client_event_queue.pop(); - } - return event; -} - -#endif // #ifndef SERVER diff --git a/src/environment.h b/src/environment.h index 4bee40e57..1de13e9ed 100644 --- a/src/environment.h +++ b/src/environment.h @@ -30,37 +30,24 @@ with this program; if not, write to the Free Software Foundation, Inc., - etc. */ -#include <set> #include <list> #include <queue> #include <map> #include "irr_v3d.h" #include "activeobject.h" #include "util/numeric.h" -#include "mapnode.h" -#include "mapblock.h" #include "threading/mutex.h" #include "threading/atomic.h" #include "network/networkprotocol.h" // for AccessDeniedCode -class ServerEnvironment; -class ActiveBlockModifier; -class ServerActiveObject; -class ITextureSource; class IGameDef; class Map; -class ServerMap; -class ClientMap; -class GameScripting; -class Player; -class RemotePlayer; -class PlayerSAO; class Environment { public: // Environment will delete the map passed to the constructor - Environment(); + Environment(IGameDef *gamedef); virtual ~Environment(); /* @@ -71,7 +58,7 @@ public: */ virtual void step(f32 dtime) = 0; - virtual Map & getMap() = 0; + virtual Map &getMap() = 0; u32 getDayNightRatio(); @@ -91,6 +78,7 @@ public: // counter used internally when triggering ABMs u32 m_added_objects; + IGameDef *getGameDef() { return m_gamedef; } protected: GenericAtomic<float> m_time_of_day_speed; @@ -128,532 +116,12 @@ protected: float m_cache_abm_interval; float m_cache_nodetimer_interval; + IGameDef *m_gamedef; + private: Mutex m_time_lock; DISABLE_CLASS_COPY(Environment); }; -/* - {Active, Loading} block modifier interface. - - These are fed into ServerEnvironment at initialization time; - ServerEnvironment handles deleting them. -*/ - -class ActiveBlockModifier -{ -public: - ActiveBlockModifier(){}; - virtual ~ActiveBlockModifier(){}; - - // Set of contents to trigger on - virtual std::set<std::string> getTriggerContents()=0; - // Set of required neighbors (trigger doesn't happen if none are found) - // Empty = do not check neighbors - virtual std::set<std::string> getRequiredNeighbors() - { return std::set<std::string>(); } - // Trigger interval in seconds - virtual float getTriggerInterval() = 0; - // Random chance of (1 / return value), 0 is disallowed - virtual u32 getTriggerChance() = 0; - // Whether to modify chance to simulate time lost by an unnattended block - virtual bool getSimpleCatchUp() = 0; - // This is called usually at interval for 1/chance of the nodes - virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){}; - virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, - u32 active_object_count, u32 active_object_count_wider){}; -}; - -struct ABMWithState -{ - ActiveBlockModifier *abm; - float timer; - - ABMWithState(ActiveBlockModifier *abm_); -}; - -struct LoadingBlockModifierDef -{ - // Set of contents to trigger on - std::set<std::string> trigger_contents; - std::string name; - bool run_at_every_load; - - virtual ~LoadingBlockModifierDef() {} - virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){}; -}; - -struct LBMContentMapping -{ - typedef std::map<content_t, std::vector<LoadingBlockModifierDef *> > container_map; - container_map map; - - std::vector<LoadingBlockModifierDef *> lbm_list; - - // Needs to be separate method (not inside destructor), - // because the LBMContentMapping may be copied and destructed - // many times during operation in the lbm_lookup_map. - void deleteContents(); - void addLBM(LoadingBlockModifierDef *lbm_def, IGameDef *gamedef); - const std::vector<LoadingBlockModifierDef *> *lookup(content_t c) const; -}; - -class LBMManager -{ -public: - LBMManager(): - m_query_mode(false) - {} - - ~LBMManager(); - - // Don't call this after loadIntroductionTimes() ran. - void addLBMDef(LoadingBlockModifierDef *lbm_def); - - void loadIntroductionTimes(const std::string ×, - IGameDef *gamedef, u32 now); - - // Don't call this before loadIntroductionTimes() ran. - std::string createIntroductionTimesString(); - - // Don't call this before loadIntroductionTimes() ran. - void applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp); - - // Warning: do not make this std::unordered_map, order is relevant here - typedef std::map<u32, LBMContentMapping> lbm_lookup_map; - -private: - // Once we set this to true, we can only query, - // not modify - bool m_query_mode; - - // For m_query_mode == false: - // The key of the map is the LBM def's name. - // TODO make this std::unordered_map - std::map<std::string, LoadingBlockModifierDef *> m_lbm_defs; - - // For m_query_mode == true: - // The key of the map is the LBM def's first introduction time. - lbm_lookup_map m_lbm_lookup; - - // Returns an iterator to the LBMs that were introduced - // after the given time. This is guaranteed to return - // valid values for everything - lbm_lookup_map::const_iterator getLBMsIntroducedAfter(u32 time) - { return m_lbm_lookup.lower_bound(time); } -}; - -/* - List of active blocks, used by ServerEnvironment -*/ - -class ActiveBlockList -{ -public: - void update(std::vector<v3s16> &active_positions, - s16 radius, - std::set<v3s16> &blocks_removed, - std::set<v3s16> &blocks_added); - - bool contains(v3s16 p){ - return (m_list.find(p) != m_list.end()); - } - - void clear(){ - m_list.clear(); - } - - std::set<v3s16> m_list; - std::set<v3s16> m_forceloaded_list; - -private: -}; - -/* - Operation mode for ServerEnvironment::clearObjects() -*/ -enum ClearObjectsMode { - // Load and go through every mapblock, clearing objects - CLEAR_OBJECTS_MODE_FULL, - - // Clear objects immediately in loaded mapblocks; - // clear objects in unloaded mapblocks only when the mapblocks are next activated. - CLEAR_OBJECTS_MODE_QUICK, -}; - -/* - The server-side environment. - - This is not thread-safe. Server uses an environment mutex. -*/ - -typedef UNORDERED_MAP<u16, ServerActiveObject *> ActiveObjectMap; - -class ServerEnvironment : public Environment -{ -public: - ServerEnvironment(ServerMap *map, GameScripting *scriptIface, - IGameDef *gamedef, const std::string &path_world); - ~ServerEnvironment(); - - Map & getMap(); - - ServerMap & getServerMap(); - - //TODO find way to remove this fct! - GameScripting* getScriptIface() - { return m_script; } - - IGameDef *getGameDef() - { return m_gamedef; } - - float getSendRecommendedInterval() - { return m_recommended_send_interval; } - - void kickAllPlayers(AccessDeniedCode reason, - const std::string &str_reason, bool reconnect); - // Save players - void saveLoadedPlayers(); - void savePlayer(RemotePlayer *player); - RemotePlayer *loadPlayer(const std::string &playername, PlayerSAO *sao); - void addPlayer(RemotePlayer *player); - void removePlayer(RemotePlayer *player); - - /* - Save and load time of day and game timer - */ - void saveMeta(); - void loadMeta(); - // to be called instead of loadMeta if - // env_meta.txt doesn't exist (e.g. new world) - void loadDefaultMeta(); - - u32 addParticleSpawner(float exptime); - u32 addParticleSpawner(float exptime, u16 attached_id); - void deleteParticleSpawner(u32 id, bool remove_from_object = true); - - /* - External ActiveObject interface - ------------------------------------------- - */ - - ServerActiveObject* getActiveObject(u16 id); - - /* - Add an active object to the environment. - Environment handles deletion of object. - Object may be deleted by environment immediately. - If id of object is 0, assigns a free id to it. - Returns the id of the object. - Returns 0 if not added and thus deleted. - */ - u16 addActiveObject(ServerActiveObject *object); - - /* - Add an active object as a static object to the corresponding - MapBlock. - Caller allocates memory, ServerEnvironment frees memory. - Return value: true if succeeded, false if failed. - (note: not used, pending removal from engine) - */ - //bool addActiveObjectAsStatic(ServerActiveObject *object); - - /* - Find out what new objects have been added to - inside a radius around a position - */ - void getAddedActiveObjects(PlayerSAO *playersao, s16 radius, - s16 player_radius, - std::set<u16> ¤t_objects, - std::queue<u16> &added_objects); - - /* - Find out what new objects have been removed from - inside a radius around a position - */ - void getRemovedActiveObjects(PlayerSAO *playersao, s16 radius, - s16 player_radius, - std::set<u16> ¤t_objects, - std::queue<u16> &removed_objects); - - /* - Get the next message emitted by some active object. - Returns a message with id=0 if no messages are available. - */ - ActiveObjectMessage getActiveObjectMessage(); - - /* - Activate objects and dynamically modify for the dtime determined - from timestamp and additional_dtime - */ - void activateBlock(MapBlock *block, u32 additional_dtime=0); - - /* - {Active,Loading}BlockModifiers - ------------------------------------------- - */ - - void addActiveBlockModifier(ActiveBlockModifier *abm); - void addLoadingBlockModifierDef(LoadingBlockModifierDef *lbm); - - /* - Other stuff - ------------------------------------------- - */ - - // Script-aware node setters - bool setNode(v3s16 p, const MapNode &n); - bool removeNode(v3s16 p); - bool swapNode(v3s16 p, const MapNode &n); - - // Find all active objects inside a radius around a point - void getObjectsInsideRadius(std::vector<u16> &objects, v3f pos, float radius); - - // Clear objects, loading and going through every MapBlock - void clearObjects(ClearObjectsMode mode); - - // This makes stuff happen - void step(f32 dtime); - - //check if there's a line of sight between two positions - bool line_of_sight(v3f pos1, v3f pos2, float stepsize=1.0, v3s16 *p=NULL); - - u32 getGameTime() { return m_game_time; } - - void reportMaxLagEstimate(float f) { m_max_lag_estimate = f; } - float getMaxLagEstimate() { return m_max_lag_estimate; } - - std::set<v3s16>* getForceloadedBlocks() { return &m_active_blocks.m_forceloaded_list; }; - - // Sets the static object status all the active objects in the specified block - // This is only really needed for deleting blocks from the map - void setStaticForActiveObjectsInBlock(v3s16 blockpos, - bool static_exists, v3s16 static_block=v3s16(0,0,0)); - - RemotePlayer *getPlayer(const u16 peer_id); - RemotePlayer *getPlayer(const char* name); -private: - - /* - Internal ActiveObject interface - ------------------------------------------- - */ - - /* - Add an active object to the environment. - - Called by addActiveObject. - - Object may be deleted by environment immediately. - If id of object is 0, assigns a free id to it. - Returns the id of the object. - Returns 0 if not added and thus deleted. - */ - u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed, u32 dtime_s); - - /* - Remove all objects that satisfy (m_removed && m_known_by_count==0) - */ - void removeRemovedObjects(); - - /* - Convert stored objects from block to active - */ - void activateObjects(MapBlock *block, u32 dtime_s); - - /* - Convert objects that are not in active blocks to static. - - If m_known_by_count != 0, active object is not deleted, but static - data is still updated. - - If force_delete is set, active object is deleted nevertheless. It - shall only be set so in the destructor of the environment. - */ - void deactivateFarObjects(bool force_delete); - - /* - Member variables - */ - - // The map - ServerMap *m_map; - // Lua state - GameScripting* m_script; - // Game definition - IGameDef *m_gamedef; - // World path - const std::string m_path_world; - // Active object list - ActiveObjectMap m_active_objects; - // Outgoing network message buffer for active objects - std::queue<ActiveObjectMessage> m_active_object_messages; - // Some timers - float m_send_recommended_timer; - IntervalLimiter m_object_management_interval; - // List of active blocks - ActiveBlockList m_active_blocks; - IntervalLimiter m_active_blocks_management_interval; - IntervalLimiter m_active_block_modifier_interval; - IntervalLimiter m_active_blocks_nodemetadata_interval; - int m_active_block_interval_overload_skip; - // Time from the beginning of the game in seconds. - // Incremented in step(). - u32 m_game_time; - // A helper variable for incrementing the latter - float m_game_time_fraction_counter; - // Time of last clearObjects call (game time). - // When a mapblock older than this is loaded, its objects are cleared. - u32 m_last_clear_objects_time; - // Active block modifiers - std::vector<ABMWithState> m_abms; - LBMManager m_lbm_mgr; - // An interval for generally sending object positions and stuff - float m_recommended_send_interval; - // Estimate for general maximum lag as determined by server. - // Can raise to high values like 15s with eg. map generation mods. - float m_max_lag_estimate; - - // peer_ids in here should be unique, except that there may be many 0s - std::vector<RemotePlayer*> m_players; - - // Particles - IntervalLimiter m_particle_management_interval; - UNORDERED_MAP<u32, float> m_particle_spawners; - UNORDERED_MAP<u32, u16> m_particle_spawner_attachments; -}; - -#ifndef SERVER - -#include "clientobject.h" -#include "content_cao.h" - -class ClientSimpleObject; - -/* - The client-side environment. - - This is not thread-safe. - Must be called from main (irrlicht) thread (uses the SceneManager) - Client uses an environment mutex. -*/ - -enum ClientEnvEventType -{ - CEE_NONE, - CEE_PLAYER_DAMAGE, - CEE_PLAYER_BREATH -}; - -struct ClientEnvEvent -{ - ClientEnvEventType type; - union { - //struct{ - //} none; - struct{ - u8 amount; - bool send_to_server; - } player_damage; - struct{ - u16 amount; - } player_breath; - }; -}; - -class ClientEnvironment : public Environment -{ -public: - ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, - ITextureSource *texturesource, IGameDef *gamedef, - IrrlichtDevice *device); - ~ClientEnvironment(); - - Map & getMap(); - ClientMap & getClientMap(); - - IGameDef *getGameDef() - { return m_gamedef; } - - void step(f32 dtime); - - virtual void setLocalPlayer(LocalPlayer *player); - LocalPlayer *getLocalPlayer() { return m_local_player; } - - /* - ClientSimpleObjects - */ - - void addSimpleObject(ClientSimpleObject *simple); - - /* - ActiveObjects - */ - - GenericCAO* getGenericCAO(u16 id); - ClientActiveObject* getActiveObject(u16 id); - - /* - Adds an active object to the environment. - Environment handles deletion of object. - Object may be deleted by environment immediately. - If id of object is 0, assigns a free id to it. - Returns the id of the object. - Returns 0 if not added and thus deleted. - */ - u16 addActiveObject(ClientActiveObject *object); - - void addActiveObject(u16 id, u8 type, const std::string &init_data); - void removeActiveObject(u16 id); - - void processActiveObjectMessage(u16 id, const std::string &data); - - /* - Callbacks for activeobjects - */ - - void damageLocalPlayer(u8 damage, bool handle_hp=true); - void updateLocalPlayerBreath(u16 breath); - - /* - Client likes to call these - */ - - // Get all nearby objects - void getActiveObjects(v3f origin, f32 max_d, - std::vector<DistanceSortedActiveObject> &dest); - - // Get event from queue. CEE_NONE is returned if queue is empty. - ClientEnvEvent getClientEvent(); - - u16 attachement_parent_ids[USHRT_MAX + 1]; - - const std::list<std::string> &getPlayerNames() { return m_player_names; } - void addPlayerName(const std::string &name) { m_player_names.push_back(name); } - void removePlayerName(const std::string &name) { m_player_names.remove(name); } - void updateCameraOffset(v3s16 camera_offset) - { m_camera_offset = camera_offset; } - v3s16 getCameraOffset() const { return m_camera_offset; } -private: - ClientMap *m_map; - LocalPlayer *m_local_player; - scene::ISceneManager *m_smgr; - ITextureSource *m_texturesource; - IGameDef *m_gamedef; - IrrlichtDevice *m_irr; - UNORDERED_MAP<u16, ClientActiveObject*> m_active_objects; - std::vector<ClientSimpleObject*> m_simple_objects; - std::queue<ClientEnvEvent> m_client_event_queue; - IntervalLimiter m_active_object_light_update_interval; - IntervalLimiter m_lava_hurt_interval; - IntervalLimiter m_drowning_interval; - IntervalLimiter m_breathing_interval; - std::list<std::string> m_player_names; - v3s16 m_camera_offset; -}; - #endif - -#endif - diff --git a/src/exceptions.h b/src/exceptions.h index 67a2d0df6..1b39c6725 100644 --- a/src/exceptions.h +++ b/src/exceptions.h @@ -27,10 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., class BaseException : public std::exception { public: - BaseException(const std::string &s) throw() - { - m_s = s; - } + BaseException(const std::string &s) throw(): m_s(s) {} ~BaseException() throw() {} virtual const char * what() const throw() { @@ -122,12 +119,12 @@ public: class ClientStateError : public BaseException { public: - ClientStateError(std::string s): BaseException(s) {} + ClientStateError(const std::string &s): BaseException(s) {} }; class PrngException : public BaseException { public: - PrngException(std::string s): BaseException(s) {} + PrngException(const std::string &s): BaseException(s) {} }; class ModError : public BaseException { diff --git a/src/face_position_cache.cpp b/src/face_position_cache.cpp new file mode 100644 index 000000000..f57e75da9 --- /dev/null +++ b/src/face_position_cache.cpp @@ -0,0 +1,110 @@ +/* +Minetest +Copyright (C) 2015 Nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "face_position_cache.h" +#include "threading/mutex_auto_lock.h" + + +UNORDERED_MAP<u16, std::vector<v3s16> > FacePositionCache::cache; +Mutex FacePositionCache::cache_mutex; + +// Calculate the borders of a "d-radius" cube +const std::vector<v3s16> &FacePositionCache::getFacePositions(u16 d) +{ + MutexAutoLock lock(cache_mutex); + UNORDERED_MAP<u16, std::vector<v3s16> >::iterator it = cache.find(d); + if (it != cache.end()) + return it->second; + + return generateFacePosition(d); +} + +const std::vector<v3s16> &FacePositionCache::generateFacePosition(u16 d) +{ + cache[d] = std::vector<v3s16>(); + std::vector<v3s16> &c = cache[d]; + if (d == 0) { + c.push_back(v3s16(0,0,0)); + return c; + } + if (d == 1) { + // This is an optimized sequence of coordinates. + c.push_back(v3s16( 0, 1, 0)); // Top + c.push_back(v3s16( 0, 0, 1)); // Back + c.push_back(v3s16(-1, 0, 0)); // Left + c.push_back(v3s16( 1, 0, 0)); // Right + c.push_back(v3s16( 0, 0,-1)); // Front + c.push_back(v3s16( 0,-1, 0)); // Bottom + // 6 + c.push_back(v3s16(-1, 0, 1)); // Back left + c.push_back(v3s16( 1, 0, 1)); // Back right + c.push_back(v3s16(-1, 0,-1)); // Front left + c.push_back(v3s16( 1, 0,-1)); // Front right + c.push_back(v3s16(-1,-1, 0)); // Bottom left + c.push_back(v3s16( 1,-1, 0)); // Bottom right + c.push_back(v3s16( 0,-1, 1)); // Bottom back + c.push_back(v3s16( 0,-1,-1)); // Bottom front + c.push_back(v3s16(-1, 1, 0)); // Top left + c.push_back(v3s16( 1, 1, 0)); // Top right + c.push_back(v3s16( 0, 1, 1)); // Top back + c.push_back(v3s16( 0, 1,-1)); // Top front + // 18 + c.push_back(v3s16(-1, 1, 1)); // Top back-left + c.push_back(v3s16( 1, 1, 1)); // Top back-right + c.push_back(v3s16(-1, 1,-1)); // Top front-left + c.push_back(v3s16( 1, 1,-1)); // Top front-right + c.push_back(v3s16(-1,-1, 1)); // Bottom back-left + c.push_back(v3s16( 1,-1, 1)); // Bottom back-right + c.push_back(v3s16(-1,-1,-1)); // Bottom front-left + c.push_back(v3s16( 1,-1,-1)); // Bottom front-right + // 26 + return c; + } + + // Take blocks in all sides, starting from y=0 and going +-y + for (s16 y = 0; y <= d - 1; y++) { + // Left and right side, including borders + for (s16 z =- d; z <= d; z++) { + c.push_back(v3s16( d, y, z)); + c.push_back(v3s16(-d, y, z)); + if (y != 0) { + c.push_back(v3s16( d, -y, z)); + c.push_back(v3s16(-d, -y, z)); + } + } + // Back and front side, excluding borders + for (s16 x = -d + 1; x <= d - 1; x++) { + c.push_back(v3s16(x, y, d)); + c.push_back(v3s16(x, y, -d)); + if (y != 0) { + c.push_back(v3s16(x, -y, d)); + c.push_back(v3s16(x, -y, -d)); + } + } + } + + // Take the bottom and top face with borders + // -d < x < d, y = +-d, -d < z < d + for (s16 x = -d; x <= d; x++) + for (s16 z = -d; z <= d; z++) { + c.push_back(v3s16(x, -d, z)); + c.push_back(v3s16(x, d, z)); + } + return c; +} diff --git a/src/face_position_cache.h b/src/face_position_cache.h new file mode 100644 index 000000000..c1d2841c4 --- /dev/null +++ b/src/face_position_cache.h @@ -0,0 +1,44 @@ +/* +Minetest +Copyright (C) 2015 Nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef FACE_POSITION_CACHE_HEADER +#define FACE_POSITION_CACHE_HEADER + +#include "irr_v3d.h" +#include "threading/mutex.h" +#include "util/cpp11_container.h" + +#include <map> +#include <vector> + +/* + * This class permits caching getFacePosition call results. + * This reduces CPU usage and vector calls. + */ +class FacePositionCache { +public: + static const std::vector<v3s16> &getFacePositions(u16 d); + +private: + static const std::vector<v3s16> &generateFacePosition(u16 d); + static UNORDERED_MAP<u16, std::vector<v3s16> > cache; + static Mutex cache_mutex; +}; + +#endif diff --git a/src/filecache.h b/src/filecache.h index a913a06ac..627ab45ed 100644 --- a/src/filecache.h +++ b/src/filecache.h @@ -21,8 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef FILECACHE_HEADER #define FILECACHE_HEADER -#include <string> #include <iostream> +#include <string> class FileCache { @@ -30,13 +30,11 @@ public: /* 'dir' is the file cache directory to use. */ - FileCache(std::string dir): - m_dir(dir) - { - } - + FileCache(const std::string &dir) : m_dir(dir) {} + bool update(const std::string &name, const std::string &data); bool load(const std::string &name, std::ostream &os); + private: std::string m_dir; diff --git a/src/fontengine.cpp b/src/fontengine.cpp index 55ff001e7..da327c3f6 100644 --- a/src/fontengine.cpp +++ b/src/fontengine.cpp @@ -343,11 +343,31 @@ void FontEngine::initFont(unsigned int basesize, FontMode mode) if (font != NULL) { m_font_cache[mode][basesize] = font; + return; } - else { - errorstream << "FontEngine: failed to load freetype font: " - << font_path << std::endl; + + // try fallback font + errorstream << "FontEngine: failed to load: " << font_path << ", trying to fall back " + "to fallback font" << std::endl; + + font_path = g_settings->get(font_config_prefix + "fallback_font_path"); + + font = gui::CGUITTFont::createTTFont(m_env, + font_path.c_str(), size, true, true, font_shadow, + font_shadow_alpha); + + if (font != NULL) { + m_font_cache[mode][basesize] = font; + return; } + + // give up + errorstream << "FontEngine: failed to load freetype font: " + << font_path << std::endl; + errorstream << "minetest can not continue without a valid font. Please correct " + "the 'font_path' setting or install the font file in the proper " + "location" << std::endl; + abort(); } #endif } diff --git a/src/game.cpp b/src/game.cpp index 966c23073..ff473e022 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <iomanip> #include "camera.h" #include "client.h" +#include "client/inputhandler.h" #include "client/tile.h" // For TextureSource #include "client/keys.h" #include "client/joystick_controller.h" @@ -41,7 +42,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "guiKeyChangeMenu.h" #include "guiPasswordChange.h" #include "guiVolumeChange.h" -#include "hud.h" #include "mainmenumanager.h" #include "mapblock.h" #include "nodedef.h" // Needed for determining pointing to nodes @@ -51,27 +51,20 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "quicktune_shortcutter.h" #include "server.h" #include "settings.h" -#include "shader.h" // For ShaderSource #include "sky.h" #include "subgame.h" #include "tool.h" +#include "util/basic_macros.h" #include "util/directiontables.h" #include "util/pointedthing.h" #include "irrlicht_changes/static_text.h" #include "version.h" -#include "minimap.h" -#include "mapblock_mesh.h" - -#include "sound.h" +#include "script/scripting_client.h" #if USE_SOUND #include "sound_openal.h" #endif -#ifdef HAVE_TOUCHSCREENGUI - #include "touchscreengui.h" -#endif - extern Settings *g_settings; extern Profiler *g_profiler; @@ -79,14 +72,15 @@ extern Profiler *g_profiler; Text input system */ -struct TextDestNodeMetadata : public TextDest { +struct TextDestNodeMetadata : public TextDest +{ TextDestNodeMetadata(v3s16 p, Client *client) { m_p = p; m_client = client; } // This is deprecated I guess? -celeron55 - void gotText(std::wstring text) + void gotText(const std::wstring &text) { std::string ntext = wide_to_utf8(text); infostream << "Submitting 'text' field of node at (" << m_p.X << "," @@ -104,13 +98,14 @@ struct TextDestNodeMetadata : public TextDest { Client *m_client; }; -struct TextDestPlayerInventory : public TextDest { +struct TextDestPlayerInventory : public TextDest +{ TextDestPlayerInventory(Client *client) { m_client = client; m_formname = ""; } - TextDestPlayerInventory(Client *client, std::string formname) + TextDestPlayerInventory(Client *client, const std::string &formname) { m_client = client; m_formname = formname; @@ -123,25 +118,20 @@ struct TextDestPlayerInventory : public TextDest { Client *m_client; }; -struct LocalFormspecHandler : public TextDest { - LocalFormspecHandler(); - LocalFormspecHandler(std::string formname) : - m_client(0) +struct LocalFormspecHandler : public TextDest +{ + LocalFormspecHandler(const std::string &formname): + m_client(NULL) { m_formname = formname; } - LocalFormspecHandler(std::string formname, Client *client) : + LocalFormspecHandler(const std::string &formname, Client *client): m_client(client) { m_formname = formname; } - void gotText(std::wstring message) - { - errorstream << "LocalFormspecHandler::gotText old style message received" << std::endl; - } - void gotText(const StringMap &fields) { if (m_formname == "MT_PAUSE_MENU") { @@ -179,38 +169,8 @@ struct LocalFormspecHandler : public TextDest { } } - if (m_formname == "MT_DEATH_SCREEN") { - assert(m_client != 0); - - if ((fields.find("btn_respawn") != fields.end())) { - m_client->sendRespawn(); - return; - } - - if (fields.find("quit") != fields.end()) { - m_client->sendRespawn(); - return; - } - } - - // don't show error message for unhandled cursor keys - if ((fields.find("key_up") != fields.end()) || - (fields.find("key_down") != fields.end()) || - (fields.find("key_left") != fields.end()) || - (fields.find("key_right") != fields.end())) { - return; - } - - errorstream << "LocalFormspecHandler::gotText unhandled >" - << m_formname << "< event" << std::endl; - - int i = 0; - StringMap::const_iterator it; - for (it = fields.begin(); it != fields.end(); ++it) { - errorstream << "\t" << i << ": " << it->first - << "=" << it->second << std::endl; - i++; - } + // Don't disable this part when modding is disabled, it's used in builtin + m_client->getScript()->on_formspec_input(m_formname, fields); } Client *m_client; @@ -235,7 +195,8 @@ public: return meta->getString("formspec"); } - std::string resolveText(std::string str) + + virtual std::string resolveText(const std::string &str) { NodeMetadata *meta = m_map->getNodeMetadata(m_p); @@ -265,271 +226,6 @@ public: Client *m_client; }; -/* - Check if a node is pointable -*/ -inline bool isPointableNode(const MapNode &n, - Client *client, bool liquids_pointable) -{ - const ContentFeatures &features = client->getNodeDefManager()->get(n); - return features.pointable || - (liquids_pointable && features.isLiquid()); -} - -static inline void getNeighborConnectingFace(v3s16 p, INodeDefManager *nodedef, - ClientMap *map, MapNode n, u8 bitmask, u8 *neighbors) -{ - MapNode n2 = map->getNodeNoEx(p); - if (nodedef->nodeboxConnects(n, n2, bitmask)) - *neighbors |= bitmask; -} - -static inline u8 getNeighbors(v3s16 p, INodeDefManager *nodedef, ClientMap *map, MapNode n) -{ - u8 neighbors = 0; - const ContentFeatures &f = nodedef->get(n); - // locate possible neighboring nodes to connect to - if (f.drawtype == NDT_NODEBOX && f.node_box.type == NODEBOX_CONNECTED) { - v3s16 p2 = p; - - p2.Y++; - getNeighborConnectingFace(p2, nodedef, map, n, 1, &neighbors); - - p2 = p; - p2.Y--; - getNeighborConnectingFace(p2, nodedef, map, n, 2, &neighbors); - - p2 = p; - p2.Z--; - getNeighborConnectingFace(p2, nodedef, map, n, 4, &neighbors); - - p2 = p; - p2.X--; - getNeighborConnectingFace(p2, nodedef, map, n, 8, &neighbors); - - p2 = p; - p2.Z++; - getNeighborConnectingFace(p2, nodedef, map, n, 16, &neighbors); - - p2 = p; - p2.X++; - getNeighborConnectingFace(p2, nodedef, map, n, 32, &neighbors); - } - - return neighbors; -} - -/* - Find what the player is pointing at -*/ -PointedThing getPointedThing(Client *client, Hud *hud, const v3f &player_position, - const v3f &camera_direction, const v3f &camera_position, - core::line3d<f32> shootline, f32 d, bool liquids_pointable, - bool look_for_object, const v3s16 &camera_offset, - ClientActiveObject *&selected_object) -{ - PointedThing result; - - std::vector<aabb3f> *selectionboxes = hud->getSelectionBoxes(); - selectionboxes->clear(); - static const bool show_entity_selectionbox = g_settings->getBool("show_entity_selectionbox"); - - selected_object = NULL; - - INodeDefManager *nodedef = client->getNodeDefManager(); - ClientMap &map = client->getEnv().getClientMap(); - - f32 min_distance = BS * 1001; - - // First try to find a pointed at active object - if (look_for_object) { - selected_object = client->getSelectedActiveObject(d * BS, - camera_position, shootline); - - if (selected_object != NULL) { - if (show_entity_selectionbox && - selected_object->doShowSelectionBox()) { - aabb3f *selection_box = selected_object->getSelectionBox(); - // Box should exist because object was - // returned in the first place - assert(selection_box); - - v3f pos = selected_object->getPosition(); - selectionboxes->push_back(aabb3f( - selection_box->MinEdge, selection_box->MaxEdge)); - hud->setSelectionPos(pos, camera_offset); - } - - min_distance = (selected_object->getPosition() - camera_position).getLength(); - - hud->setSelectedFaceNormal(v3f(0.0, 0.0, 0.0)); - result.type = POINTEDTHING_OBJECT; - result.object_id = selected_object->getId(); - } - } - - // That didn't work, try to find a pointed at node - - v3s16 pos_i = floatToInt(player_position, BS); - - /*infostream<<"pos_i=("<<pos_i.X<<","<<pos_i.Y<<","<<pos_i.Z<<")" - <<std::endl;*/ - - s16 a = d; - s16 ystart = pos_i.Y - (camera_direction.Y < 0 ? a : 1); - s16 zstart = pos_i.Z - (camera_direction.Z < 0 ? a : 1); - s16 xstart = pos_i.X - (camera_direction.X < 0 ? a : 1); - s16 yend = pos_i.Y + 1 + (camera_direction.Y > 0 ? a : 1); - s16 zend = pos_i.Z + (camera_direction.Z > 0 ? a : 1); - s16 xend = pos_i.X + (camera_direction.X > 0 ? a : 1); - - // Prevent signed number overflow - if (yend == 32767) - yend = 32766; - - if (zend == 32767) - zend = 32766; - - if (xend == 32767) - xend = 32766; - - v3s16 pointed_pos(0, 0, 0); - - for (s16 y = ystart; y <= yend; y++) { - for (s16 z = zstart; z <= zend; z++) { - for (s16 x = xstart; x <= xend; x++) { - MapNode n; - bool is_valid_position; - v3s16 p(x, y, z); - - n = map.getNodeNoEx(p, &is_valid_position); - if (!is_valid_position) { - continue; - } - if (!isPointableNode(n, client, liquids_pointable)) { - continue; - } - - std::vector<aabb3f> boxes; - n.getSelectionBoxes(nodedef, &boxes, getNeighbors(p, nodedef, &map, n)); - - v3s16 np(x, y, z); - v3f npf = intToFloat(np, BS); - for (std::vector<aabb3f>::const_iterator - i = boxes.begin(); - i != boxes.end(); ++i) { - aabb3f box = *i; - box.MinEdge += npf; - box.MaxEdge += npf; - - v3f centerpoint = box.getCenter(); - f32 distance = (centerpoint - camera_position).getLength(); - if (distance >= min_distance) { - continue; - } - if (!box.intersectsWithLine(shootline)) { - continue; - } - result.type = POINTEDTHING_NODE; - min_distance = distance; - pointed_pos = np; - } - } - } - } - - if (result.type == POINTEDTHING_NODE) { - f32 d = 0.001 * BS; - MapNode n = map.getNodeNoEx(pointed_pos); - v3f npf = intToFloat(pointed_pos, BS); - std::vector<aabb3f> boxes; - n.getSelectionBoxes(nodedef, &boxes, getNeighbors(pointed_pos, nodedef, &map, n)); - f32 face_min_distance = 1000 * BS; - for (std::vector<aabb3f>::const_iterator - i = boxes.begin(); - i != boxes.end(); ++i) { - aabb3f box = *i; - box.MinEdge += npf; - box.MaxEdge += npf; - for (u16 j = 0; j < 6; j++) { - v3s16 facedir = g_6dirs[j]; - aabb3f facebox = box; - if (facedir.X > 0) { - facebox.MinEdge.X = facebox.MaxEdge.X - d; - } else if (facedir.X < 0) { - facebox.MaxEdge.X = facebox.MinEdge.X + d; - } else if (facedir.Y > 0) { - facebox.MinEdge.Y = facebox.MaxEdge.Y - d; - } else if (facedir.Y < 0) { - facebox.MaxEdge.Y = facebox.MinEdge.Y + d; - } else if (facedir.Z > 0) { - facebox.MinEdge.Z = facebox.MaxEdge.Z - d; - } else if (facedir.Z < 0) { - facebox.MaxEdge.Z = facebox.MinEdge.Z + d; - } - v3f centerpoint = facebox.getCenter(); - f32 distance = (centerpoint - camera_position).getLength(); - if (distance >= face_min_distance) - continue; - if (!facebox.intersectsWithLine(shootline)) - continue; - result.node_abovesurface = pointed_pos + facedir; - hud->setSelectedFaceNormal(v3f(facedir.X, facedir.Y, facedir.Z)); - face_min_distance = distance; - } - } - selectionboxes->clear(); - for (std::vector<aabb3f>::const_iterator - i = boxes.begin(); - i != boxes.end(); ++i) { - aabb3f box = *i; - box.MinEdge += v3f(-d, -d, -d); - box.MaxEdge += v3f(d, d, d); - selectionboxes->push_back(box); - } - hud->setSelectionPos(intToFloat(pointed_pos, BS), camera_offset); - result.node_undersurface = pointed_pos; - } - - // Update selection mesh light level and vertex colors - if (selectionboxes->size() > 0) { - v3f pf = hud->getSelectionPos(); - v3s16 p = floatToInt(pf, BS); - - // Get selection mesh light level - MapNode n = map.getNodeNoEx(p); - u16 node_light = getInteriorLight(n, -1, nodedef); - u16 light_level = node_light; - - for (u8 i = 0; i < 6; i++) { - n = map.getNodeNoEx(p + g_6dirs[i]); - node_light = getInteriorLight(n, -1, nodedef); - if (node_light > light_level) - light_level = node_light; - } - - video::SColor c = MapBlock_LightColor(255, light_level, 0); - u8 day = c.getRed(); - u8 night = c.getGreen(); - u32 daynight_ratio = client->getEnv().getDayNightRatio(); - finalColorBlend(c, day, night, daynight_ratio); - - // Modify final color a bit with time - u32 timer = porting::getTimeMs() % 5000; - float timerf = (float)(irr::core::PI * ((timer / 2500.0) - 0.5)); - float sin_r = 0.08 * sin(timerf); - float sin_g = 0.08 * sin(timerf + irr::core::PI * 0.5); - float sin_b = 0.08 * sin(timerf + irr::core::PI); - c.setRed(core::clamp(core::round32(c.getRed() * (0.8 + sin_r)), 0, 255)); - c.setGreen(core::clamp(core::round32(c.getGreen() * (0.8 + sin_g)), 0, 255)); - c.setBlue(core::clamp(core::round32(c.getBlue() * (0.8 + sin_b)), 0, 255)); - - // Set mesh final color - hud->setSelectionMeshColor(c); - } - return result; -} - /* Profiler display */ void update_profiler_gui(gui::IGUIStaticText *guitext_profiler, FontEngine *fe, @@ -773,6 +469,7 @@ class SoundMaker ISoundManager *m_sound; INodeDefManager *m_ndef; public: + bool makes_footstep_sound; float m_player_step_timer; SimpleSoundSpec m_player_step_sound; @@ -782,6 +479,7 @@ public: SoundMaker(ISoundManager *sound, INodeDefManager *ndef): m_sound(sound), m_ndef(ndef), + makes_footstep_sound(true), m_player_step_timer(0) { } @@ -790,7 +488,8 @@ public: { if (m_player_step_timer <= 0 && m_player_step_sound.exists()) { m_player_step_timer = 0.03; - m_sound->playSound(m_player_step_sound, false); + if (makes_footstep_sound) + m_sound->playSound(m_player_step_sound, false); } } @@ -864,27 +563,35 @@ public: class GameOnDemandSoundFetcher: public OnDemandSoundFetcher { std::set<std::string> m_fetched; +private: + void paths_insert(std::set<std::string> &dst_paths, + const std::string &base, + const std::string &name) + { + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".0.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".1.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".2.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".3.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".4.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".5.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".6.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".7.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".8.ogg"); + dst_paths.insert(base + DIR_DELIM + "sounds" + DIR_DELIM + name + ".9.ogg"); + } public: void fetchSounds(const std::string &name, - std::set<std::string> &dst_paths, - std::set<std::string> &dst_datas) + std::set<std::string> &dst_paths, + std::set<std::string> &dst_datas) { if (m_fetched.count(name)) return; m_fetched.insert(name); - std::string base = porting::path_share + DIR_DELIM + "sounds"; - dst_paths.insert(base + DIR_DELIM + name + ".ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".0.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".1.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".2.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".3.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".4.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".5.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".6.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".7.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".8.ogg"); - dst_paths.insert(base + DIR_DELIM + name + ".9.ogg"); + + paths_insert(dst_paths, porting::path_share, name); + paths_insert(dst_paths, porting::path_user, name); } }; @@ -907,7 +614,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter CachedPixelShaderSetting<float> m_fog_distance; CachedVertexShaderSetting<float> m_animation_timer_vertex; CachedPixelShaderSetting<float> m_animation_timer_pixel; - CachedPixelShaderSetting<float> m_day_night_ratio; + CachedPixelShaderSetting<float, 3> m_day_light; CachedPixelShaderSetting<float, 3> m_eye_position_pixel; CachedVertexShaderSetting<float, 3> m_eye_position_vertex; CachedPixelShaderSetting<float, 3> m_minimap_yaw; @@ -939,7 +646,7 @@ public: m_fog_distance("fogDistance"), m_animation_timer_vertex("animationTimer"), m_animation_timer_pixel("animationTimer"), - m_day_night_ratio("dayNightRatio"), + m_day_light("dayLight"), m_eye_position_pixel("eyePosition"), m_eye_position_vertex("eyePosition"), m_minimap_yaw("yawVec"), @@ -982,8 +689,14 @@ public: m_fog_distance.set(&fog_distance, services); - float daynight_ratio = (float)m_client->getEnv().getDayNightRatio() / 1000.f; - m_day_night_ratio.set(&daynight_ratio, services); + u32 daynight_ratio = (float)m_client->getEnv().getDayNightRatio(); + video::SColorf sunlight; + get_sunlight_color(&sunlight, daynight_ratio); + float dnc[3] = { + sunlight.r, + sunlight.g, + sunlight.b }; + m_day_light.set(dnc, services); u32 animation_timer = porting::getTimeMs() % 100000; float animation_timer_f = (float)animation_timer / 100000.f; @@ -1002,16 +715,19 @@ public: m_eye_position_pixel.set(eye_position_array, services); m_eye_position_vertex.set(eye_position_array, services); - float minimap_yaw_array[3]; - v3f minimap_yaw = m_client->getMapper()->getYawVec(); + if (m_client->getMinimap()) { + float minimap_yaw_array[3]; + v3f minimap_yaw = m_client->getMinimap()->getYawVec(); #if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8) - minimap_yaw_array[0] = minimap_yaw.X; - minimap_yaw_array[1] = minimap_yaw.Y; - minimap_yaw_array[2] = minimap_yaw.Z; + minimap_yaw_array[0] = minimap_yaw.X; + minimap_yaw_array[1] = minimap_yaw.Y; + minimap_yaw_array[2] = minimap_yaw.Z; #else - minimap_yaw.getAs3Values(minimap_yaw_array); + minimap_yaw.getAs3Values(minimap_yaw_array); #endif - m_minimap_yaw.set(minimap_yaw_array, services); + m_minimap_yaw.set(minimap_yaw_array, services); + + } SamplerLayer_t base_tex = 0, normal_tex = 1, @@ -1105,7 +821,8 @@ bool nodePlacementPrediction(Client &client, // Predict param2 for facedir and wallmounted nodes u8 param2 = 0; - if (nodedef->get(id).param_type_2 == CPT2_WALLMOUNTED) { + if (nodedef->get(id).param_type_2 == CPT2_WALLMOUNTED || + nodedef->get(id).param_type_2 == CPT2_COLORED_WALLMOUNTED) { v3s16 dir = nodepos - neighbourpos; if (abs(dir.Y) > MYMAX(abs(dir.X), abs(dir.Z))) { @@ -1117,7 +834,8 @@ bool nodePlacementPrediction(Client &client, } } - if (nodedef->get(id).param_type_2 == CPT2_FACEDIR) { + if (nodedef->get(id).param_type_2 == CPT2_FACEDIR || + nodedef->get(id).param_type_2 == CPT2_COLORED_FACEDIR) { v3s16 dir = nodepos - floatToInt(client.getEnv().getLocalPlayer()->getPosition(), BS); if (abs(dir.X) > abs(dir.Z)) { @@ -1141,7 +859,8 @@ bool nodePlacementPrediction(Client &client, }; v3s16 pp; - if (nodedef->get(id).param_type_2 == CPT2_WALLMOUNTED) + if (nodedef->get(id).param_type_2 == CPT2_WALLMOUNTED || + nodedef->get(id).param_type_2 == CPT2_COLORED_WALLMOUNTED) pp = p + wallmounted_dirs[param2]; else pp = p + v3s16(0, -1, 0); @@ -1181,16 +900,14 @@ bool nodePlacementPrediction(Client &client, } static inline void create_formspec_menu(GUIFormSpecMenu **cur_formspec, - InventoryManager *invmgr, IGameDef *gamedef, - IWritableTextureSource *tsrc, IrrlichtDevice *device, - JoystickController *joystick, - IFormSource *fs_src, TextDest *txt_dest, Client *client) + Client *client, IrrlichtDevice *device, JoystickController *joystick, + IFormSource *fs_src, TextDest *txt_dest) { if (*cur_formspec == 0) { *cur_formspec = new GUIFormSpecMenu(device, joystick, - guiroot, -1, &g_menumgr, invmgr, gamedef, tsrc, - fs_src, txt_dest, client); + guiroot, -1, &g_menumgr, client, client->getTextureSource(), + fs_src, txt_dest); (*cur_formspec)->doPause = false; /* @@ -1214,105 +931,6 @@ static inline void create_formspec_menu(GUIFormSpecMenu **cur_formspec, #define SIZE_TAG "size[11,5.5,true]" // Fixed size on desktop #endif -static void show_deathscreen(GUIFormSpecMenu **cur_formspec, - InventoryManager *invmgr, IGameDef *gamedef, - IWritableTextureSource *tsrc, IrrlichtDevice *device, - JoystickController *joystick, Client *client) -{ - std::string formspec = - std::string(FORMSPEC_VERSION_STRING) + - SIZE_TAG - "bgcolor[#320000b4;true]" - "label[4.85,1.35;" + gettext("You died.") + "]" - "button_exit[4,3;3,0.5;btn_respawn;" + gettext("Respawn") + "]" - ; - - /* Create menu */ - /* Note: FormspecFormSource and LocalFormspecHandler - * are deleted by guiFormSpecMenu */ - FormspecFormSource *fs_src = new FormspecFormSource(formspec); - LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_DEATH_SCREEN", client); - - create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, - joystick, fs_src, txt_dst, NULL); -} - -/******************************************************************************/ -static void show_pause_menu(GUIFormSpecMenu **cur_formspec, - InventoryManager *invmgr, IGameDef *gamedef, - IWritableTextureSource *tsrc, IrrlichtDevice *device, - JoystickController *joystick, bool singleplayermode) -{ -#ifdef __ANDROID__ - std::string control_text = strgettext("Default Controls:\n" - "No menu visible:\n" - "- single tap: button activate\n" - "- double tap: place/use\n" - "- slide finger: look around\n" - "Menu/Inventory visible:\n" - "- double tap (outside):\n" - " -->close\n" - "- touch stack, touch slot:\n" - " --> move stack\n" - "- touch&drag, tap 2nd finger\n" - " --> place single item to slot\n" - ); -#else - std::string control_text = strgettext("Default Controls:\n" - "- WASD: move\n" - "- Space: jump/climb\n" - "- Shift: sneak/go down\n" - "- Q: drop item\n" - "- I: inventory\n" - "- Mouse: turn/look\n" - "- Mouse left: dig/punch\n" - "- Mouse right: place/use\n" - "- Mouse wheel: select item\n" - "- T: chat\n" - ); -#endif - - float ypos = singleplayermode ? 0.5 : 0.1; - std::ostringstream os; - - os << FORMSPEC_VERSION_STRING << SIZE_TAG - << "button_exit[4," << (ypos++) << ";3,0.5;btn_continue;" - << strgettext("Continue") << "]"; - - if (!singleplayermode) { - os << "button_exit[4," << (ypos++) << ";3,0.5;btn_change_password;" - << strgettext("Change Password") << "]"; - } - -#ifndef __ANDROID__ - os << "button_exit[4," << (ypos++) << ";3,0.5;btn_sound;" - << strgettext("Sound Volume") << "]"; - os << "button_exit[4," << (ypos++) << ";3,0.5;btn_key_config;" - << strgettext("Change Keys") << "]"; -#endif - os << "button_exit[4," << (ypos++) << ";3,0.5;btn_exit_menu;" - << strgettext("Exit to Menu") << "]"; - os << "button_exit[4," << (ypos++) << ";3,0.5;btn_exit_os;" - << strgettext("Exit to OS") << "]" - << "textarea[7.5,0.25;3.9,6.25;;" << control_text << ";]" - << "textarea[0.4,0.25;3.5,6;;" << PROJECT_NAME_C "\n" - << g_build_info << "\n" - << "path_user = " << wrap_rows(porting::path_user, 20) - << "\n;]"; - - /* Create menu */ - /* Note: FormspecFormSource and LocalFormspecHandler * - * are deleted by guiFormSpecMenu */ - FormspecFormSource *fs_src = new FormspecFormSource(os.str()); - LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_PAUSE_MENU"); - - create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, - joystick, fs_src, txt_dst, NULL); - std::string con("btn_continue"); - (*cur_formspec)->setFocus(con); - (*cur_formspec)->doPause = true; -} - /******************************************************************************/ static void updateChat(Client &client, f32 dtime, bool show_debug, const v2u32 &screensize, bool show_chat, u32 show_profiler, @@ -1421,11 +1039,17 @@ void KeyCache::populate() key[KeyType::INVENTORY] = getKeySetting("keymap_inventory"); key[KeyType::CHAT] = getKeySetting("keymap_chat"); key[KeyType::CMD] = getKeySetting("keymap_cmd"); + key[KeyType::CMD_LOCAL] = getKeySetting("keymap_cmd_local"); key[KeyType::CONSOLE] = getKeySetting("keymap_console"); key[KeyType::MINIMAP] = getKeySetting("keymap_minimap"); key[KeyType::FREEMOVE] = getKeySetting("keymap_freemove"); key[KeyType::FASTMOVE] = getKeySetting("keymap_fastmove"); key[KeyType::NOCLIP] = getKeySetting("keymap_noclip"); + key[KeyType::HOTBAR_PREV] = getKeySetting("keymap_hotbar_previous"); + key[KeyType::HOTBAR_NEXT] = getKeySetting("keymap_hotbar_next"); + key[KeyType::MUTE] = getKeySetting("keymap_mute"); + key[KeyType::INC_VOLUME] = getKeySetting("keymap_increase_volume"); + key[KeyType::DEC_VOLUME] = getKeySetting("keymap_decrease_volume"); key[KeyType::CINEMATIC] = getKeySetting("keymap_cinematic"); key[KeyType::SCREENSHOT] = getKeySetting("keymap_screenshot"); key[KeyType::TOGGLE_HUD] = getKeySetting("keymap_toggle_hud"); @@ -1497,6 +1121,7 @@ struct GameRunData { PointedThing pointed_old; bool digging; bool ldown_for_dig; + bool dig_instantly; bool left_punch; bool update_wielded_item_trigger; bool reset_jump_timer; @@ -1530,28 +1155,10 @@ struct Jitter { struct RunStats { u32 drawtime; - u32 beginscenetime; - u32 endscenetime; Jitter dtime_jitter, busy_time_jitter; }; -/* Flags that can, or may, change during main game loop - */ -struct VolatileRunFlags { - bool invert_mouse; - bool show_chat; - bool show_hud; - bool show_minimap; - bool force_fog_off; - bool show_debug; - bool show_profiler_graph; - bool disable_camera_update; - bool first_loop_after_window_activation; - bool camera_offset_changed; -}; - - /**************************************************************************** THE GAME ****************************************************************************/ @@ -1594,7 +1201,7 @@ protected: u16 port, const SubgameSpec &gamespec); bool initSound(); - bool createSingleplayerServer(const std::string map_dir, + bool createSingleplayerServer(const std::string &map_dir, const SubgameSpec &gamespec, u16 port, std::string *address); // Client creation @@ -1610,79 +1217,75 @@ protected: // Main loop - void updateInteractTimers(GameRunData *runData, f32 dtime); + void updateInteractTimers(f32 dtime); bool checkConnection(); bool handleCallbacks(); void processQueues(); - void updateProfilers(const GameRunData &runData, const RunStats &stats, - const FpsControl &draw_times, f32 dtime); - void addProfilerGraphs(const RunStats &stats, const FpsControl &draw_times, - f32 dtime); + void updateProfilers(const RunStats &stats, const FpsControl &draw_times, f32 dtime); + void addProfilerGraphs(const RunStats &stats, const FpsControl &draw_times, f32 dtime); void updateStats(RunStats *stats, const FpsControl &draw_times, f32 dtime); // Input related - void processUserInput(VolatileRunFlags *flags, GameRunData *runData, - f32 dtime); - void processKeyInput(VolatileRunFlags *flags, - float *statustext_time, - float *jump_timer, - bool *reset_jump_timer, - u32 *profiler_current_page, - u32 profiler_max_page); + void processUserInput(f32 dtime); + void processKeyInput(); void processItemSelection(u16 *new_playeritem); void dropSelectedItem(); void openInventory(); - void openConsole(float height, const wchar_t *line=NULL); - void toggleFreeMove(float *statustext_time); - void toggleFreeMoveAlt(float *statustext_time, float *jump_timer); - void toggleFast(float *statustext_time); - void toggleNoClip(float *statustext_time); - void toggleCinematic(float *statustext_time); - void toggleAutorun(float *statustext_time); - - void toggleChat(float *statustext_time, bool *flag); - void toggleHud(float *statustext_time, bool *flag); - void toggleMinimap(float *statustext_time, bool *flag, bool show_hud, - bool shift_pressed); - void toggleFog(float *statustext_time, bool *flag); - void toggleDebug(float *statustext_time, bool *show_debug, - bool *show_profiler_graph, bool *show_wireframe); - void toggleUpdateCamera(float *statustext_time, bool *flag); - void toggleProfiler(float *statustext_time, u32 *profiler_current_page, - u32 profiler_max_page); - - void increaseViewRange(float *statustext_time); - void decreaseViewRange(float *statustext_time); - void toggleFullViewRange(float *statustext_time); - - void updateCameraDirection(CameraOrientation *cam, VolatileRunFlags *flags, - float dtime); - void updateCameraOrientation(CameraOrientation *cam, - const VolatileRunFlags &flags, float dtime); + void openConsole(float scale, const wchar_t *line=NULL); + void toggleFreeMove(); + void toggleFreeMoveAlt(); + void toggleFast(); + void toggleNoClip(); + void toggleCinematic(); + void toggleAutorun(); + + void toggleChat(); + void toggleHud(); + void toggleMinimap(bool shift_pressed); + void toggleFog(); + void toggleDebug(); + void toggleUpdateCamera(); + void toggleProfiler(); + + void increaseViewRange(); + void decreaseViewRange(); + void toggleFullViewRange(); + + void updateCameraDirection(CameraOrientation *cam, float dtime); + void updateCameraOrientation(CameraOrientation *cam, float dtime); void updatePlayerControl(const CameraOrientation &cam); void step(f32 *dtime); - void processClientEvents(CameraOrientation *cam, float *damage_flash); - void updateCamera(VolatileRunFlags *flags, u32 busy_time, f32 dtime, - float time_from_last_punch); + void processClientEvents(CameraOrientation *cam); + void updateCamera(u32 busy_time, f32 dtime); void updateSound(f32 dtime); - void processPlayerInteraction(GameRunData *runData, f32 dtime, bool show_hud, - bool show_debug); - void handlePointingAtNothing(GameRunData *runData, const ItemStack &playerItem); - void handlePointingAtNode(GameRunData *runData, - const PointedThing &pointed, const ItemDefinition &playeritem_def, + void processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug); + /*! + * Returns the object or node the player is pointing at. + * Also updates the selected thing in the Hud. + * + * @param[in] shootline the shootline, starting from + * the camera position. This also gives the maximal distance + * of the search. + * @param[in] liquids_pointable if false, liquids are ignored + * @param[in] look_for_object if false, objects are ignored + * @param[in] camera_offset offset of the camera + * @param[out] selected_object the selected object or + * NULL if not found + */ + PointedThing updatePointedThing( + const core::line3d<f32> &shootline, bool liquids_pointable, + bool look_for_object, const v3s16 &camera_offset); + void handlePointingAtNothing(const ItemStack &playerItem); + void handlePointingAtNode(const PointedThing &pointed, const ItemDefinition &playeritem_def, const ToolCapabilities &playeritem_toolcap, f32 dtime); - void handlePointingAtObject(GameRunData *runData, - const PointedThing &pointed, const ItemStack &playeritem, + void handlePointingAtObject(const PointedThing &pointed, const ItemStack &playeritem, const v3f &player_position, bool show_debug); - void handleDigging(GameRunData *runData, const PointedThing &pointed, - const v3s16 &nodepos, const ToolCapabilities &playeritem_toolcap, - f32 dtime); - void updateFrame(ProfilerGraph *graph, RunStats *stats, GameRunData *runData, - f32 dtime, const VolatileRunFlags &flags, const CameraOrientation &cam); - void updateGui(float *statustext_time, const RunStats &stats, - const GameRunData& runData, f32 dtime, const VolatileRunFlags &flags, + void handleDigging(const PointedThing &pointed, const v3s16 &nodepos, + const ToolCapabilities &playeritem_toolcap, f32 dtime); + void updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, const CameraOrientation &cam); + void updateGui(const RunStats &stats, f32 dtime, const CameraOrientation &cam); void updateProfilerGraphs(ProfilerGraph *graph); // Misc @@ -1734,6 +1337,8 @@ protected: #endif private: + void showPauseMenu(); + InputHandler *input; Client *client; @@ -1767,10 +1372,10 @@ private: Sky *sky; // Free using ->Drop() Inventory *local_inventory; Hud *hud; - Mapper *mapper; + Minimap *mapper; GameRunData runData; - VolatileRunFlags flags; + GameUIFlags flags; /* 'cache' This class does take ownership/responsibily for cleaning up etc of any of @@ -1782,7 +1387,6 @@ private: bool *kill; std::string *error_message; bool *reconnect_requested; - IGameDef *gamedef; // Convenience (same as *client) scene::ISceneNode *skybox; bool random_input; @@ -1803,7 +1407,7 @@ private: gui::IGUIStaticText *guitext_profiler; // Profiler text std::wstring infotext; - std::wstring statustext; + std::wstring m_statustext; KeyCache keycache; @@ -1828,6 +1432,10 @@ private: f32 m_cache_cam_smoothing; f32 m_cache_fog_start; + bool m_invert_mouse; + bool m_first_loop_after_window_activation; + bool m_camera_offset_changed; + #ifdef __ANDROID__ bool m_cache_hold_aux1; bool m_android_chat_open; @@ -1856,7 +1464,10 @@ Game::Game() : sky(NULL), local_inventory(NULL), hud(NULL), - mapper(NULL) + mapper(NULL), + m_invert_mouse(false), + m_first_loop_after_window_activation(false), + m_camera_offset_changed(false) { g_settings->registerChangedCallback("doubletap_jump", &settingChangedCallback, this); @@ -1987,8 +1598,8 @@ bool Game::startup(bool *kill, flags.show_chat = true; flags.show_hud = true; flags.show_debug = g_settings->getBool("show_debug"); - flags.invert_mouse = g_settings->getBool("invert_mouse"); - flags.first_loop_after_window_activation = true; + m_invert_mouse = g_settings->getBool("invert_mouse"); + m_first_loop_after_window_activation = true; if (!init(map_dir, address, port, gamespec)) return false; @@ -2022,17 +1633,33 @@ void Game::run() && client->checkPrivilege("fast"); #endif + irr::core::dimension2d<u32> previous_screen_size(g_settings->getU16("screenW"), + g_settings->getU16("screenH")); + while (device->run() && !(*kill || g_gamecallback->shutdown_requested || (server && server->getShutdownRequested()))) { + const irr::core::dimension2d<u32> ¤t_screen_size = + device->getVideoDriver()->getScreenSize(); + // Verify if window size has changed and save it if it's the case + // Ensure evaluating settings->getBool after verifying screensize + // First condition is cheaper + if (previous_screen_size != current_screen_size && + current_screen_size != irr::core::dimension2d<u32>(0,0) && + g_settings->getBool("autosave_screensize")) { + g_settings->setU16("screenW", current_screen_size.Width); + g_settings->setU16("screenH", current_screen_size.Height); + previous_screen_size = current_screen_size; + } + /* Must be called immediately after a device->run() call because it * uses device->getTimer()->getTime() */ limitFps(&draw_times, &dtime); updateStats(&stats, draw_times, dtime); - updateInteractTimers(&runData, dtime); + updateInteractTimers(dtime); if (!checkConnection()) break; @@ -2044,36 +1671,38 @@ void Game::run() infotext = L""; hud->resizeHotbar(); - updateProfilers(runData, stats, draw_times, dtime); - processUserInput(&flags, &runData, dtime); + updateProfilers(stats, draw_times, dtime); + processUserInput(dtime); // Update camera before player movement to avoid camera lag of one frame - updateCameraDirection(&cam_view_target, &flags, dtime); + updateCameraDirection(&cam_view_target, dtime); cam_view.camera_yaw += (cam_view_target.camera_yaw - cam_view.camera_yaw) * m_cache_cam_smoothing; cam_view.camera_pitch += (cam_view_target.camera_pitch - cam_view.camera_pitch) * m_cache_cam_smoothing; updatePlayerControl(cam_view); step(&dtime); - processClientEvents(&cam_view_target, &runData.damage_flash); - updateCamera(&flags, draw_times.busy_time, dtime, - runData.time_from_last_punch); + processClientEvents(&cam_view_target); + updateCamera(draw_times.busy_time, dtime); updateSound(dtime); - processPlayerInteraction(&runData, dtime, flags.show_hud, - flags.show_debug); - updateFrame(&graph, &stats, &runData, dtime, flags, cam_view); + processPlayerInteraction(dtime, flags.show_hud, flags.show_debug); + updateFrame(&graph, &stats, dtime, cam_view); updateProfilerGraphs(&graph); // Update if minimap has been disabled by the server - flags.show_minimap &= !client->isMinimapDisabledByServer(); + flags.show_minimap &= client->shouldShowMinimap(); } } void Game::shutdown() { +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 8 if (g_settings->get("3d_mode") == "pageflip") { driver->setRenderTarget(irr::video::ERT_STEREO_BOTH_BUFFERS); } +#endif + if (current_formspec) + current_formspec->quitMenu(); showOverlayMessage(wgettext("Shutting down..."), 0, 0, false); @@ -2125,9 +1754,10 @@ bool Game::init( u16 port, const SubgameSpec &gamespec) { + texture_src = createTextureSource(device); + showOverlayMessage(wgettext("Loading..."), 0, 0); - texture_src = createTextureSource(device); shader_src = createShaderSource(device); itemdef_manager = createItemDefManager(); @@ -2179,7 +1809,7 @@ bool Game::initSound() return true; } -bool Game::createSingleplayerServer(const std::string map_dir, +bool Game::createSingleplayerServer(const std::string &map_dir, const SubgameSpec &gamespec, u16 port, std::string *address) { showOverlayMessage(wgettext("Creating server..."), 0, 5); @@ -2208,7 +1838,7 @@ bool Game::createSingleplayerServer(const std::string map_dir, } server = new Server(map_dir, gamespec, simple_singleplayer_mode, - bind_addr.isIPv6()); + bind_addr.isIPv6(), false); server->start(bind_addr); @@ -2257,7 +1887,7 @@ bool Game::createClient(const std::string &playername, /* Camera */ - camera = new Camera(smgr, *draw_control, gamedef); + camera = new Camera(smgr, *draw_control, client); if (!camera || !camera->successfullyCreated(*error_message)) return false; client->setCamera(camera); @@ -2314,7 +1944,7 @@ bool Game::createClient(const std::string &playername, player->hurt_tilt_timer = 0; player->hurt_tilt_strength = 0; - hud = new Hud(driver, smgr, guienv, gamedef, player, local_inventory); + hud = new Hud(driver, smgr, guienv, client, player, local_inventory); if (!hud) { *error_message = "Memory error: could not create HUD"; @@ -2322,8 +1952,9 @@ bool Game::createClient(const std::string &playername, return false; } - mapper = client->getMapper(); - mapper->setMinimapMode(MINIMAP_MODE_OFF); + mapper = client->getMinimap(); + if (mapper) + mapper->setMinimapMode(MINIMAP_MODE_OFF); return true; } @@ -2436,21 +2067,19 @@ bool Game::connectToServer(const std::string &playername, } client = new Client(device, - playername.c_str(), password, + playername.c_str(), password, *address, *draw_control, texture_src, shader_src, itemdef_manager, nodedef_manager, sound, eventmgr, - connect_address.isIPv6()); + connect_address.isIPv6(), &flags); if (!client) return false; - gamedef = client; // Client acts as our GameDef - infostream << "Connecting to server at "; connect_address.print(&infostream); infostream << std::endl; - client->connect(connect_address, *address, + client->connect(connect_address, simple_singleplayer_mode || local_server_mode); /* @@ -2466,6 +2095,8 @@ bool Game::connectToServer(const std::string &playername, fps_control.last_time = device->getTimer()->getTime(); + client->initMods(); + while (device->run()) { limitFps(&fps_control, &dtime); @@ -2583,17 +2214,21 @@ bool Game::getServerContent(bool *aborted) if (!client->itemdefReceived()) { const wchar_t *text = wgettext("Item definitions..."); progress = 25; - draw_load_screen(text, device, guienv, dtime, progress); + draw_load_screen(text, device, guienv, texture_src, + dtime, progress); delete[] text; } else if (!client->nodedefReceived()) { const wchar_t *text = wgettext("Node definitions..."); progress = 30; - draw_load_screen(text, device, guienv, dtime, progress); + draw_load_screen(text, device, guienv, texture_src, + dtime, progress); delete[] text; } else { std::stringstream message; - message.precision(3); - message << gettext("Media..."); + std::fixed(message); + message.precision(0); + message << gettext("Media...") << " " << (client->mediaReceiveProgress()*100) << "%"; + message.precision(2); if ((USE_CURL == 0) || (!g_settings->getBool("enable_remote_media_server"))) { @@ -2610,7 +2245,7 @@ bool Game::getServerContent(bool *aborted) progress = 30 + client->mediaReceiveProgress() * 35 + 0.5; draw_load_screen(utf8_to_wide(message.str()), device, - guienv, dtime, progress); + guienv, texture_src, dtime, progress); } } @@ -2624,15 +2259,15 @@ bool Game::getServerContent(bool *aborted) ****************************************************************************/ /****************************************************************************/ -inline void Game::updateInteractTimers(GameRunData *runData, f32 dtime) +inline void Game::updateInteractTimers(f32 dtime) { - if (runData->nodig_delay_timer >= 0) - runData->nodig_delay_timer -= dtime; + if (runData.nodig_delay_timer >= 0) + runData.nodig_delay_timer -= dtime; - if (runData->object_hit_delay_timer >= 0) - runData->object_hit_delay_timer -= dtime; + if (runData.object_hit_delay_timer >= 0) + runData.object_hit_delay_timer -= dtime; - runData->time_from_last_punch += dtime; + runData.time_from_last_punch += dtime; } @@ -2691,13 +2326,12 @@ inline bool Game::handleCallbacks() void Game::processQueues() { texture_src->processQueue(); - itemdef_manager->processQueue(gamedef); + itemdef_manager->processQueue(client); shader_src->processQueue(); } -void Game::updateProfilers(const GameRunData &runData, const RunStats &stats, - const FpsControl &draw_times, f32 dtime) +void Game::updateProfilers(const RunStats &stats, const FpsControl &draw_times, f32 dtime) { float profiler_print_interval = g_settings->getFloat("profiler_print_interval"); @@ -2795,13 +2429,10 @@ void Game::updateStats(RunStats *stats, const FpsControl &draw_times, Input handling ****************************************************************************/ -void Game::processUserInput(VolatileRunFlags *flags, - GameRunData *runData, f32 dtime) +void Game::processUserInput(f32 dtime) { // Reset input if window not active or some menu is active - if (device->isWindowActive() == false - || noMenuActive() == false - || guienv->hasFocus(gui_chat_console)) { + if (!device->isWindowActive() || isMenuActive() || guienv->hasFocus(gui_chat_console)) { input->clear(); #ifdef HAVE_TOUCHSCREENGUI g_touchscreengui->hide(); @@ -2830,84 +2461,90 @@ void Game::processUserInput(VolatileRunFlags *flags, #endif // Increase timer for double tap of "keymap_jump" - if (m_cache_doubletap_jump && runData->jump_timer <= 0.2) - runData->jump_timer += dtime; - - processKeyInput( - flags, - &runData->statustext_time, - &runData->jump_timer, - &runData->reset_jump_timer, - &runData->profiler_current_page, - runData->profiler_max_page); - - processItemSelection(&runData->new_playeritem); + if (m_cache_doubletap_jump && runData.jump_timer <= 0.2f) + runData.jump_timer += dtime; + + processKeyInput(); + processItemSelection(&runData.new_playeritem); } -void Game::processKeyInput(VolatileRunFlags *flags, - float *statustext_time, - float *jump_timer, - bool *reset_jump_timer, - u32 *profiler_current_page, - u32 profiler_max_page) +void Game::processKeyInput() { - - //TimeTaker tt("process kybd input", NULL, PRECISION_NANO); - if (wasKeyDown(KeyType::DROP)) { dropSelectedItem(); } else if (wasKeyDown(KeyType::AUTORUN)) { - toggleAutorun(statustext_time); + toggleAutorun(); } else if (wasKeyDown(KeyType::INVENTORY)) { openInventory(); } else if (wasKeyDown(KeyType::ESC) || input->wasKeyDown(CancelKey)) { if (!gui_chat_console->isOpenInhibited()) { - show_pause_menu(¤t_formspec, client, gamedef, - texture_src, device, &input->joystick, - simple_singleplayer_mode); + showPauseMenu(); } } else if (wasKeyDown(KeyType::CHAT)) { openConsole(0.2, L""); } else if (wasKeyDown(KeyType::CMD)) { openConsole(0.2, L"/"); + } else if (wasKeyDown(KeyType::CMD_LOCAL)) { + openConsole(0.2, L"."); } else if (wasKeyDown(KeyType::CONSOLE)) { - openConsole(1); + openConsole(core::clamp(g_settings->getFloat("console_height"), 0.1f, 1.0f)); } else if (wasKeyDown(KeyType::FREEMOVE)) { - toggleFreeMove(statustext_time); + toggleFreeMove(); } else if (wasKeyDown(KeyType::JUMP)) { - toggleFreeMoveAlt(statustext_time, jump_timer); - *reset_jump_timer = true; + toggleFreeMoveAlt(); } else if (wasKeyDown(KeyType::FASTMOVE)) { - toggleFast(statustext_time); + toggleFast(); } else if (wasKeyDown(KeyType::NOCLIP)) { - toggleNoClip(statustext_time); + toggleNoClip(); + } else if (wasKeyDown(KeyType::MUTE)) { + float volume = g_settings->getFloat("sound_volume"); + if (volume < 0.001f) { + g_settings->setFloat("sound_volume", 1.0f); + m_statustext = narrow_to_wide(gettext("Volume changed to 100%")); + } else { + g_settings->setFloat("sound_volume", 0.0f); + m_statustext = narrow_to_wide(gettext("Volume changed to 0%")); + } + runData.statustext_time = 0; + } else if (wasKeyDown(KeyType::INC_VOLUME)) { + float new_volume = rangelim(g_settings->getFloat("sound_volume") + 0.1f, 0.0f, 1.0f); + char buf[100]; + g_settings->setFloat("sound_volume", new_volume); + snprintf(buf, sizeof(buf), gettext("Volume changed to %d%%"), myround(new_volume * 100)); + m_statustext = narrow_to_wide(buf); + runData.statustext_time = 0; + } else if (wasKeyDown(KeyType::DEC_VOLUME)) { + float new_volume = rangelim(g_settings->getFloat("sound_volume") - 0.1f, 0.0f, 1.0f); + char buf[100]; + g_settings->setFloat("sound_volume", new_volume); + snprintf(buf, sizeof(buf), gettext("Volume changed to %d%%"), myround(new_volume * 100)); + m_statustext = narrow_to_wide(buf); + runData.statustext_time = 0; } else if (wasKeyDown(KeyType::CINEMATIC)) { - toggleCinematic(statustext_time); + toggleCinematic(); } else if (wasKeyDown(KeyType::SCREENSHOT)) { client->makeScreenshot(device); } else if (wasKeyDown(KeyType::TOGGLE_HUD)) { - toggleHud(statustext_time, &flags->show_hud); + toggleHud(); } else if (wasKeyDown(KeyType::MINIMAP)) { - toggleMinimap(statustext_time, &flags->show_minimap, flags->show_hud, - isKeyDown(KeyType::SNEAK)); + toggleMinimap(isKeyDown(KeyType::SNEAK)); } else if (wasKeyDown(KeyType::TOGGLE_CHAT)) { - toggleChat(statustext_time, &flags->show_chat); + toggleChat(); } else if (wasKeyDown(KeyType::TOGGLE_FORCE_FOG_OFF)) { - toggleFog(statustext_time, &flags->force_fog_off); + toggleFog(); } else if (wasKeyDown(KeyType::TOGGLE_UPDATE_CAMERA)) { - toggleUpdateCamera(statustext_time, &flags->disable_camera_update); + toggleUpdateCamera(); } else if (wasKeyDown(KeyType::TOGGLE_DEBUG)) { - toggleDebug(statustext_time, &flags->show_debug, &flags->show_profiler_graph, - &draw_control->show_wireframe); + toggleDebug(); } else if (wasKeyDown(KeyType::TOGGLE_PROFILER)) { - toggleProfiler(statustext_time, profiler_current_page, profiler_max_page); + toggleProfiler(); } else if (wasKeyDown(KeyType::INCREASE_VIEWING_RANGE)) { - increaseViewRange(statustext_time); + increaseViewRange(); } else if (wasKeyDown(KeyType::DECREASE_VIEWING_RANGE)) { - decreaseViewRange(statustext_time); + decreaseViewRange(); } else if (wasKeyDown(KeyType::RANGESELECT)) { - toggleFullViewRange(statustext_time); + toggleFullViewRange(); } else if (wasKeyDown(KeyType::QUICKTUNE_NEXT)) { quicktune->next(); } else if (wasKeyDown(KeyType::QUICKTUNE_PREV)) { @@ -2926,17 +2563,14 @@ void Game::processKeyInput(VolatileRunFlags *flags, debug_stacks_print(); } - if (!isKeyDown(KeyType::JUMP) && *reset_jump_timer) { - *reset_jump_timer = false; - *jump_timer = 0.0; + if (!isKeyDown(KeyType::JUMP) && runData.reset_jump_timer) { + runData.reset_jump_timer = false; + runData.jump_timer = 0.0f; } - //tt.stop(); - if (quicktune->hasMessage()) { - std::string msg = quicktune->getMessage(); - statustext = utf8_to_wide(msg); - *statustext_time = 0; + m_statustext = utf8_to_wide(quicktune->getMessage()); + runData.statustext_time = 0.0f; } } @@ -2954,11 +2588,13 @@ void Game::processItemSelection(u16 *new_playeritem) s32 dir = wheel; - if (input->joystick.wasKeyDown(KeyType::SCROLL_DOWN)) { + if (input->joystick.wasKeyDown(KeyType::SCROLL_DOWN) || + wasKeyDown(KeyType::HOTBAR_NEXT)) { dir = -1; } - if (input->joystick.wasKeyDown(KeyType::SCROLL_UP)) { + if (input->joystick.wasKeyDown(KeyType::SCROLL_UP) || + wasKeyDown(KeyType::HOTBAR_PREV)) { dir = 1; } @@ -3015,8 +2651,7 @@ void Game::openInventory() PlayerInventoryFormSource *fs_src = new PlayerInventoryFormSource(client); TextDest *txt_dst = new TextDestPlayerInventory(client); - create_formspec_menu(¤t_formspec, client, gamedef, texture_src, - device, &input->joystick, fs_src, txt_dst, client); + create_formspec_menu(¤t_formspec, client, device, &input->joystick, fs_src, txt_dst); cur_formname = ""; InventoryLocation inventoryloc; @@ -3025,15 +2660,17 @@ void Game::openInventory() } -void Game::openConsole(float height, const wchar_t *line) +void Game::openConsole(float scale, const wchar_t *line) { + assert(scale > 0.0f && scale <= 1.0f); + #ifdef __ANDROID__ porting::showInputDialog(gettext("ok"), "", "", 2); m_android_chat_open = true; #else if (gui_chat_console->isOpenInhibited()) return; - gui_chat_console->openConsole(height); + gui_chat_console->openConsole(scale); if (line) { gui_chat_console->setCloseOnEnter(true); gui_chat_console->replaceAndAddToHistory(line); @@ -3052,40 +2689,42 @@ void Game::handleAndroidChatInput() #endif -void Game::toggleFreeMove(float *statustext_time) +void Game::toggleFreeMove() { static const wchar_t *msg[] = { L"free_move disabled", L"free_move enabled" }; bool free_move = !g_settings->getBool("free_move"); g_settings->set("free_move", bool_to_cstr(free_move)); - *statustext_time = 0; - statustext = msg[free_move]; + runData.statustext_time = 0; + m_statustext = msg[free_move]; if (free_move && !client->checkPrivilege("fly")) - statustext += L" (note: no 'fly' privilege)"; + m_statustext += L" (note: no 'fly' privilege)"; } -void Game::toggleFreeMoveAlt(float *statustext_time, float *jump_timer) +void Game::toggleFreeMoveAlt() { - if (m_cache_doubletap_jump && *jump_timer < 0.2f) - toggleFreeMove(statustext_time); + if (m_cache_doubletap_jump && runData.jump_timer < 0.2f) + toggleFreeMove(); + + runData.reset_jump_timer = true; } -void Game::toggleFast(float *statustext_time) +void Game::toggleFast() { static const wchar_t *msg[] = { L"fast_move disabled", L"fast_move enabled" }; bool fast_move = !g_settings->getBool("fast_move"); g_settings->set("fast_move", bool_to_cstr(fast_move)); - *statustext_time = 0; - statustext = msg[fast_move]; + runData.statustext_time = 0; + m_statustext = msg[fast_move]; bool has_fast_privs = client->checkPrivilege("fast"); if (fast_move && !has_fast_privs) - statustext += L" (note: no 'fast' privilege)"; + m_statustext += L" (note: no 'fast' privilege)"; #ifdef __ANDROID__ m_cache_hold_aux1 = fast_move && has_fast_privs; @@ -3093,63 +2732,62 @@ void Game::toggleFast(float *statustext_time) } -void Game::toggleNoClip(float *statustext_time) +void Game::toggleNoClip() { static const wchar_t *msg[] = { L"noclip disabled", L"noclip enabled" }; bool noclip = !g_settings->getBool("noclip"); g_settings->set("noclip", bool_to_cstr(noclip)); - *statustext_time = 0; - statustext = msg[noclip]; + runData.statustext_time = 0; + m_statustext = msg[noclip]; if (noclip && !client->checkPrivilege("noclip")) - statustext += L" (note: no 'noclip' privilege)"; + m_statustext += L" (note: no 'noclip' privilege)"; } -void Game::toggleCinematic(float *statustext_time) +void Game::toggleCinematic() { static const wchar_t *msg[] = { L"cinematic disabled", L"cinematic enabled" }; bool cinematic = !g_settings->getBool("cinematic"); g_settings->set("cinematic", bool_to_cstr(cinematic)); - *statustext_time = 0; - statustext = msg[cinematic]; + runData.statustext_time = 0; + m_statustext = msg[cinematic]; } // Add WoW-style autorun by toggling continuous forward. -void Game::toggleAutorun(float *statustext_time) +void Game::toggleAutorun() { static const wchar_t *msg[] = { L"autorun disabled", L"autorun enabled" }; bool autorun_enabled = !g_settings->getBool("continuous_forward"); g_settings->set("continuous_forward", bool_to_cstr(autorun_enabled)); - *statustext_time = 0; - statustext = msg[autorun_enabled ? 1 : 0]; + runData.statustext_time = 0; + m_statustext = msg[autorun_enabled ? 1 : 0]; } -void Game::toggleChat(float *statustext_time, bool *flag) +void Game::toggleChat() { static const wchar_t *msg[] = { L"Chat hidden", L"Chat shown" }; - *flag = !*flag; - *statustext_time = 0; - statustext = msg[*flag]; + flags.show_chat = !flags.show_chat; + runData.statustext_time = 0; + m_statustext = msg[flags.show_chat]; } -void Game::toggleHud(float *statustext_time, bool *flag) +void Game::toggleHud() { static const wchar_t *msg[] = { L"HUD hidden", L"HUD shown" }; - *flag = !*flag; - *statustext_time = 0; - statustext = msg[*flag]; + flags.show_hud = !flags.show_hud; + runData.statustext_time = 0; + m_statustext = msg[flags.show_hud]; } -void Game::toggleMinimap(float *statustext_time, bool *flag, - bool show_hud, bool shift_pressed) +void Game::toggleMinimap(bool shift_pressed) { - if (!show_hud || !g_settings->getBool("enable_minimap")) + if (!mapper || !flags.show_hud || !g_settings->getBool("enable_minimap")) return; if (shift_pressed) { @@ -3165,151 +2803,150 @@ void Game::toggleMinimap(float *statustext_time, bool *flag, mode = (MinimapMode)((int)mode + 1); } - *flag = true; + flags.show_minimap = true; switch (mode) { case MINIMAP_MODE_SURFACEx1: - statustext = L"Minimap in surface mode, Zoom x1"; + m_statustext = L"Minimap in surface mode, Zoom x1"; break; case MINIMAP_MODE_SURFACEx2: - statustext = L"Minimap in surface mode, Zoom x2"; + m_statustext = L"Minimap in surface mode, Zoom x2"; break; case MINIMAP_MODE_SURFACEx4: - statustext = L"Minimap in surface mode, Zoom x4"; + m_statustext = L"Minimap in surface mode, Zoom x4"; break; case MINIMAP_MODE_RADARx1: - statustext = L"Minimap in radar mode, Zoom x1"; + m_statustext = L"Minimap in radar mode, Zoom x1"; break; case MINIMAP_MODE_RADARx2: - statustext = L"Minimap in radar mode, Zoom x2"; + m_statustext = L"Minimap in radar mode, Zoom x2"; break; case MINIMAP_MODE_RADARx4: - statustext = L"Minimap in radar mode, Zoom x4"; + m_statustext = L"Minimap in radar mode, Zoom x4"; break; default: mode = MINIMAP_MODE_OFF; - *flag = false; - statustext = (hud_flags & HUD_FLAG_MINIMAP_VISIBLE) ? + flags.show_minimap = false; + m_statustext = (hud_flags & HUD_FLAG_MINIMAP_VISIBLE) ? L"Minimap hidden" : L"Minimap disabled by server"; } - *statustext_time = 0; + runData.statustext_time = 0; mapper->setMinimapMode(mode); } -void Game::toggleFog(float *statustext_time, bool *flag) +void Game::toggleFog() { static const wchar_t *msg[] = { L"Fog enabled", L"Fog disabled" }; - *flag = !*flag; - *statustext_time = 0; - statustext = msg[*flag]; + flags.force_fog_off = !flags.force_fog_off; + runData.statustext_time = 0; + m_statustext = msg[flags.force_fog_off]; } -void Game::toggleDebug(float *statustext_time, bool *show_debug, - bool *show_profiler_graph, bool *show_wireframe) +void Game::toggleDebug() { // Initial / 4x toggle: Chat only // 1x toggle: Debug text with chat // 2x toggle: Debug text with profiler graph // 3x toggle: Debug text and wireframe - if (!*show_debug) { - *show_debug = true; - *show_profiler_graph = false; - *show_wireframe = false; - statustext = L"Debug info shown"; - } else if (!*show_profiler_graph && !*show_wireframe) { - *show_profiler_graph = true; - statustext = L"Profiler graph shown"; - } else if (!*show_wireframe && client->checkPrivilege("debug")) { - *show_profiler_graph = false; - *show_wireframe = true; - statustext = L"Wireframe shown"; + if (!flags.show_debug) { + flags.show_debug = true; + flags.show_profiler_graph = false; + draw_control->show_wireframe = false; + m_statustext = L"Debug info shown"; + } else if (!flags.show_profiler_graph && !draw_control->show_wireframe) { + flags.show_profiler_graph = true; + m_statustext = L"Profiler graph shown"; + } else if (!draw_control->show_wireframe && client->checkPrivilege("debug")) { + flags.show_profiler_graph = false; + draw_control->show_wireframe = true; + m_statustext = L"Wireframe shown"; } else { - *show_debug = false; - *show_profiler_graph = false; - *show_wireframe = false; + flags.show_debug = false; + flags.show_profiler_graph = false; + draw_control->show_wireframe = false; if (client->checkPrivilege("debug")) { - statustext = L"Debug info, profiler graph, and wireframe hidden"; + m_statustext = L"Debug info, profiler graph, and wireframe hidden"; } else { - statustext = L"Debug info and profiler graph hidden"; + m_statustext = L"Debug info and profiler graph hidden"; } } - *statustext_time = 0; + runData.statustext_time = 0; } -void Game::toggleUpdateCamera(float *statustext_time, bool *flag) +void Game::toggleUpdateCamera() { static const wchar_t *msg[] = { L"Camera update enabled", L"Camera update disabled" }; - *flag = !*flag; - *statustext_time = 0; - statustext = msg[*flag]; + flags.disable_camera_update = !flags.disable_camera_update; + runData.statustext_time = 0; + m_statustext = msg[flags.disable_camera_update]; } -void Game::toggleProfiler(float *statustext_time, u32 *profiler_current_page, - u32 profiler_max_page) +void Game::toggleProfiler() { - *profiler_current_page = (*profiler_current_page + 1) % (profiler_max_page + 1); + runData.profiler_current_page = + (runData.profiler_current_page + 1) % (runData.profiler_max_page + 1); // FIXME: This updates the profiler with incomplete values - update_profiler_gui(guitext_profiler, g_fontengine, *profiler_current_page, - profiler_max_page, driver->getScreenSize().Height); + update_profiler_gui(guitext_profiler, g_fontengine, runData.profiler_current_page, + runData.profiler_max_page, driver->getScreenSize().Height); - if (*profiler_current_page != 0) { + if (runData.profiler_current_page != 0) { std::wstringstream sstr; - sstr << "Profiler shown (page " << *profiler_current_page - << " of " << profiler_max_page << ")"; - statustext = sstr.str(); + sstr << "Profiler shown (page " << runData.profiler_current_page + << " of " << runData.profiler_max_page << ")"; + m_statustext = sstr.str(); } else { - statustext = L"Profiler hidden"; + m_statustext = L"Profiler hidden"; } - *statustext_time = 0; + runData.statustext_time = 0; } -void Game::increaseViewRange(float *statustext_time) +void Game::increaseViewRange() { s16 range = g_settings->getS16("viewing_range"); s16 range_new = range + 10; if (range_new > 4000) { range_new = 4000; - statustext = utf8_to_wide("Viewing range is at maximum: " + m_statustext = utf8_to_wide("Viewing range is at maximum: " + itos(range_new)); } else { - statustext = utf8_to_wide("Viewing range changed to " + m_statustext = utf8_to_wide("Viewing range changed to " + itos(range_new)); } g_settings->set("viewing_range", itos(range_new)); - *statustext_time = 0; + runData.statustext_time = 0; } -void Game::decreaseViewRange(float *statustext_time) +void Game::decreaseViewRange() { s16 range = g_settings->getS16("viewing_range"); s16 range_new = range - 10; if (range_new < 20) { range_new = 20; - statustext = utf8_to_wide("Viewing range is at minimum: " + m_statustext = utf8_to_wide("Viewing range is at minimum: " + itos(range_new)); } else { - statustext = utf8_to_wide("Viewing range changed to " + m_statustext = utf8_to_wide("Viewing range changed to " + itos(range_new)); } g_settings->set("viewing_range", itos(range_new)); - *statustext_time = 0; + runData.statustext_time = 0; } -void Game::toggleFullViewRange(float *statustext_time) +void Game::toggleFullViewRange() { static const wchar_t *msg[] = { L"Disabled full viewing range", @@ -3318,15 +2955,15 @@ void Game::toggleFullViewRange(float *statustext_time) draw_control->range_all = !draw_control->range_all; infostream << msg[draw_control->range_all] << std::endl; - statustext = msg[draw_control->range_all]; - *statustext_time = 0; + m_statustext = msg[draw_control->range_all]; + runData.statustext_time = 0; } -void Game::updateCameraDirection(CameraOrientation *cam, - VolatileRunFlags *flags, float dtime) +void Game::updateCameraDirection(CameraOrientation *cam, float dtime) { - if ((device->isWindowActive() && noMenuActive()) || random_input) { + if ((device->isWindowActive() && device->isWindowFocused() + && !isMenuActive()) || random_input) { #ifndef __ANDROID__ if (!random_input) { @@ -3336,10 +2973,10 @@ void Game::updateCameraDirection(CameraOrientation *cam, } #endif - if (flags->first_loop_after_window_activation) - flags->first_loop_after_window_activation = false; + if (m_first_loop_after_window_activation) + m_first_loop_after_window_activation = false; else - updateCameraOrientation(cam, *flags, dtime); + updateCameraOrientation(cam, dtime); input->setMousePos((driver->getScreenSize().Width / 2), (driver->getScreenSize().Height / 2)); @@ -3347,18 +2984,16 @@ void Game::updateCameraDirection(CameraOrientation *cam, #ifndef ANDROID // Mac OSX gets upset if this is set every frame - if (device->getCursorControl()->isVisible() == false) + if (!device->getCursorControl()->isVisible()) device->getCursorControl()->setVisible(true); #endif - if (!flags->first_loop_after_window_activation) - flags->first_loop_after_window_activation = true; + m_first_loop_after_window_activation = true; } } -void Game::updateCameraOrientation(CameraOrientation *cam, - const VolatileRunFlags &flags, float dtime) +void Game::updateCameraOrientation(CameraOrientation *cam, float dtime) { #ifdef HAVE_TOUCHSCREENGUI if (g_touchscreengui) { @@ -3370,8 +3005,7 @@ void Game::updateCameraOrientation(CameraOrientation *cam, s32 dx = input->getMousePos().X - (driver->getScreenSize().Width / 2); s32 dy = input->getMousePos().Y - (driver->getScreenSize().Height / 2); - if (flags.invert_mouse - || camera->getCameraMode() == CAMERA_MODE_THIRD_FRONT) { + if (m_invert_mouse || camera->getCameraMode() == CAMERA_MODE_THIRD_FRONT) { dy = -dy; } @@ -3384,10 +3018,8 @@ void Game::updateCameraOrientation(CameraOrientation *cam, if (m_cache_enable_joysticks) { f32 c = m_cache_joystick_frustum_sensitivity * (1.f / 32767.f) * dtime; - cam->camera_yaw -= input->joystick.getAxisWithoutDead(JA_FRUSTUM_HORIZONTAL) * - c; - cam->camera_pitch += input->joystick.getAxisWithoutDead(JA_FRUSTUM_VERTICAL) * - c; + cam->camera_yaw -= input->joystick.getAxisWithoutDead(JA_FRUSTUM_HORIZONTAL) * c; + cam->camera_pitch += input->joystick.getAxisWithoutDead(JA_FRUSTUM_VERTICAL) * c; } cam->camera_pitch = rangelim(cam->camera_pitch, -89.5, 89.5); @@ -3470,43 +3102,47 @@ inline void Game::step(f32 *dtime) } -void Game::processClientEvents(CameraOrientation *cam, float *damage_flash) +void Game::processClientEvents(CameraOrientation *cam) { - ClientEvent event = client->getClientEvent(); - LocalPlayer *player = client->getEnv().getLocalPlayer(); - for ( ; event.type != CE_NONE; event = client->getClientEvent()) { + while (client->hasClientEvents()) { + ClientEvent event = client->getClientEvent(); - if (event.type == CE_PLAYER_DAMAGE && - client->getHP() != 0) { - //u16 damage = event.player_damage.amount; - //infostream<<"Player damage: "<<damage<<std::endl; + switch (event.type) { + case CE_PLAYER_DAMAGE: + if (client->getHP() == 0) + break; + if (client->moddingEnabled()) { + client->getScript()->on_damage_taken(event.player_damage.amount); + } - *damage_flash += 95.0 + 3.2 * event.player_damage.amount; - *damage_flash = MYMIN(*damage_flash, 127.0); + runData.damage_flash += 95.0 + 3.2 * event.player_damage.amount; + runData.damage_flash = MYMIN(runData.damage_flash, 127.0); player->hurt_tilt_timer = 1.5; player->hurt_tilt_strength = rangelim(event.player_damage.amount / 4, 1.0, 4.0); - MtEvent *e = new SimpleTriggerEvent("PlayerDamage"); - gamedef->event()->put(e); - } else if (event.type == CE_PLAYER_FORCE_MOVE) { + client->event()->put(new SimpleTriggerEvent("PlayerDamage")); + break; + + case CE_PLAYER_FORCE_MOVE: cam->camera_yaw = event.player_force_move.yaw; cam->camera_pitch = event.player_force_move.pitch; - } else if (event.type == CE_DEATHSCREEN) { - show_deathscreen(¤t_formspec, client, gamedef, texture_src, - device, &input->joystick, client); + break; - chat_backend->addMessage(L"", L"You died."); + case CE_DEATHSCREEN: + // This should be enabled for death formspec in builtin + client->getScript()->on_death(); /* Handle visualization */ - *damage_flash = 0; + runData.damage_flash = 0; player->hurt_tilt_timer = 0; player->hurt_tilt_strength = 0; + break; - } else if (event.type == CE_SHOW_FORMSPEC) { + case CE_SHOW_FORMSPEC: if (*(event.show_formspec.formspec) == "") { if (current_formspec && ( *(event.show_formspec.formname) == "" || *(event.show_formspec.formname) == cur_formname) ){ current_formspec->quitMenu(); @@ -3517,54 +3153,69 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash) TextDestPlayerInventory *txt_dst = new TextDestPlayerInventory(client, *(event.show_formspec.formname)); - create_formspec_menu(¤t_formspec, client, gamedef, - texture_src, device, &input->joystick, - fs_src, txt_dst, client); + create_formspec_menu(¤t_formspec, client, device, &input->joystick, + fs_src, txt_dst); cur_formname = *(event.show_formspec.formname); } - delete(event.show_formspec.formspec); - delete(event.show_formspec.formname); - } else if ((event.type == CE_SPAWN_PARTICLE) || - (event.type == CE_ADD_PARTICLESPAWNER) || - (event.type == CE_DELETE_PARTICLESPAWNER)) { - client->getParticleManager()->handleParticleEvent(&event, gamedef, - smgr, player); - } else if (event.type == CE_HUDADD) { - u32 id = event.hudadd.id; - - LocalPlayer *player = client->getEnv().getLocalPlayer(); - HudElement *e = player->getHud(id); - - if (e != NULL) { - delete event.hudadd.pos; - delete event.hudadd.name; - delete event.hudadd.scale; - delete event.hudadd.text; - delete event.hudadd.align; - delete event.hudadd.offset; - delete event.hudadd.world_pos; - delete event.hudadd.size; - continue; + delete event.show_formspec.formspec; + delete event.show_formspec.formname; + break; + + case CE_SHOW_LOCAL_FORMSPEC: + { + FormspecFormSource *fs_src = new FormspecFormSource(*event.show_formspec.formspec); + LocalFormspecHandler *txt_dst = new LocalFormspecHandler(*event.show_formspec.formname, client); + create_formspec_menu(¤t_formspec, client, device, &input->joystick, + fs_src, txt_dst); } + delete event.show_formspec.formspec; + delete event.show_formspec.formname; + break; - e = new HudElement; - e->type = (HudElementType)event.hudadd.type; - e->pos = *event.hudadd.pos; - e->name = *event.hudadd.name; - e->scale = *event.hudadd.scale; - e->text = *event.hudadd.text; - e->number = event.hudadd.number; - e->item = event.hudadd.item; - e->dir = event.hudadd.dir; - e->align = *event.hudadd.align; - e->offset = *event.hudadd.offset; - e->world_pos = *event.hudadd.world_pos; - e->size = *event.hudadd.size; - - u32 new_id = player->addHud(e); - //if this isn't true our huds aren't consistent - sanity_check(new_id == id); + case CE_SPAWN_PARTICLE: + case CE_ADD_PARTICLESPAWNER: + case CE_DELETE_PARTICLESPAWNER: + client->getParticleManager()->handleParticleEvent(&event, client, + smgr, player); + break; + + case CE_HUDADD: + { + u32 id = event.hudadd.id; + + HudElement *e = player->getHud(id); + + if (e != NULL) { + delete event.hudadd.pos; + delete event.hudadd.name; + delete event.hudadd.scale; + delete event.hudadd.text; + delete event.hudadd.align; + delete event.hudadd.offset; + delete event.hudadd.world_pos; + delete event.hudadd.size; + continue; + } + + e = new HudElement; + e->type = (HudElementType)event.hudadd.type; + e->pos = *event.hudadd.pos; + e->name = *event.hudadd.name; + e->scale = *event.hudadd.scale; + e->text = *event.hudadd.text; + e->number = event.hudadd.number; + e->item = event.hudadd.item; + e->dir = event.hudadd.dir; + e->align = *event.hudadd.align; + e->offset = *event.hudadd.offset; + e->world_pos = *event.hudadd.world_pos; + e->size = *event.hudadd.size; + + u32 new_id = player->addHud(e); + //if this isn't true our huds aren't consistent + sanity_check(new_id == id); + } delete event.hudadd.pos; delete event.hudadd.name; @@ -3574,75 +3225,87 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash) delete event.hudadd.offset; delete event.hudadd.world_pos; delete event.hudadd.size; - } else if (event.type == CE_HUDRM) { - HudElement *e = player->removeHud(event.hudrm.id); - - if (e != NULL) - delete(e); - } else if (event.type == CE_HUDCHANGE) { - u32 id = event.hudchange.id; - HudElement *e = player->getHud(id); - - if (e == NULL) { - delete event.hudchange.v3fdata; - delete event.hudchange.v2fdata; - delete event.hudchange.sdata; - delete event.hudchange.v2s32data; - continue; + break; + + case CE_HUDRM: + { + HudElement *e = player->removeHud(event.hudrm.id); + + if (e != NULL) + delete e; } + break; - switch (event.hudchange.stat) { - case HUD_STAT_POS: - e->pos = *event.hudchange.v2fdata; - break; + case CE_HUDCHANGE: + { + u32 id = event.hudchange.id; + HudElement *e = player->getHud(id); - case HUD_STAT_NAME: - e->name = *event.hudchange.sdata; - break; + if (e == NULL) { + delete event.hudchange.v3fdata; + delete event.hudchange.v2fdata; + delete event.hudchange.sdata; + delete event.hudchange.v2s32data; + continue; + } - case HUD_STAT_SCALE: - e->scale = *event.hudchange.v2fdata; - break; + switch (event.hudchange.stat) { + case HUD_STAT_POS: + e->pos = *event.hudchange.v2fdata; + break; - case HUD_STAT_TEXT: - e->text = *event.hudchange.sdata; - break; + case HUD_STAT_NAME: + e->name = *event.hudchange.sdata; + break; - case HUD_STAT_NUMBER: - e->number = event.hudchange.data; - break; + case HUD_STAT_SCALE: + e->scale = *event.hudchange.v2fdata; + break; - case HUD_STAT_ITEM: - e->item = event.hudchange.data; - break; + case HUD_STAT_TEXT: + e->text = *event.hudchange.sdata; + break; - case HUD_STAT_DIR: - e->dir = event.hudchange.data; - break; + case HUD_STAT_NUMBER: + e->number = event.hudchange.data; + break; - case HUD_STAT_ALIGN: - e->align = *event.hudchange.v2fdata; - break; + case HUD_STAT_ITEM: + e->item = event.hudchange.data; + break; - case HUD_STAT_OFFSET: - e->offset = *event.hudchange.v2fdata; - break; + case HUD_STAT_DIR: + e->dir = event.hudchange.data; + break; - case HUD_STAT_WORLD_POS: - e->world_pos = *event.hudchange.v3fdata; - break; + case HUD_STAT_ALIGN: + e->align = *event.hudchange.v2fdata; + break; - case HUD_STAT_SIZE: - e->size = *event.hudchange.v2s32data; - break; + case HUD_STAT_OFFSET: + e->offset = *event.hudchange.v2fdata; + break; + + case HUD_STAT_WORLD_POS: + e->world_pos = *event.hudchange.v3fdata; + break; + + case HUD_STAT_SIZE: + e->size = *event.hudchange.v2s32data; + break; + } } delete event.hudchange.v3fdata; delete event.hudchange.v2fdata; delete event.hudchange.sdata; delete event.hudchange.v2s32data; - } else if (event.type == CE_SET_SKY) { + break; + + case CE_SET_SKY: sky->setVisible(false); + // Whether clouds are visible in front of a custom skybox + sky->setCloudsEnabled(event.set_sky.clouds); if (skybox) { skybox->remove(); @@ -3652,6 +3315,7 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash) // Handle according to type if (*event.set_sky.type == "regular") { sky->setVisible(true); + sky->setCloudsEnabled(true); } else if (*event.set_sky.type == "skybox" && event.set_sky.params->size() == 6) { sky->setFallbackBgColor(*event.set_sky.bgcolor); @@ -3675,17 +3339,37 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash) delete event.set_sky.bgcolor; delete event.set_sky.type; delete event.set_sky.params; - } else if (event.type == CE_OVERRIDE_DAY_NIGHT_RATIO) { - bool enable = event.override_day_night_ratio.do_override; - u32 value = event.override_day_night_ratio.ratio_f * 1000; - client->getEnv().setDayNightRatioOverride(enable, value); + break; + + case CE_OVERRIDE_DAY_NIGHT_RATIO: + client->getEnv().setDayNightRatioOverride( + event.override_day_night_ratio.do_override, + event.override_day_night_ratio.ratio_f * 1000); + break; + + case CE_CLOUD_PARAMS: + if (clouds) { + clouds->setDensity(event.cloud_params.density); + clouds->setColorBright(video::SColor(event.cloud_params.color_bright)); + clouds->setColorAmbient(video::SColor(event.cloud_params.color_ambient)); + clouds->setHeight(event.cloud_params.height); + clouds->setThickness(event.cloud_params.thickness); + clouds->setSpeed(v2f( + event.cloud_params.speed_x, + event.cloud_params.speed_y)); + } + break; + + default: + // unknown or unhandled type + break; + } } } -void Game::updateCamera(VolatileRunFlags *flags, u32 busy_time, - f32 dtime, float time_from_last_punch) +void Game::updateCamera(u32 busy_time, f32 dtime) { LocalPlayer *player = client->getEnv().getLocalPlayer(); @@ -3702,6 +3386,7 @@ void Game::updateCamera(VolatileRunFlags *flags, u32 busy_time, if (mlist && client->getPlayerItem() < mlist->getSize()) playeritem = mlist->getItem(client->getPlayerItem()); } + if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand InventoryList *hlist = local_inventory->getList("hand"); if (hlist) @@ -3728,7 +3413,7 @@ void Game::updateCamera(VolatileRunFlags *flags, u32 busy_time, } float full_punch_interval = playeritem_toolcap.full_punch_interval; - float tool_reload_ratio = time_from_last_punch / full_punch_interval; + float tool_reload_ratio = runData.time_from_last_punch / full_punch_interval; tool_reload_ratio = MYMIN(tool_reload_ratio, 1.0); camera->update(player, dtime, busy_time / 1000.0f, tool_reload_ratio, @@ -3740,13 +3425,13 @@ void Game::updateCamera(VolatileRunFlags *flags, u32 busy_time, f32 camera_fov = camera->getFovMax(); v3s16 camera_offset = camera->getOffset(); - flags->camera_offset_changed = (camera_offset != old_camera_offset); + m_camera_offset_changed = (camera_offset != old_camera_offset); - if (!flags->disable_camera_update) { + if (!flags.disable_camera_update) { client->getEnv().getClientMap().updateCamera(camera_position, camera_direction, camera_fov, camera_offset); - if (flags->camera_offset_changed) { + if (m_camera_offset_changed) { client->updateCameraOffset(camera_offset); client->getEnv().updateCameraOffset(camera_offset); @@ -3765,22 +3450,32 @@ void Game::updateSound(f32 dtime) v3f(0, 0, 0), // velocity camera->getDirection(), camera->getCameraNode()->getUpVector()); - sound->setListenerGain(g_settings->getFloat("sound_volume")); + // Check if volume is in the proper range, else fix it. + float old_volume = g_settings->getFloat("sound_volume"); + float new_volume = rangelim(old_volume, 0.0f, 1.0f); + sound->setListenerGain(new_volume); - // Update sound maker - soundmaker->step(dtime); + if (old_volume != new_volume) { + g_settings->setFloat("sound_volume", new_volume); + } LocalPlayer *player = client->getEnv().getLocalPlayer(); + // Tell the sound maker whether to make footstep sounds + soundmaker->makes_footstep_sound = player->makes_footstep_sound; + + // Update sound maker + if (player->makes_footstep_sound) + soundmaker->step(dtime); + ClientMap &map = client->getEnv().getClientMap(); - MapNode n = map.getNodeNoEx(player->getStandingNodePos()); + MapNode n = map.getNodeNoEx(player->getFootstepNodePos()); soundmaker->m_player_step_sound = nodedef_manager->get(n).sound_footstep; } -void Game::processPlayerInteraction(GameRunData *runData, - f32 dtime, bool show_hud, bool show_debug) +void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) { LocalPlayer *player = client->getEnv().getLocalPlayer(); @@ -3792,13 +3487,11 @@ void Game::processPlayerInteraction(GameRunData *runData, playeritem = mlist->getItem(client->getPlayerItem()); } - if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand - InventoryList *hlist = local_inventory->getList("hand"); - if (hlist) - playeritem = hlist->getItem(0); - } const ItemDefinition &playeritem_def = playeritem.getDefinition(itemdef_manager); + InventoryList *hlist = local_inventory->getList("hand"); + const ItemDefinition &hand_def = + hlist ? hlist->getItem(0).getDefinition(itemdef_manager) : itemdef_manager->get(""); v3f player_position = player->getPosition(); v3f camera_position = camera->getPosition(); @@ -3811,7 +3504,7 @@ void Game::processPlayerInteraction(GameRunData *runData, */ f32 d = playeritem_def.range; // max. distance - f32 d_hand = itemdef_manager->get("").range; + f32 d_hand = hand_def.range; if (d < 0 && d_hand >= 0) d = d_hand; @@ -3821,14 +3514,11 @@ void Game::processPlayerInteraction(GameRunData *runData, core::line3d<f32> shootline; if (camera->getCameraMode() != CAMERA_MODE_THIRD_FRONT) { - shootline = core::line3d<f32>(camera_position, - camera_position + camera_direction * BS * (d + 1)); - + camera_position + camera_direction * BS * d); } else { // prevent player pointing anything in front-view - if (camera->getCameraMode() == CAMERA_MODE_THIRD_FRONT) - shootline = core::line3d<f32>(0, 0, 0, 0, 0, 0); + shootline = core::line3d<f32>(camera_position,camera_position); } #ifdef HAVE_TOUCHSCREENGUI @@ -3841,17 +3531,12 @@ void Game::processPlayerInteraction(GameRunData *runData, #endif - PointedThing pointed = getPointedThing( - // input - client, hud, player_position, camera_direction, - camera_position, shootline, d, + PointedThing pointed = updatePointedThing(shootline, playeritem_def.liquids_pointable, - !runData->ldown_for_dig, - camera_offset, - // output - runData->selected_object); + !runData.ldown_for_dig, + camera_offset); - if (pointed != runData->pointed_old) { + if (pointed != runData.pointed_old) { infostream << "Pointing at " << pointed.dump() << std::endl; hud->updateSelectionMesh(camera_offset); } @@ -3861,67 +3546,73 @@ void Game::processPlayerInteraction(GameRunData *runData, - releasing left mouse button - pointing away from node */ - if (runData->digging) { + if (runData.digging) { if (getLeftReleased()) { infostream << "Left button released" << " (stopped digging)" << std::endl; - runData->digging = false; - } else if (pointed != runData->pointed_old) { + runData.digging = false; + } else if (pointed != runData.pointed_old) { if (pointed.type == POINTEDTHING_NODE - && runData->pointed_old.type == POINTEDTHING_NODE + && runData.pointed_old.type == POINTEDTHING_NODE && pointed.node_undersurface - == runData->pointed_old.node_undersurface) { + == runData.pointed_old.node_undersurface) { // Still pointing to the same node, but a different face. // Don't reset. } else { infostream << "Pointing away from node" << " (stopped digging)" << std::endl; - runData->digging = false; + runData.digging = false; hud->updateSelectionMesh(camera_offset); } } - if (!runData->digging) { - client->interact(1, runData->pointed_old); + if (!runData.digging) { + client->interact(1, runData.pointed_old); client->setCrack(-1, v3s16(0, 0, 0)); - runData->dig_time = 0.0; + runData.dig_time = 0.0; } + } else if (runData.dig_instantly && getLeftReleased()) { + // Remove e.g. torches faster when clicking instead of holding LMB + runData.nodig_delay_timer = 0; + runData.dig_instantly = false; } - if (!runData->digging && runData->ldown_for_dig && !isLeftPressed()) { - runData->ldown_for_dig = false; + if (!runData.digging && runData.ldown_for_dig && !isLeftPressed()) { + runData.ldown_for_dig = false; } - runData->left_punch = false; + runData.left_punch = false; soundmaker->m_player_leftpunch_sound.name = ""; if (isRightPressed()) - runData->repeat_rightclick_timer += dtime; + runData.repeat_rightclick_timer += dtime; else - runData->repeat_rightclick_timer = 0; + runData.repeat_rightclick_timer = 0; if (playeritem_def.usable && isLeftPressed()) { - if (getLeftClicked()) + if (getLeftClicked() && (!client->moddingEnabled() + || !client->getScript()->on_item_use(playeritem, pointed))) client->interact(4, pointed); } else if (pointed.type == POINTEDTHING_NODE) { ToolCapabilities playeritem_toolcap = playeritem.getToolCapabilities(itemdef_manager); - handlePointingAtNode(runData, pointed, playeritem_def, - playeritem_toolcap, dtime); + if (playeritem.name.empty()) { + playeritem_toolcap = *hand_def.tool_capabilities; + } + handlePointingAtNode(pointed, playeritem_def, playeritem_toolcap, dtime); } else if (pointed.type == POINTEDTHING_OBJECT) { - handlePointingAtObject(runData, pointed, playeritem, - player_position, show_debug); + handlePointingAtObject(pointed, playeritem, player_position, show_debug); } else if (isLeftPressed()) { // When button is held down in air, show continuous animation - runData->left_punch = true; + runData.left_punch = true; } else if (getRightClicked()) { - handlePointingAtNothing(runData, playeritem); + handlePointingAtNothing(playeritem); } - runData->pointed_old = pointed; + runData.pointed_old = pointed; - if (runData->left_punch || getLeftClicked()) + if (runData.left_punch || getLeftClicked()) camera->setDigging(0); // left click animation input->resetLeftClicked(); @@ -3938,7 +3629,104 @@ void Game::processPlayerInteraction(GameRunData *runData, } -void Game::handlePointingAtNothing(GameRunData *runData, const ItemStack &playerItem) +PointedThing Game::updatePointedThing( + const core::line3d<f32> &shootline, + bool liquids_pointable, + bool look_for_object, + const v3s16 &camera_offset) +{ + std::vector<aabb3f> *selectionboxes = hud->getSelectionBoxes(); + selectionboxes->clear(); + hud->setSelectedFaceNormal(v3f(0.0, 0.0, 0.0)); + static const bool show_entity_selectionbox = g_settings->getBool( + "show_entity_selectionbox"); + + ClientMap &map = client->getEnv().getClientMap(); + INodeDefManager *nodedef=client->getNodeDefManager(); + + runData.selected_object = NULL; + + PointedThing result=client->getEnv().getPointedThing( + shootline, liquids_pointable, look_for_object); + if (result.type == POINTEDTHING_OBJECT) { + runData.selected_object = client->getEnv().getActiveObject(result.object_id); + if (show_entity_selectionbox && runData.selected_object->doShowSelectionBox()) { + aabb3f *selection_box = runData.selected_object->getSelectionBox(); + + // Box should exist because object was + // returned in the first place + + assert(selection_box); + + v3f pos = runData.selected_object->getPosition(); + selectionboxes->push_back(aabb3f( + selection_box->MinEdge, selection_box->MaxEdge)); + selectionboxes->push_back( + aabb3f(selection_box->MinEdge, selection_box->MaxEdge)); + hud->setSelectionPos(pos, camera_offset); + } + } else if (result.type == POINTEDTHING_NODE) { + // Update selection boxes + MapNode n = map.getNodeNoEx(result.node_undersurface); + std::vector<aabb3f> boxes; + n.getSelectionBoxes(nodedef, &boxes, + n.getNeighbors(result.node_undersurface, &map)); + + f32 d = 0.002 * BS; + for (std::vector<aabb3f>::const_iterator i = boxes.begin(); + i != boxes.end(); ++i) { + aabb3f box = *i; + box.MinEdge -= v3f(d, d, d); + box.MaxEdge += v3f(d, d, d); + selectionboxes->push_back(box); + } + hud->setSelectionPos(intToFloat(result.node_undersurface, BS), + camera_offset); + hud->setSelectedFaceNormal(v3f( + result.intersection_normal.X, + result.intersection_normal.Y, + result.intersection_normal.Z)); + } + + // Update selection mesh light level and vertex colors + if (selectionboxes->size() > 0) { + v3f pf = hud->getSelectionPos(); + v3s16 p = floatToInt(pf, BS); + + // Get selection mesh light level + MapNode n = map.getNodeNoEx(p); + u16 node_light = getInteriorLight(n, -1, nodedef); + u16 light_level = node_light; + + for (u8 i = 0; i < 6; i++) { + n = map.getNodeNoEx(p + g_6dirs[i]); + node_light = getInteriorLight(n, -1, nodedef); + if (node_light > light_level) + light_level = node_light; + } + + u32 daynight_ratio = client->getEnv().getDayNightRatio(); + video::SColor c; + final_color_blend(&c, light_level, daynight_ratio); + + // Modify final color a bit with time + u32 timer = porting::getTimeMs() % 5000; + float timerf = (float) (irr::core::PI * ((timer / 2500.0) - 0.5)); + float sin_r = 0.08 * sin(timerf); + float sin_g = 0.08 * sin(timerf + irr::core::PI * 0.5); + float sin_b = 0.08 * sin(timerf + irr::core::PI); + c.setRed(core::clamp(core::round32(c.getRed() * (0.8 + sin_r)), 0, 255)); + c.setGreen(core::clamp(core::round32(c.getGreen() * (0.8 + sin_g)), 0, 255)); + c.setBlue(core::clamp(core::round32(c.getBlue() * (0.8 + sin_b)), 0, 255)); + + // Set mesh final color + hud->setSelectionMeshColor(c); + } + return result; +} + + +void Game::handlePointingAtNothing(const ItemStack &playerItem) { infostream << "Right Clicked in Air" << std::endl; PointedThing fauxPointed; @@ -3947,8 +3735,7 @@ void Game::handlePointingAtNothing(GameRunData *runData, const ItemStack &player } -void Game::handlePointingAtNode(GameRunData *runData, - const PointedThing &pointed, const ItemDefinition &playeritem_def, +void Game::handlePointingAtNode(const PointedThing &pointed, const ItemDefinition &playeritem_def, const ToolCapabilities &playeritem_toolcap, f32 dtime) { v3s16 nodepos = pointed.node_undersurface; @@ -3959,6 +3746,13 @@ void Game::handlePointingAtNode(GameRunData *runData, */ ClientMap &map = client->getEnv().getClientMap(); + + if (runData.nodig_delay_timer <= 0.0 && isLeftPressed() + && client->checkPrivilege("interact")) { + handleDigging(pointed, nodepos, playeritem_toolcap, dtime); + } + + // This should be done after digging handling NodeMetadata *meta = map.getNodeMetadata(nodepos); if (meta) { @@ -3972,15 +3766,10 @@ void Game::handlePointingAtNode(GameRunData *runData, } } - if (runData->nodig_delay_timer <= 0.0 && isLeftPressed() - && client->checkPrivilege("interact")) { - handleDigging(runData, pointed, nodepos, playeritem_toolcap, dtime); - } - if ((getRightClicked() || - runData->repeat_rightclick_timer >= m_repeat_right_click_time) && + runData.repeat_rightclick_timer >= m_repeat_right_click_time) && client->checkPrivilege("interact")) { - runData->repeat_rightclick_timer = 0; + runData.repeat_rightclick_timer = 0; infostream << "Ground right-clicked" << std::endl; if (meta && meta->getString("formspec") != "" && !random_input @@ -3994,8 +3783,8 @@ void Game::handlePointingAtNode(GameRunData *runData, &client->getEnv().getClientMap(), nodepos); TextDest *txt_dst = new TextDestNodeMetadata(nodepos, client); - create_formspec_menu(¤t_formspec, client, gamedef, - texture_src, device, &input->joystick, fs_src, txt_dst, client); + create_formspec_menu(¤t_formspec, client, + device, &input->joystick, fs_src, txt_dst); cur_formname = ""; current_formspec->setFormSpec(meta->getString("formspec"), inventoryloc); @@ -4016,6 +3805,9 @@ void Game::handlePointingAtNode(GameRunData *runData, // Read the sound soundmaker->m_player_rightpunch_sound = playeritem_def.sound_place; + + if (client->moddingEnabled()) + client->getScript()->on_placenode(pointed, playeritem_def); } else { soundmaker->m_player_rightpunch_sound = SimpleSoundSpec(); @@ -4033,31 +3825,28 @@ void Game::handlePointingAtNode(GameRunData *runData, } -void Game::handlePointingAtObject(GameRunData *runData, - const PointedThing &pointed, - const ItemStack &playeritem, - const v3f &player_position, - bool show_debug) +void Game::handlePointingAtObject(const PointedThing &pointed, const ItemStack &playeritem, + const v3f &player_position, bool show_debug) { infotext = unescape_enriched( - utf8_to_wide(runData->selected_object->infoText())); + utf8_to_wide(runData.selected_object->infoText())); if (show_debug) { if (infotext != L"") { infotext += L"\n"; } infotext += unescape_enriched(utf8_to_wide( - runData->selected_object->debugInfoText())); + runData.selected_object->debugInfoText())); } if (isLeftPressed()) { bool do_punch = false; bool do_punch_damage = false; - if (runData->object_hit_delay_timer <= 0.0) { + if (runData.object_hit_delay_timer <= 0.0) { do_punch = true; do_punch_damage = true; - runData->object_hit_delay_timer = object_hit_delay; + runData.object_hit_delay_timer = object_hit_delay; } if (getLeftClicked()) @@ -4065,17 +3854,24 @@ void Game::handlePointingAtObject(GameRunData *runData, if (do_punch) { infostream << "Left-clicked object" << std::endl; - runData->left_punch = true; + runData.left_punch = true; } if (do_punch_damage) { // Report direct punch - v3f objpos = runData->selected_object->getPosition(); + v3f objpos = runData.selected_object->getPosition(); v3f dir = (objpos - player_position).normalize(); + ItemStack item = playeritem; + if (playeritem.name.empty()) { + InventoryList *hlist = local_inventory->getList("hand"); + if (hlist) { + item = hlist->getItem(0); + } + } - bool disable_send = runData->selected_object->directReportPunch( - dir, &playeritem, runData->time_from_last_punch); - runData->time_from_last_punch = 0; + bool disable_send = runData.selected_object->directReportPunch( + dir, &item, runData.time_from_last_punch); + runData.time_from_last_punch = 0; if (!disable_send) client->interact(0, pointed); @@ -4087,17 +3883,9 @@ void Game::handlePointingAtObject(GameRunData *runData, } -void Game::handleDigging(GameRunData *runData, - const PointedThing &pointed, const v3s16 &nodepos, +void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos, const ToolCapabilities &playeritem_toolcap, f32 dtime) { - if (!runData->digging) { - infostream << "Started digging" << std::endl; - client->interact(0, pointed); - runData->digging = true; - runData->ldown_for_dig = true; - } - LocalPlayer *player = client->getEnv().getLocalPlayer(); ClientMap &map = client->getEnv().getClientMap(); MapNode n = client->getEnv().getClientMap().getNodeNoEx(nodepos); @@ -4110,34 +3898,46 @@ void Game::handleDigging(GameRunData *runData, // If can't dig, try hand if (!params.diggable) { - const ItemDefinition &hand = itemdef_manager->get(""); + InventoryList *hlist = local_inventory->getList("hand"); + const ItemDefinition &hand = + hlist ? hlist->getItem(0).getDefinition(itemdef_manager) : itemdef_manager->get(""); const ToolCapabilities *tp = hand.tool_capabilities; if (tp) params = getDigParams(nodedef_manager->get(n).groups, tp); } - if (params.diggable == false) { + if (!params.diggable) { // I guess nobody will wait for this long - runData->dig_time_complete = 10000000.0; + runData.dig_time_complete = 10000000.0; } else { - runData->dig_time_complete = params.time; + runData.dig_time_complete = params.time; if (m_cache_enable_particles) { const ContentFeatures &features = client->getNodeDefManager()->get(n); - client->getParticleManager()->addPunchingParticles(gamedef, smgr, - player, nodepos, features.tiles); + client->getParticleManager()->addPunchingParticles(client, smgr, + player, nodepos, n, features); } } - if (runData->dig_time_complete >= 0.001) { - runData->dig_index = (float)crack_animation_length - * runData->dig_time - / runData->dig_time_complete; + if (!runData.digging) { + infostream << "Started digging" << std::endl; + runData.dig_instantly = runData.dig_time_complete == 0; + if (client->moddingEnabled() && client->getScript()->on_punchnode(nodepos, n)) + return; + client->interact(0, pointed); + runData.digging = true; + runData.ldown_for_dig = true; + } + + if (!runData.dig_instantly) { + runData.dig_index = (float)crack_animation_length + * runData.dig_time + / runData.dig_time_complete; } else { - // This is for torches - runData->dig_index = crack_animation_length; + // This is for e.g. torches + runData.dig_index = crack_animation_length; } SimpleSoundSpec sound_dig = nodedef_manager->get(n).sound_dig; @@ -4156,54 +3956,57 @@ void Game::handleDigging(GameRunData *runData, } // Don't show cracks if not diggable - if (runData->dig_time_complete >= 100000.0) { - } else if (runData->dig_index < crack_animation_length) { + if (runData.dig_time_complete >= 100000.0) { + } else if (runData.dig_index < crack_animation_length) { //TimeTaker timer("client.setTempMod"); //infostream<<"dig_index="<<dig_index<<std::endl; - client->setCrack(runData->dig_index, nodepos); + client->setCrack(runData.dig_index, nodepos); } else { infostream << "Digging completed" << std::endl; - client->interact(2, pointed); client->setCrack(-1, v3s16(0, 0, 0)); + + runData.dig_time = 0; + runData.digging = false; + + runData.nodig_delay_timer = + runData.dig_time_complete / (float)crack_animation_length; + + // We don't want a corresponding delay to very time consuming nodes + // and nodes without digging time (e.g. torches) get a fixed delay. + if (runData.nodig_delay_timer > 0.3) + runData.nodig_delay_timer = 0.3; + else if (runData.dig_instantly) + runData.nodig_delay_timer = 0.15; + bool is_valid_position; MapNode wasnode = map.getNodeNoEx(nodepos, &is_valid_position); - if (is_valid_position) + if (is_valid_position) { + if (client->moddingEnabled() && + client->getScript()->on_dignode(nodepos, wasnode)) { + return; + } client->removeNode(nodepos); + } + + client->interact(2, pointed); if (m_cache_enable_particles) { const ContentFeatures &features = client->getNodeDefManager()->get(wasnode); - client->getParticleManager()->addDiggingParticles(gamedef, smgr, - player, nodepos, features.tiles); + client->getParticleManager()->addDiggingParticles(client, smgr, + player, nodepos, wasnode, features); } - runData->dig_time = 0; - runData->digging = false; - - runData->nodig_delay_timer = - runData->dig_time_complete / (float)crack_animation_length; - - // We don't want a corresponding delay to - // very time consuming nodes - if (runData->nodig_delay_timer > 0.3) - runData->nodig_delay_timer = 0.3; - - // We want a slight delay to very little - // time consuming nodes - const float mindelay = 0.15; - - if (runData->nodig_delay_timer < mindelay) - runData->nodig_delay_timer = mindelay; // Send event to trigger sound MtEvent *e = new NodeDugEvent(nodepos, wasnode); - gamedef->event()->put(e); + client->event()->put(e); } - if (runData->dig_time_complete < 100000.0) { - runData->dig_time += dtime; + if (runData.dig_time_complete < 100000.0) { + runData.dig_time += dtime; } else { - runData->dig_time = 0; + runData.dig_time = 0; client->setCrack(-1, nodepos); } @@ -4211,8 +4014,7 @@ void Game::handleDigging(GameRunData *runData, } -void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, - GameRunData *runData, f32 dtime, const VolatileRunFlags &flags, +void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, const CameraOrientation &cam) { LocalPlayer *player = client->getEnv().getLocalPlayer(); @@ -4222,9 +4024,9 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, */ if (draw_control->range_all) { - runData->fog_range = 100000 * BS; + runData.fog_range = 100000 * BS; } else { - runData->fog_range = draw_control->wanted_range * BS; + runData.fog_range = draw_control->wanted_range * BS; } /* @@ -4242,18 +4044,16 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, ScopeProfiler sp(g_profiler, "Detecting background light", SPT_AVG); float old_brightness = sky->getBrightness(); direct_brightness = client->getEnv().getClientMap() - .getBackgroundBrightness(MYMIN(runData->fog_range * 1.2, 60 * BS), + .getBackgroundBrightness(MYMIN(runData.fog_range * 1.2, 60 * BS), daynight_ratio, (int)(old_brightness * 255.5), &sunlight_seen) / 255.0; } - float time_of_day = runData->time_of_day; - float time_of_day_smooth = runData->time_of_day_smooth; - - time_of_day = client->getEnv().getTimeOfDayF(); + float time_of_day_smooth = runData.time_of_day_smooth; + float time_of_day = client->getEnv().getTimeOfDayF(); - const float maxsm = 0.05; - const float todsm = 0.05; + static const float maxsm = 0.05; + static const float todsm = 0.05; if (fabs(time_of_day - time_of_day_smooth) > maxsm && fabs(time_of_day - time_of_day_smooth + 1.0) > maxsm && @@ -4267,8 +4067,8 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, time_of_day_smooth = time_of_day_smooth * (1.0 - todsm) + time_of_day * todsm; - runData->time_of_day = time_of_day; - runData->time_of_day_smooth = time_of_day_smooth; + runData.time_of_day = time_of_day; + runData.time_of_day_smooth = time_of_day_smooth; sky->update(time_of_day_smooth, time_brightness, direct_brightness, sunlight_seen, camera->getCameraMode(), player->getYaw(), @@ -4302,8 +4102,8 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, driver->setFog( sky->getBgColor(), video::EFT_FOG_LINEAR, - runData->fog_range * m_cache_fog_start, - runData->fog_range * 1.0, + runData.fog_range * m_cache_fog_start, + runData.fog_range * 1.0, 0.01, false, // pixel fog true // range fog @@ -4327,24 +4127,24 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, v2u32 screensize = driver->getScreenSize(); updateChat(*client, dtime, flags.show_debug, screensize, - flags.show_chat, runData->profiler_current_page, + flags.show_chat, runData.profiler_current_page, *chat_backend, guitext_chat); /* Inventory */ - if (client->getPlayerItem() != runData->new_playeritem) - client->selectPlayerItem(runData->new_playeritem); + if (client->getPlayerItem() != runData.new_playeritem) + client->selectPlayerItem(runData.new_playeritem); // Update local inventory if it has changed if (client->getLocalInventoryUpdated()) { //infostream<<"Updating local inventory"<<std::endl; client->getLocalInventory(*local_inventory); - runData->update_wielded_item_trigger = true; + runData.update_wielded_item_trigger = true; } - if (runData->update_wielded_item_trigger) { + if (runData.update_wielded_item_trigger) { // Update wielded tool InventoryList *mlist = local_inventory->getList("main"); @@ -4358,25 +4158,25 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, camera->wield(item); } - runData->update_wielded_item_trigger = false; + runData.update_wielded_item_trigger = false; } /* Update block draw list every 200ms or when camera direction has changed much */ - runData->update_draw_list_timer += dtime; + runData.update_draw_list_timer += dtime; v3f camera_direction = camera->getDirection(); - if (runData->update_draw_list_timer >= 0.2 - || runData->update_draw_list_last_cam_dir.getDistanceFrom(camera_direction) > 0.2 - || flags.camera_offset_changed) { - runData->update_draw_list_timer = 0; + if (runData.update_draw_list_timer >= 0.2 + || runData.update_draw_list_last_cam_dir.getDistanceFrom(camera_direction) > 0.2 + || m_camera_offset_changed) { + runData.update_draw_list_timer = 0; client->getEnv().getClientMap().updateDrawList(driver); - runData->update_draw_list_last_cam_dir = camera_direction; + runData.update_draw_list_last_cam_dir = camera_direction; } - updateGui(&runData->statustext_time, *stats, *runData, dtime, flags, cam); + updateGui(*stats, dtime, cam); /* make sure menu is on top @@ -4387,7 +4187,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, if (current_formspec->getReferenceCount() == 1) { current_formspec->drop(); current_formspec = NULL; - } else if (!noMenuActive()) { + } else if (isMenuActive()) { guiroot->bringToFront(current_formspec); } } @@ -4396,16 +4196,12 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, Drawing begins */ - video::SColor skycolor = sky->getSkyColor(); + const video::SColor &skycolor = sky->getSkyColor(); TimeTaker tt_draw("mainloop: draw"); - { - TimeTaker timer("beginScene"); - driver->beginScene(true, true, skycolor); - stats->beginscenetime = timer.stop(true); - } + driver->beginScene(true, true, skycolor); - draw_scene(driver, smgr, *camera, *client, player, *hud, *mapper, + draw_scene(driver, smgr, *camera, *client, player, *hud, mapper, guienv, screensize, skycolor, flags.show_hud, flags.show_minimap); @@ -4418,13 +4214,13 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, /* Damage flash */ - if (runData->damage_flash > 0.0) { - video::SColor color(runData->damage_flash, 180, 0, 0); + if (runData.damage_flash > 0.0) { + video::SColor color(runData.damage_flash, 180, 0, 0); driver->draw2DRectangle(color, core::rect<s32>(0, 0, screensize.X, screensize.Y), NULL); - runData->damage_flash -= 100.0 * dtime; + runData.damage_flash -= 100.0 * dtime; } /* @@ -4440,7 +4236,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, /* Update minimap pos and rotation */ - if (flags.show_minimap && flags.show_hud) { + if (mapper && flags.show_minimap && flags.show_hud) { mapper->setPos(floatToInt(player->getPosition(), BS)); mapper->setAngle(player->getYaw()); } @@ -4448,11 +4244,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, /* End scene */ - { - TimeTaker timer("endScene"); - driver->endScene(); - stats->endscenetime = timer.stop(true); - } + driver->endScene(); stats->drawtime = tt_draw.stop(true); g_profiler->graphAdd("mainloop_draw", stats->drawtime / 1000.0f); @@ -4470,9 +4262,7 @@ inline static const char *yawToDirectionString(int yaw) } -void Game::updateGui(float *statustext_time, const RunStats &stats, - const GameRunData& runData, f32 dtime, const VolatileRunFlags &flags, - const CameraOrientation &cam) +void Game::updateGui(const RunStats &stats, f32 dtime, const CameraOrientation &cam) { v2u32 screensize = driver->getScreenSize(); LocalPlayer *player = client->getEnv().getLocalPlayer(); @@ -4483,7 +4273,6 @@ void Game::updateGui(float *statustext_time, const RunStats &stats, drawtime_avg = drawtime_avg * 0.95 + stats.drawtime * 0.05; u16 fps = 1.0 / stats.dtime_jitter.avg; - //s32 fps = driver->getFPS(); std::ostringstream os(std::ios_base::binary); os << std::fixed @@ -4553,19 +4342,19 @@ void Game::updateGui(float *statustext_time, const RunStats &stats, float statustext_time_max = 1.5; - if (!statustext.empty()) { - *statustext_time += dtime; + if (!m_statustext.empty()) { + runData.statustext_time += dtime; - if (*statustext_time >= statustext_time_max) { - statustext = L""; - *statustext_time = 0; + if (runData.statustext_time >= statustext_time_max) { + m_statustext = L""; + runData.statustext_time = 0; } } - setStaticText(guitext_status, statustext.c_str()); - guitext_status->setVisible(!statustext.empty()); + setStaticText(guitext_status, m_statustext.c_str()); + guitext_status->setVisible(!m_statustext.empty()); - if (!statustext.empty()) { + if (!m_statustext.empty()) { s32 status_width = guitext_status->getTextWidth(); s32 status_height = guitext_status->getTextHeight(); s32 status_y = screensize.Y - 150; @@ -4586,7 +4375,7 @@ void Game::updateGui(float *statustext_time, const RunStats &stats, final_color.setAlpha(0); video::SColor fade_color = initial_color.getInterpolated_quadratic( initial_color, final_color, - pow(*statustext_time / statustext_time_max, 2.0f)); + pow(runData.statustext_time / statustext_time_max, 2.0f)); guitext_status->setOverrideColor(fade_color); guitext_status->enableOverrideColor(true); } @@ -4655,7 +4444,8 @@ inline void Game::limitFps(FpsControl *fps_timings, f32 *dtime) void Game::showOverlayMessage(const wchar_t *msg, float dtime, int percent, bool draw_clouds) { - draw_load_screen(msg, device, guienv, dtime, percent, draw_clouds); + draw_load_screen(msg, device, guienv, texture_src, dtime, percent, + draw_clouds); delete[] msg; } @@ -4719,6 +4509,131 @@ void Game::extendedResourceCleanup() << " (note: irrlicht doesn't support removing renderers)" << std::endl; } +#define GET_KEY_NAME(KEY) gettext(getKeySetting(#KEY).name()) +void Game::showPauseMenu() +{ +#ifdef __ANDROID__ + static const std::string control_text = strgettext("Default Controls:\n" + "No menu visible:\n" + "- single tap: button activate\n" + "- double tap: place/use\n" + "- slide finger: look around\n" + "Menu/Inventory visible:\n" + "- double tap (outside):\n" + " -->close\n" + "- touch stack, touch slot:\n" + " --> move stack\n" + "- touch&drag, tap 2nd finger\n" + " --> place single item to slot\n" + ); +#else + static const std::string control_text_template = strgettext("Controls:\n" + "- %s: move forwards\n" + "- %s: move backwards\n" + "- %s: move left\n" + "- %s: move right\n" + "- %s: jump/climb\n" + "- %s: sneak/go down\n" + "- %s: drop item\n" + "- %s: inventory\n" + "- Mouse: turn/look\n" + "- Mouse left: dig/punch\n" + "- Mouse right: place/use\n" + "- Mouse wheel: select item\n" + "- %s: chat\n" + ); + + char control_text_buf[600]; + + snprintf(control_text_buf, ARRLEN(control_text_buf), control_text_template.c_str(), + GET_KEY_NAME(keymap_forward), + GET_KEY_NAME(keymap_backward), + GET_KEY_NAME(keymap_left), + GET_KEY_NAME(keymap_right), + GET_KEY_NAME(keymap_jump), + GET_KEY_NAME(keymap_sneak), + GET_KEY_NAME(keymap_drop), + GET_KEY_NAME(keymap_inventory), + GET_KEY_NAME(keymap_chat) + ); + + std::string control_text = std::string(control_text_buf); + str_formspec_escape(control_text); +#endif + + float ypos = simple_singleplayer_mode ? 0.7f : 0.1f; + std::ostringstream os; + + os << FORMSPEC_VERSION_STRING << SIZE_TAG + << "button_exit[4," << (ypos++) << ";3,0.5;btn_continue;" + << strgettext("Continue") << "]"; + + if (!simple_singleplayer_mode) { + os << "button_exit[4," << (ypos++) << ";3,0.5;btn_change_password;" + << strgettext("Change Password") << "]"; + } else { + os << "field[4.95,0;5,1.5;;" << strgettext("Game paused") << ";]"; + } + +#ifndef __ANDROID__ + os << "button_exit[4," << (ypos++) << ";3,0.5;btn_sound;" + << strgettext("Sound Volume") << "]"; + os << "button_exit[4," << (ypos++) << ";3,0.5;btn_key_config;" + << strgettext("Change Keys") << "]"; +#endif + os << "button_exit[4," << (ypos++) << ";3,0.5;btn_exit_menu;" + << strgettext("Exit to Menu") << "]"; + os << "button_exit[4," << (ypos++) << ";3,0.5;btn_exit_os;" + << strgettext("Exit to OS") << "]" + << "textarea[7.5,0.25;3.9,6.25;;" << control_text << ";]" + << "textarea[0.4,0.25;3.9,6.25;;" << PROJECT_NAME_C " " VERSION_STRING "\n" + << "\n" + << strgettext("Game info:") << "\n"; + const std::string &address = client->getAddressName(); + static const std::string mode = strgettext("- Mode: "); + if (!simple_singleplayer_mode) { + Address serverAddress = client->getServerAddress(); + if (address != "") { + os << mode << strgettext("Remote server") << "\n" + << strgettext("- Address: ") << address; + } else { + os << mode << strgettext("Hosting server"); + } + os << "\n" << strgettext("- Port: ") << serverAddress.getPort() << "\n"; + } else { + os << mode << strgettext("Singleplayer") << "\n"; + } + if (simple_singleplayer_mode || address == "") { + static const std::string on = strgettext("On"); + static const std::string off = strgettext("Off"); + const std::string &damage = g_settings->getBool("enable_damage") ? on : off; + const std::string &creative = g_settings->getBool("creative_mode") ? on : off; + const std::string &announced = g_settings->getBool("server_announce") ? on : off; + os << strgettext("- Damage: ") << damage << "\n" + << strgettext("- Creative Mode: ") << creative << "\n"; + if (!simple_singleplayer_mode) { + const std::string &pvp = g_settings->getBool("enable_pvp") ? on : off; + os << strgettext("- PvP: ") << pvp << "\n" + << strgettext("- Public: ") << announced << "\n"; + std::string server_name = g_settings->get("server_name"); + str_formspec_escape(server_name); + if (announced == on && server_name != "") + os << strgettext("- Server Name: ") << server_name; + + } + } + os << ";]"; + + /* Create menu */ + /* Note: FormspecFormSource and LocalFormspecHandler * + * are deleted by guiFormSpecMenu */ + FormspecFormSource *fs_src = new FormspecFormSource(os.str()); + LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_PAUSE_MENU"); + + create_formspec_menu(¤t_formspec, client, device, &input->joystick, fs_src, txt_dst); + current_formspec->setFocus("btn_continue"); + current_formspec->doPause = true; +} /****************************************************************************/ /**************************************************************************** diff --git a/src/game.h b/src/game.h index df32e3397..4fb198be8 100644 --- a/src/game.h +++ b/src/game.h @@ -22,127 +22,23 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include <string> -#include "client/keys.h" -#include "client/joystick_controller.h" -#include "keycode.h" -#include <list> -class KeyList : protected std::list<KeyPress> -{ - typedef std::list<KeyPress> super; - typedef super::iterator iterator; - typedef super::const_iterator const_iterator; - - virtual const_iterator find(const KeyPress &key) const - { - const_iterator f(begin()); - const_iterator e(end()); - - while (f != e) { - if (*f == key) - return f; - - ++f; - } - - return e; - } - - virtual iterator find(const KeyPress &key) - { - iterator f(begin()); - iterator e(end()); - - while (f != e) { - if (*f == key) - return f; - - ++f; - } - - return e; - } - -public: - void clear() - { - super::clear(); - } - - void set(const KeyPress &key) - { - if (find(key) == end()) - push_back(key); - } - - void unset(const KeyPress &key) - { - iterator p(find(key)); - - if (p != end()) - erase(p); - } - - void toggle(const KeyPress &key) - { - iterator p(this->find(key)); - - if (p != end()) - erase(p); - else - push_back(key); - } - - bool operator[](const KeyPress &key) const - { - return find(key) != end(); - } -}; +class InputHandler; +class ChatBackend; /* to avoid having to include chat.h */ +struct SubgameSpec; -class InputHandler +// Flags that can, or may, change during main game loop +struct GameUIFlags { -public: - InputHandler() - { - } - virtual ~InputHandler() - { - } - - virtual bool isKeyDown(const KeyPress &keyCode) = 0; - virtual bool wasKeyDown(const KeyPress &keyCode) = 0; - - virtual void listenForKey(const KeyPress &keyCode) {} - virtual void dontListenForKeys() {} - - virtual v2s32 getMousePos() = 0; - virtual void setMousePos(s32 x, s32 y) = 0; - - virtual bool getLeftState() = 0; - virtual bool getRightState() = 0; - - virtual bool getLeftClicked() = 0; - virtual bool getRightClicked() = 0; - virtual void resetLeftClicked() = 0; - virtual void resetRightClicked() = 0; - - virtual bool getLeftReleased() = 0; - virtual bool getRightReleased() = 0; - virtual void resetLeftReleased() = 0; - virtual void resetRightReleased() = 0; - - virtual s32 getMouseWheel() = 0; - - virtual void step(float dtime) {} - - virtual void clear() {} - - JoystickController joystick; + bool show_chat; + bool show_hud; + bool show_minimap; + bool force_fog_off; + bool show_debug; + bool show_profiler_graph; + bool disable_camera_update; }; -class ChatBackend; /* to avoid having to include chat.h */ -struct SubgameSpec; - void the_game(bool *kill, bool random_input, InputHandler *input, @@ -159,4 +55,3 @@ void the_game(bool *kill, bool simple_singleplayer_mode); #endif - diff --git a/src/gamedef.h b/src/gamedef.h index 7e3da4cac..6cd01305f 100644 --- a/src/gamedef.h +++ b/src/gamedef.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define GAMEDEF_HEADER #include <string> +#include <vector> #include "irrlichttypes.h" class IItemDefManager; @@ -33,12 +34,14 @@ class MtEventManager; class IRollbackManager; class EmergeManager; class Camera; +class ModMetadata; namespace irr { namespace scene { class IAnimatedMesh; class ISceneManager; }} +struct ModSpec; /* An interface for fetching game-global definitions like tool and mapnode properties @@ -53,47 +56,29 @@ public: virtual INodeDefManager* getNodeDefManager()=0; virtual ICraftDefManager* getCraftDefManager()=0; - // This is always thread-safe, but referencing the irrlicht texture - // pointers in other threads than main thread will make things explode. - virtual ITextureSource* getTextureSource()=0; - - virtual IShaderSource* getShaderSource()=0; - // Used for keeping track of names/ids of unknown nodes virtual u16 allocateUnknownNodeId(const std::string &name)=0; - // Only usable on the client - virtual ISoundManager* getSoundManager()=0; virtual MtEventManager* getEventManager()=0; - virtual scene::IAnimatedMesh* getMesh(const std::string &filename) - { return NULL; } - virtual scene::ISceneManager* getSceneManager()=0; - - virtual Camera* getCamera() - { return NULL; } - virtual void setCamera(Camera *camera) {} // Only usable on the server, and NOT thread-safe. It is usable from the // environment thread. - virtual IRollbackManager* getRollbackManager(){return NULL;} - - // Only usable on the server. Thread safe if not written while running threads. - virtual EmergeManager *getEmergeManager() { return NULL; } - - // Used on the client - virtual bool checkLocalPrivilege(const std::string &priv) - { return false; } + virtual IRollbackManager* getRollbackManager() { return NULL; } // Shorthands IItemDefManager *idef() { return getItemDefManager(); } INodeDefManager *ndef() { return getNodeDefManager(); } ICraftDefManager *cdef() { return getCraftDefManager(); } - ITextureSource *tsrc() { return getTextureSource(); } - ISoundManager *sound() { return getSoundManager(); } - IShaderSource *shsrc() { return getShaderSource(); } + MtEventManager *event() { return getEventManager(); } - IRollbackManager *rollback() { return getRollbackManager();} - EmergeManager *emerge() { return getEmergeManager(); } + IRollbackManager *rollback() { return getRollbackManager(); } + + virtual const std::vector<ModSpec> &getMods() const = 0; + virtual const ModSpec* getModSpec(const std::string &modname) const = 0; + virtual std::string getWorldPath() const { return ""; } + virtual std::string getModStoragePath() const = 0; + virtual bool registerModStorage(ModMetadata *storage) = 0; + virtual void unregisterModStorage(const std::string &name) = 0; }; #endif diff --git a/src/gameparams.h b/src/gameparams.h index bf9953c39..4afc0fdce 100644 --- a/src/gameparams.h +++ b/src/gameparams.h @@ -24,7 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc., struct SubgameSpec; -struct GameParams { +struct GameParams +{ u16 socket_port; std::string world_path; SubgameSpec game_spec; diff --git a/src/genericobject.cpp b/src/genericobject.cpp index c4660cf44..58f4b997e 100644 --- a/src/genericobject.cpp +++ b/src/genericobject.cpp @@ -68,7 +68,7 @@ std::string gob_cmd_update_position( std::string gob_cmd_set_texture_mod(const std::string &mod) { std::ostringstream os(std::ios::binary); - // command + // command writeU8(os, GENERIC_CMD_SET_TEXTURE_MOD); // parameters os<<serializeString(mod); @@ -95,7 +95,7 @@ std::string gob_cmd_set_sprite( std::string gob_cmd_punched(s16 damage, s16 result_hp) { std::ostringstream os(std::ios::binary); - // command + // command writeU8(os, GENERIC_CMD_PUNCHED); // damage writeS16(os, damage); @@ -118,10 +118,10 @@ std::string gob_cmd_update_armor_groups(const ItemGroupList &armor_groups) } std::string gob_cmd_update_physics_override(float physics_override_speed, float physics_override_jump, - float physics_override_gravity, bool sneak, bool sneak_glitch) + float physics_override_gravity, bool sneak, bool sneak_glitch, bool new_move) { std::ostringstream os(std::ios::binary); - // command + // command writeU8(os, GENERIC_CMD_SET_PHYSICS_OVERRIDE); // parameters writeF1000(os, physics_override_speed); @@ -130,13 +130,14 @@ std::string gob_cmd_update_physics_override(float physics_override_speed, float // these are sent inverted so we get true when the server sends nothing writeU8(os, !sneak); writeU8(os, !sneak_glitch); + writeU8(os, !new_move); return os.str(); } std::string gob_cmd_update_animation(v2f frames, float frame_speed, float frame_blend, bool frame_loop) { std::ostringstream os(std::ios::binary); - // command + // command writeU8(os, GENERIC_CMD_SET_ANIMATION); // parameters writeV2F1000(os, frames); @@ -147,10 +148,11 @@ std::string gob_cmd_update_animation(v2f frames, float frame_speed, float frame_ return os.str(); } -std::string gob_cmd_update_bone_position(std::string bone, v3f position, v3f rotation) +std::string gob_cmd_update_bone_position(const std::string &bone, v3f position, + v3f rotation) { std::ostringstream os(std::ios::binary); - // command + // command writeU8(os, GENERIC_CMD_SET_BONE_POSITION); // parameters os<<serializeString(bone); @@ -159,10 +161,11 @@ std::string gob_cmd_update_bone_position(std::string bone, v3f position, v3f rot return os.str(); } -std::string gob_cmd_update_attachment(int parent_id, std::string bone, v3f position, v3f rotation) +std::string gob_cmd_update_attachment(int parent_id, const std::string &bone, + v3f position, v3f rotation) { std::ostringstream os(std::ios::binary); - // command + // command writeU8(os, GENERIC_CMD_ATTACH_TO); // parameters writeS16(os, parent_id); @@ -183,10 +186,11 @@ std::string gob_cmd_update_nametag_attributes(video::SColor color) return os.str(); } -std::string gob_cmd_update_infant(u16 id, u8 type, std::string client_initialization_data) +std::string gob_cmd_update_infant(u16 id, u8 type, + const std::string &client_initialization_data) { std::ostringstream os(std::ios::binary); - // command + // command writeU8(os, GENERIC_CMD_SPAWN_INFANT); // parameters writeU16(os, id); diff --git a/src/genericobject.h b/src/genericobject.h index 48e71db75..d82650f0e 100644 --- a/src/genericobject.h +++ b/src/genericobject.h @@ -68,17 +68,21 @@ std::string gob_cmd_punched(s16 damage, s16 result_hp); std::string gob_cmd_update_armor_groups(const ItemGroupList &armor_groups); std::string gob_cmd_update_physics_override(float physics_override_speed, - float physics_override_jump, float physics_override_gravity, bool sneak, bool sneak_glitch); + float physics_override_jump, float physics_override_gravity, + bool sneak, bool sneak_glitch, bool new_move); std::string gob_cmd_update_animation(v2f frames, float frame_speed, float frame_blend, bool frame_loop); -std::string gob_cmd_update_bone_position(std::string bone, v3f position, v3f rotation); +std::string gob_cmd_update_bone_position(const std::string &bone, v3f position, + v3f rotation); -std::string gob_cmd_update_attachment(int parent_id, std::string bone, v3f position, v3f rotation); +std::string gob_cmd_update_attachment(int parent_id, const std::string &bone, + v3f position, v3f rotation); std::string gob_cmd_update_nametag_attributes(video::SColor color); -std::string gob_cmd_update_infant(u16 id, u8 type, std::string client_initialization_data); +std::string gob_cmd_update_infant(u16 id, u8 type, + const std::string &client_initialization_data); #endif diff --git a/src/gettime.h b/src/gettime.h index 44c159026..4d5a02e1e 100644 --- a/src/gettime.h +++ b/src/gettime.h @@ -21,43 +21,26 @@ with this program; if not, write to the Free Software Foundation, Inc., #define GETTIME_HEADER #include "irrlichttypes.h" +#include <time.h> +#include <string> -/* - Get a millisecond counter value. - Precision depends on implementation. - Overflows at any value above 10000000. - - Implementation of this is done in: - Normal build: main.cpp - Server build: servermain.cpp -*/ -enum TimePrecision { - PRECISION_SECONDS = 0, +enum TimePrecision +{ + PRECISION_SECONDS, PRECISION_MILLI, PRECISION_MICRO, PRECISION_NANO }; -extern u32 getTimeMs(); -extern u32 getTime(TimePrecision prec); - -/* - Timestamp stuff -*/ - -#include <time.h> -#include <string> - inline std::string getTimestamp() { time_t t = time(NULL); // This is not really thread-safe but it won't break anything // except its own output, so just go with it. struct tm *tm = localtime(&t); - char cs[20]; //YYYY-MM-DD HH:MM:SS + '\0' + char cs[20]; // YYYY-MM-DD HH:MM:SS + '\0' strftime(cs, 20, "%Y-%m-%d %H:%M:%S", tm); return cs; } - #endif diff --git a/src/guiChatConsole.cpp b/src/guiChatConsole.cpp index 8dd5ab032..5bb80bbbe 100644 --- a/src/guiChatConsole.cpp +++ b/src/guiChatConsole.cpp @@ -55,7 +55,7 @@ GUIChatConsole::GUIChatConsole( m_client(client), m_menumgr(menumgr), m_screensize(v2u32(0,0)), - m_animate_time_old(0), + m_animate_time_old(porting::getTimeMs()), m_open(false), m_close_on_enter(false), m_height(0), @@ -71,8 +71,6 @@ GUIChatConsole::GUIChatConsole( m_font(NULL), m_fontsize(0, 0) { - m_animate_time_old = getTimeMs(); - // load background settings s32 console_alpha = g_settings->getS32("console_alpha"); m_background_color.setAlpha(clamp_u8(console_alpha)); @@ -116,13 +114,15 @@ GUIChatConsole::~GUIChatConsole() m_font->drop(); } -void GUIChatConsole::openConsole(f32 height) +void GUIChatConsole::openConsole(f32 scale) { + assert(scale > 0.0f && scale <= 1.0f); + m_open = true; - m_desired_height_fraction = height; - m_desired_height = height * m_screensize.Y; + m_desired_height_fraction = scale; + m_desired_height = scale * m_screensize.Y; reformatConsole(); - m_animate_time_old = getTimeMs(); + m_animate_time_old = porting::getTimeMs(); IGUIElement::setVisible(true); Environment->setFocus(this); m_menumgr->createdMenu(this); @@ -210,7 +210,7 @@ void GUIChatConsole::draw() } // Animation - u32 now = getTimeMs(); + u64 now = porting::getTimeMs(); animate(now - m_animate_time_old); m_animate_time_old = now; @@ -627,10 +627,8 @@ bool GUIChatConsole::OnEvent(const SEvent& event) bool backwards = event.KeyInput.Shift; prompt.nickCompletion(names, backwards); return true; - } - else if(event.KeyInput.Char != 0 && !event.KeyInput.Control) - { - #if (defined(__linux__)) + } else if (!iswcntrl(event.KeyInput.Char) && !event.KeyInput.Control) { + #if defined(__linux__) && (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9) wchar_t wc = L'_'; mbtowc( &wc, (char *) &event.KeyInput.Char, sizeof(event.KeyInput.Char) ); prompt.input(wc); diff --git a/src/guiChatConsole.h b/src/guiChatConsole.h index 3013a1d31..0332678c7 100644 --- a/src/guiChatConsole.h +++ b/src/guiChatConsole.h @@ -41,7 +41,7 @@ public: // Open the console (height = desired fraction of screen size) // This doesn't open immediately but initiates an animation. // You should call isOpenInhibited() before this. - void openConsole(f32 height); + void openConsole(f32 scale); bool isOpen() const; @@ -98,7 +98,7 @@ private: v2u32 m_screensize; // used to compute how much time passed since last animate() - u32 m_animate_time_old; + u64 m_animate_time_old; // should the console be opened or closed? bool m_open; diff --git a/src/guiEngine.cpp b/src/guiEngine.cpp index a3c35f68d..2d1bd6d44 100644 --- a/src/guiEngine.cpp +++ b/src/guiEngine.cpp @@ -60,7 +60,7 @@ void TextDestGuiEngine::gotText(const StringMap &fields) } /******************************************************************************/ -void TextDestGuiEngine::gotText(std::wstring text) +void TextDestGuiEngine::gotText(const std::wstring &text) { m_engine->getScriptIface()->handleMainMenuEvent(wide_to_utf8(text)); } @@ -194,11 +194,9 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev, -1, m_menumanager, NULL /* &client */, - NULL /* gamedef */, m_texture_source, m_formspecgui, m_buttonhandler, - NULL, false); m_menu->allowClose(false); @@ -215,13 +213,13 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev, m_data->script_data.errormessage = ""; if (!loadMainMenuScript()) { - errorstream << "No future without mainmenu" << std::endl; + errorstream << "No future without main menu!" << std::endl; abort(); } run(); } catch (LuaError &e) { - errorstream << "MAINMENU ERROR: " << e.what() << std::endl; + errorstream << "Main menu error: " << e.what() << std::endl; m_data->script_data.errormessage = e.what(); } @@ -233,13 +231,13 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev, /******************************************************************************/ bool GUIEngine::loadMainMenuScript() { - // Try custom menu script (main_menu_path) - + // Set main menu path (for core.get_mainmenu_path()) m_scriptdir = g_settings->get("main_menu_path"); if (m_scriptdir.empty()) { - m_scriptdir = porting::path_share + DIR_DELIM "builtin" + DIR_DELIM "mainmenu"; + m_scriptdir = porting::path_share + DIR_DELIM + "builtin" + DIR_DELIM + "mainmenu"; } + // Load builtin (which will load the main menu script) std::string script = porting::path_share + DIR_DELIM "builtin" + DIR_DELIM "init.lua"; try { m_script->loadScript(script); @@ -264,8 +262,24 @@ void GUIEngine::run() unsigned int text_height = g_fontengine->getTextHeight(); - while(m_device->run() && (!m_startgame) && (!m_kill)) - { + irr::core::dimension2d<u32> previous_screen_size(g_settings->getU16("screenW"), + g_settings->getU16("screenH")); + + while (m_device->run() && (!m_startgame) && (!m_kill)) { + + const irr::core::dimension2d<u32> ¤t_screen_size = + m_device->getVideoDriver()->getScreenSize(); + // Verify if window size has changed and save it if it's the case + // Ensure evaluating settings->getBool after verifying screensize + // First condition is cheaper + if (previous_screen_size != current_screen_size && + current_screen_size != irr::core::dimension2d<u32>(0,0) && + g_settings->getBool("autosave_screensize")) { + g_settings->setU16("screenW", current_screen_size.Width); + g_settings->setU16("screenH", current_screen_size.Height); + previous_screen_size = current_screen_size; + } + //check if we need to update the "upper left corner"-text if (text_height != g_fontengine->getTextHeight()) { updateTopLeftTextSize(); @@ -542,7 +556,7 @@ bool GUIEngine::setTexture(texture_layer layer, std::string texturepath, } /******************************************************************************/ -bool GUIEngine::downloadFile(std::string url, std::string target) +bool GUIEngine::downloadFile(const std::string &url, const std::string &target) { #if USE_CURL std::ofstream target_file(target.c_str(), std::ios::out | std::ios::binary); @@ -604,8 +618,8 @@ void GUIEngine::stopSound(s32 handle) } /******************************************************************************/ -unsigned int GUIEngine::queueAsync(std::string serialized_func, - std::string serialized_params) +unsigned int GUIEngine::queueAsync(const std::string &serialized_func, + const std::string &serialized_params) { return m_script->queueAsync(serialized_func, serialized_params); } diff --git a/src/guiEngine.h b/src/guiEngine.h index 897244808..e7e5ca05d 100644 --- a/src/guiEngine.h +++ b/src/guiEngine.h @@ -80,7 +80,7 @@ public: * receive text/events transmitted by guiFormSpecMenu * @param text textual representation of event */ - void gotText(std::wstring text); + void gotText(const std::wstring &text); private: /** target to transmit data to */ @@ -139,6 +139,7 @@ private: class GUIEngine { /** grant ModApiMainMenu access to private members */ friend class ModApiMainMenu; + friend class ModApiSound; public: /** @@ -177,7 +178,8 @@ public: } /** pass async callback to scriptengine **/ - unsigned int queueAsync(std::string serialized_fct,std::string serialized_params); + unsigned int queueAsync(const std::string &serialized_fct, + const std::string &serialized_params); private: @@ -187,9 +189,6 @@ private: /** run main menu loop */ void run(); - /** handler to limit frame rate within main menu */ - void limitFrameRate(); - /** update size of topleftext element */ void updateTopLeftTextSize(); @@ -261,14 +260,11 @@ private: * @param url url to download * @param target file to store to */ - static bool downloadFile(std::string url,std::string target); + static bool downloadFile(const std::string &url, const std::string &target); /** array containing pointers to current specified texture layers */ image_definition m_textures[TEX_LAYER_MAX]; - /** draw version string in topleft corner */ - void drawVersion(); - /** * specify text to appear as top left string * @param text to set diff --git a/src/guiFileSelectMenu.cpp b/src/guiFileSelectMenu.cpp index 0bb02f8a6..65a07be39 100644 --- a/src/guiFileSelectMenu.cpp +++ b/src/guiFileSelectMenu.cpp @@ -18,19 +18,16 @@ */ #include "guiFileSelectMenu.h" -#include "util/string.h" -#include <locale.h> GUIFileSelectMenu::GUIFileSelectMenu(gui::IGUIEnvironment* env, - gui::IGUIElement* parent, s32 id, IMenuManager *menumgr, - std::string title, std::string formname) : -GUIModalMenu(env, parent, id, menumgr) + gui::IGUIElement* parent, s32 id, IMenuManager *menumgr, + const std::string &title, const std::string &formname) : + GUIModalMenu(env, parent, id, menumgr), + m_title(utf8_to_wide(title)), + m_accepted(false), + m_text_dst(NULL), + m_formname(formname) { - m_title = utf8_to_wide(title); - m_parent = parent; - m_formname = formname; - m_text_dst = 0; - m_accepted = false; } GUIFileSelectMenu::~GUIFileSelectMenu() @@ -107,16 +104,12 @@ bool GUIFileSelectMenu::OnEvent(const SEvent& event) acceptInput(); quitMenu(); return true; - break; - case gui::EGET_DIRECTORY_SELECTED: case gui::EGET_FILE_SELECTED: m_accepted=true; acceptInput(); quitMenu(); return true; - break; - default: //ignore this event break; diff --git a/src/guiFileSelectMenu.h b/src/guiFileSelectMenu.h index e37d3d8df..034823740 100644 --- a/src/guiFileSelectMenu.h +++ b/src/guiFileSelectMenu.h @@ -26,14 +26,12 @@ #include "IGUIFileOpenDialog.h" #include "guiFormSpecMenu.h" //required because of TextDest only !!! - -class GUIFileSelectMenu: public GUIModalMenu +class GUIFileSelectMenu : public GUIModalMenu { public: - GUIFileSelectMenu(gui::IGUIEnvironment* env, gui::IGUIElement* parent, - s32 id, IMenuManager *menumgr, - std::string title, - std::string formid); + GUIFileSelectMenu(gui::IGUIEnvironment *env, gui::IGUIElement *parent, s32 id, + IMenuManager *menumgr, const std::string &title, + const std::string &formid); ~GUIFileSelectMenu(); void removeChildren(); @@ -45,34 +43,21 @@ public: void drawMenu(); - bool OnEvent(const SEvent& event); - - bool isRunning() { - return m_running; - } + bool OnEvent(const SEvent &event); - void setTextDest(TextDest * dest) { - m_text_dst = dest; - } + void setTextDest(TextDest *dest) { m_text_dst = dest; } private: void acceptInput(); std::wstring m_title; bool m_accepted; - gui::IGUIElement* m_parent; - - std::string m_selectedPath; - gui::IGUIFileOpenDialog* m_fileOpenDialog; - - bool m_running; + gui::IGUIFileOpenDialog *m_fileOpenDialog; TextDest *m_text_dst; std::string m_formname; }; - - #endif /* GUIFILESELECTMENU_H_ */ diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index bfc7a9b79..19fd9f1f0 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -42,7 +42,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "filesys.h" #include "gettime.h" #include "gettext.h" -#include "scripting_game.h" +#include "scripting_server.h" #include "porting.h" #include "settings.h" #include "client.h" @@ -81,13 +81,12 @@ static unsigned int font_line_height(gui::IGUIFont *font) GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev, JoystickController *joystick, gui::IGUIElement* parent, s32 id, IMenuManager *menumgr, - InventoryManager *invmgr, IGameDef *gamedef, + Client *client, ISimpleTextureSource *tsrc, IFormSource* fsrc, TextDest* tdst, - Client* client, bool remap_dbl_click) : + bool remap_dbl_click) : GUIModalMenu(dev->getGUIEnvironment(), parent, id, menumgr), m_device(dev), - m_invmgr(invmgr), - m_gamedef(gamedef), + m_invmgr(client), m_tsrc(tsrc), m_client(client), m_selected_item(NULL), @@ -253,7 +252,7 @@ std::vector<std::string>* GUIFormSpecMenu::getDropDownValues(const std::string & return NULL; } -void GUIFormSpecMenu::parseSize(parserData* data,std::string element) +void GUIFormSpecMenu::parseSize(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,','); @@ -279,7 +278,7 @@ void GUIFormSpecMenu::parseSize(parserData* data,std::string element) errorstream<< "Invalid size element (" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseContainer(parserData* data, std::string element) +void GUIFormSpecMenu::parseContainer(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element, ','); @@ -305,10 +304,10 @@ void GUIFormSpecMenu::parseContainerEnd(parserData* data) } } -void GUIFormSpecMenu::parseList(parserData* data,std::string element) +void GUIFormSpecMenu::parseList(parserData* data, const std::string &element) { - if (m_gamedef == 0) { - warningstream<<"invalid use of 'list' with m_gamedef==0"<<std::endl; + if (m_client == 0) { + warningstream<<"invalid use of 'list' with m_client==0"<<std::endl; return; } @@ -360,10 +359,10 @@ void GUIFormSpecMenu::parseList(parserData* data,std::string element) errorstream<< "Invalid list element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseListRing(parserData* data, std::string element) +void GUIFormSpecMenu::parseListRing(parserData* data, const std::string &element) { - if (m_gamedef == 0) { - errorstream << "WARNING: invalid use of 'listring' with m_gamedef==0" << std::endl; + if (m_client == 0) { + errorstream << "WARNING: invalid use of 'listring' with m_client==0" << std::endl; return; } @@ -395,7 +394,7 @@ void GUIFormSpecMenu::parseListRing(parserData* data, std::string element) << m_inventorylists.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseCheckbox(parserData* data,std::string element) +void GUIFormSpecMenu::parseCheckbox(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -451,7 +450,7 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data,std::string element) errorstream<< "Invalid checkbox element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseScrollBar(parserData* data, std::string element) +void GUIFormSpecMenu::parseScrollBar(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -510,7 +509,7 @@ void GUIFormSpecMenu::parseScrollBar(parserData* data, std::string element) errorstream<< "Invalid scrollbar element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseImage(parserData* data,std::string element) +void GUIFormSpecMenu::parseImage(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -554,7 +553,7 @@ void GUIFormSpecMenu::parseImage(parserData* data,std::string element) errorstream<< "Invalid image element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseItemImage(parserData* data,std::string element) +void GUIFormSpecMenu::parseItemImage(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -584,8 +583,8 @@ void GUIFormSpecMenu::parseItemImage(parserData* data,std::string element) errorstream<< "Invalid ItemImage element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseButton(parserData* data,std::string element, - std::string type) +void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element, + const std::string &type) { std::vector<std::string> parts = split(element,';'); @@ -639,7 +638,7 @@ void GUIFormSpecMenu::parseButton(parserData* data,std::string element, errorstream<< "Invalid button element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseBackground(parserData* data,std::string element) +void GUIFormSpecMenu::parseBackground(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -677,7 +676,7 @@ void GUIFormSpecMenu::parseBackground(parserData* data,std::string element) errorstream<< "Invalid background element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseTableOptions(parserData* data,std::string element) +void GUIFormSpecMenu::parseTableOptions(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -689,7 +688,7 @@ void GUIFormSpecMenu::parseTableOptions(parserData* data,std::string element) } } -void GUIFormSpecMenu::parseTableColumns(parserData* data,std::string element) +void GUIFormSpecMenu::parseTableColumns(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -709,7 +708,7 @@ void GUIFormSpecMenu::parseTableColumns(parserData* data,std::string element) } } -void GUIFormSpecMenu::parseTable(parserData* data,std::string element) +void GUIFormSpecMenu::parseTable(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -777,7 +776,7 @@ void GUIFormSpecMenu::parseTable(parserData* data,std::string element) errorstream<< "Invalid table element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) +void GUIFormSpecMenu::parseTextList(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -850,7 +849,7 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) } -void GUIFormSpecMenu::parseDropDown(parserData* data,std::string element) +void GUIFormSpecMenu::parseDropDown(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -914,8 +913,7 @@ void GUIFormSpecMenu::parseDropDown(parserData* data,std::string element) << element << "'" << std::endl; } -void GUIFormSpecMenu::parseFieldCloseOnEnter(parserData *data, - const std::string &element) +void GUIFormSpecMenu::parseFieldCloseOnEnter(parserData *data, const std::string &element) { std::vector<std::string> parts = split(element,';'); if (parts.size() == 2 || @@ -924,7 +922,7 @@ void GUIFormSpecMenu::parseFieldCloseOnEnter(parserData *data, } } -void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element) +void GUIFormSpecMenu::parsePwdField(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -1085,8 +1083,8 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data, m_fields.push_back(spec); } -void GUIFormSpecMenu::parseTextArea(parserData* data, - std::vector<std::string>& parts,std::string type) +void GUIFormSpecMenu::parseTextArea(parserData* data, std::vector<std::string>& parts, + const std::string &type) { std::vector<std::string> v_pos = split(parts[0],','); @@ -1197,8 +1195,8 @@ void GUIFormSpecMenu::parseTextArea(parserData* data, m_fields.push_back(spec); } -void GUIFormSpecMenu::parseField(parserData* data,std::string element, - std::string type) +void GUIFormSpecMenu::parseField(parserData* data, const std::string &element, + const std::string &type) { std::vector<std::string> parts = split(element,';'); @@ -1216,7 +1214,7 @@ void GUIFormSpecMenu::parseField(parserData* data,std::string element, errorstream<< "Invalid field element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseLabel(parserData* data,std::string element) +void GUIFormSpecMenu::parseLabel(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -1272,7 +1270,7 @@ void GUIFormSpecMenu::parseLabel(parserData* data,std::string element) errorstream<< "Invalid label element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseVertLabel(parserData* data,std::string element) +void GUIFormSpecMenu::parseVertLabel(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -1322,8 +1320,8 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data,std::string element) errorstream<< "Invalid vertlabel element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element, - std::string type) +void GUIFormSpecMenu::parseImageButton(parserData* data, const std::string &element, + const std::string &type) { std::vector<std::string> parts = split(element,';'); @@ -1411,7 +1409,7 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element, errorstream<< "Invalid imagebutton element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseTabHeader(parserData* data,std::string element) +void GUIFormSpecMenu::parseTabHeader(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -1483,11 +1481,11 @@ void GUIFormSpecMenu::parseTabHeader(parserData* data,std::string element) << element << "'" << std::endl; } -void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element) +void GUIFormSpecMenu::parseItemImageButton(parserData* data, const std::string &element) { - if (m_gamedef == 0) { - warningstream << "invalid use of item_image_button with m_gamedef==0" + if (m_client == 0) { + warningstream << "invalid use of item_image_button with m_client==0" << std::endl; return; } @@ -1521,7 +1519,7 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element) if(!data->explicit_size) warningstream<<"invalid use of item_image_button without a size[] element"<<std::endl; - IItemDefManager *idef = m_gamedef->idef(); + IItemDefManager *idef = m_client->idef(); ItemStack item; item.deSerialize(item_name, idef); @@ -1557,7 +1555,7 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element) errorstream<< "Invalid ItemImagebutton element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseBox(parserData* data,std::string element) +void GUIFormSpecMenu::parseBox(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -1593,7 +1591,7 @@ void GUIFormSpecMenu::parseBox(parserData* data,std::string element) errorstream<< "Invalid Box element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseBackgroundColor(parserData* data,std::string element) +void GUIFormSpecMenu::parseBackgroundColor(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -1611,7 +1609,7 @@ void GUIFormSpecMenu::parseBackgroundColor(parserData* data,std::string element) errorstream<< "Invalid bgcolor element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseListColors(parserData* data,std::string element) +void GUIFormSpecMenu::parseListColors(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); @@ -1639,7 +1637,7 @@ void GUIFormSpecMenu::parseListColors(parserData* data,std::string element) errorstream<< "Invalid listcolors element(" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseTooltip(parserData* data, std::string element) +void GUIFormSpecMenu::parseTooltip(parserData* data, const std::string &element) { std::vector<std::string> parts = split(element,';'); if (parts.size() == 2) { @@ -1659,7 +1657,7 @@ void GUIFormSpecMenu::parseTooltip(parserData* data, std::string element) errorstream<< "Invalid tooltip element(" << parts.size() << "): '" << element << "'" << std::endl; } -bool GUIFormSpecMenu::parseVersionDirect(std::string data) +bool GUIFormSpecMenu::parseVersionDirect(const std::string &data) { //some prechecks if (data == "") @@ -1683,7 +1681,7 @@ bool GUIFormSpecMenu::parseVersionDirect(std::string data) return false; } -bool GUIFormSpecMenu::parseSizeDirect(parserData* data, std::string element) +bool GUIFormSpecMenu::parseSizeDirect(parserData* data, const std::string &element) { if (element == "") return false; @@ -1707,7 +1705,76 @@ bool GUIFormSpecMenu::parseSizeDirect(parserData* data, std::string element) return true; } -void GUIFormSpecMenu::parseElement(parserData* data, std::string element) +bool GUIFormSpecMenu::parsePositionDirect(parserData *data, const std::string &element) +{ + if (element.empty()) + return false; + + std::vector<std::string> parts = split(element, '['); + + if (parts.size() != 2) + return false; + + std::string type = trim(parts[0]); + std::string description = trim(parts[1]); + + if (type != "position") + return false; + + parsePosition(data, description); + + return true; +} + +void GUIFormSpecMenu::parsePosition(parserData *data, const std::string &element) +{ + std::vector<std::string> parts = split(element, ','); + + if (parts.size() == 2) { + data->offset.X = stof(parts[0]); + data->offset.Y = stof(parts[1]); + return; + } + + errorstream << "Invalid position element (" << parts.size() << "): '" << element << "'" << std::endl; +} + +bool GUIFormSpecMenu::parseAnchorDirect(parserData *data, const std::string &element) +{ + if (element.empty()) + return false; + + std::vector<std::string> parts = split(element, '['); + + if (parts.size() != 2) + return false; + + std::string type = trim(parts[0]); + std::string description = trim(parts[1]); + + if (type != "anchor") + return false; + + parseAnchor(data, description); + + return true; +} + +void GUIFormSpecMenu::parseAnchor(parserData *data, const std::string &element) +{ + std::vector<std::string> parts = split(element, ','); + + if (parts.size() == 2) { + data->anchor.X = stof(parts[0]); + data->anchor.Y = stof(parts[1]); + return; + } + + errorstream << "Invalid anchor element (" << parts.size() << "): '" << element + << "'" << std::endl; +} + +void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element) { //some prechecks if (element == "") @@ -1918,6 +1985,8 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) mydata.size= v2s32(100,100); mydata.screensize = screensize; + mydata.offset = v2f32(0.5f, 0.5f); + mydata.anchor = v2f32(0.5f, 0.5f); // Base position of contents of form mydata.basepos = getBasePos(); @@ -1936,6 +2005,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) m_tooltips.clear(); m_inventory_rings.clear(); m_static_texts.clear(); + m_dropdowns.clear(); // Set default values (fits old formspec values) m_bgcolor = video::SColor(140,0,0,0); @@ -1984,6 +2054,21 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) } } + /* "position" element is always after "size" element if it used */ + for (; i< elements.size(); i++) { + if (!parsePositionDirect(&mydata, elements[i])) { + break; + } + } + + /* "anchor" element is always after "position" (or "size" element) if it used */ + for (; i< elements.size(); i++) { + if (!parseAnchorDirect(&mydata, elements[i])) { + break; + } + } + + if (mydata.explicit_size) { // compute scaling for specified form size if (m_lock) { @@ -2067,10 +2152,10 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) padding.Y*2+spacing.Y*(mydata.invsize.Y-1.0)+imgsize.Y + m_btn_height*2.0/3.0 ); DesiredRect = mydata.rect = core::rect<s32>( - mydata.screensize.X/2 - mydata.size.X/2 + offset.X, - mydata.screensize.Y/2 - mydata.size.Y/2 + offset.Y, - mydata.screensize.X/2 + mydata.size.X/2 + offset.X, - mydata.screensize.Y/2 + mydata.size.Y/2 + offset.Y + (s32)((f32)mydata.screensize.X * mydata.offset.X) - (s32)(mydata.anchor.X * (f32)mydata.size.X) + offset.X, + (s32)((f32)mydata.screensize.Y * mydata.offset.Y) - (s32)(mydata.anchor.Y * (f32)mydata.size.Y) + offset.Y, + (s32)((f32)mydata.screensize.X * mydata.offset.X) + (s32)((1.0 - mydata.anchor.X) * (f32)mydata.size.X) + offset.X, + (s32)((f32)mydata.screensize.Y * mydata.offset.Y) + (s32)((1.0 - mydata.anchor.Y) * (f32)mydata.size.Y) + offset.Y ); } else { // Non-size[] form must consist only of text fields and @@ -2079,10 +2164,10 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) m_font = g_fontengine->getFont(); m_btn_height = font_line_height(m_font) * 0.875; DesiredRect = core::rect<s32>( - mydata.screensize.X/2 - 580/2, - mydata.screensize.Y/2 - 300/2, - mydata.screensize.X/2 + 580/2, - mydata.screensize.Y/2 + 300/2 + (s32)((f32)mydata.screensize.X * mydata.offset.X) - (s32)(mydata.anchor.X * 580.0), + (s32)((f32)mydata.screensize.Y * mydata.offset.Y) - (s32)(mydata.anchor.Y * 300.0), + (s32)((f32)mydata.screensize.X * mydata.offset.X) + (s32)((1.0 - mydata.anchor.X) * 580.0), + (s32)((f32)mydata.screensize.Y * mydata.offset.Y) + (s32)((1.0 - mydata.anchor.Y) * 300.0) ); } recalculateAbsolutePosition(false); @@ -2297,46 +2382,26 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase, if(!item.empty()) { drawItemStack(driver, m_font, item, - rect, &AbsoluteClippingRect, m_gamedef, + rect, &AbsoluteClippingRect, m_client, rotation_kind); } // Draw tooltip std::wstring tooltip_text = L""; if (hovering && !m_selected_item) { - tooltip_text = utf8_to_wide(item.getDefinition(m_gamedef->idef()).description); + const std::string &desc = item.metadata.getString("description"); + if (desc.empty()) + tooltip_text = + utf8_to_wide(item.getDefinition(m_client->idef()).description); + else + tooltip_text = utf8_to_wide(desc); + // Show itemstring as fallback for easier debugging + if (!item.name.empty() && tooltip_text.empty()) + tooltip_text = utf8_to_wide(item.name); } - if (tooltip_text != L"") { - std::vector<std::wstring> tt_rows = str_split(tooltip_text, L'\n'); - m_tooltip_element->setBackgroundColor(m_default_tooltip_bgcolor); - m_tooltip_element->setOverrideColor(m_default_tooltip_color); - m_tooltip_element->setVisible(true); - this->bringToFront(m_tooltip_element); - setStaticText(m_tooltip_element, tooltip_text.c_str()); - s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height; -#if (IRRLICHT_VERSION_MAJOR <= 1 && IRRLICHT_VERSION_MINOR <= 8 && IRRLICHT_VERSION_REVISION < 2) || USE_FREETYPE == 1 - s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5; -#else - s32 tooltip_height = m_tooltip_element->getTextHeight() + 5; -#endif - v2u32 screenSize = driver->getScreenSize(); - int tooltip_offset_x = m_btn_height; - int tooltip_offset_y = m_btn_height; -#ifdef __ANDROID__ - tooltip_offset_x *= 3; - tooltip_offset_y = 0; - if (m_pointer.X > (s32)screenSize.X / 2) - tooltip_offset_x = (tooltip_offset_x + tooltip_width) * -1; -#endif - s32 tooltip_x = m_pointer.X + tooltip_offset_x; - s32 tooltip_y = m_pointer.Y + tooltip_offset_y; - if (tooltip_x + tooltip_width > (s32)screenSize.X) - tooltip_x = (s32)screenSize.X - tooltip_width - m_btn_height; - if (tooltip_y + tooltip_height > (s32)screenSize.Y) - tooltip_y = (s32)screenSize.Y - tooltip_height - m_btn_height; - m_tooltip_element->setRelativePosition(core::rect<s32>( - core::position2d<s32>(tooltip_x, tooltip_y), - core::dimension2d<s32>(tooltip_width, tooltip_height))); + if (!tooltip_text.empty()) { + showTooltip(tooltip_text, m_default_tooltip_color, + m_default_tooltip_bgcolor); } } } @@ -2349,7 +2414,7 @@ void GUIFormSpecMenu::drawSelectedItem() if (!m_selected_item) { drawItemStack(driver, m_font, ItemStack(), core::rect<s32>(v2s32(0, 0), v2s32(0, 0)), - NULL, m_gamedef, IT_ROT_DRAGGED); + NULL, m_client, IT_ROT_DRAGGED); return; } @@ -2363,7 +2428,7 @@ void GUIFormSpecMenu::drawSelectedItem() core::rect<s32> imgrect(0,0,imgsize.X,imgsize.Y); core::rect<s32> rect = imgrect + (m_pointer - imgrect.getCenter()); rect.constrainTo(driver->getViewPort()); - drawItemStack(driver, m_font, stack, rect, NULL, m_gamedef, IT_ROT_DRAGGED); + drawItemStack(driver, m_font, stack, rect, NULL, m_client, IT_ROT_DRAGGED); } void GUIFormSpecMenu::drawMenu() @@ -2488,11 +2553,11 @@ void GUIFormSpecMenu::drawMenu() */ for(u32 i=0; i<m_itemimages.size(); i++) { - if (m_gamedef == 0) + if (m_client == 0) break; const ImageDrawSpec &spec = m_itemimages[i]; - IItemDefManager *idef = m_gamedef->idef(); + IItemDefManager *idef = m_client->idef(); ItemStack item; item.deSerialize(spec.item_name, idef); core::rect<s32> imgrect(0, 0, spec.geom.X, spec.geom.Y); @@ -2509,7 +2574,7 @@ void GUIFormSpecMenu::drawMenu() #endif } drawItemStack(driver, m_font, item, rect, &AbsoluteClippingRect, - m_gamedef, IT_ROT_NONE); + m_client, IT_ROT_NONE); } /* @@ -2527,7 +2592,7 @@ void GUIFormSpecMenu::drawMenu() if (!item_hovered) { drawItemStack(driver, m_font, ItemStack(), core::rect<s32>(v2s32(0, 0), v2s32(0, 0)), - NULL, m_gamedef, IT_ROT_HOVERED); + NULL, m_client, IT_ROT_HOVERED); } /* TODO find way to show tooltips on touchscreen */ @@ -2566,53 +2631,33 @@ void GUIFormSpecMenu::drawMenu() if (hovered != NULL) { s32 id = hovered->getID(); - u32 delta = 0; + u64 delta = 0; if (id == -1) { m_old_tooltip_id = id; m_old_tooltip = L""; } else { if (id == m_old_tooltip_id) { - delta = porting::getDeltaMs(m_hovered_time, getTimeMs()); + delta = porting::getDeltaMs(m_hovered_time, porting::getTimeMs()); } else { - m_hovered_time = getTimeMs(); + m_hovered_time = porting::getTimeMs(); m_old_tooltip_id = id; } } + // Find and update the current tooltip if (id != -1 && delta >= m_tooltip_show_delay) { - for(std::vector<FieldSpec>::iterator iter = m_fields.begin(); + for (std::vector<FieldSpec>::iterator iter = m_fields.begin(); iter != m_fields.end(); ++iter) { - if (iter->fid == id && m_tooltips[iter->fname].tooltip != L"") { - if (m_old_tooltip != m_tooltips[iter->fname].tooltip) { - m_tooltip_element->setBackgroundColor(m_tooltips[iter->fname].bgcolor); - m_tooltip_element->setOverrideColor(m_tooltips[iter->fname].color); - m_old_tooltip = m_tooltips[iter->fname].tooltip; - setStaticText(m_tooltip_element, m_tooltips[iter->fname].tooltip.c_str()); - std::vector<std::wstring> tt_rows = str_split(m_tooltips[iter->fname].tooltip, L'\n'); - s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height; - s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5; - int tooltip_offset_x = m_btn_height; - int tooltip_offset_y = m_btn_height; -#ifdef __ANDROID__ - tooltip_offset_x *= 3; - tooltip_offset_y = 0; - if (m_pointer.X > (s32)screenSize.X / 2) - tooltip_offset_x = (tooltip_offset_x + tooltip_width) * -1; -#endif - s32 tooltip_x = m_pointer.X + tooltip_offset_x; - s32 tooltip_y = m_pointer.Y + tooltip_offset_y; - if (tooltip_x + tooltip_width > (s32)screenSize.X) - tooltip_x = (s32)screenSize.X - tooltip_width - m_btn_height; - if (tooltip_y + tooltip_height > (s32)screenSize.Y) - tooltip_y = (s32)screenSize.Y - tooltip_height - m_btn_height; - m_tooltip_element->setRelativePosition(core::rect<s32>( - core::position2d<s32>(tooltip_x, tooltip_y), - core::dimension2d<s32>(tooltip_width, tooltip_height))); - } - m_tooltip_element->setVisible(true); - this->bringToFront(m_tooltip_element); - break; - } + + if (iter->fid != id) + continue; + + const std::wstring &text = m_tooltips[iter->fname].tooltip; + if (!text.empty()) + showTooltip(text, m_tooltips[iter->fname].color, + m_tooltips[iter->fname].bgcolor); + + break; } } } @@ -2627,6 +2672,53 @@ void GUIFormSpecMenu::drawMenu() skin->setFont(old_font); } + +void GUIFormSpecMenu::showTooltip(const std::wstring &text, + const irr::video::SColor &color, const irr::video::SColor &bgcolor) +{ + m_tooltip_element->setOverrideColor(color); + m_tooltip_element->setBackgroundColor(bgcolor); + m_old_tooltip = text; + setStaticText(m_tooltip_element, text.c_str()); + + // Tooltip size and offset + s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height; +#if (IRRLICHT_VERSION_MAJOR <= 1 && IRRLICHT_VERSION_MINOR <= 8 && IRRLICHT_VERSION_REVISION < 2) || USE_FREETYPE == 1 + std::vector<std::wstring> text_rows = str_split(text, L'\n'); + s32 tooltip_height = m_tooltip_element->getTextHeight() * text_rows.size() + 5; +#else + s32 tooltip_height = m_tooltip_element->getTextHeight() + 5; +#endif + v2u32 screenSize = Environment->getVideoDriver()->getScreenSize(); + int tooltip_offset_x = m_btn_height; + int tooltip_offset_y = m_btn_height; +#ifdef __ANDROID__ + tooltip_offset_x *= 3; + tooltip_offset_y = 0; + if (m_pointer.X > (s32)screenSize.X / 2) + tooltip_offset_x = -(tooltip_offset_x + tooltip_width); +#endif + + // Calculate and set the tooltip position + s32 tooltip_x = m_pointer.X + tooltip_offset_x; + s32 tooltip_y = m_pointer.Y + tooltip_offset_y; + if (tooltip_x + tooltip_width > (s32)screenSize.X) + tooltip_x = (s32)screenSize.X - tooltip_width - m_btn_height; + if (tooltip_y + tooltip_height > (s32)screenSize.Y) + tooltip_y = (s32)screenSize.Y - tooltip_height - m_btn_height; + + m_tooltip_element->setRelativePosition( + core::rect<s32>( + core::position2d<s32>(tooltip_x, tooltip_y), + core::dimension2d<s32>(tooltip_width, tooltip_height) + ) + ); + + // Display the tooltip + m_tooltip_element->setVisible(true); + bringToFront(m_tooltip_element); +} + void GUIFormSpecMenu::updateSelectedItem() { // If the selected stack has become empty for some reason, deselect it. @@ -3152,10 +3244,10 @@ bool GUIFormSpecMenu::DoubleClickDetection(const SEvent event) m_doubleclickdetect[0].time = m_doubleclickdetect[1].time; m_doubleclickdetect[1].pos = m_pointer; - m_doubleclickdetect[1].time = getTimeMs(); + m_doubleclickdetect[1].time = porting::getTimeMs(); } else if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) { - u32 delta = porting::getDeltaMs(m_doubleclickdetect[0].time, getTimeMs()); + u64 delta = porting::getDeltaMs(m_doubleclickdetect[0].time, porting::getTimeMs()); if (delta > 400) { return false; } @@ -3204,8 +3296,9 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) { if (event.EventType==EET_KEY_INPUT_EVENT) { KeyPress kp(event.KeyInput); - if (event.KeyInput.PressedDown && ( (kp == EscapeKey) || - (kp == getKeySetting("keymap_inventory")) || (kp == CancelKey))) { + if (event.KeyInput.PressedDown && ( + (kp == EscapeKey) || (kp == CancelKey) || + ((m_client != NULL) && (kp == getKeySetting("keymap_inventory"))))) { tryClose(); return true; } else if (m_client != NULL && event.KeyInput.PressedDown && @@ -3470,7 +3563,7 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) // Check how many items can be moved move_amount = stack_from.count = MYMIN(move_amount, stack_from.count); - ItemStack leftover = stack_to.addItem(stack_from, m_gamedef->idef()); + ItemStack leftover = stack_to.addItem(stack_from, m_client->idef()); // If source stack cannot be added to destination stack at all, // they are swapped if ((leftover.count == stack_from.count) && diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h index 95df11e6a..9eaf60ac6 100644 --- a/src/guiFormSpecMenu.h +++ b/src/guiFormSpecMenu.h @@ -25,7 +25,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <stack> #include "irrlichttypes_extrabloated.h" -#include "inventory.h" #include "inventorymanager.h" #include "modalMenu.h" #include "guiTable.h" @@ -34,7 +33,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include "util/enriched_string.h" -class IGameDef; class InventoryManager; class ISimpleTextureSource; class Client; @@ -57,12 +55,10 @@ typedef enum { struct TextDest { - virtual ~TextDest() {}; + virtual ~TextDest() {} // This is deprecated I guess? -celeron55 - virtual void gotText(std::wstring text){} + virtual void gotText(const std::wstring &text) {} virtual void gotText(const StringMap &fields) = 0; - virtual void setFormName(std::string formname) - { m_formname = formname;}; std::string m_formname; }; @@ -73,30 +69,29 @@ public: virtual ~IFormSource(){} virtual std::string getForm() = 0; // Fill in variables in field text - virtual std::string resolveText(std::string str){ return str; } + virtual std::string resolveText(const std::string &str) { return str; } }; class GUIFormSpecMenu : public GUIModalMenu { struct ItemSpec { - ItemSpec() + ItemSpec() : + i(-1) { - i = -1; } + ItemSpec(const InventoryLocation &a_inventoryloc, const std::string &a_listname, - s32 a_i) - { - inventoryloc = a_inventoryloc; - listname = a_listname; - i = a_i; - } - bool isValid() const + s32 a_i) : + inventoryloc(a_inventoryloc), + listname(a_listname), + i(a_i) { - return i != -1; } + bool isValid() const { return i != -1; } + InventoryLocation inventoryloc; std::string listname; s32 i; @@ -146,7 +141,8 @@ class GUIFormSpecMenu : public GUIModalMenu ImageDrawSpec(): parent_button(NULL), clip(false) - {} + { + } ImageDrawSpec(const std::string &a_name, const std::string &a_item_name, @@ -159,7 +155,8 @@ class GUIFormSpecMenu : public GUIModalMenu geom(a_geom), scale(true), clip(false) - {} + { + } ImageDrawSpec(const std::string &a_name, const std::string &a_item_name, @@ -171,7 +168,8 @@ class GUIFormSpecMenu : public GUIModalMenu geom(a_geom), scale(true), clip(false) - {} + { + } ImageDrawSpec(const std::string &a_name, const v2s32 &a_pos, const v2s32 &a_geom, bool clip=false): @@ -181,7 +179,8 @@ class GUIFormSpecMenu : public GUIModalMenu geom(a_geom), scale(true), clip(clip) - {} + { + } ImageDrawSpec(const std::string &a_name, const v2s32 &a_pos): @@ -190,7 +189,8 @@ class GUIFormSpecMenu : public GUIModalMenu pos(a_pos), scale(false), clip(false) - {} + { + } std::string name; std::string item_name; @@ -210,14 +210,14 @@ class GUIFormSpecMenu : public GUIModalMenu const std::wstring &default_text, int id) : fname(name), flabel(label), + fdefault(unescape_enriched(default_text)), fid(id), send(false), ftype(f_Unknown), is_exit(false) { - //flabel = unescape_enriched(label); - fdefault = unescape_enriched(default_text); } + std::string fname; std::wstring flabel; std::wstring fdefault; @@ -228,7 +228,8 @@ class GUIFormSpecMenu : public GUIModalMenu core::rect<s32> rect; }; - struct BoxDrawSpec { + struct BoxDrawSpec + { BoxDrawSpec(v2s32 a_pos, v2s32 a_geom,irr::video::SColor a_color): pos(a_pos), geom(a_geom), @@ -240,45 +241,46 @@ class GUIFormSpecMenu : public GUIModalMenu irr::video::SColor color; }; - struct TooltipSpec { - TooltipSpec() - { - } - TooltipSpec(std::string a_tooltip, irr::video::SColor a_bgcolor, + struct TooltipSpec + { + TooltipSpec() {} + TooltipSpec(const std::string &a_tooltip, irr::video::SColor a_bgcolor, irr::video::SColor a_color): + tooltip(utf8_to_wide(a_tooltip)), bgcolor(a_bgcolor), color(a_color) { - //tooltip = unescape_enriched(utf8_to_wide(a_tooltip)); - tooltip = utf8_to_wide(a_tooltip); } + std::wstring tooltip; irr::video::SColor bgcolor; irr::video::SColor color; }; - struct StaticTextSpec { + struct StaticTextSpec + { StaticTextSpec(): parent_button(NULL) { } + StaticTextSpec(const std::wstring &a_text, const core::rect<s32> &a_rect): + text(a_text), rect(a_rect), parent_button(NULL) { - //text = unescape_enriched(a_text); - text = a_text; } + StaticTextSpec(const std::wstring &a_text, const core::rect<s32> &a_rect, gui::IGUIButton *a_parent_button): + text(a_text), rect(a_rect), parent_button(a_parent_button) { - //text = unescape_enriched(a_text); - text = a_text; } + std::wstring text; core::rect<s32> rect; gui::IGUIButton *parent_button; @@ -289,18 +291,16 @@ public: JoystickController *joystick, gui::IGUIElement* parent, s32 id, IMenuManager *menumgr, - InventoryManager *invmgr, - IGameDef *gamedef, + Client *client, ISimpleTextureSource *tsrc, IFormSource* fs_src, TextDest* txt_dst, - Client* client, bool remap_dbl_click = true); ~GUIFormSpecMenu(); void setFormSpec(const std::string &formspec_string, - InventoryLocation current_inventory_location) + const InventoryLocation ¤t_inventory_location) { m_formspec_string = formspec_string; m_current_inventory_location = current_inventory_location; @@ -339,7 +339,7 @@ public: void removeChildren(); void setInitialFocus(); - void setFocus(std::string &elementname) + void setFocus(const std::string &elementname) { m_focused_element = elementname; } @@ -384,7 +384,6 @@ protected: irr::IrrlichtDevice* m_device; InventoryManager *m_invmgr; - IGameDef *m_gamedef; ISimpleTextureSource *m_tsrc; Client *m_client; @@ -421,8 +420,8 @@ protected: v2s32 m_old_pointer; // Mouse position after previous mouse event gui::IGUIStaticText *m_tooltip_element; - u32 m_tooltip_show_delay; - s32 m_hovered_time; + u64 m_tooltip_show_delay; + u64 m_hovered_time; s32 m_old_tooltip_id; std::wstring m_old_tooltip; @@ -452,6 +451,8 @@ private: bool explicit_size; v2f invsize; v2s32 size; + v2f32 offset; + v2f32 anchor; core::rect<s32> rect; v2s32 basepos; v2u32 screensize; @@ -472,44 +473,53 @@ private: fs_key_pendig current_keys_pending; std::string current_field_enter_pending; - void parseElement(parserData* data, std::string element); + void parseElement(parserData* data, const std::string &element); - void parseSize(parserData* data, std::string element); - void parseContainer(parserData* data, std::string element); + void parseSize(parserData* data, const std::string &element); + void parseContainer(parserData* data, const std::string &element); void parseContainerEnd(parserData* data); - void parseList(parserData* data, std::string element); - void parseListRing(parserData* data, std::string element); - void parseCheckbox(parserData* data, std::string element); - void parseImage(parserData* data, std::string element); - void parseItemImage(parserData* data,std::string element); - void parseButton(parserData* data,std::string element,std::string typ); - void parseBackground(parserData* data,std::string element); - void parseTableOptions(parserData* data,std::string element); - void parseTableColumns(parserData* data,std::string element); - void parseTable(parserData* data,std::string element); - void parseTextList(parserData* data,std::string element); - void parseDropDown(parserData* data,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 parseItemImage(parserData* data, const std::string &element); + void parseButton(parserData* data, const std::string &element, + const std::string &typ); + void parseBackground(parserData* data, const std::string &element); + void parseTableOptions(parserData* data, const std::string &element); + void parseTableColumns(parserData* data, const std::string &element); + void parseTable(parserData* data, const std::string &element); + void parseTextList(parserData* data, const std::string &element); + void parseDropDown(parserData* data, const std::string &element); void parseFieldCloseOnEnter(parserData *data, const std::string &element); - void parsePwdField(parserData* data,std::string element); - void parseField(parserData* data,std::string element,std::string type); + void parsePwdField(parserData* data, const std::string &element); + void parseField(parserData* data, const std::string &element, const std::string &type); void parseSimpleField(parserData* data,std::vector<std::string> &parts); void parseTextArea(parserData* data,std::vector<std::string>& parts, - std::string type); - void parseLabel(parserData* data,std::string element); - void parseVertLabel(parserData* data,std::string element); - void parseImageButton(parserData* data,std::string element,std::string type); - void parseItemImageButton(parserData* data,std::string element); - void parseTabHeader(parserData* data,std::string element); - void parseBox(parserData* data,std::string element); - void parseBackgroundColor(parserData* data,std::string element); - void parseListColors(parserData* data,std::string element); - void parseTooltip(parserData* data,std::string element); - bool parseVersionDirect(std::string data); - bool parseSizeDirect(parserData* data, std::string element); - void parseScrollBar(parserData* data, std::string element); + const std::string &type); + 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 parseItemImageButton(parserData* data, const std::string &element); + void parseTabHeader(parserData* data, const std::string &element); + void parseBox(parserData* data, const std::string &element); + void parseBackgroundColor(parserData* data, const std::string &element); + void parseListColors(parserData* data, const std::string &element); + void parseTooltip(parserData* data, const std::string &element); + bool parseVersionDirect(const std::string &data); + bool parseSizeDirect(parserData* data, const std::string &element); + void parseScrollBar(parserData* data, const std::string &element); + bool parsePositionDirect(parserData *data, const std::string &element); + void parsePosition(parserData *data, const std::string &element); + bool parseAnchorDirect(parserData *data, const std::string &element); + void parseAnchor(parserData *data, const std::string &element); void tryClose(); + void showTooltip(const std::wstring &text, const irr::video::SColor &color, + const irr::video::SColor &bgcolor); + /** * check if event is part of a double click * @param event event to evaluate @@ -520,7 +530,7 @@ private: struct clickpos { v2s32 pos; - s32 time; + s64 time; }; clickpos m_doubleclickdetect[2]; @@ -547,23 +557,22 @@ private: class FormspecFormSource: public IFormSource { public: - FormspecFormSource(std::string formspec) + FormspecFormSource(const std::string &formspec): + m_formspec(formspec) { - m_formspec = formspec; } ~FormspecFormSource() - {} - - void setForm(std::string formspec) { - m_formspec = FORMSPEC_VERSION_STRING + formspec; + { } - std::string getForm() + void setForm(const std::string &formspec) { - return m_formspec; + m_formspec = FORMSPEC_VERSION_STRING + formspec; } + std::string getForm() { return m_formspec; } + std::string m_formspec; }; diff --git a/src/guiKeyChangeMenu.cpp b/src/guiKeyChangeMenu.cpp index 07137d1bc..ae53c56f9 100644 --- a/src/guiKeyChangeMenu.cpp +++ b/src/guiKeyChangeMenu.cpp @@ -53,10 +53,16 @@ enum GUI_ID_KEY_CINEMATIC_BUTTON, GUI_ID_KEY_CHAT_BUTTON, GUI_ID_KEY_CMD_BUTTON, + GUI_ID_KEY_CMD_LOCAL_BUTTON, GUI_ID_KEY_CONSOLE_BUTTON, GUI_ID_KEY_SNEAK_BUTTON, GUI_ID_KEY_DROP_BUTTON, GUI_ID_KEY_INVENTORY_BUTTON, + GUI_ID_KEY_HOTBAR_PREV_BUTTON, + GUI_ID_KEY_HOTBAR_NEXT_BUTTON, + GUI_ID_KEY_MUTE_BUTTON, + GUI_ID_KEY_DEC_VOLUME_BUTTON, + GUI_ID_KEY_INC_VOLUME_BUTTON, GUI_ID_KEY_DUMP_BUTTON, GUI_ID_KEY_RANGE_BUTTON, GUI_ID_KEY_ZOOM_BUTTON, @@ -108,7 +114,7 @@ void GUIKeyChangeMenu::removeChildren() void GUIKeyChangeMenu::regenerateGui(v2u32 screensize) { removeChildren(); - v2s32 size(620, 430); + v2s32 size(745, 430); core::rect < s32 > rect(screensize.X / 2 - size.X / 2, screensize.Y / 2 - size.Y / 2, screensize.X / 2 + size.X / 2, @@ -145,15 +151,17 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize) { core::rect < s32 > rect(0, 0, 100, 30); - rect += topleft + v2s32(offset.X + 115, offset.Y - 5); + rect += topleft + v2s32(offset.X + 120, offset.Y - 5); const wchar_t *text = wgettext(k->key.name()); k->button = Environment->addButton(rect, this, k->id, text); delete[] text; } - if(i + 1 == KMaxButtonPerColumns) - offset = v2s32(260, 60); - else + if ((i + 1) % KMaxButtonPerColumns == 0) { + offset.X += 230; + offset.Y = 60; + } else { offset += v2s32(0, 25); + } } { @@ -214,7 +222,7 @@ void GUIKeyChangeMenu::drawMenu() video::SColor bgcolor(140, 0, 0, 0); { - core::rect < s32 > rect(0, 0, 620, 620); + core::rect < s32 > rect(0, 0, 745, 620); rect += AbsoluteRect.UpperLeftCorner; driver->draw2DRectangle(bgcolor, rect, &AbsoluteClippingRect); } @@ -406,8 +414,14 @@ void GUIKeyChangeMenu::init_keys() this->add_key(GUI_ID_KEY_SNEAK_BUTTON, wgettext("Sneak"), "keymap_sneak"); this->add_key(GUI_ID_KEY_DROP_BUTTON, wgettext("Drop"), "keymap_drop"); this->add_key(GUI_ID_KEY_INVENTORY_BUTTON, wgettext("Inventory"), "keymap_inventory"); + this->add_key(GUI_ID_KEY_HOTBAR_PREV_BUTTON,wgettext("Prev. item"), "keymap_hotbar_previous"); + this->add_key(GUI_ID_KEY_HOTBAR_NEXT_BUTTON,wgettext("Next item"), "keymap_hotbar_next"); + this->add_key(GUI_ID_KEY_MUTE_BUTTON, wgettext("Mute"), "keymap_mute"); + this->add_key(GUI_ID_KEY_DEC_VOLUME_BUTTON,wgettext("Dec. volume"), "keymap_decrease_volume"); + this->add_key(GUI_ID_KEY_INC_VOLUME_BUTTON,wgettext("Inc. volume"), "keymap_increase_volume"); this->add_key(GUI_ID_KEY_CHAT_BUTTON, wgettext("Chat"), "keymap_chat"); this->add_key(GUI_ID_KEY_CMD_BUTTON, wgettext("Command"), "keymap_cmd"); + this->add_key(GUI_ID_KEY_CMD_LOCAL_BUTTON, wgettext("Local command"), "keymap_cmd_local"); this->add_key(GUI_ID_KEY_CONSOLE_BUTTON, wgettext("Console"), "keymap_console"); this->add_key(GUI_ID_KEY_FLY_BUTTON, wgettext("Toggle fly"), "keymap_freemove"); this->add_key(GUI_ID_KEY_FAST_BUTTON, wgettext("Toggle fast"), "keymap_fastmove"); diff --git a/src/guiKeyChangeMenu.h b/src/guiKeyChangeMenu.h index 19a07620d..1aa400632 100644 --- a/src/guiKeyChangeMenu.h +++ b/src/guiKeyChangeMenu.h @@ -30,7 +30,8 @@ #include <string> #include <vector> -struct key_setting { +struct key_setting +{ int id; const wchar_t *button_name; KeyPress key; @@ -38,12 +39,11 @@ struct key_setting { gui::IGUIButton *button; }; - -class GUIKeyChangeMenu: public GUIModalMenu +class GUIKeyChangeMenu : public GUIModalMenu { public: - GUIKeyChangeMenu(gui::IGUIEnvironment* env, gui::IGUIElement* parent, - s32 id, IMenuManager *menumgr); + GUIKeyChangeMenu(gui::IGUIEnvironment *env, gui::IGUIElement *parent, s32 id, + IMenuManager *menumgr); ~GUIKeyChangeMenu(); void removeChildren(); @@ -56,10 +56,9 @@ public: bool acceptInput(); - bool OnEvent(const SEvent& event); + bool OnEvent(const SEvent &event); private: - void init_keys(); bool resetMenu(); @@ -67,13 +66,12 @@ private: void add_key(int id, const wchar_t *button_name, const std::string &setting_name); bool shift_down; - + s32 activeKey; - + std::vector<KeyPress> key_used; gui::IGUIStaticText *key_used_text; std::vector<key_setting *> key_settings; }; #endif - diff --git a/src/guiPasswordChange.cpp b/src/guiPasswordChange.cpp index e2f9994be..c8eb36e5f 100644 --- a/src/guiPasswordChange.cpp +++ b/src/guiPasswordChange.cpp @@ -33,6 +33,7 @@ const int ID_newPassword1 = 257; const int ID_newPassword2 = 258; const int ID_change = 259; const int ID_message = 260; +const int ID_cancel = 261; GUIPasswordChange::GUIPasswordChange(gui::IGUIEnvironment* env, gui::IGUIElement* parent, s32 id, @@ -40,7 +41,10 @@ GUIPasswordChange::GUIPasswordChange(gui::IGUIEnvironment* env, Client* client ): GUIModalMenu(env, parent, id, menumgr), - m_client(client) + m_client(client), + m_oldpass(L""), + m_newpass(L""), + m_newpass_confirm(L"") { } @@ -51,31 +55,25 @@ GUIPasswordChange::~GUIPasswordChange() void GUIPasswordChange::removeChildren() { - { - gui::IGUIElement *e = getElementFromId(ID_oldPassword); - if(e != NULL) - e->remove(); - } - { - gui::IGUIElement *e = getElementFromId(ID_newPassword1); - if(e != NULL) - e->remove(); + const core::list<gui::IGUIElement *> &children = getChildren(); + core::list<gui::IGUIElement *> children_copy; + for (core::list<gui::IGUIElement *>::ConstIterator i = children.begin(); + i != children.end(); i++) { + children_copy.push_back(*i); } - { - gui::IGUIElement *e = getElementFromId(ID_newPassword2); - if(e != NULL) - e->remove(); - } - { - gui::IGUIElement *e = getElementFromId(ID_change); - if(e != NULL) - e->remove(); + for (core::list<gui::IGUIElement *>::Iterator i = children_copy.begin(); + i != children_copy.end(); i++) { + (*i)->remove(); } } - void GUIPasswordChange::regenerateGui(v2u32 screensize) { /* + save current input + */ + acceptInput(); + + /* Remove stuff */ removeChildren(); @@ -104,7 +102,7 @@ void GUIPasswordChange::regenerateGui(v2u32 screensize) s32 ypos = 50; { core::rect<s32> rect(0, 0, 150, 20); - rect += topleft_client + v2s32(25, ypos+6); + rect += topleft_client + v2s32(25, ypos + 6); text = wgettext("Old Password"); Environment->addStaticText(text, rect, false, true, this, -1); delete[] text; @@ -112,15 +110,15 @@ void GUIPasswordChange::regenerateGui(v2u32 screensize) { core::rect<s32> rect(0, 0, 230, 30); rect += topleft_client + v2s32(160, ypos); - gui::IGUIEditBox *e = - Environment->addEditBox(L"", rect, true, this, ID_oldPassword); + gui::IGUIEditBox *e = Environment->addEditBox( + m_oldpass.c_str(), rect, true, this, ID_oldPassword); Environment->setFocus(e); e->setPasswordBox(true); } ypos += 50; { core::rect<s32> rect(0, 0, 150, 20); - rect += topleft_client + v2s32(25, ypos+6); + rect += topleft_client + v2s32(25, ypos + 6); text = wgettext("New Password"); Environment->addStaticText(text, rect, false, true, this, -1); delete[] text; @@ -128,14 +126,14 @@ void GUIPasswordChange::regenerateGui(v2u32 screensize) { core::rect<s32> rect(0, 0, 230, 30); rect += topleft_client + v2s32(160, ypos); - gui::IGUIEditBox *e = - Environment->addEditBox(L"", rect, true, this, ID_newPassword1); + gui::IGUIEditBox *e = Environment->addEditBox( + m_newpass.c_str(), rect, true, this, ID_newPassword1); e->setPasswordBox(true); } ypos += 50; { core::rect<s32> rect(0, 0, 150, 20); - rect += topleft_client + v2s32(25, ypos+6); + rect += topleft_client + v2s32(25, ypos + 6); text = wgettext("Confirm Password"); Environment->addStaticText(text, rect, false, true, this, -1); delete[] text; @@ -143,19 +141,26 @@ void GUIPasswordChange::regenerateGui(v2u32 screensize) { core::rect<s32> rect(0, 0, 230, 30); rect += topleft_client + v2s32(160, ypos); - gui::IGUIEditBox *e = - Environment->addEditBox(L"", rect, true, this, ID_newPassword2); + gui::IGUIEditBox *e = Environment->addEditBox( + m_newpass_confirm.c_str(), rect, true, this, ID_newPassword2); e->setPasswordBox(true); } ypos += 50; { - core::rect<s32> rect(0, 0, 140, 30); - rect = rect + v2s32(size.X/2-140/2, ypos); + core::rect<s32> rect(0, 0, 100, 30); + rect = rect + v2s32(size.X / 4 + 56, ypos); text = wgettext("Change"); Environment->addButton(rect, this, ID_change, text); delete[] text; } + { + core::rect<s32> rect(0, 0, 100, 30); + rect = rect + v2s32(size.X / 4 + 185, ypos); + text = wgettext("Cancel"); + Environment->addButton(rect, this, ID_cancel, text); + delete[] text; + } ypos += 50; { @@ -163,9 +168,8 @@ void GUIPasswordChange::regenerateGui(v2u32 screensize) rect += topleft_client + v2s32(35, ypos); text = wgettext("Passwords do not match!"); IGUIElement *e = - Environment->addStaticText( - text, - rect, false, true, this, ID_message); + Environment->addStaticText( + text, rect, false, true, this, ID_message); e->setVisible(false); delete[] text; } @@ -173,88 +177,86 @@ void GUIPasswordChange::regenerateGui(v2u32 screensize) void GUIPasswordChange::drawMenu() { - gui::IGUISkin* skin = Environment->getSkin(); + gui::IGUISkin *skin = Environment->getSkin(); if (!skin) return; - video::IVideoDriver* driver = Environment->getVideoDriver(); + video::IVideoDriver *driver = Environment->getVideoDriver(); - video::SColor bgcolor(140,0,0,0); + video::SColor bgcolor(140, 0, 0, 0); driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect); gui::IGUIElement::draw(); } -bool GUIPasswordChange::acceptInput() +void GUIPasswordChange::acceptInput() { - std::wstring oldpass; - std::wstring newpass; - gui::IGUIElement *e; - e = getElementFromId(ID_oldPassword); - if(e != NULL) - oldpass = e->getText(); - e = getElementFromId(ID_newPassword1); - if(e != NULL) - newpass = e->getText(); - e = getElementFromId(ID_newPassword2); - if(e != NULL && newpass != e->getText()) - { - e = getElementFromId(ID_message); - if(e != NULL) - e->setVisible(true); - return false; - } - m_client->sendChangePassword(wide_to_utf8(oldpass), - wide_to_utf8(newpass)); - return true; + gui::IGUIElement *e; + e = getElementFromId(ID_oldPassword); + if (e != NULL) + m_oldpass = e->getText(); + e = getElementFromId(ID_newPassword1); + if (e != NULL) + m_newpass = e->getText(); + e = getElementFromId(ID_newPassword2); + if (e != NULL) + m_newpass_confirm = e->getText(); } -bool GUIPasswordChange::OnEvent(const SEvent& event) +bool GUIPasswordChange::processInput() { - if(event.EventType==EET_KEY_INPUT_EVENT) - { - if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown) - { + if (m_newpass != m_newpass_confirm) { + gui::IGUIElement *e = getElementFromId(ID_message); + if (e != NULL) + e->setVisible(true); + return false; + } + m_client->sendChangePassword(wide_to_utf8(m_oldpass), wide_to_utf8(m_newpass)); + return true; +} + +bool GUIPasswordChange::OnEvent(const SEvent &event) +{ + if (event.EventType == EET_KEY_INPUT_EVENT) { + if (event.KeyInput.Key == KEY_ESCAPE && event.KeyInput.PressedDown) { quitMenu(); return true; } - if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown) - { - if(acceptInput()) + if (event.KeyInput.Key == KEY_RETURN && event.KeyInput.PressedDown) { + acceptInput(); + if (processInput()) quitMenu(); return true; } } - if(event.EventType==EET_GUI_EVENT) - { - if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST - && isVisible()) - { - if(!canTakeFocus(event.GUIEvent.Element)) - { - dstream<<"GUIPasswordChange: Not allowing focus change." - <<std::endl; + if (event.EventType == EET_GUI_EVENT) { + if (event.GUIEvent.EventType == gui::EGET_ELEMENT_FOCUS_LOST && + isVisible()) { + if (!canTakeFocus(event.GUIEvent.Element)) { + dstream << "GUIPasswordChange: Not allowing focus change." + << std::endl; // Returning true disables focus change return true; } } - if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED) - { - switch(event.GUIEvent.Caller->getID()) - { + if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) { + switch (event.GUIEvent.Caller->getID()) { case ID_change: - if(acceptInput()) + acceptInput(); + if (processInput()) quitMenu(); return true; + case ID_cancel: + quitMenu(); + return true; } } - if(event.GUIEvent.EventType==gui::EGET_EDITBOX_ENTER) - { - switch(event.GUIEvent.Caller->getID()) - { + if (event.GUIEvent.EventType == gui::EGET_EDITBOX_ENTER) { + switch (event.GUIEvent.Caller->getID()) { case ID_oldPassword: case ID_newPassword1: case ID_newPassword2: - if(acceptInput()) + acceptInput(); + if (processInput()) quitMenu(); return true; } @@ -263,4 +265,3 @@ bool GUIPasswordChange::OnEvent(const SEvent& event) return Parent ? Parent->OnEvent(event) : false; } - diff --git a/src/guiPasswordChange.h b/src/guiPasswordChange.h index aecc7076f..9680ef13d 100644 --- a/src/guiPasswordChange.h +++ b/src/guiPasswordChange.h @@ -27,12 +27,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. class GUIPasswordChange : public GUIModalMenu { public: - GUIPasswordChange(gui::IGUIEnvironment* env, - gui::IGUIElement* parent, s32 id, - IMenuManager *menumgr, - Client* client); + GUIPasswordChange(gui::IGUIEnvironment *env, gui::IGUIElement *parent, s32 id, + IMenuManager *menumgr, Client *client); ~GUIPasswordChange(); - + void removeChildren(); /* Remove and re-add (or reposition) stuff @@ -41,14 +39,17 @@ public: void drawMenu(); - bool acceptInput(); + void acceptInput(); - bool OnEvent(const SEvent& event); - -private: - Client* m_client; + bool processInput(); + + bool OnEvent(const SEvent &event); +private: + Client *m_client; + std::wstring m_oldpass; + std::wstring m_newpass; + std::wstring m_newpass_confirm; }; #endif - diff --git a/src/guiTable.cpp b/src/guiTable.cpp index 6b33b8266..d223e3069 100644 --- a/src/guiTable.cpp +++ b/src/guiTable.cpp @@ -828,7 +828,7 @@ bool GUITable::OnEvent(const SEvent &event) } else if (event.KeyInput.PressedDown && event.KeyInput.Char) { // change selection based on text as it is typed - s32 now = getTimeMs(); + u64 now = porting::getTimeMs(); if (now - m_keynav_time >= 500) m_keynav_buffer = L""; m_keynav_time = now; diff --git a/src/guiTable.h b/src/guiTable.h index 4d5b39166..02e8af00b 100644 --- a/src/guiTable.h +++ b/src/guiTable.h @@ -74,11 +74,10 @@ public: std::string name; std::string value; - Option(const std::string &name_, const std::string &value_) - { - name = name_; - value = value_; - } + Option(const std::string &name_, const std::string &value_) : + name(name_), + value(value_) + {} }; /* @@ -197,7 +196,7 @@ protected: bool m_sel_doubleclick; // Keyboard navigation stuff - s32 m_keynav_time; + u64 m_keynav_time; core::stringw m_keynav_buffer; // Drawing and geometry information diff --git a/src/guiVolumeChange.cpp b/src/guiVolumeChange.cpp index 8425bc04f..c7868ad35 100644 --- a/src/guiVolumeChange.cpp +++ b/src/guiVolumeChange.cpp @@ -30,10 +30,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "gettext.h" -const int ID_soundText1 = 263; -const int ID_soundText2 = 264; -const int ID_soundExitButton = 265; -const int ID_soundSlider = 266; +const int ID_soundText = 263; +const int ID_soundExitButton = 264; +const int ID_soundSlider = 265; GUIVolumeChange::GUIVolumeChange(gui::IGUIEnvironment* env, gui::IGUIElement* parent, s32 id, @@ -50,10 +49,7 @@ GUIVolumeChange::~GUIVolumeChange() void GUIVolumeChange::removeChildren() { - if (gui::IGUIElement *e = getElementFromId(ID_soundText1)) - e->remove(); - - if (gui::IGUIElement *e = getElementFromId(ID_soundText2)) + if (gui::IGUIElement *e = getElementFromId(ID_soundText)) e->remove(); if (gui::IGUIElement *e = getElementFromId(ID_soundExitButton)) @@ -69,39 +65,35 @@ void GUIVolumeChange::regenerateGui(v2u32 screensize) Remove stuff */ removeChildren(); - + /* Calculate new sizes and positions */ - core::rect<s32> rect( - screensize.X/2 - 380/2, - screensize.Y/2 - 200/2, - screensize.X/2 + 380/2, - screensize.Y/2 + 200/2 + DesiredRect = core::rect<s32>( + screensize.X/2 - 380/2, + screensize.Y/2 - 200/2, + screensize.X/2 + 380/2, + screensize.Y/2 + 200/2 ); - - DesiredRect = rect; recalculateAbsolutePosition(false); - v2s32 size = rect.getSize(); - v2s32 topleft_client(40, 0); - int volume = (int)(g_settings->getFloat("sound_volume")*100); + v2s32 size = DesiredRect.getSize(); + int volume = (int)(g_settings->getFloat("sound_volume") * 100); + /* Add stuff */ { - core::rect<s32> rect(0, 0, 120, 20); - rect = rect + v2s32(size.X/2-60, size.Y/2-35); + core::rect<s32> rect(0, 0, 160, 20); + rect = rect + v2s32(size.X / 2 - 80, size.Y / 2 - 35); + const wchar_t *text = wgettext("Sound Volume: "); - Environment->addStaticText(text, rect, false, - true, this, ID_soundText1); - delete[] text; - } - { - core::rect<s32> rect(0, 0, 30, 20); - rect = rect + v2s32(size.X/2+40, size.Y/2-35); - Environment->addStaticText(core::stringw(volume).c_str(), rect, false, - true, this, ID_soundText2); + core::stringw volume_text = text; + delete [] text; + + volume_text += core::stringw(volume) + core::stringw("%"); + Environment->addStaticText(volume_text.c_str(), rect, false, + true, this, ID_soundText); } { core::rect<s32> rect(0, 0, 80, 30); @@ -156,10 +148,15 @@ bool GUIVolumeChange::OnEvent(const SEvent& event) if (event.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED) { if (event.GUIEvent.Caller->getID() == ID_soundSlider) { s32 pos = ((gui::IGUIScrollBar*)event.GUIEvent.Caller)->getPos(); - g_settings->setFloat("sound_volume", (float)pos/100); + g_settings->setFloat("sound_volume", (float) pos / 100); + + gui::IGUIElement *e = getElementFromId(ID_soundText); + const wchar_t *text = wgettext("Sound Volume: "); + core::stringw volume_text = text; + delete [] text; - gui::IGUIElement *e = getElementFromId(ID_soundText2); - e->setText(core::stringw(pos).c_str()); + volume_text += core::stringw(pos) + core::stringw("%"); + e->setText(volume_text.c_str()); return true; } } diff --git a/src/httpfetch.cpp b/src/httpfetch.cpp index f64c9f717..3b3f5d331 100644 --- a/src/httpfetch.cpp +++ b/src/httpfetch.cpp @@ -40,16 +40,15 @@ Mutex g_httpfetch_mutex; std::map<unsigned long, std::queue<HTTPFetchResult> > g_httpfetch_results; PcgRandom g_callerid_randomness; -HTTPFetchRequest::HTTPFetchRequest() +HTTPFetchRequest::HTTPFetchRequest() : + url(""), + caller(HTTPFETCH_DISCARD), + request_id(0), + timeout(g_settings->getS32("curl_timeout")), + connect_timeout(timeout), + multipart(false), + useragent(std::string(PROJECT_NAME_C "/") + g_version_hash + " (" + porting::get_sysinfo() + ")") { - url = ""; - caller = HTTPFETCH_DISCARD; - request_id = 0; - timeout = g_settings->getS32("curl_timeout"); - connect_timeout = timeout; - multipart = false; - - useragent = std::string(PROJECT_NAME_C "/") + g_version_hash + " (" + porting::get_sysinfo() + ")"; } @@ -207,7 +206,7 @@ public: class HTTPFetchOngoing { public: - HTTPFetchOngoing(HTTPFetchRequest request, CurlHandlePool *pool); + HTTPFetchOngoing(const HTTPFetchRequest &request, CurlHandlePool *pool); ~HTTPFetchOngoing(); CURLcode start(CURLM *multi); @@ -228,7 +227,8 @@ private: }; -HTTPFetchOngoing::HTTPFetchOngoing(HTTPFetchRequest request_, CurlHandlePool *pool_): +HTTPFetchOngoing::HTTPFetchOngoing(const HTTPFetchRequest &request_, + CurlHandlePool *pool_): pool(pool_), curl(NULL), multi(NULL), diff --git a/src/httpfetch.h b/src/httpfetch.h index f57ed8789..29fb540d0 100644 --- a/src/httpfetch.h +++ b/src/httpfetch.h @@ -61,7 +61,7 @@ struct HTTPFetchRequest // If not empty, should contain entries such as "Accept: text/html" std::vector<std::string> extra_headers; - //useragent to use + // useragent to use std::string useragent; HTTPFetchRequest(); @@ -78,25 +78,16 @@ struct HTTPFetchResult unsigned long request_id; HTTPFetchResult() + : succeeded(false), timeout(false), response_code(0), data(""), + caller(HTTPFETCH_DISCARD), request_id(0) { - succeeded = false; - timeout = false; - response_code = 0; - data = ""; - caller = HTTPFETCH_DISCARD; - request_id = 0; } HTTPFetchResult(const HTTPFetchRequest &fetch_request) + : succeeded(false), timeout(false), response_code(0), data(""), + caller(fetch_request.caller), request_id(fetch_request.request_id) { - succeeded = false; - timeout = false; - response_code = 0; - data = ""; - caller = fetch_request.caller; - request_id = fetch_request.request_id; } - }; // Initializes the httpfetch module @@ -126,8 +117,6 @@ void httpfetch_caller_free(unsigned long caller); // Performs a synchronous HTTP request. This blocks and therefore should // only be used from background threads. -void httpfetch_sync(const HTTPFetchRequest &fetch_request, - HTTPFetchResult &fetch_result); - +void httpfetch_sync(const HTTPFetchRequest &fetch_request, HTTPFetchResult &fetch_result); #endif // !HTTPFETCH_HEADER diff --git a/src/hud.cpp b/src/hud.cpp index 43d957380..a2f031b4c 100644 --- a/src/hud.cpp +++ b/src/hud.cpp @@ -22,10 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "hud.h" #include "settings.h" #include "util/numeric.h" -#include "util/string.h" #include "log.h" -#include "gamedef.h" -#include "itemdef.h" +#include "client.h" #include "inventory.h" #include "client/tile.h" #include "localplayer.h" @@ -34,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "fontengine.h" #include "guiscalingfilter.h" #include "mesh.h" +#include "wieldmesh.h" #include <IGUIStaticText.h> #ifdef HAVE_TOUCHSCREENGUI @@ -41,13 +40,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #endif Hud::Hud(video::IVideoDriver *driver, scene::ISceneManager* smgr, - gui::IGUIEnvironment* guienv, IGameDef *gamedef, LocalPlayer *player, + gui::IGUIEnvironment* guienv, Client *client, LocalPlayer *player, Inventory *inventory) { this->driver = driver; this->smgr = smgr; this->guienv = guienv; - this->gamedef = gamedef; + this->client = client; this->player = player; this->inventory = inventory; @@ -61,7 +60,7 @@ Hud::Hud(video::IVideoDriver *driver, scene::ISceneManager* smgr, for (unsigned int i = 0; i < 4; i++) hbar_colors[i] = video::SColor(255, 255, 255, 255); - tsrc = gamedef->getTextureSource(); + tsrc = client->getTextureSource(); v3f crosshair_color = g_settings->getV3F("crosshair_color"); u32 cross_r = rangelim(myround(crosshair_color.X), 0, 255); @@ -88,24 +87,31 @@ Hud::Hud(video::IVideoDriver *driver, scene::ISceneManager* smgr, m_halo_boxes.clear(); m_selection_pos = v3f(0.0, 0.0, 0.0); - std::string mode = g_settings->get("node_highlighting"); + std::string mode_setting = g_settings->get("node_highlighting"); + + if (mode_setting == "halo") { + m_mode = HIGHLIGHT_HALO; + } else if (mode_setting == "none") { + m_mode = HIGHLIGHT_NONE; + } else { + m_mode = HIGHLIGHT_BOX; + } + m_selection_material.Lighting = false; if (g_settings->getBool("enable_shaders")) { - IShaderSource *shdrsrc = gamedef->getShaderSource(); + IShaderSource *shdrsrc = client->getShaderSource(); u16 shader_id = shdrsrc->getShader( - mode == "halo" ? "selection_shader" : "default_shader", 1, 1); + m_mode == HIGHLIGHT_HALO ? "selection_shader" : "default_shader", 1, 1); m_selection_material.MaterialType = shdrsrc->getShaderInfo(shader_id).material; } else { m_selection_material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; } - if (mode == "box") { - m_use_selection_mesh = false; + if (m_mode == HIGHLIGHT_BOX) { m_selection_material.Thickness = rangelim(g_settings->getS16("selectionbox_width"), 1, 5); - } else if (mode == "halo") { - m_use_selection_mesh = true; + } else if (m_mode == HIGHLIGHT_HALO) { m_selection_material.setTexture(0, tsrc->getTextureForMesh("halo.png")); m_selection_material.setFlag(video::EMF_BACK_FACE_CULLING, true); } else { @@ -193,7 +199,7 @@ void Hud::drawItem(const ItemStack &item, const core::rect<s32>& rect, if (!use_hotbar_image) driver->draw2DRectangle(bgcolor2, rect, NULL); drawItemStack(driver, g_fontengine->getFont(), item, rect, NULL, - gamedef, selected ? IT_ROT_SELECTED : IT_ROT_NONE); + client, selected ? IT_ROT_SELECTED : IT_ROT_NONE); } //NOTE: selectitem = 0 -> no selected; selectitem 1-based @@ -519,7 +525,7 @@ void Hud::setSelectionPos(const v3f &pos, const v3s16 &camera_offset) void Hud::drawSelectionMesh() { - if (!m_use_selection_mesh) { + if (m_mode == HIGHLIGHT_BOX) { // Draw 3D selection boxes video::SMaterial oldmaterial = driver->getMaterial2D(); driver->setMaterial(m_selection_material); @@ -539,7 +545,7 @@ void Hud::drawSelectionMesh() driver->draw3DBox(box, video::SColor(255, r, g, b)); } driver->setMaterial(oldmaterial); - } else if (m_selection_mesh) { + } else if (m_mode == HIGHLIGHT_HALO && m_selection_mesh) { // Draw selection mesh video::SMaterial oldmaterial = driver->getMaterial2D(); driver->setMaterial(m_selection_material); @@ -565,7 +571,7 @@ void Hud::drawSelectionMesh() void Hud::updateSelectionMesh(const v3s16 &camera_offset) { m_camera_offset = camera_offset; - if (!m_use_selection_mesh) + if (m_mode != HIGHLIGHT_HALO) return; if (m_selection_mesh) { @@ -620,7 +626,7 @@ void Hud::resizeHotbar() { } struct MeshTimeInfo { - s32 time; + u64 time; scene::IMesh *mesh; }; @@ -629,7 +635,7 @@ void drawItemStack(video::IVideoDriver *driver, const ItemStack &item, const core::rect<s32> &rect, const core::rect<s32> *clip, - IGameDef *gamedef, + Client *client, ItemRotationKind rotation_kind) { static MeshTimeInfo rotation_time_infos[IT_ROT_NONE]; @@ -643,19 +649,20 @@ void drawItemStack(video::IVideoDriver *driver, return; } - const ItemDefinition &def = item.getDefinition(gamedef->idef()); - scene::IMesh* mesh = gamedef->idef()->getWieldMesh(def.name, gamedef); + const ItemDefinition &def = item.getDefinition(client->idef()); + ItemMesh *imesh = client->idef()->getWieldMesh(def.name, client); - if (mesh) { + if (imesh && imesh->mesh) { + scene::IMesh *mesh = imesh->mesh; driver->clearZBuffer(); s32 delta = 0; if (rotation_kind < IT_ROT_NONE) { MeshTimeInfo &ti = rotation_time_infos[rotation_kind]; if (mesh != ti.mesh) { ti.mesh = mesh; - ti.time = getTimeMs(); + ti.time = porting::getTimeMs(); } else { - delta = porting::getDeltaMs(ti.time, getTimeMs()) % 100000; + delta = porting::getDeltaMs(ti.time, porting::getTimeMs()) % 100000; } } core::rect<s32> oldViewPort = driver->getViewPort(); @@ -669,16 +676,32 @@ void drawItemStack(video::IVideoDriver *driver, matrix.makeIdentity(); if (enable_animations) { - float timer_f = (float)delta / 5000.0; + float timer_f = (float) delta / 5000.0; matrix.setRotationDegrees(core::vector3df(0, 360 * timer_f, 0)); } driver->setTransform(video::ETS_WORLD, matrix); driver->setViewPort(rect); + video::SColor basecolor = + client->idef()->getItemstackColor(item, client); + u32 mc = mesh->getMeshBufferCount(); for (u32 j = 0; j < mc; ++j) { scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); + // we can modify vertices relatively fast, + // because these meshes are not buffered. + assert(buf->getHardwareMappingHint_Vertex() == scene::EHM_NEVER); + video::SColor c = basecolor; + if (imesh->buffer_colors.size() > j) { + ItemPartColor *p = &imesh->buffer_colors[j]; + if (p->override_base) + c = p->color; + } + if (imesh->needs_shading) + colorizeMeshBuffer(buf, &c); + else + setMeshBufferColor(buf, c); video::SMaterial &material = buf->getMaterial(); material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; material.Lighting = false; @@ -95,7 +95,7 @@ struct HudElement { #include <IGUIFont.h> #include "irr_aabb3d.h" -class IGameDef; +class Client; class ITextureSource; class Inventory; class InventoryList; @@ -107,7 +107,7 @@ public: video::IVideoDriver *driver; scene::ISceneManager* smgr; gui::IGUIEnvironment *guienv; - IGameDef *gamedef; + Client *client; LocalPlayer *player; Inventory *inventory; ITextureSource *tsrc; @@ -121,7 +121,7 @@ public: bool use_hotbar_selected_image; Hud(video::IVideoDriver *driver,scene::ISceneManager* smgr, - gui::IGUIEnvironment* guienv, IGameDef *gamedef, LocalPlayer *player, + gui::IGUIEnvironment* guienv, Client *client, LocalPlayer *player, Inventory *inventory); ~Hud(); @@ -175,7 +175,11 @@ private: v3f m_selected_face_normal; video::SMaterial m_selection_material; - bool m_use_selection_mesh; + + enum { + HIGHLIGHT_BOX, + HIGHLIGHT_HALO, + HIGHLIGHT_NONE } m_mode; }; enum ItemRotationKind { @@ -190,7 +194,7 @@ void drawItemStack(video::IVideoDriver *driver, const ItemStack &item, const core::rect<s32> &rect, const core::rect<s32> *clip, - IGameDef *gamedef, + Client *client, ItemRotationKind rotation_kind); #endif diff --git a/src/intlGUIEditBox.cpp b/src/intlGUIEditBox.cpp index 29f828076..37687e1e4 100644 --- a/src/intlGUIEditBox.cpp +++ b/src/intlGUIEditBox.cpp @@ -29,6 +29,7 @@ // This file is part of the "Irrlicht Engine". // For conditions of distribution and use, see copyright notice in irrlicht.h +#include <util/numeric.h> #include "intlGUIEditBox.h" #if defined(_IRR_COMPILE_WITH_GUI_) && IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9 @@ -1096,39 +1097,39 @@ s32 intlGUIEditBox::getCursorPos(s32 x, s32 y) const u32 lineCount = (WordWrap || MultiLine) ? BrokenText.size() : 1; - core::stringw *txtLine=0; - s32 startPos=0; - x+=3; + core::stringw *txtLine = NULL; + s32 startPos = 0; + u32 curr_line_idx = 0; + x += 3; - for (u32 i=0; i < lineCount; ++i) - { - setTextRect(i); - if (i == 0 && y < CurrentTextRect.UpperLeftCorner.Y) + for (; curr_line_idx < lineCount; ++curr_line_idx) { + setTextRect(curr_line_idx); + if (curr_line_idx == 0 && y < CurrentTextRect.UpperLeftCorner.Y) y = CurrentTextRect.UpperLeftCorner.Y; - if (i == lineCount - 1 && y > CurrentTextRect.LowerRightCorner.Y ) + if (curr_line_idx == lineCount - 1 && y > CurrentTextRect.LowerRightCorner.Y) y = CurrentTextRect.LowerRightCorner.Y; // is it inside this region? - if (y >= CurrentTextRect.UpperLeftCorner.Y && y <= CurrentTextRect.LowerRightCorner.Y) - { + if (y >= CurrentTextRect.UpperLeftCorner.Y && y <= CurrentTextRect.LowerRightCorner.Y) { // we've found the clicked line - txtLine = (WordWrap || MultiLine) ? &BrokenText[i] : &Text; - startPos = (WordWrap || MultiLine) ? BrokenTextPositions[i] : 0; + txtLine = (WordWrap || MultiLine) ? &BrokenText[curr_line_idx] : &Text; + startPos = (WordWrap || MultiLine) ? BrokenTextPositions[curr_line_idx] : 0; break; } } if (x < CurrentTextRect.UpperLeftCorner.X) x = CurrentTextRect.UpperLeftCorner.X; + else if (x > CurrentTextRect.LowerRightCorner.X) + x = CurrentTextRect.LowerRightCorner.X; - s32 idx = font->getCharacterFromPos(Text.c_str(), x - CurrentTextRect.UpperLeftCorner.X); - - // click was on or left of the line - if (idx != -1) - return idx + startPos; + s32 idx = font->getCharacterFromPos(txtLine->c_str(), x - CurrentTextRect.UpperLeftCorner.X); + // Special handling for last line, if we are on limits, add 1 extra shift because idx + // will be the last char, not null char of the wstring + if (curr_line_idx == lineCount - 1 && x == CurrentTextRect.LowerRightCorner.X) + idx++; - // click was off the right edge of the line, go to end. - return txtLine->size() + startPos; + return rangelim(idx + startPos, 0, S32_MAX); } diff --git a/src/intlGUIEditBox.h b/src/intlGUIEditBox.h index e3ee15a30..bb617476c 100644 --- a/src/intlGUIEditBox.h +++ b/src/intlGUIEditBox.h @@ -155,7 +155,7 @@ namespace gui gui::IGUIFont *OverrideFont, *LastBreakFont; IOSOperator* Operator; - u32 BlinkStartTime; + u64 BlinkStartTime; s32 CursorPos; s32 HScrollPos, VScrollPos; // scroll position in characters u32 Max; diff --git a/src/inventory.cpp b/src/inventory.cpp index cb8faecbc..8617f7263 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -45,82 +45,15 @@ static content_t content_translate_from_19_to_internal(content_t c_from) return c_from; } -// If the string contains spaces, quotes or control characters, encodes as JSON. -// Else returns the string unmodified. -static std::string serializeJsonStringIfNeeded(const std::string &s) +ItemStack::ItemStack(const std::string &name_, u16 count_, + u16 wear_, IItemDefManager *itemdef) : + name(itemdef->getAlias(name_)), + count(count_), + wear(wear_) { - for(size_t i = 0; i < s.size(); ++i) - { - if(s[i] <= 0x1f || s[i] >= 0x7f || s[i] == ' ' || s[i] == '\"') - return serializeJsonString(s); - } - return s; -} - -// Parses a string serialized by serializeJsonStringIfNeeded. -static std::string deSerializeJsonStringIfNeeded(std::istream &is) -{ - std::ostringstream tmp_os; - bool expect_initial_quote = true; - bool is_json = false; - bool was_backslash = false; - for(;;) - { - char c = is.get(); - if(is.eof()) - break; - if(expect_initial_quote && c == '"') - { - tmp_os << c; - is_json = true; - } - else if(is_json) - { - tmp_os << c; - if(was_backslash) - was_backslash = false; - else if(c == '\\') - was_backslash = true; - else if(c == '"') - break; // Found end of string - } - else - { - if(c == ' ') - { - // Found end of word - is.unget(); - break; - } - else - { - tmp_os << c; - } - } - expect_initial_quote = false; - } - if(is_json) - { - std::istringstream tmp_is(tmp_os.str(), std::ios::binary); - return deSerializeJsonString(tmp_is); - } - else - return tmp_os.str(); -} - - -ItemStack::ItemStack(std::string name_, u16 count_, - u16 wear_, std::string metadata_, - IItemDefManager *itemdef) -{ - name = itemdef->getAlias(name_); - count = count_; - wear = wear_; - metadata = metadata_; - - if(name.empty() || count == 0) + if (name.empty() || count == 0) clear(); - else if(itemdef->get(name).type == ITEM_TOOL) + else if (itemdef->get(name).type == ITEM_TOOL) count = 1; } @@ -137,7 +70,7 @@ void ItemStack::serialize(std::ostream &os) const parts = 2; if(wear != 0) parts = 3; - if(metadata != "") + if (!metadata.empty()) parts = 4; os<<serializeJsonStringIfNeeded(name); @@ -145,8 +78,10 @@ void ItemStack::serialize(std::ostream &os) const os<<" "<<count; if(parts >= 3) os<<" "<<wear; - if(parts >= 4) - os<<" "<<serializeJsonStringIfNeeded(metadata); + if (parts >= 4) { + os << " "; + metadata.serialize(os); + } } void ItemStack::deSerialize(std::istream &is, IItemDefManager *itemdef) @@ -289,7 +224,7 @@ void ItemStack::deSerialize(std::istream &is, IItemDefManager *itemdef) wear = stoi(wear_str); // Read metadata - metadata = deSerializeJsonStringIfNeeded(is); + metadata.deSerialize(is); // In case fields are added after metadata, skip space here: //std::getline(is, tmp, ' '); @@ -335,7 +270,7 @@ ItemStack ItemStack::addItem(const ItemStack &newitem_, *this = newitem; newitem.clear(); } - // If item name or metadata differs, bail out + // If item name or metadata differs, bail out else if (name != newitem.name || metadata != newitem.metadata) { @@ -375,7 +310,7 @@ bool ItemStack::itemFits(const ItemStack &newitem_, { newitem.clear(); } - // If item name or metadata differs, bail out + // If item name or metadata differs, bail out else if (name != newitem.name || metadata != newitem.metadata) { @@ -434,14 +369,13 @@ ItemStack ItemStack::peekItem(u32 peekcount) const Inventory */ -InventoryList::InventoryList(std::string name, u32 size, IItemDefManager *itemdef) +InventoryList::InventoryList(const std::string &name, u32 size, IItemDefManager *itemdef): + m_name(name), + m_size(size), + m_width(0), + m_itemdef(itemdef) { - m_name = name; - m_size = size; - m_width = 0; - m_itemdef = itemdef; clearItems(); - //m_dirty = false; } InventoryList::~InventoryList() @@ -776,14 +710,6 @@ ItemStack InventoryList::takeItem(u32 i, u32 takecount) return taken; } -ItemStack InventoryList::peekItem(u32 i, u32 peekcount) const -{ - if(i >= m_items.size()) - return ItemStack(); - - return m_items[i].peekItem(peekcount); -} - void InventoryList::moveItemSomewhere(u32 i, InventoryList *dest, u32 count) { // Take item from source list diff --git a/src/inventory.h b/src/inventory.h index 7d7e58d61..a9fef3b05 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "debug.h" #include "itemdef.h" #include "irrlichttypes.h" +#include "itemstackmetadata.h" #include <istream> #include <ostream> #include <string> @@ -32,10 +33,10 @@ struct ToolCapabilities; struct ItemStack { - ItemStack(): name(""), count(0), wear(0), metadata("") {} - ItemStack(std::string name_, u16 count_, - u16 wear, std::string metadata_, - IItemDefManager *itemdef); + ItemStack(): name(""), count(0), wear(0) {} + ItemStack(const std::string &name_, u16 count_, + u16 wear, IItemDefManager *itemdef); + ~ItemStack() {} // Serialization @@ -61,7 +62,7 @@ struct ItemStack name = ""; count = 0; wear = 0; - metadata = ""; + metadata.clear(); } void add(u16 n) @@ -166,13 +167,13 @@ struct ItemStack std::string name; u16 count; u16 wear; - std::string metadata; + ItemStackMetadata metadata; }; class InventoryList { public: - InventoryList(std::string name, u32 size, IItemDefManager *itemdef); + InventoryList(const std::string &name, u32 size, IItemDefManager *itemdef); ~InventoryList(); void clearItems(); void setSize(u32 newsize); @@ -238,9 +239,6 @@ public: // Returns empty item if couldn't take any. ItemStack takeItem(u32 i, u32 takecount); - // Similar to takeItem, but keeps the slot intact. - ItemStack peekItem(u32 i, u32 peekcount) const; - // Move an item to a different list (or a different stack in the same list) // count is the maximum number of items to move (0 for everything) // returns number of moved items @@ -253,8 +251,8 @@ public: private: std::vector<ItemStack> m_items; - u32 m_size, m_width; std::string m_name; + u32 m_size, m_width; IItemDefManager *m_itemdef; }; @@ -313,4 +311,3 @@ private: }; #endif - diff --git a/src/inventorymanager.cpp b/src/inventorymanager.cpp index 3d8513492..c976bd037 100644 --- a/src/inventorymanager.cpp +++ b/src/inventorymanager.cpp @@ -19,15 +19,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "inventorymanager.h" #include "log.h" -#include "environment.h" -#include "scripting_game.h" +#include "serverenvironment.h" +#include "scripting_server.h" #include "serverobject.h" #include "settings.h" #include "craftdef.h" #include "rollback_interface.h" #include "util/strfnd.h" - -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" +#include "util/basic_macros.h" #define PLAYER_TO_SA(p) p->getEnv()->getScriptIface() diff --git a/src/irr_aabb3d.h b/src/irr_aabb3d.h index 7ac401837..4c6b3f5e6 100644 --- a/src/irr_aabb3d.h +++ b/src/irr_aabb3d.h @@ -27,4 +27,3 @@ with this program; if not, write to the Free Software Foundation, Inc., typedef core::aabbox3d<f32> aabb3f; #endif - diff --git a/src/irr_v2d.h b/src/irr_v2d.h index 5c0d65a30..617491cf0 100644 --- a/src/irr_v2d.h +++ b/src/irr_v2d.h @@ -31,4 +31,3 @@ typedef core::vector2d<u32> v2u32; typedef core::vector2d<f32> v2f32; #endif - diff --git a/src/irr_v3d.h b/src/irr_v3d.h index f74d601e8..fa6af3661 100644 --- a/src/irr_v3d.h +++ b/src/irr_v3d.h @@ -30,4 +30,3 @@ typedef core::vector3d<u16> v3u16; typedef core::vector3d<s32> v3s32; #endif - diff --git a/src/irrlicht_changes/static_text.cpp b/src/irrlicht_changes/static_text.cpp index 703287eb3..50c6c6a68 100644 --- a/src/irrlicht_changes/static_text.cpp +++ b/src/irrlicht_changes/static_text.cpp @@ -20,6 +20,10 @@ #if USE_FREETYPE #include "cguittfont/xCGUITTFont.h" #endif +#ifndef _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX + // newer Irrlicht versions no longer have this + #define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX +#endif #include "util/string.h" diff --git a/src/irrlichttypes_bloated.h b/src/irrlichttypes_bloated.h index 77aba350c..2caca6fc4 100644 --- a/src/irrlichttypes_bloated.h +++ b/src/irrlichttypes_bloated.h @@ -29,4 +29,3 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <SColor.h> #endif - diff --git a/src/irrlichttypes_extrabloated.h b/src/irrlichttypes_extrabloated.h index cd6cb1d2c..464ee7904 100644 --- a/src/irrlichttypes_extrabloated.h +++ b/src/irrlichttypes_extrabloated.h @@ -36,4 +36,3 @@ with this program; if not, write to the Free Software Foundation, Inc., #endif #endif - diff --git a/src/itemdef.cpp b/src/itemdef.cpp index 1aa6331dc..51d8f1d5d 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -20,7 +20,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "itemdef.h" -#include "gamedef.h" #include "nodedef.h" #include "tool.h" #include "inventory.h" @@ -29,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mesh.h" #include "wieldmesh.h" #include "client/tile.h" +#include "client.h" #endif #include "log.h" #include "settings.h" @@ -82,6 +82,8 @@ ItemDefinition& ItemDefinition::operator=(const ItemDefinition &def) sound_place = def.sound_place; sound_place_failed = def.sound_place_failed; range = def.range; + palette_image = def.palette_image; + color = def.color; return *this; } @@ -104,6 +106,8 @@ void ItemDefinition::reset() description = ""; inventory_image = ""; wield_image = ""; + palette_image = ""; + color = video::SColor(0xFFFFFFFF); wield_scale = v3f(1.0, 1.0, 1.0); stack_max = 99; usable = false; @@ -123,17 +127,13 @@ void ItemDefinition::reset() void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const { - if(protocol_version <= 17) - writeU8(os, 1); // version - else if(protocol_version <= 20) - writeU8(os, 2); // version - else - writeU8(os, 3); // version + + writeU8(os, 3); // version (proto > 20) writeU8(os, type); - os<<serializeString(name); - os<<serializeString(description); - os<<serializeString(inventory_image); - os<<serializeString(wield_image); + os << serializeString(name); + os << serializeString(description); + os << serializeString(inventory_image); + os << serializeString(wield_image); writeV3F1000(os, wield_scale); writeS16(os, stack_max); writeU8(os, usable); @@ -144,24 +144,21 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const tool_capabilities->serialize(tmp_os, protocol_version); tool_capabilities_s = tmp_os.str(); } - os<<serializeString(tool_capabilities_s); + os << serializeString(tool_capabilities_s); writeU16(os, groups.size()); for (ItemGroupList::const_iterator i = groups.begin(); i != groups.end(); ++i){ os << serializeString(i->first); writeS16(os, i->second); } - os<<serializeString(node_placement_prediction); - if(protocol_version > 17){ - //serializeSimpleSoundSpec(sound_place, os); - os<<serializeString(sound_place.name); - writeF1000(os, sound_place.gain); - } - if (protocol_version > 20) { - writeF1000(os, range); - os << serializeString(sound_place_failed.name); - writeF1000(os, sound_place_failed.gain); - } + os << serializeString(node_placement_prediction); + os << serializeString(sound_place.name); + writeF1000(os, sound_place.gain); + writeF1000(os, range); + os << serializeString(sound_place_failed.name); + writeF1000(os, sound_place_failed.gain); + os << serializeString(palette_image); + writeU32(os, color.color); } void ItemDefinition::deSerialize(std::istream &is) @@ -218,6 +215,8 @@ void ItemDefinition::deSerialize(std::istream &is) try { sound_place_failed.name = deSerializeString(is); sound_place_failed.gain = readF1000(is); + palette_image = deSerializeString(is); + color.set(readU32(is)); } catch(SerializationError &e) {}; } @@ -233,11 +232,13 @@ class CItemDefManager: public IWritableItemDefManager struct ClientCached { video::ITexture *inventory_texture; - scene::IMesh *wield_mesh; + ItemMesh wield_mesh; + Palette *palette; ClientCached(): inventory_texture(NULL), - wield_mesh(NULL) + wield_mesh(), + palette(NULL) {} }; #endif @@ -259,8 +260,8 @@ public: i = values.begin(); i != values.end(); ++i) { ClientCached *cc = *i; - if (cc->wield_mesh) - cc->wield_mesh->drop(); + if (cc->wield_mesh.mesh) + cc->wield_mesh.mesh->drop(); delete cc; } @@ -284,16 +285,16 @@ public: assert(i != m_item_definitions.end()); return *(i->second); } - virtual std::string getAlias(const std::string &name) const + virtual const std::string &getAlias(const std::string &name) const { StringMap::const_iterator it = m_aliases.find(name); if (it != m_aliases.end()) return it->second; return name; } - virtual std::set<std::string> getAll() const + virtual void getAll(std::set<std::string> &result) const { - std::set<std::string> result; + result.clear(); for(std::map<std::string, ItemDefinition *>::const_iterator it = m_item_definitions.begin(); it != m_item_definitions.end(); ++it) { @@ -304,7 +305,6 @@ public: it != m_aliases.end(); ++it) { result.insert(it->first); } - return result; } virtual bool isKnown(const std::string &name_) const { @@ -317,7 +317,7 @@ public: #ifndef SERVER public: ClientCached* createClientCachedDirect(const std::string &name, - IGameDef *gamedef) const + Client *client) const { infostream<<"Lazily creating item texture and mesh for \"" <<name<<"\""<<std::endl; @@ -331,7 +331,7 @@ public: if(cc) return cc; - ITextureSource *tsrc = gamedef->getTextureSource(); + ITextureSource *tsrc = client->getTextureSource(); const ItemDefinition &def = get(name); // Create new ClientCached @@ -345,8 +345,9 @@ public: ItemStack item = ItemStack(); item.name = def.name; - scene::IMesh *mesh = getItemMesh(gamedef, item); - cc->wield_mesh = mesh; + getItemMesh(client, item, &(cc->wield_mesh)); + + cc->palette = tsrc->getPalette(def.palette_image); // Put in cache m_clientcached.set(name, cc); @@ -354,7 +355,7 @@ public: return cc; } ClientCached* getClientCached(const std::string &name, - IGameDef *gamedef) const + Client *client) const { ClientCached *cc = NULL; m_clientcached.get(name, &cc); @@ -363,7 +364,7 @@ public: if(thr_is_current_thread(m_main_thread)) { - return createClientCachedDirect(name, gamedef); + return createClientCachedDirect(name, client); } else { @@ -392,21 +393,49 @@ public: } // Get item inventory texture virtual video::ITexture* getInventoryTexture(const std::string &name, - IGameDef *gamedef) const + Client *client) const { - ClientCached *cc = getClientCached(name, gamedef); + ClientCached *cc = getClientCached(name, client); if(!cc) return NULL; return cc->inventory_texture; } // Get item wield mesh - virtual scene::IMesh* getWieldMesh(const std::string &name, - IGameDef *gamedef) const + virtual ItemMesh* getWieldMesh(const std::string &name, + Client *client) const + { + ClientCached *cc = getClientCached(name, client); + if(!cc) + return NULL; + return &(cc->wield_mesh); + } + + // Get item palette + virtual Palette* getPalette(const std::string &name, + Client *client) const { - ClientCached *cc = getClientCached(name, gamedef); + ClientCached *cc = getClientCached(name, client); if(!cc) return NULL; - return cc->wield_mesh; + return cc->palette; + } + + virtual video::SColor getItemstackColor(const ItemStack &stack, + Client *client) const + { + // Look for direct color definition + const std::string &colorstring = stack.metadata.getString("color", 0); + video::SColor directcolor; + if ((colorstring != "") + && parseColorString(colorstring, directcolor, true)) + return directcolor; + // See if there is a palette + Palette *palette = getPalette(stack.name, client); + const std::string &index = stack.metadata.getString("palette_index", 0); + if ((palette != NULL) && (index != "")) + return (*palette)[mystoi(index, 0, 255)]; + // Fallback color + return get(stack.name).color; } #endif void clear() @@ -543,7 +572,7 @@ public: request = m_get_clientcached_queue.pop(); m_get_clientcached_queue.pushResult(request, - createClientCachedDirect(request.key, gamedef)); + createClientCachedDirect(request.key, (Client *)gamedef)); } #endif } diff --git a/src/itemdef.h b/src/itemdef.h index dcb98e8a9..2d7ff570d 100644 --- a/src/itemdef.h +++ b/src/itemdef.h @@ -28,7 +28,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "itemgroup.h" #include "sound.h" class IGameDef; +class Client; struct ToolCapabilities; +#ifndef SERVER +#include "client/tile.h" +struct ItemMesh; +struct ItemStack; +#endif /* Base item definition @@ -56,6 +62,8 @@ struct ItemDefinition */ std::string inventory_image; // Optional for nodes, mandatory for tools/craftitems std::string wield_image; // If empty, inventory_image or mesh (only nodes) is used + std::string palette_image; // If specified, the item will be colorized based on this + video::SColor color; // The fallback color of the node. v3f wield_scale; /* @@ -99,18 +107,25 @@ public: // Get item definition virtual const ItemDefinition& get(const std::string &name) const=0; // Get alias definition - virtual std::string getAlias(const std::string &name) const=0; + virtual const std::string &getAlias(const std::string &name) const=0; // Get set of all defined item names and aliases - virtual std::set<std::string> getAll() const=0; + virtual void getAll(std::set<std::string> &result) const=0; // Check if item is known virtual bool isKnown(const std::string &name) const=0; #ifndef SERVER // Get item inventory texture virtual video::ITexture* getInventoryTexture(const std::string &name, - IGameDef *gamedef) const=0; + Client *client) const=0; // Get item wield mesh - virtual scene::IMesh* getWieldMesh(const std::string &name, - IGameDef *gamedef) const=0; + virtual ItemMesh* getWieldMesh(const std::string &name, + Client *client) const=0; + // Get item palette + virtual Palette* getPalette(const std::string &name, + Client *client) const = 0; + // Returns the base color of an item stack: the color of all + // tiles that do not define their own color. + virtual video::SColor getItemstackColor(const ItemStack &stack, + Client *client) const = 0; #endif virtual void serialize(std::ostream &os, u16 protocol_version)=0; @@ -125,18 +140,18 @@ public: // Get item definition virtual const ItemDefinition& get(const std::string &name) const=0; // Get alias definition - virtual std::string getAlias(const std::string &name) const=0; + virtual const std::string &getAlias(const std::string &name) const=0; // Get set of all defined item names and aliases - virtual std::set<std::string> getAll() const=0; + virtual void getAll(std::set<std::string> &result) const=0; // Check if item is known virtual bool isKnown(const std::string &name) const=0; #ifndef SERVER // Get item inventory texture virtual video::ITexture* getInventoryTexture(const std::string &name, - IGameDef *gamedef) const=0; + Client *client) const=0; // Get item wield mesh - virtual scene::IMesh* getWieldMesh(const std::string &name, - IGameDef *gamedef) const=0; + virtual ItemMesh* getWieldMesh(const std::string &name, + Client *client) const=0; #endif // Remove all registered item and node definitions and aliases diff --git a/src/itemgroup.h b/src/itemgroup.h index f91ccc221..2206857fd 100644 --- a/src/itemgroup.h +++ b/src/itemgroup.h @@ -25,14 +25,12 @@ with this program; if not, write to the Free Software Foundation, Inc., typedef UNORDERED_MAP<std::string, int> ItemGroupList; -static inline int itemgroup_get(const ItemGroupList &groups, - const std::string &name) +static inline int itemgroup_get(const ItemGroupList &groups, const std::string &name) { ItemGroupList::const_iterator i = groups.find(name); - if(i == groups.end()) + if (i == groups.end()) return 0; return i->second; } #endif - diff --git a/src/itemstackmetadata.cpp b/src/itemstackmetadata.cpp new file mode 100644 index 000000000..c3d602245 --- /dev/null +++ b/src/itemstackmetadata.cpp @@ -0,0 +1,43 @@ +#include "itemstackmetadata.h" +#include "util/serialize.h" +#include "util/strfnd.h" + +#define DESERIALIZE_START '\x01' +#define DESERIALIZE_KV_DELIM '\x02' +#define DESERIALIZE_PAIR_DELIM '\x03' +#define DESERIALIZE_START_STR "\x01" +#define DESERIALIZE_KV_DELIM_STR "\x02" +#define DESERIALIZE_PAIR_DELIM_STR "\x03" + +void ItemStackMetadata::serialize(std::ostream &os) const +{ + std::ostringstream os2; + os2 << DESERIALIZE_START; + for (StringMap::const_iterator + it = m_stringvars.begin(); + it != m_stringvars.end(); ++it) { + os2 << it->first << DESERIALIZE_KV_DELIM + << it->second << DESERIALIZE_PAIR_DELIM; + } + os << serializeJsonStringIfNeeded(os2.str()); +} + +void ItemStackMetadata::deSerialize(std::istream &is) +{ + std::string in = deSerializeJsonStringIfNeeded(is); + + m_stringvars.clear(); + + if (!in.empty() && in[0] == DESERIALIZE_START) { + Strfnd fnd(in); + fnd.to(1); + while (!fnd.at_end()) { + std::string name = fnd.next(DESERIALIZE_KV_DELIM_STR); + std::string var = fnd.next(DESERIALIZE_PAIR_DELIM_STR); + m_stringvars[name] = var; + } + } else { + // BACKWARDS COMPATIBILITY + m_stringvars[""] = in; + } +} diff --git a/src/itemstackmetadata.h b/src/itemstackmetadata.h new file mode 100644 index 000000000..c56c58fd2 --- /dev/null +++ b/src/itemstackmetadata.h @@ -0,0 +1,35 @@ +/* +Minetest +Copyright (C) 2010-2013 rubenwardy <rubenwardy@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef ITEMSTACKMETADATA_HEADER +#define ITEMSTACKMETADATA_HEADER + +#include "metadata.h" + +class Inventory; +class IItemDefManager; + +class ItemStackMetadata : public Metadata +{ +public: + void serialize(std::ostream &os) const; + void deSerialize(std::istream &is); +}; + +#endif diff --git a/src/jsoncpp/json/json.h b/src/jsoncpp/json/json.h deleted file mode 100644 index 396aafa82..000000000 --- a/src/jsoncpp/json/json.h +++ /dev/null @@ -1,1914 +0,0 @@ -/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/). -/// It is intented to be used with #include <json/json.h> - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: LICENSE -// ////////////////////////////////////////////////////////////////////// - -/* -The JsonCpp library's source code, including accompanying documentation, -tests and demonstration applications, are licensed under the following -conditions... - -The author (Baptiste Lepilleur) explicitly disclaims copyright in all -jurisdictions which recognize such a disclaimer. In such jurisdictions, -this software is released into the Public Domain. - -In jurisdictions which do not recognize Public Domain property (e.g. Germany as of -2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is -released under the terms of the MIT License (see below). - -In jurisdictions which recognize Public Domain property, the user of this -software may choose to accept it either as 1) Public Domain, 2) under the -conditions of the MIT License (see below), or 3) under the terms of dual -Public Domain/MIT License conditions described here, as they choose. - -The MIT License is about as close to Public Domain as a license can get, and is -described in clear, concise terms at: - - http://en.wikipedia.org/wiki/MIT_License - -The full text of the MIT License follows: - -======================================================================== -Copyright (c) 2007-2010 Baptiste Lepilleur - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, copy, -modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -======================================================================== -(END LICENSE TEXT) - -The MIT license is compatible with both the GPL and commercial -software, affording one all of the rights of Public Domain with the -minor nuisance of being required to keep the above copyright notice -and license text in the source code. Note also that by accepting the -Public Domain "license" you can re-license your copy using whatever -license you like. - -*/ - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: LICENSE -// ////////////////////////////////////////////////////////////////////// - - - - - -#ifndef JSON_AMALGATED_H_INCLUDED -# define JSON_AMALGATED_H_INCLUDED -/// If defined, indicates that the source file is amalgated -/// to prevent private header inclusion. -#define JSON_IS_AMALGAMATION - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/config.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_CONFIG_H_INCLUDED -# define JSON_CONFIG_H_INCLUDED - -/// If defined, indicates that json library is embedded in CppTL library. -//# define JSON_IN_CPPTL 1 - -/// If defined, indicates that json may leverage CppTL library -//# define JSON_USE_CPPTL 1 -/// If defined, indicates that cpptl vector based map should be used instead of std::map -/// as Value container. -//# define JSON_USE_CPPTL_SMALLMAP 1 -/// If defined, indicates that Json specific container should be used -/// (hash table & simple deque container with customizable allocator). -/// THIS FEATURE IS STILL EXPERIMENTAL! There is know bugs: See #3177332 -//# define JSON_VALUE_USE_INTERNAL_MAP 1 -/// Force usage of standard new/malloc based allocator instead of memory pool based allocator. -/// The memory pools allocator used optimization (initializing Value and ValueInternalLink -/// as if it was a POD) that may cause some validation tool to report errors. -/// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined. -//# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1 - -// If non-zero, the library uses exceptions to report bad input instead of C -// assertion macros. The default is to use exceptions. -# ifndef JSON_USE_EXCEPTION -# define JSON_USE_EXCEPTION 1 -# endif - -/// If defined, indicates that the source file is amalgated -/// to prevent private header inclusion. -/// Remarks: it is automatically defined in the generated amalgated header. -// #define JSON_IS_AMALGAMATION - - -# ifdef JSON_IN_CPPTL -# include <cpptl/config.h> -# ifndef JSON_USE_CPPTL -# define JSON_USE_CPPTL 1 -# endif -# endif - -# ifdef JSON_IN_CPPTL -# define JSON_API CPPTL_API -# elif defined(JSON_DLL_BUILD) -# define JSON_API __declspec(dllexport) -# elif defined(JSON_DLL) -# define JSON_API __declspec(dllimport) -# else -# define JSON_API -# endif - -// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for integer -// Storages, and 64 bits integer support is disabled. -// #define JSON_NO_INT64 1 - -#if defined(_MSC_VER) && _MSC_VER <= 1200 // MSVC 6 -// Microsoft Visual Studio 6 only support conversion from __int64 to double -// (no conversion from unsigned __int64). -#define JSON_USE_INT64_DOUBLE_CONVERSION 1 -#endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6 - -#if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008 -/// Indicates that the following function is deprecated. -# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) -#endif - -#if !defined(JSONCPP_DEPRECATED) -# define JSONCPP_DEPRECATED(message) -#endif // if !defined(JSONCPP_DEPRECATED) - -namespace Json { - typedef int Int; - typedef unsigned int UInt; -# if defined(JSON_NO_INT64) - typedef int LargestInt; - typedef unsigned int LargestUInt; -# undef JSON_HAS_INT64 -# else // if defined(JSON_NO_INT64) - // For Microsoft Visual use specific types as long long is not supported -# if defined(_MSC_VER) // Microsoft Visual Studio - typedef __int64 Int64; - typedef unsigned __int64 UInt64; -# else // if defined(_MSC_VER) // Other platforms, use long long - typedef long long int Int64; - typedef unsigned long long int UInt64; -# endif // if defined(_MSC_VER) - typedef Int64 LargestInt; - typedef UInt64 LargestUInt; -# define JSON_HAS_INT64 -# endif // if defined(JSON_NO_INT64) -} // end namespace Json - - -#endif // JSON_CONFIG_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/config.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/forwards.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_FORWARDS_H_INCLUDED -# define JSON_FORWARDS_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -# include "config.h" -#endif // if !defined(JSON_IS_AMALGAMATION) - -namespace Json { - - // writer.h - class FastWriter; - class StyledWriter; - - // reader.h - class Reader; - - // features.h - class Features; - - // value.h - typedef unsigned int ArrayIndex; - class StaticString; - class Path; - class PathArgument; - class Value; - class ValueIteratorBase; - class ValueIterator; - class ValueConstIterator; -#ifdef JSON_VALUE_USE_INTERNAL_MAP - class ValueMapAllocator; - class ValueInternalLink; - class ValueInternalArray; - class ValueInternalMap; -#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP - -} // namespace Json - - -#endif // JSON_FORWARDS_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/forwards.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/features.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef CPPTL_JSON_FEATURES_H_INCLUDED -# define CPPTL_JSON_FEATURES_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -# include "forwards.h" -#endif // if !defined(JSON_IS_AMALGAMATION) - -namespace Json { - - /** \brief Configuration passed to reader and writer. - * This configuration object can be used to force the Reader or Writer - * to behave in a standard conforming way. - */ - class JSON_API Features - { - public: - /** \brief A configuration that allows all features and assumes all strings are UTF-8. - * - C & C++ comments are allowed - * - Root object can be any JSON value - * - Assumes Value strings are encoded in UTF-8 - */ - static Features all(); - - /** \brief A configuration that is strictly compatible with the JSON specification. - * - Comments are forbidden. - * - Root object must be either an array or an object value. - * - Assumes Value strings are encoded in UTF-8 - */ - static Features strictMode(); - - /** \brief Initialize the configuration like JsonConfig::allFeatures; - */ - Features(); - - /// \c true if comments are allowed. Default: \c true. - bool allowComments_; - - /// \c true if root must be either an array or an object value. Default: \c false. - bool strictRoot_; - }; - -} // namespace Json - -#endif // CPPTL_JSON_FEATURES_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/features.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/value.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef CPPTL_JSON_H_INCLUDED -# define CPPTL_JSON_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -# include "forwards.h" -#endif // if !defined(JSON_IS_AMALGAMATION) -# include <string> -# include <vector> - -# ifndef JSON_USE_CPPTL_SMALLMAP -# include <map> -# else -# include <cpptl/smallmap.h> -# endif -# ifdef JSON_USE_CPPTL -# include <cpptl/forwards.h> -# endif - -/** \brief JSON (JavaScript Object Notation). - */ -namespace Json { - - /** \brief Type of the value held by a Value object. - */ - enum ValueType - { - nullValue = 0, ///< 'null' value - intValue, ///< signed integer value - uintValue, ///< unsigned integer value - realValue, ///< double value - stringValue, ///< UTF-8 string value - booleanValue, ///< bool value - arrayValue, ///< array value (ordered list) - objectValue ///< object value (collection of name/value pairs). - }; - - enum CommentPlacement - { - commentBefore = 0, ///< a comment placed on the line before a value - commentAfterOnSameLine, ///< a comment just after a value on the same line - commentAfter, ///< a comment on the line after a value (only make sense for root value) - numberOfCommentPlacement - }; - -//# ifdef JSON_USE_CPPTL -// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames; -// typedef CppTL::AnyEnumerator<const Value &> EnumValues; -//# endif - - /** \brief Lightweight wrapper to tag static string. - * - * Value constructor and objectValue member assignement takes advantage of the - * StaticString and avoid the cost of string duplication when storing the - * string or the member name. - * - * Example of usage: - * \code - * Json::Value aValue( StaticString("some text") ); - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode - */ - class JSON_API StaticString - { - public: - explicit StaticString( const char *czstring ) - : str_( czstring ) - { - } - - operator const char *() const - { - return str_; - } - - const char *c_str() const - { - return str_; - } - - private: - const char *str_; - }; - - /** \brief Represents a <a HREF="http://www.json.org">JSON</a> value. - * - * This class is a discriminated union wrapper that can represents a: - * - signed integer [range: Value::minInt - Value::maxInt] - * - unsigned integer (range: 0 - Value::maxUInt) - * - double - * - UTF-8 string - * - boolean - * - 'null' - * - an ordered list of Value - * - collection of name/value pairs (javascript object) - * - * The type of the held value is represented by a #ValueType and - * can be obtained using type(). - * - * values of an #objectValue or #arrayValue can be accessed using operator[]() methods. - * Non const methods will automatically create the a #nullValue element - * if it does not exist. - * The sequence of an #arrayValue will be automatically resize and initialized - * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. - * - * The get() methods can be used to obtanis default value in the case the required element - * does not exist. - * - * It is possible to iterate over the list of a #objectValue values using - * the getMemberNames() method. - */ - class JSON_API Value - { - friend class ValueIteratorBase; -# ifdef JSON_VALUE_USE_INTERNAL_MAP - friend class ValueInternalLink; - friend class ValueInternalMap; -# endif - public: - typedef std::vector<std::string> Members; - typedef ValueIterator iterator; - typedef ValueConstIterator const_iterator; - typedef Json::UInt UInt; - typedef Json::Int Int; -# if defined(JSON_HAS_INT64) - typedef Json::UInt64 UInt64; - typedef Json::Int64 Int64; -#endif // defined(JSON_HAS_INT64) - typedef Json::LargestInt LargestInt; - typedef Json::LargestUInt LargestUInt; - typedef Json::ArrayIndex ArrayIndex; - - static const Value null; - /// Minimum signed integer value that can be stored in a Json::Value. - static const LargestInt minLargestInt; - /// Maximum signed integer value that can be stored in a Json::Value. - static const LargestInt maxLargestInt; - /// Maximum unsigned integer value that can be stored in a Json::Value. - static const LargestUInt maxLargestUInt; - - /// Minimum signed int value that can be stored in a Json::Value. - static const Int minInt; - /// Maximum signed int value that can be stored in a Json::Value. - static const Int maxInt; - /// Maximum unsigned int value that can be stored in a Json::Value. - static const UInt maxUInt; - -# if defined(JSON_HAS_INT64) - /// Minimum signed 64 bits int value that can be stored in a Json::Value. - static const Int64 minInt64; - /// Maximum signed 64 bits int value that can be stored in a Json::Value. - static const Int64 maxInt64; - /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. - static const UInt64 maxUInt64; -#endif // defined(JSON_HAS_INT64) - - private: -#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION -# ifndef JSON_VALUE_USE_INTERNAL_MAP - class CZString - { - public: - enum DuplicationPolicy - { - noDuplication = 0, - duplicate, - duplicateOnCopy - }; - CZString( ArrayIndex index ); - CZString( const char *cstr, DuplicationPolicy allocate ); - CZString( const CZString &other ); - ~CZString(); - CZString &operator =( const CZString &other ); - bool operator<( const CZString &other ) const; - bool operator==( const CZString &other ) const; - ArrayIndex index() const; - const char *c_str() const; - bool isStaticString() const; - private: - void swap( CZString &other ); - const char *cstr_; - ArrayIndex index_; - }; - - public: -# ifndef JSON_USE_CPPTL_SMALLMAP - typedef std::map<CZString, Value> ObjectValues; -# else - typedef CppTL::SmallMap<CZString, Value> ObjectValues; -# endif // ifndef JSON_USE_CPPTL_SMALLMAP -# endif // ifndef JSON_VALUE_USE_INTERNAL_MAP -#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - - public: - /** \brief Create a default Value of the given type. - - This is a very useful constructor. - To create an empty array, pass arrayValue. - To create an empty object, pass objectValue. - Another Value can then be set to this one by assignment. - This is useful since clear() and resize() will not alter types. - - Examples: - \code - Json::Value null_value; // null - Json::Value arr_value(Json::arrayValue); // [] - Json::Value obj_value(Json::objectValue); // {} - \endcode - */ - Value( ValueType type = nullValue ); - Value( Int value ); - Value( UInt value ); -#if defined(JSON_HAS_INT64) - Value( Int64 value ); - Value( UInt64 value ); -#endif // if defined(JSON_HAS_INT64) - Value( double value ); - Value( const char *value ); - Value( const char *beginValue, const char *endValue ); - /** \brief Constructs a value from a static string. - - * Like other value string constructor but do not duplicate the string for - * internal storage. The given string must remain alive after the call to this - * constructor. - * Example of usage: - * \code - * Json::Value aValue( StaticString("some text") ); - * \endcode - */ - Value( const StaticString &value ); - Value( const std::string &value ); -# ifdef JSON_USE_CPPTL - Value( const CppTL::ConstString &value ); -# endif - Value( bool value ); - Value( const Value &other ); - ~Value(); - - Value &operator=( const Value &other ); - /// Swap values. - /// \note Currently, comments are intentionally not swapped, for - /// both logic and efficiency. - void swap( Value &other ); - - ValueType type() const; - - bool operator <( const Value &other ) const; - bool operator <=( const Value &other ) const; - bool operator >=( const Value &other ) const; - bool operator >( const Value &other ) const; - - bool operator ==( const Value &other ) const; - bool operator !=( const Value &other ) const; - - int compare( const Value &other ) const; - - const char *asCString() const; - std::string asString() const; -# ifdef JSON_USE_CPPTL - CppTL::ConstString asConstString() const; -# endif - Int asInt() const; - UInt asUInt() const; -#if defined(JSON_HAS_INT64) - Int64 asInt64() const; - UInt64 asUInt64() const; -#endif // if defined(JSON_HAS_INT64) - LargestInt asLargestInt() const; - LargestUInt asLargestUInt() const; - float asFloat() const; - double asDouble() const; - bool asBool() const; - - bool isNull() const; - bool isBool() const; - bool isInt() const; - bool isInt64() const; - bool isUInt() const; - bool isUInt64() const; - bool isIntegral() const; - bool isDouble() const; - bool isNumeric() const; - bool isString() const; - bool isArray() const; - bool isObject() const; - - bool isConvertibleTo( ValueType other ) const; - - /// Number of values in array or object - ArrayIndex size() const; - - /// \brief Return true if empty array, empty object, or null; - /// otherwise, false. - bool empty() const; - - /// Return isNull() - bool operator!() const; - - /// Remove all object members and array elements. - /// \pre type() is arrayValue, objectValue, or nullValue - /// \post type() is unchanged - void clear(); - - /// Resize the array to size elements. - /// New elements are initialized to null. - /// May only be called on nullValue or arrayValue. - /// \pre type() is arrayValue or nullValue - /// \post type() is arrayValue - void resize( ArrayIndex size ); - - /// Access an array element (zero based index ). - /// If the array contains less than index element, then null value are inserted - /// in the array so that its size is index+1. - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - Value &operator[]( ArrayIndex index ); - - /// Access an array element (zero based index ). - /// If the array contains less than index element, then null value are inserted - /// in the array so that its size is index+1. - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - Value &operator[]( int index ); - - /// Access an array element (zero based index ) - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - const Value &operator[]( ArrayIndex index ) const; - - /// Access an array element (zero based index ) - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - const Value &operator[]( int index ) const; - - /// If the array contains at least index+1 elements, returns the element value, - /// otherwise returns defaultValue. - Value get( ArrayIndex index, - const Value &defaultValue ) const; - /// Return true if index < size(). - bool isValidIndex( ArrayIndex index ) const; - /// \brief Append value to array at the end. - /// - /// Equivalent to jsonvalue[jsonvalue.size()] = value; - Value &append( const Value &value ); - - /// Access an object value by name, create a null member if it does not exist. - Value &operator[]( const char *key ); - /// Access an object value by name, returns null if there is no member with that name. - const Value &operator[]( const char *key ) const; - /// Access an object value by name, create a null member if it does not exist. - Value &operator[]( const std::string &key ); - /// Access an object value by name, returns null if there is no member with that name. - const Value &operator[]( const std::string &key ) const; - /** \brief Access an object value by name, create a null member if it does not exist. - - * If the object as no entry for that name, then the member name used to store - * the new entry is not duplicated. - * Example of use: - * \code - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode - */ - Value &operator[]( const StaticString &key ); -# ifdef JSON_USE_CPPTL - /// Access an object value by name, create a null member if it does not exist. - Value &operator[]( const CppTL::ConstString &key ); - /// Access an object value by name, returns null if there is no member with that name. - const Value &operator[]( const CppTL::ConstString &key ) const; -# endif - /// Return the member named key if it exist, defaultValue otherwise. - Value get( const char *key, - const Value &defaultValue ) const; - /// Return the member named key if it exist, defaultValue otherwise. - Value get( const std::string &key, - const Value &defaultValue ) const; -# ifdef JSON_USE_CPPTL - /// Return the member named key if it exist, defaultValue otherwise. - Value get( const CppTL::ConstString &key, - const Value &defaultValue ) const; -# endif - /// \brief Remove and return the named member. - /// - /// Do nothing if it did not exist. - /// \return the removed Value, or null. - /// \pre type() is objectValue or nullValue - /// \post type() is unchanged - Value removeMember( const char* key ); - /// Same as removeMember(const char*) - Value removeMember( const std::string &key ); - - /// Return true if the object has a member named key. - bool isMember( const char *key ) const; - /// Return true if the object has a member named key. - bool isMember( const std::string &key ) const; -# ifdef JSON_USE_CPPTL - /// Return true if the object has a member named key. - bool isMember( const CppTL::ConstString &key ) const; -# endif - - /// \brief Return a list of the member names. - /// - /// If null, return an empty list. - /// \pre type() is objectValue or nullValue - /// \post if type() was nullValue, it remains nullValue - Members getMemberNames() const; - -//# ifdef JSON_USE_CPPTL -// EnumMemberNames enumMemberNames() const; -// EnumValues enumValues() const; -//# endif - - /// Comments must be //... or /* ... */ - void setComment( const char *comment, - CommentPlacement placement ); - /// Comments must be //... or /* ... */ - void setComment( const std::string &comment, - CommentPlacement placement ); - bool hasComment( CommentPlacement placement ) const; - /// Include delimiters and embedded newlines. - std::string getComment( CommentPlacement placement ) const; - - std::string toStyledString() const; - - const_iterator begin() const; - const_iterator end() const; - - iterator begin(); - iterator end(); - - private: - Value &resolveReference( const char *key, - bool isStatic ); - -# ifdef JSON_VALUE_USE_INTERNAL_MAP - inline bool isItemAvailable() const - { - return itemIsUsed_ == 0; - } - - inline void setItemUsed( bool isUsed = true ) - { - itemIsUsed_ = isUsed ? 1 : 0; - } - - inline bool isMemberNameStatic() const - { - return memberNameIsStatic_ == 0; - } - - inline void setMemberNameIsStatic( bool isStatic ) - { - memberNameIsStatic_ = isStatic ? 1 : 0; - } -# endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP - - private: - struct CommentInfo - { - CommentInfo(); - ~CommentInfo(); - - void setComment( const char *text ); - - char *comment_; - }; - - //struct MemberNamesTransform - //{ - // typedef const char *result_type; - // const char *operator()( const CZString &name ) const - // { - // return name.c_str(); - // } - //}; - - union ValueHolder - { - LargestInt int_; - LargestUInt uint_; - double real_; - bool bool_; - char *string_; -# ifdef JSON_VALUE_USE_INTERNAL_MAP - ValueInternalArray *array_; - ValueInternalMap *map_; -#else - ObjectValues *map_; -# endif - } value_; - ValueType type_ : 8; - int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. -# ifdef JSON_VALUE_USE_INTERNAL_MAP - unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container. - int memberNameIsStatic_ : 1; // used by the ValueInternalMap container. -# endif - CommentInfo *comments_; - }; - - - /** \brief Experimental and untested: represents an element of the "path" to access a node. - */ - class PathArgument - { - public: - friend class Path; - - PathArgument(); - PathArgument( ArrayIndex index ); - PathArgument( const char *key ); - PathArgument( const std::string &key ); - - private: - enum Kind - { - kindNone = 0, - kindIndex, - kindKey - }; - std::string key_; - ArrayIndex index_; - Kind kind_; - }; - - /** \brief Experimental and untested: represents a "path" to access a node. - * - * Syntax: - * - "." => root node - * - ".[n]" => elements at index 'n' of root node (an array value) - * - ".name" => member named 'name' of root node (an object value) - * - ".name1.name2.name3" - * - ".[0][1][2].name1[3]" - * - ".%" => member name is provided as parameter - * - ".[%]" => index is provied as parameter - */ - class Path - { - public: - Path( const std::string &path, - const PathArgument &a1 = PathArgument(), - const PathArgument &a2 = PathArgument(), - const PathArgument &a3 = PathArgument(), - const PathArgument &a4 = PathArgument(), - const PathArgument &a5 = PathArgument() ); - - const Value &resolve( const Value &root ) const; - Value resolve( const Value &root, - const Value &defaultValue ) const; - /// Creates the "path" to access the specified node and returns a reference on the node. - Value &make( Value &root ) const; - - private: - typedef std::vector<const PathArgument *> InArgs; - typedef std::vector<PathArgument> Args; - - void makePath( const std::string &path, - const InArgs &in ); - void addPathInArg( const std::string &path, - const InArgs &in, - InArgs::const_iterator &itInArg, - PathArgument::Kind kind ); - void invalidPath( const std::string &path, - int location ); - - Args args_; - }; - - - -#ifdef JSON_VALUE_USE_INTERNAL_MAP - /** \brief Allocator to customize Value internal map. - * Below is an example of a simple implementation (default implementation actually - * use memory pool for speed). - * \code - class DefaultValueMapAllocator : public ValueMapAllocator - { - public: // overridden from ValueMapAllocator - virtual ValueInternalMap *newMap() - { - return new ValueInternalMap(); - } - - virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) - { - return new ValueInternalMap( other ); - } - - virtual void destructMap( ValueInternalMap *map ) - { - delete map; - } - - virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) - { - return new ValueInternalLink[size]; - } - - virtual void releaseMapBuckets( ValueInternalLink *links ) - { - delete [] links; - } - - virtual ValueInternalLink *allocateMapLink() - { - return new ValueInternalLink(); - } - - virtual void releaseMapLink( ValueInternalLink *link ) - { - delete link; - } - }; - * \endcode - */ - class JSON_API ValueMapAllocator - { - public: - virtual ~ValueMapAllocator(); - virtual ValueInternalMap *newMap() = 0; - virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0; - virtual void destructMap( ValueInternalMap *map ) = 0; - virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0; - virtual void releaseMapBuckets( ValueInternalLink *links ) = 0; - virtual ValueInternalLink *allocateMapLink() = 0; - virtual void releaseMapLink( ValueInternalLink *link ) = 0; - }; - - /** \brief ValueInternalMap hash-map bucket chain link (for internal use only). - * \internal previous_ & next_ allows for bidirectional traversal. - */ - class JSON_API ValueInternalLink - { - public: - enum { itemPerLink = 6 }; // sizeof(ValueInternalLink) = 128 on 32 bits architecture. - enum InternalFlags { - flagAvailable = 0, - flagUsed = 1 - }; - - ValueInternalLink(); - - ~ValueInternalLink(); - - Value items_[itemPerLink]; - char *keys_[itemPerLink]; - ValueInternalLink *previous_; - ValueInternalLink *next_; - }; - - - /** \brief A linked page based hash-table implementation used internally by Value. - * \internal ValueInternalMap is a tradional bucket based hash-table, with a linked - * list in each bucket to handle collision. There is an addional twist in that - * each node of the collision linked list is a page containing a fixed amount of - * value. This provides a better compromise between memory usage and speed. - * - * Each bucket is made up of a chained list of ValueInternalLink. The last - * link of a given bucket can be found in the 'previous_' field of the following bucket. - * The last link of the last bucket is stored in tailLink_ as it has no following bucket. - * Only the last link of a bucket may contains 'available' item. The last link always - * contains at least one element unless is it the bucket one very first link. - */ - class JSON_API ValueInternalMap - { - friend class ValueIteratorBase; - friend class Value; - public: - typedef unsigned int HashKey; - typedef unsigned int BucketIndex; - -# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - struct IteratorState - { - IteratorState() - : map_(0) - , link_(0) - , itemIndex_(0) - , bucketIndex_(0) - { - } - ValueInternalMap *map_; - ValueInternalLink *link_; - BucketIndex itemIndex_; - BucketIndex bucketIndex_; - }; -# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - - ValueInternalMap(); - ValueInternalMap( const ValueInternalMap &other ); - ValueInternalMap &operator =( const ValueInternalMap &other ); - ~ValueInternalMap(); - - void swap( ValueInternalMap &other ); - - BucketIndex size() const; - - void clear(); - - bool reserveDelta( BucketIndex growth ); - - bool reserve( BucketIndex newItemCount ); - - const Value *find( const char *key ) const; - - Value *find( const char *key ); - - Value &resolveReference( const char *key, - bool isStatic ); - - void remove( const char *key ); - - void doActualRemove( ValueInternalLink *link, - BucketIndex index, - BucketIndex bucketIndex ); - - ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex ); - - Value &setNewItem( const char *key, - bool isStatic, - ValueInternalLink *link, - BucketIndex index ); - - Value &unsafeAdd( const char *key, - bool isStatic, - HashKey hashedKey ); - - HashKey hash( const char *key ) const; - - int compare( const ValueInternalMap &other ) const; - - private: - void makeBeginIterator( IteratorState &it ) const; - void makeEndIterator( IteratorState &it ) const; - static bool equals( const IteratorState &x, const IteratorState &other ); - static void increment( IteratorState &iterator ); - static void incrementBucket( IteratorState &iterator ); - static void decrement( IteratorState &iterator ); - static const char *key( const IteratorState &iterator ); - static const char *key( const IteratorState &iterator, bool &isStatic ); - static Value &value( const IteratorState &iterator ); - static int distance( const IteratorState &x, const IteratorState &y ); - - private: - ValueInternalLink *buckets_; - ValueInternalLink *tailLink_; - BucketIndex bucketsSize_; - BucketIndex itemCount_; - }; - - /** \brief A simplified deque implementation used internally by Value. - * \internal - * It is based on a list of fixed "page", each page contains a fixed number of items. - * Instead of using a linked-list, a array of pointer is used for fast item look-up. - * Look-up for an element is as follow: - * - compute page index: pageIndex = itemIndex / itemsPerPage - * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage] - * - * Insertion is amortized constant time (only the array containing the index of pointers - * need to be reallocated when items are appended). - */ - class JSON_API ValueInternalArray - { - friend class Value; - friend class ValueIteratorBase; - public: - enum { itemsPerPage = 8 }; // should be a power of 2 for fast divide and modulo. - typedef Value::ArrayIndex ArrayIndex; - typedef unsigned int PageIndex; - -# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - struct IteratorState // Must be a POD - { - IteratorState() - : array_(0) - , currentPageIndex_(0) - , currentItemIndex_(0) - { - } - ValueInternalArray *array_; - Value **currentPageIndex_; - unsigned int currentItemIndex_; - }; -# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - - ValueInternalArray(); - ValueInternalArray( const ValueInternalArray &other ); - ValueInternalArray &operator =( const ValueInternalArray &other ); - ~ValueInternalArray(); - void swap( ValueInternalArray &other ); - - void clear(); - void resize( ArrayIndex newSize ); - - Value &resolveReference( ArrayIndex index ); - - Value *find( ArrayIndex index ) const; - - ArrayIndex size() const; - - int compare( const ValueInternalArray &other ) const; - - private: - static bool equals( const IteratorState &x, const IteratorState &other ); - static void increment( IteratorState &iterator ); - static void decrement( IteratorState &iterator ); - static Value &dereference( const IteratorState &iterator ); - static Value &unsafeDereference( const IteratorState &iterator ); - static int distance( const IteratorState &x, const IteratorState &y ); - static ArrayIndex indexOf( const IteratorState &iterator ); - void makeBeginIterator( IteratorState &it ) const; - void makeEndIterator( IteratorState &it ) const; - void makeIterator( IteratorState &it, ArrayIndex index ) const; - - void makeIndexValid( ArrayIndex index ); - - Value **pages_; - ArrayIndex size_; - PageIndex pageCount_; - }; - - /** \brief Experimental: do not use. Allocator to customize Value internal array. - * Below is an example of a simple implementation (actual implementation use - * memory pool). - \code -class DefaultValueArrayAllocator : public ValueArrayAllocator -{ -public: // overridden from ValueArrayAllocator - virtual ~DefaultValueArrayAllocator() - { - } - - virtual ValueInternalArray *newArray() - { - return new ValueInternalArray(); - } - - virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) - { - return new ValueInternalArray( other ); - } - - virtual void destruct( ValueInternalArray *array ) - { - delete array; - } - - virtual void reallocateArrayPageIndex( Value **&indexes, - ValueInternalArray::PageIndex &indexCount, - ValueInternalArray::PageIndex minNewIndexCount ) - { - ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1; - if ( minNewIndexCount > newIndexCount ) - newIndexCount = minNewIndexCount; - void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount ); - if ( !newIndexes ) - throw std::bad_alloc(); - indexCount = newIndexCount; - indexes = static_cast<Value **>( newIndexes ); - } - virtual void releaseArrayPageIndex( Value **indexes, - ValueInternalArray::PageIndex indexCount ) - { - if ( indexes ) - free( indexes ); - } - - virtual Value *allocateArrayPage() - { - return static_cast<Value *>( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) ); - } - - virtual void releaseArrayPage( Value *value ) - { - if ( value ) - free( value ); - } -}; - \endcode - */ - class JSON_API ValueArrayAllocator - { - public: - virtual ~ValueArrayAllocator(); - virtual ValueInternalArray *newArray() = 0; - virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0; - virtual void destructArray( ValueInternalArray *array ) = 0; - /** \brief Reallocate array page index. - * Reallocates an array of pointer on each page. - * \param indexes [input] pointer on the current index. May be \c NULL. - * [output] pointer on the new index of at least - * \a minNewIndexCount pages. - * \param indexCount [input] current number of pages in the index. - * [output] number of page the reallocated index can handle. - * \b MUST be >= \a minNewIndexCount. - * \param minNewIndexCount Minimum number of page the new index must be able to - * handle. - */ - virtual void reallocateArrayPageIndex( Value **&indexes, - ValueInternalArray::PageIndex &indexCount, - ValueInternalArray::PageIndex minNewIndexCount ) = 0; - virtual void releaseArrayPageIndex( Value **indexes, - ValueInternalArray::PageIndex indexCount ) = 0; - virtual Value *allocateArrayPage() = 0; - virtual void releaseArrayPage( Value *value ) = 0; - }; -#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP - - - /** \brief base class for Value iterators. - * - */ - class ValueIteratorBase - { - public: - typedef unsigned int size_t; - typedef int difference_type; - typedef ValueIteratorBase SelfType; - - ValueIteratorBase(); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - explicit ValueIteratorBase( const Value::ObjectValues::iterator ¤t ); -#else - ValueIteratorBase( const ValueInternalArray::IteratorState &state ); - ValueIteratorBase( const ValueInternalMap::IteratorState &state ); -#endif - - bool operator ==( const SelfType &other ) const - { - return isEqual( other ); - } - - bool operator !=( const SelfType &other ) const - { - return !isEqual( other ); - } - - difference_type operator -( const SelfType &other ) const - { - return computeDistance( other ); - } - - /// Return either the index or the member name of the referenced value as a Value. - Value key() const; - - /// Return the index of the referenced Value. -1 if it is not an arrayValue. - UInt index() const; - - /// Return the member name of the referenced Value. "" if it is not an objectValue. - const char *memberName() const; - - protected: - Value &deref() const; - - void increment(); - - void decrement(); - - difference_type computeDistance( const SelfType &other ) const; - - bool isEqual( const SelfType &other ) const; - - void copy( const SelfType &other ); - - private: -#ifndef JSON_VALUE_USE_INTERNAL_MAP - Value::ObjectValues::iterator current_; - // Indicates that iterator is for a null value. - bool isNull_; -#else - union - { - ValueInternalArray::IteratorState array_; - ValueInternalMap::IteratorState map_; - } iterator_; - bool isArray_; -#endif - }; - - /** \brief const iterator for object and array value. - * - */ - class ValueConstIterator : public ValueIteratorBase - { - friend class Value; - public: - typedef unsigned int size_t; - typedef int difference_type; - typedef const Value &reference; - typedef const Value *pointer; - typedef ValueConstIterator SelfType; - - ValueConstIterator(); - private: - /*! \internal Use by Value to create an iterator. - */ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - explicit ValueConstIterator( const Value::ObjectValues::iterator ¤t ); -#else - ValueConstIterator( const ValueInternalArray::IteratorState &state ); - ValueConstIterator( const ValueInternalMap::IteratorState &state ); -#endif - public: - SelfType &operator =( const ValueIteratorBase &other ); - - SelfType operator++( int ) - { - SelfType temp( *this ); - ++*this; - return temp; - } - - SelfType operator--( int ) - { - SelfType temp( *this ); - --*this; - return temp; - } - - SelfType &operator--() - { - decrement(); - return *this; - } - - SelfType &operator++() - { - increment(); - return *this; - } - - reference operator *() const - { - return deref(); - } - }; - - - /** \brief Iterator for object and array value. - */ - class ValueIterator : public ValueIteratorBase - { - friend class Value; - public: - typedef unsigned int size_t; - typedef int difference_type; - typedef Value &reference; - typedef Value *pointer; - typedef ValueIterator SelfType; - - ValueIterator(); - ValueIterator( const ValueConstIterator &other ); - ValueIterator( const ValueIterator &other ); - private: - /*! \internal Use by Value to create an iterator. - */ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - explicit ValueIterator( const Value::ObjectValues::iterator ¤t ); -#else - ValueIterator( const ValueInternalArray::IteratorState &state ); - ValueIterator( const ValueInternalMap::IteratorState &state ); -#endif - public: - - SelfType &operator =( const SelfType &other ); - - SelfType operator++( int ) - { - SelfType temp( *this ); - ++*this; - return temp; - } - - SelfType operator--( int ) - { - SelfType temp( *this ); - --*this; - return temp; - } - - SelfType &operator--() - { - decrement(); - return *this; - } - - SelfType &operator++() - { - increment(); - return *this; - } - - reference operator *() const - { - return deref(); - } - }; - - -} // namespace Json - - -#endif // CPPTL_JSON_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/value.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/reader.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef CPPTL_JSON_READER_H_INCLUDED -# define CPPTL_JSON_READER_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -# include "features.h" -# include "value.h" -#endif // if !defined(JSON_IS_AMALGAMATION) -# include <deque> -# include <stack> -# include <string> - -namespace Json { - - /** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a Value. - * - */ - class JSON_API Reader - { - public: - typedef char Char; - typedef const Char *Location; - - /** \brief Constructs a Reader allowing all features - * for parsing. - */ - Reader(); - - /** \brief Constructs a Reader allowing the specified feature set - * for parsing. - */ - Reader( const Features &features ); - - /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document. - * \param document UTF-8 encoded string containing the document to read. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them back during - * serialization, \c false to discard comments. - * This parameter is ignored if Features::allowComments_ - * is \c false. - * \return \c true if the document was successfully parsed, \c false if an error occurred. - */ - bool parse( const std::string &document, - Value &root, - bool collectComments = true ); - - /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document. - * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the document to read. - * \param endDoc Pointer on the end of the UTF-8 encoded string of the document to read. - \ Must be >= beginDoc. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them back during - * serialization, \c false to discard comments. - * This parameter is ignored if Features::allowComments_ - * is \c false. - * \return \c true if the document was successfully parsed, \c false if an error occurred. - */ - bool parse( const char *beginDoc, const char *endDoc, - Value &root, - bool collectComments = true ); - - /// \brief Parse from input stream. - /// \see Json::operator>>(std::istream&, Json::Value&). - bool parse( std::istream &is, - Value &root, - bool collectComments = true ); - - /** \brief Returns a user friendly string that list errors in the parsed document. - * \return Formatted error message with the list of errors with their location in - * the parsed document. An empty string is returned if no error occurred - * during parsing. - * \deprecated Use getFormattedErrorMessages() instead (typo fix). - */ - JSONCPP_DEPRECATED("Use getFormattedErrorMessages instead") - std::string getFormatedErrorMessages() const; - - /** \brief Returns a user friendly string that list errors in the parsed document. - * \return Formatted error message with the list of errors with their location in - * the parsed document. An empty string is returned if no error occurred - * during parsing. - */ - std::string getFormattedErrorMessages() const; - - private: - enum TokenType - { - tokenEndOfStream = 0, - tokenObjectBegin, - tokenObjectEnd, - tokenArrayBegin, - tokenArrayEnd, - tokenString, - tokenNumber, - tokenTrue, - tokenFalse, - tokenNull, - tokenArraySeparator, - tokenMemberSeparator, - tokenComment, - tokenError - }; - - class Token - { - public: - TokenType type_; - Location start_; - Location end_; - }; - - class ErrorInfo - { - public: - Token token_; - std::string message_; - Location extra_; - }; - - typedef std::deque<ErrorInfo> Errors; - - bool expectToken( TokenType type, Token &token, const char *message ); - bool readToken( Token &token ); - void skipSpaces(); - bool match( Location pattern, - int patternLength ); - bool readComment(); - bool readCStyleComment(); - bool readCppStyleComment(); - bool readString(); - void readNumber(); - bool readValue(); - bool readObject( Token &token ); - bool readArray( Token &token ); - bool decodeNumber( Token &token ); - bool decodeString( Token &token ); - bool decodeString( Token &token, std::string &decoded ); - bool decodeDouble( Token &token ); - bool decodeUnicodeCodePoint( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ); - bool decodeUnicodeEscapeSequence( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ); - bool addError( const std::string &message, - Token &token, - Location extra = 0 ); - bool recoverFromError( TokenType skipUntilToken ); - bool addErrorAndRecover( const std::string &message, - Token &token, - TokenType skipUntilToken ); - void skipUntilSpace(); - Value ¤tValue(); - Char getNextChar(); - void getLocationLineAndColumn( Location location, - int &line, - int &column ) const; - std::string getLocationLineAndColumn( Location location ) const; - void addComment( Location begin, - Location end, - CommentPlacement placement ); - void skipCommentTokens( Token &token ); - - typedef std::stack<Value *> Nodes; - Nodes nodes_; - Errors errors_; - std::string document_; - Location begin_; - Location end_; - Location current_; - Location lastValueEnd_; - Value *lastValue_; - std::string commentsBefore_; - Features features_; - bool collectComments_; - }; - - /** \brief Read from 'sin' into 'root'. - - Always keep comments from the input JSON. - - This can be used to read a file into a particular sub-object. - For example: - \code - Json::Value root; - cin >> root["dir"]["file"]; - cout << root; - \endcode - Result: - \verbatim - { - "dir": { - "file": { - // The input stream JSON would be nested here. - } - } - } - \endverbatim - \throw std::exception on parse error. - \see Json::operator<<() - */ - std::istream& operator>>( std::istream&, Value& ); - -} // namespace Json - -#endif // CPPTL_JSON_READER_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/reader.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/writer.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_WRITER_H_INCLUDED -# define JSON_WRITER_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -# include "value.h" -#endif // if !defined(JSON_IS_AMALGAMATION) -# include <vector> -# include <string> - -namespace Json { - - class Value; - - /** \brief Abstract class for writers. - */ - class JSON_API Writer - { - public: - virtual ~Writer(); - - virtual std::string write( const Value &root ) = 0; - }; - - /** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format without formatting (not human friendly). - * - * The JSON document is written in a single line. It is not intended for 'human' consumption, - * but may be usefull to support feature such as RPC where bandwith is limited. - * \sa Reader, Value - */ - class JSON_API FastWriter : public Writer - { - public: - FastWriter(); - virtual ~FastWriter(){} - - void enableYAMLCompatibility(); - - /** \brief Drop the "null" string from the writer's output for nullValues. - * Strictly speaking, this is not valid JSON. But when the output is being - * fed to a browser's Javascript, it makes for smaller output and the - * browser can handle the output just fine. - */ - void dropNullPlaceholders(); - - public: // overridden from Writer - virtual std::string write( const Value &root ); - - private: - void writeValue( const Value &value ); - - std::string document_; - bool yamlCompatiblityEnabled_; - bool dropNullPlaceholders_; - }; - - /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way. - * - * The rules for line break and indent are as follow: - * - Object value: - * - if empty then print {} without indent and line break - * - if not empty the print '{', line break & indent, print one value per line - * and then unindent and line break and print '}'. - * - Array value: - * - if empty then print [] without indent and line break - * - if the array contains no object value, empty array or some other value types, - * and all the values fit on one lines, then print the array on a single line. - * - otherwise, it the values do not fit on one line, or the array contains - * object or non empty array, then print one value per line. - * - * If the Value have comments then they are outputed according to their #CommentPlacement. - * - * \sa Reader, Value, Value::setComment() - */ - class JSON_API StyledWriter: public Writer - { - public: - StyledWriter(); - virtual ~StyledWriter(){} - - public: // overridden from Writer - /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format. - * \param root Value to serialize. - * \return String containing the JSON document that represents the root value. - */ - virtual std::string write( const Value &root ); - - private: - void writeValue( const Value &value ); - void writeArrayValue( const Value &value ); - bool isMultineArray( const Value &value ); - void pushValue( const std::string &value ); - void writeIndent(); - void writeWithIndent( const std::string &value ); - void indent(); - void unindent(); - void writeCommentBeforeValue( const Value &root ); - void writeCommentAfterValueOnSameLine( const Value &root ); - bool hasCommentForValue( const Value &value ); - static std::string normalizeEOL( const std::string &text ); - - typedef std::vector<std::string> ChildValues; - - ChildValues childValues_; - std::string document_; - std::string indentString_; - int rightMargin_; - int indentSize_; - bool addChildValues_; - }; - - /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way, - to a stream rather than to a string. - * - * The rules for line break and indent are as follow: - * - Object value: - * - if empty then print {} without indent and line break - * - if not empty the print '{', line break & indent, print one value per line - * and then unindent and line break and print '}'. - * - Array value: - * - if empty then print [] without indent and line break - * - if the array contains no object value, empty array or some other value types, - * and all the values fit on one lines, then print the array on a single line. - * - otherwise, it the values do not fit on one line, or the array contains - * object or non empty array, then print one value per line. - * - * If the Value have comments then they are outputed according to their #CommentPlacement. - * - * \param indentation Each level will be indented by this amount extra. - * \sa Reader, Value, Value::setComment() - */ - class JSON_API StyledStreamWriter - { - public: - StyledStreamWriter( std::string indentation="\t" ); - ~StyledStreamWriter(){} - - public: - /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format. - * \param out Stream to write to. (Can be ostringstream, e.g.) - * \param root Value to serialize. - * \note There is no point in deriving from Writer, since write() should not return a value. - */ - void write( std::ostream &out, const Value &root ); - - private: - void writeValue( const Value &value ); - void writeArrayValue( const Value &value ); - bool isMultineArray( const Value &value ); - void pushValue( const std::string &value ); - void writeIndent(); - void writeWithIndent( const std::string &value ); - void indent(); - void unindent(); - void writeCommentBeforeValue( const Value &root ); - void writeCommentAfterValueOnSameLine( const Value &root ); - bool hasCommentForValue( const Value &value ); - static std::string normalizeEOL( const std::string &text ); - - typedef std::vector<std::string> ChildValues; - - ChildValues childValues_; - std::ostream* document_; - std::string indentString_; - int rightMargin_; - std::string indentation_; - bool addChildValues_; - }; - -# if defined(JSON_HAS_INT64) - std::string JSON_API valueToString( Int value ); - std::string JSON_API valueToString( UInt value ); -# endif // if defined(JSON_HAS_INT64) - std::string JSON_API valueToString( LargestInt value ); - std::string JSON_API valueToString( LargestUInt value ); - std::string JSON_API valueToString( double value ); - std::string JSON_API valueToString( bool value ); - std::string JSON_API valueToQuotedString( const char *value ); - - /// \brief Output using the StyledStreamWriter. - /// \see Json::operator>>() - std::ostream& operator<<( std::ostream&, const Value &root ); - -} // namespace Json - - - -#endif // JSON_WRITER_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/writer.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/assertions.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED -# define CPPTL_JSON_ASSERTIONS_H_INCLUDED - -#include <stdlib.h> - -#if !defined(JSON_IS_AMALGAMATION) -# include <json/config.h> -#endif // if !defined(JSON_IS_AMALGAMATION) - -#if JSON_USE_EXCEPTION -#define JSON_ASSERT( condition ) assert( condition ); // @todo <= change this into an exception throw -#define JSON_FAIL_MESSAGE( message ) throw std::runtime_error( message ); -#else // JSON_USE_EXCEPTION -#define JSON_ASSERT( condition ) assert( condition ); - -// The call to assert() will show the failure message in debug builds. In -// release bugs we write to invalid memory in order to crash hard, so that a -// debugger or crash reporter gets the chance to take over. We still call exit() -// afterward in order to tell the compiler that this macro doesn't return. -#define JSON_FAIL_MESSAGE( message ) { assert(false && message); strcpy(reinterpret_cast<char*>(666), message); exit(123); } - -#endif - -#define JSON_ASSERT_MESSAGE( condition, message ) if (!( condition )) { JSON_FAIL_MESSAGE( message ) } - -#endif // CPPTL_JSON_ASSERTIONS_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/assertions.h -// ////////////////////////////////////////////////////////////////////// - - - - - -#endif //ifndef JSON_AMALGATED_H_INCLUDED diff --git a/src/jsoncpp/json/jsoncpp.cpp b/src/jsoncpp/json/jsoncpp.cpp deleted file mode 100644 index 7a04736de..000000000 --- a/src/jsoncpp/json/jsoncpp.cpp +++ /dev/null @@ -1,4367 +0,0 @@ -/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/). -/// It is intented to be used with #include <json/json.h> - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: LICENSE -// ////////////////////////////////////////////////////////////////////// - -/* -The JsonCpp library's source code, including accompanying documentation, -tests and demonstration applications, are licensed under the following -conditions... - -The author (Baptiste Lepilleur) explicitly disclaims copyright in all -jurisdictions which recognize such a disclaimer. In such jurisdictions, -this software is released into the Public Domain. - -In jurisdictions which do not recognize Public Domain property (e.g. Germany as of -2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is -released under the terms of the MIT License (see below). - -In jurisdictions which recognize Public Domain property, the user of this -software may choose to accept it either as 1) Public Domain, 2) under the -conditions of the MIT License (see below), or 3) under the terms of dual -Public Domain/MIT License conditions described here, as they choose. - -The MIT License is about as close to Public Domain as a license can get, and is -described in clear, concise terms at: - - http://en.wikipedia.org/wiki/MIT_License - -The full text of the MIT License follows: - -======================================================================== -Copyright (c) 2007-2010 Baptiste Lepilleur - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, copy, -modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -======================================================================== -(END LICENSE TEXT) - -The MIT license is compatible with both the GPL and commercial -software, affording one all of the rights of Public Domain with the -minor nuisance of being required to keep the above copyright notice -and license text in the source code. Note also that by accepting the -Public Domain "license" you can re-license your copy using whatever -license you like. - -*/ - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: LICENSE -// ////////////////////////////////////////////////////////////////////// - - - - - - -#include "json.h" - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: src/lib_json/json_tool.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED -# define LIB_JSONCPP_JSON_TOOL_H_INCLUDED - -/* This header provides common string manipulation support, such as UTF-8, - * portable conversion from/to string... - * - * It is an internal header that must not be exposed. - */ - -namespace Json { - -/// Converts a unicode code-point to UTF-8. -static inline std::string -codePointToUTF8(unsigned int cp) -{ - std::string result; - - // based on description from http://en.wikipedia.org/wiki/UTF-8 - - if (cp <= 0x7f) - { - result.resize(1); - result[0] = static_cast<char>(cp); - } - else if (cp <= 0x7FF) - { - result.resize(2); - result[1] = static_cast<char>(0x80 | (0x3f & cp)); - result[0] = static_cast<char>(0xC0 | (0x1f & (cp >> 6))); - } - else if (cp <= 0xFFFF) - { - result.resize(3); - result[2] = static_cast<char>(0x80 | (0x3f & cp)); - result[1] = 0x80 | static_cast<char>((0x3f & (cp >> 6))); - result[0] = 0xE0 | static_cast<char>((0xf & (cp >> 12))); - } - else if (cp <= 0x10FFFF) - { - result.resize(4); - result[3] = static_cast<char>(0x80 | (0x3f & cp)); - result[2] = static_cast<char>(0x80 | (0x3f & (cp >> 6))); - result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 12))); - result[0] = static_cast<char>(0xF0 | (0x7 & (cp >> 18))); - } - - return result; -} - - -/// Returns true if ch is a control character (in range [0,32[). -static inline bool -isControlCharacter(char ch) -{ - return ch > 0 && ch <= 0x1F; -} - - -enum { - /// Constant that specify the size of the buffer that must be passed to uintToString. - uintToStringBufferSize = 3*sizeof(LargestUInt)+1 -}; - -// Defines a char buffer for use with uintToString(). -typedef char UIntToStringBuffer[uintToStringBufferSize]; - - -/** Converts an unsigned integer to string. - * @param value Unsigned interger to convert to string - * @param current Input/Output string buffer. - * Must have at least uintToStringBufferSize chars free. - */ -static inline void -uintToString( LargestUInt value, - char *¤t ) -{ - *--current = 0; - do - { - *--current = char(value % 10) + '0'; - value /= 10; - } - while ( value != 0 ); -} - -} // namespace Json { - -#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: src/lib_json/json_tool.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: src/lib_json/json_reader.cpp -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2011 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#if !defined(JSON_IS_AMALGAMATION) -# include <json/assertions.h> -# include <json/reader.h> -# include <json/value.h> -# include "json_tool.h" -#endif // if !defined(JSON_IS_AMALGAMATION) -#include <utility> -#include <cstdio> -#include <cassert> -#include <cstring> -#include <stdexcept> - -#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 -#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. -#endif - -namespace Json { - -// Implementation of class Features -// //////////////////////////////// - -Features::Features() - : allowComments_( true ) - , strictRoot_( false ) -{ -} - - -Features -Features::all() -{ - return Features(); -} - - -Features -Features::strictMode() -{ - Features features; - features.allowComments_ = false; - features.strictRoot_ = true; - return features; -} - -// Implementation of class Reader -// //////////////////////////////// - - -static inline bool -in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 ) -{ - return c == c1 || c == c2 || c == c3 || c == c4; -} - -static inline bool -in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 ) -{ - return c == c1 || c == c2 || c == c3 || c == c4 || c == c5; -} - - -static bool -containsNewLine( Reader::Location begin, - Reader::Location end ) -{ - for ( ;begin < end; ++begin ) - if ( *begin == '\n' || *begin == '\r' ) - return true; - return false; -} - - -// Class Reader -// ////////////////////////////////////////////////////////////////// - -Reader::Reader() - : errors_(), - document_(), - begin_(), - end_(), - current_(), - lastValueEnd_(), - lastValue_(), - commentsBefore_(), - features_( Features::all() ), - collectComments_() -{ -} - - -Reader::Reader( const Features &features ) - : errors_(), - document_(), - begin_(), - end_(), - current_(), - lastValueEnd_(), - lastValue_(), - commentsBefore_(), - features_( features ), - collectComments_() -{ -} - - -bool -Reader::parse( const std::string &document, - Value &root, - bool collectComments ) -{ - document_ = document; - const char *begin = document_.c_str(); - const char *end = begin + document_.length(); - return parse( begin, end, root, collectComments ); -} - - -bool -Reader::parse( std::istream& sin, - Value &root, - bool collectComments ) -{ - //std::istream_iterator<char> begin(sin); - //std::istream_iterator<char> end; - // Those would allow streamed input from a file, if parse() were a - // template function. - - // Since std::string is reference-counted, this at least does not - // create an extra copy. - std::string doc; - std::getline(sin, doc, (char)EOF); - return parse( doc, root, collectComments ); -} - -bool -Reader::parse( const char *beginDoc, const char *endDoc, - Value &root, - bool collectComments ) -{ - if ( !features_.allowComments_ ) - { - collectComments = false; - } - - begin_ = beginDoc; - end_ = endDoc; - collectComments_ = collectComments; - current_ = begin_; - lastValueEnd_ = 0; - lastValue_ = 0; - commentsBefore_ = ""; - errors_.clear(); - while ( !nodes_.empty() ) - nodes_.pop(); - nodes_.push( &root ); - - bool successful = readValue(); - Token token; - skipCommentTokens( token ); - if ( collectComments_ && !commentsBefore_.empty() ) - root.setComment( commentsBefore_, commentAfter ); - if ( features_.strictRoot_ ) - { - if ( !root.isArray() && !root.isObject() ) - { - // Set error location to start of doc, ideally should be first token found in doc - token.type_ = tokenError; - token.start_ = beginDoc; - token.end_ = endDoc; - addError( "A valid JSON document must be either an array or an object value.", - token ); - return false; - } - } - return successful; -} - - -bool -Reader::readValue() -{ - Token token; - skipCommentTokens( token ); - bool successful = true; - - if ( collectComments_ && !commentsBefore_.empty() ) - { - currentValue().setComment( commentsBefore_, commentBefore ); - commentsBefore_ = ""; - } - - - switch ( token.type_ ) - { - case tokenObjectBegin: - successful = readObject( token ); - break; - case tokenArrayBegin: - successful = readArray( token ); - break; - case tokenNumber: - successful = decodeNumber( token ); - break; - case tokenString: - successful = decodeString( token ); - break; - case tokenTrue: - currentValue() = true; - break; - case tokenFalse: - currentValue() = false; - break; - case tokenNull: - currentValue() = Value(); - break; - default: - return addError( "Syntax error: value, object or array expected.", token ); - } - - if ( collectComments_ ) - { - lastValueEnd_ = current_; - lastValue_ = ¤tValue(); - } - - return successful; -} - - -void -Reader::skipCommentTokens( Token &token ) -{ - if ( features_.allowComments_ ) - { - do - { - readToken( token ); - } - while ( token.type_ == tokenComment ); - } - else - { - readToken( token ); - } -} - - -bool -Reader::expectToken( TokenType type, Token &token, const char *message ) -{ - readToken( token ); - if ( token.type_ != type ) - return addError( message, token ); - return true; -} - - -bool -Reader::readToken( Token &token ) -{ - skipSpaces(); - token.start_ = current_; - Char c = getNextChar(); - bool ok = true; - switch ( c ) - { - case '{': - token.type_ = tokenObjectBegin; - break; - case '}': - token.type_ = tokenObjectEnd; - break; - case '[': - token.type_ = tokenArrayBegin; - break; - case ']': - token.type_ = tokenArrayEnd; - break; - case '"': - token.type_ = tokenString; - ok = readString(); - break; - case '/': - token.type_ = tokenComment; - ok = readComment(); - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '-': - token.type_ = tokenNumber; - readNumber(); - break; - case 't': - token.type_ = tokenTrue; - ok = match( "rue", 3 ); - break; - case 'f': - token.type_ = tokenFalse; - ok = match( "alse", 4 ); - break; - case 'n': - token.type_ = tokenNull; - ok = match( "ull", 3 ); - break; - case ',': - token.type_ = tokenArraySeparator; - break; - case ':': - token.type_ = tokenMemberSeparator; - break; - case 0: - token.type_ = tokenEndOfStream; - break; - default: - ok = false; - break; - } - if ( !ok ) - token.type_ = tokenError; - token.end_ = current_; - return true; -} - - -void -Reader::skipSpaces() -{ - while ( current_ != end_ ) - { - Char c = *current_; - if ( c == ' ' || c == '\t' || c == '\r' || c == '\n' ) - ++current_; - else - break; - } -} - - -bool -Reader::match( Location pattern, - int patternLength ) -{ - if ( end_ - current_ < patternLength ) - return false; - int index = patternLength; - while ( index-- ) - if ( current_[index] != pattern[index] ) - return false; - current_ += patternLength; - return true; -} - - -bool -Reader::readComment() -{ - Location commentBegin = current_ - 1; - Char c = getNextChar(); - bool successful = false; - if ( c == '*' ) - successful = readCStyleComment(); - else if ( c == '/' ) - successful = readCppStyleComment(); - if ( !successful ) - return false; - - if ( collectComments_ ) - { - CommentPlacement placement = commentBefore; - if ( lastValueEnd_ && !containsNewLine( lastValueEnd_, commentBegin ) ) - { - if ( c != '*' || !containsNewLine( commentBegin, current_ ) ) - placement = commentAfterOnSameLine; - } - - addComment( commentBegin, current_, placement ); - } - return true; -} - - -void -Reader::addComment( Location begin, - Location end, - CommentPlacement placement ) -{ - assert( collectComments_ ); - if ( placement == commentAfterOnSameLine ) - { - assert( lastValue_ != 0 ); - lastValue_->setComment( std::string( begin, end ), placement ); - } - else - { - if ( !commentsBefore_.empty() ) - commentsBefore_ += "\n"; - commentsBefore_ += std::string( begin, end ); - } -} - - -bool -Reader::readCStyleComment() -{ - while ( current_ != end_ ) - { - Char c = getNextChar(); - if ( c == '*' && *current_ == '/' ) - break; - } - return getNextChar() == '/'; -} - - -bool -Reader::readCppStyleComment() -{ - while ( current_ != end_ ) - { - Char c = getNextChar(); - if ( c == '\r' || c == '\n' ) - break; - } - return true; -} - - -void -Reader::readNumber() -{ - while ( current_ != end_ ) - { - if ( !(*current_ >= '0' && *current_ <= '9') && - !in( *current_, '.', 'e', 'E', '+', '-' ) ) - break; - ++current_; - } -} - -bool -Reader::readString() -{ - Char c = 0; - while ( current_ != end_ ) - { - c = getNextChar(); - if ( c == '\\' ) - getNextChar(); - else if ( c == '"' ) - break; - } - return c == '"'; -} - - -bool -Reader::readObject( Token &/*tokenStart*/ ) -{ - Token tokenName; - std::string name; - currentValue() = Value( objectValue ); - while ( readToken( tokenName ) ) - { - bool initialTokenOk = true; - while ( tokenName.type_ == tokenComment && initialTokenOk ) - initialTokenOk = readToken( tokenName ); - if ( !initialTokenOk ) - break; - if ( tokenName.type_ == tokenObjectEnd && name.empty() ) // empty object - return true; - if ( tokenName.type_ != tokenString ) - break; - - name = ""; - if ( !decodeString( tokenName, name ) ) - return recoverFromError( tokenObjectEnd ); - - Token colon; - if ( !readToken( colon ) || colon.type_ != tokenMemberSeparator ) - { - return addErrorAndRecover( "Missing ':' after object member name", - colon, - tokenObjectEnd ); - } - Value &value = currentValue()[ name ]; - nodes_.push( &value ); - bool ok = readValue(); - nodes_.pop(); - if ( !ok ) // error already set - return recoverFromError( tokenObjectEnd ); - - Token comma; - if ( !readToken( comma ) - || ( comma.type_ != tokenObjectEnd && - comma.type_ != tokenArraySeparator && - comma.type_ != tokenComment ) ) - { - return addErrorAndRecover( "Missing ',' or '}' in object declaration", - comma, - tokenObjectEnd ); - } - bool finalizeTokenOk = true; - while ( comma.type_ == tokenComment && - finalizeTokenOk ) - finalizeTokenOk = readToken( comma ); - if ( comma.type_ == tokenObjectEnd ) - return true; - } - return addErrorAndRecover( "Missing '}' or object member name", - tokenName, - tokenObjectEnd ); -} - - -bool -Reader::readArray( Token &/*tokenStart*/ ) -{ - currentValue() = Value( arrayValue ); - skipSpaces(); - if ( *current_ == ']' ) // empty array - { - Token endArray; - readToken( endArray ); - return true; - } - int index = 0; - for (;;) - { - Value &value = currentValue()[ index++ ]; - nodes_.push( &value ); - bool ok = readValue(); - nodes_.pop(); - if ( !ok ) // error already set - return recoverFromError( tokenArrayEnd ); - - Token token; - // Accept Comment after last item in the array. - ok = readToken( token ); - while ( token.type_ == tokenComment && ok ) - { - ok = readToken( token ); - } - bool badTokenType = ( token.type_ != tokenArraySeparator && - token.type_ != tokenArrayEnd ); - if ( !ok || badTokenType ) - { - return addErrorAndRecover( "Missing ',' or ']' in array declaration", - token, - tokenArrayEnd ); - } - if ( token.type_ == tokenArrayEnd ) - break; - } - return true; -} - - -bool -Reader::decodeNumber( Token &token ) -{ - bool isDouble = false; - for ( Location inspect = token.start_; inspect != token.end_; ++inspect ) - { - isDouble = isDouble - || in( *inspect, '.', 'e', 'E', '+' ) - || ( *inspect == '-' && inspect != token.start_ ); - } - if ( isDouble ) - return decodeDouble( token ); - // Attempts to parse the number as an integer. If the number is - // larger than the maximum supported value of an integer then - // we decode the number as a double. - Location current = token.start_; - bool isNegative = *current == '-'; - if ( isNegative ) - ++current; - Value::LargestUInt maxIntegerValue = isNegative ? Value::LargestUInt(-Value::minLargestInt) - : Value::maxLargestUInt; - Value::LargestUInt threshold = maxIntegerValue / 10; - Value::LargestUInt value = 0; - while ( current < token.end_ ) - { - Char c = *current++; - if ( c < '0' || c > '9' ) - return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); - Value::UInt digit(c - '0'); - if ( value >= threshold ) - { - // We've hit or exceeded the max value divided by 10 (rounded down). If - // a) we've only just touched the limit, b) this is the last digit, and - // c) it's small enough to fit in that rounding delta, we're okay. - // Otherwise treat this number as a double to avoid overflow. - if (value > threshold || - current != token.end_ || - digit > maxIntegerValue % 10) - { - return decodeDouble( token ); - } - } - value = value * 10 + digit; - } - if ( isNegative ) - currentValue() = -Value::LargestInt( value ); - else if ( value <= Value::LargestUInt(Value::maxInt) ) - currentValue() = Value::LargestInt( value ); - else - currentValue() = value; - return true; -} - - -bool -Reader::decodeDouble( Token &token ) -{ - double value = 0; - const int bufferSize = 32; - int count; - int length = int(token.end_ - token.start_); - - // Sanity check to avoid buffer overflow exploits. - if (length < 0) { - return addError( "Unable to parse token length", token ); - } - - // Avoid using a string constant for the format control string given to - // sscanf, as this can cause hard to debug crashes on OS X. See here for more - // info: - // - // http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/gcc-4.0.1/gcc/Incompatibilities.html - char format[] = "%lf"; - - if ( length <= bufferSize ) - { - Char buffer[bufferSize+1]; - memcpy( buffer, token.start_, length ); - buffer[length] = 0; - count = sscanf( buffer, format, &value ); - } - else - { - std::string buffer( token.start_, token.end_ ); - count = sscanf( buffer.c_str(), format, &value ); - } - - if ( count != 1 ) - return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); - currentValue() = value; - return true; -} - - -bool -Reader::decodeString( Token &token ) -{ - std::string decoded; - if ( !decodeString( token, decoded ) ) - return false; - currentValue() = decoded; - return true; -} - - -bool -Reader::decodeString( Token &token, std::string &decoded ) -{ - decoded.reserve( token.end_ - token.start_ - 2 ); - Location current = token.start_ + 1; // skip '"' - Location end = token.end_ - 1; // do not include '"' - while ( current != end ) - { - Char c = *current++; - if ( c == '"' ) - break; - else if ( c == '\\' ) - { - if ( current == end ) - return addError( "Empty escape sequence in string", token, current ); - Char escape = *current++; - switch ( escape ) - { - case '"': decoded += '"'; break; - case '/': decoded += '/'; break; - case '\\': decoded += '\\'; break; - case 'b': decoded += '\b'; break; - case 'f': decoded += '\f'; break; - case 'n': decoded += '\n'; break; - case 'r': decoded += '\r'; break; - case 't': decoded += '\t'; break; - case 'u': - { - unsigned int unicode; - if ( !decodeUnicodeCodePoint( token, current, end, unicode ) ) - return false; - decoded += codePointToUTF8(unicode); - } - break; - default: - return addError( "Bad escape sequence in string", token, current ); - } - } - else - { - decoded += c; - } - } - return true; -} - -bool -Reader::decodeUnicodeCodePoint( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ) -{ - - if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) ) - return false; - if (unicode >= 0xD800 && unicode <= 0xDBFF) - { - // surrogate pairs - if (end - current < 6) - return addError( "additional six characters expected to parse unicode surrogate pair.", token, current ); - unsigned int surrogatePair; - if (*(current++) == '\\' && *(current++)== 'u') - { - if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair )) - { - unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); - } - else - return false; - } - else - return addError( "expecting another \\u token to begin the second half of a unicode surrogate pair", token, current ); - } - return true; -} - -bool -Reader::decodeUnicodeEscapeSequence( Token &token, - Location ¤t, - Location end, - unsigned int &unicode ) -{ - if ( end - current < 4 ) - return addError( "Bad unicode escape sequence in string: four digits expected.", token, current ); - unicode = 0; - for ( int index =0; index < 4; ++index ) - { - Char c = *current++; - unicode *= 16; - if ( c >= '0' && c <= '9' ) - unicode += c - '0'; - else if ( c >= 'a' && c <= 'f' ) - unicode += c - 'a' + 10; - else if ( c >= 'A' && c <= 'F' ) - unicode += c - 'A' + 10; - else - return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", token, current ); - } - return true; -} - - -bool -Reader::addError( const std::string &message, - Token &token, - Location extra ) -{ - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = extra; - errors_.push_back( info ); - return false; -} - - -bool -Reader::recoverFromError( TokenType skipUntilToken ) -{ - int errorCount = int(errors_.size()); - Token skip; - for (;;) - { - if ( !readToken(skip) ) - errors_.resize( errorCount ); // discard errors caused by recovery - if ( skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream ) - break; - } - errors_.resize( errorCount ); - return false; -} - - -bool -Reader::addErrorAndRecover( const std::string &message, - Token &token, - TokenType skipUntilToken ) -{ - addError( message, token ); - return recoverFromError( skipUntilToken ); -} - - -Value & -Reader::currentValue() -{ - return *(nodes_.top()); -} - - -Reader::Char -Reader::getNextChar() -{ - if ( current_ == end_ ) - return 0; - return *current_++; -} - - -void -Reader::getLocationLineAndColumn( Location location, - int &line, - int &column ) const -{ - Location current = begin_; - Location lastLineStart = current; - line = 0; - while ( current < location && current != end_ ) - { - Char c = *current++; - if ( c == '\r' ) - { - if ( *current == '\n' ) - ++current; - lastLineStart = current; - ++line; - } - else if ( c == '\n' ) - { - lastLineStart = current; - ++line; - } - } - // column & line start at 1 - column = int(location - lastLineStart) + 1; - ++line; -} - - -std::string -Reader::getLocationLineAndColumn( Location location ) const -{ - int line, column; - getLocationLineAndColumn( location, line, column ); - char buffer[18+16+16+1]; - sprintf( buffer, "Line %d, Column %d", line, column ); - return buffer; -} - - -// Deprecated. Preserved for backward compatibility -std::string -Reader::getFormatedErrorMessages() const -{ - return getFormattedErrorMessages(); -} - - -std::string -Reader::getFormattedErrorMessages() const -{ - std::string formattedMessage; - for ( Errors::const_iterator itError = errors_.begin(); - itError != errors_.end(); - ++itError ) - { - const ErrorInfo &error = *itError; - formattedMessage += "* " + getLocationLineAndColumn( error.token_.start_ ) + "\n"; - formattedMessage += " " + error.message_ + "\n"; - if ( error.extra_ ) - formattedMessage += "See " + getLocationLineAndColumn( error.extra_ ) + " for detail.\n"; - } - return formattedMessage; -} - - -std::istream& operator>>( std::istream &sin, Value &root ) -{ - Json::Reader reader; - bool ok = reader.parse(sin, root, true); - if (!ok) { - fprintf( - stderr, - "Error from reader: %s", - reader.getFormattedErrorMessages().c_str()); - - JSON_FAIL_MESSAGE("reader error"); - } - return sin; -} - - -} // namespace Json - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: src/lib_json/json_reader.cpp -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: src/lib_json/json_batchallocator.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSONCPP_BATCHALLOCATOR_H_INCLUDED -# define JSONCPP_BATCHALLOCATOR_H_INCLUDED - -# include <stdlib.h> -# include <assert.h> - -# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - -namespace Json { - -/* Fast memory allocator. - * - * This memory allocator allocates memory for a batch of object (specified by - * the page size, the number of object in each page). - * - * It does not allow the destruction of a single object. All the allocated objects - * can be destroyed at once. The memory can be either released or reused for future - * allocation. - * - * The in-place new operator must be used to construct the object using the pointer - * returned by allocate. - */ -template<typename AllocatedType - ,const unsigned int objectPerAllocation> -class BatchAllocator -{ -public: - BatchAllocator( unsigned int objectsPerPage = 255 ) - : freeHead_( 0 ) - , objectsPerPage_( objectsPerPage ) - { -// printf( "Size: %d => %s\n", sizeof(AllocatedType), typeid(AllocatedType).name() ); - assert( sizeof(AllocatedType) * objectPerAllocation >= sizeof(AllocatedType *) ); // We must be able to store a slist in the object free space. - assert( objectsPerPage >= 16 ); - batches_ = allocateBatch( 0 ); // allocated a dummy page - currentBatch_ = batches_; - } - - ~BatchAllocator() - { - for ( BatchInfo *batch = batches_; batch; ) - { - BatchInfo *nextBatch = batch->next_; - free( batch ); - batch = nextBatch; - } - } - - /// allocate space for an array of objectPerAllocation object. - /// @warning it is the responsability of the caller to call objects constructors. - AllocatedType *allocate() - { - if ( freeHead_ ) // returns node from free list. - { - AllocatedType *object = freeHead_; - freeHead_ = *(AllocatedType **)object; - return object; - } - if ( currentBatch_->used_ == currentBatch_->end_ ) - { - currentBatch_ = currentBatch_->next_; - while ( currentBatch_ && currentBatch_->used_ == currentBatch_->end_ ) - currentBatch_ = currentBatch_->next_; - - if ( !currentBatch_ ) // no free batch found, allocate a new one - { - currentBatch_ = allocateBatch( objectsPerPage_ ); - currentBatch_->next_ = batches_; // insert at the head of the list - batches_ = currentBatch_; - } - } - AllocatedType *allocated = currentBatch_->used_; - currentBatch_->used_ += objectPerAllocation; - return allocated; - } - - /// Release the object. - /// @warning it is the responsability of the caller to actually destruct the object. - void release( AllocatedType *object ) - { - assert( object != 0 ); - *(AllocatedType **)object = freeHead_; - freeHead_ = object; - } - -private: - struct BatchInfo - { - BatchInfo *next_; - AllocatedType *used_; - AllocatedType *end_; - AllocatedType buffer_[objectPerAllocation]; - }; - - // disabled copy constructor and assignement operator. - BatchAllocator( const BatchAllocator & ); - void operator =( const BatchAllocator &); - - static BatchInfo *allocateBatch( unsigned int objectsPerPage ) - { - const unsigned int mallocSize = sizeof(BatchInfo) - sizeof(AllocatedType)* objectPerAllocation - + sizeof(AllocatedType) * objectPerAllocation * objectsPerPage; - BatchInfo *batch = static_cast<BatchInfo*>( malloc( mallocSize ) ); - batch->next_ = 0; - batch->used_ = batch->buffer_; - batch->end_ = batch->buffer_ + objectsPerPage; - return batch; - } - - BatchInfo *batches_; - BatchInfo *currentBatch_; - /// Head of a single linked list within the allocated space of freeed object - AllocatedType *freeHead_; - unsigned int objectsPerPage_; -}; - - -} // namespace Json - -# endif // ifndef JSONCPP_DOC_INCLUDE_IMPLEMENTATION - -#endif // JSONCPP_BATCHALLOCATOR_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: src/lib_json/json_batchallocator.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: src/lib_json/json_valueiterator.inl -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -// included by json_value.cpp - -namespace Json { - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueIteratorBase -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueIteratorBase::ValueIteratorBase() -#ifndef JSON_VALUE_USE_INTERNAL_MAP - : current_() - , isNull_( true ) -{ -} -#else - : isArray_( true ) - , isNull_( true ) -{ - iterator_.array_ = ValueInternalArray::IteratorState(); -} -#endif - - -#ifndef JSON_VALUE_USE_INTERNAL_MAP -ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator ¤t ) - : current_( current ) - , isNull_( false ) -{ -} -#else -ValueIteratorBase::ValueIteratorBase( const ValueInternalArray::IteratorState &state ) - : isArray_( true ) -{ - iterator_.array_ = state; -} - - -ValueIteratorBase::ValueIteratorBase( const ValueInternalMap::IteratorState &state ) - : isArray_( false ) -{ - iterator_.map_ = state; -} -#endif - -Value & -ValueIteratorBase::deref() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - return current_->second; -#else - if ( isArray_ ) - return ValueInternalArray::dereference( iterator_.array_ ); - return ValueInternalMap::value( iterator_.map_ ); -#endif -} - - -void -ValueIteratorBase::increment() -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - ++current_; -#else - if ( isArray_ ) - ValueInternalArray::increment( iterator_.array_ ); - ValueInternalMap::increment( iterator_.map_ ); -#endif -} - - -void -ValueIteratorBase::decrement() -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - --current_; -#else - if ( isArray_ ) - ValueInternalArray::decrement( iterator_.array_ ); - ValueInternalMap::decrement( iterator_.map_ ); -#endif -} - - -ValueIteratorBase::difference_type -ValueIteratorBase::computeDistance( const SelfType &other ) const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP -# ifdef JSON_USE_CPPTL_SMALLMAP - return current_ - other.current_; -# else - // Iterator for null value are initialized using the default - // constructor, which initialize current_ to the default - // std::map::iterator. As begin() and end() are two instance - // of the default std::map::iterator, they can not be compared. - // To allow this, we handle this comparison specifically. - if ( isNull_ && other.isNull_ ) - { - return 0; - } - - - // Usage of std::distance is not portable (does not compile with Sun Studio 12 RogueWave STL, - // which is the one used by default). - // Using a portable hand-made version for non random iterator instead: - // return difference_type( std::distance( current_, other.current_ ) ); - difference_type myDistance = 0; - for ( Value::ObjectValues::iterator it = current_; it != other.current_; ++it ) - { - ++myDistance; - } - return myDistance; -# endif -#else - if ( isArray_ ) - return ValueInternalArray::distance( iterator_.array_, other.iterator_.array_ ); - return ValueInternalMap::distance( iterator_.map_, other.iterator_.map_ ); -#endif -} - - -bool -ValueIteratorBase::isEqual( const SelfType &other ) const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - if ( isNull_ ) - { - return other.isNull_; - } - return current_ == other.current_; -#else - if ( isArray_ ) - return ValueInternalArray::equals( iterator_.array_, other.iterator_.array_ ); - return ValueInternalMap::equals( iterator_.map_, other.iterator_.map_ ); -#endif -} - - -void -ValueIteratorBase::copy( const SelfType &other ) -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - current_ = other.current_; -#else - if ( isArray_ ) - iterator_.array_ = other.iterator_.array_; - iterator_.map_ = other.iterator_.map_; -#endif -} - - -Value -ValueIteratorBase::key() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - const Value::CZString czstring = (*current_).first; - if ( czstring.c_str() ) - { - if ( czstring.isStaticString() ) - return Value( StaticString( czstring.c_str() ) ); - return Value( czstring.c_str() ); - } - return Value( czstring.index() ); -#else - if ( isArray_ ) - return Value( ValueInternalArray::indexOf( iterator_.array_ ) ); - bool isStatic; - const char *memberName = ValueInternalMap::key( iterator_.map_, isStatic ); - if ( isStatic ) - return Value( StaticString( memberName ) ); - return Value( memberName ); -#endif -} - - -UInt -ValueIteratorBase::index() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - const Value::CZString czstring = (*current_).first; - if ( !czstring.c_str() ) - return czstring.index(); - return Value::UInt( -1 ); -#else - if ( isArray_ ) - return Value::UInt( ValueInternalArray::indexOf( iterator_.array_ ) ); - return Value::UInt( -1 ); -#endif -} - - -const char * -ValueIteratorBase::memberName() const -{ -#ifndef JSON_VALUE_USE_INTERNAL_MAP - const char *name = (*current_).first.c_str(); - return name ? name : ""; -#else - if ( !isArray_ ) - return ValueInternalMap::key( iterator_.map_ ); - return ""; -#endif -} - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueConstIterator -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueConstIterator::ValueConstIterator() -{ -} - - -#ifndef JSON_VALUE_USE_INTERNAL_MAP -ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator ¤t ) - : ValueIteratorBase( current ) -{ -} -#else -ValueConstIterator::ValueConstIterator( const ValueInternalArray::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} - -ValueConstIterator::ValueConstIterator( const ValueInternalMap::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} -#endif - -ValueConstIterator & -ValueConstIterator::operator =( const ValueIteratorBase &other ) -{ - copy( other ); - return *this; -} - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueIterator -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueIterator::ValueIterator() -{ -} - - -#ifndef JSON_VALUE_USE_INTERNAL_MAP -ValueIterator::ValueIterator( const Value::ObjectValues::iterator ¤t ) - : ValueIteratorBase( current ) -{ -} -#else -ValueIterator::ValueIterator( const ValueInternalArray::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} - -ValueIterator::ValueIterator( const ValueInternalMap::IteratorState &state ) - : ValueIteratorBase( state ) -{ -} -#endif - -ValueIterator::ValueIterator( const ValueConstIterator &other ) - : ValueIteratorBase( other ) -{ -} - -ValueIterator::ValueIterator( const ValueIterator &other ) - : ValueIteratorBase( other ) -{ -} - -ValueIterator & -ValueIterator::operator =( const SelfType &other ) -{ - copy( other ); - return *this; -} - -} // namespace Json - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: src/lib_json/json_valueiterator.inl -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: src/lib_json/json_value.cpp -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2011 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#if !defined(JSON_IS_AMALGAMATION) -# include <json/assertions.h> -# include <json/value.h> -# include <json/writer.h> -# ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR -# include "json_batchallocator.h" -# endif // #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR -#endif // if !defined(JSON_IS_AMALGAMATION) -#include <math.h> -#include <sstream> -#include <utility> -#include <stdexcept> -#include <cstring> -#include <cassert> -#ifdef JSON_USE_CPPTL -# include <cpptl/conststring.h> -#endif -#include <cstddef> // size_t - -#define JSON_ASSERT_UNREACHABLE assert( false ) - -namespace Json { - -const Value Value::null; -const Int Value::minInt = Int( ~(UInt(-1)/2) ); -const Int Value::maxInt = Int( UInt(-1)/2 ); -const UInt Value::maxUInt = UInt(-1); -# if defined(JSON_HAS_INT64) -const Int64 Value::minInt64 = Int64( ~(UInt64(-1)/2) ); -const Int64 Value::maxInt64 = Int64( UInt64(-1)/2 ); -const UInt64 Value::maxUInt64 = UInt64(-1); -// The constant is hard-coded because some compiler have trouble -// converting Value::maxUInt64 to a double correctly (AIX/xlC). -// Assumes that UInt64 is a 64 bits integer. -static const double maxUInt64AsDouble = 18446744073709551615.0; -#endif // defined(JSON_HAS_INT64) -const LargestInt Value::minLargestInt = LargestInt( ~(LargestUInt(-1)/2) ); -const LargestInt Value::maxLargestInt = LargestInt( LargestUInt(-1)/2 ); -const LargestUInt Value::maxLargestUInt = LargestUInt(-1); - - -/// Unknown size marker -static const unsigned int unknown = (unsigned)-1; - -#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) -template <typename T, typename U> -static inline bool InRange(double d, T min, U max) { - return d >= min && d <= max; -} -#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) -static inline double integerToDouble( Json::UInt64 value ) -{ - return static_cast<double>( Int64(value/2) ) * 2.0 + Int64(value & 1); -} - -template<typename T> -static inline double integerToDouble( T value ) -{ - return static_cast<double>( value ); -} - -template <typename T, typename U> -static inline bool InRange(double d, T min, U max) { - return d >= integerToDouble(min) && d <= integerToDouble(max); -} -#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - - -/** Duplicates the specified string value. - * @param value Pointer to the string to duplicate. Must be zero-terminated if - * length is "unknown". - * @param length Length of the value. if equals to unknown, then it will be - * computed using strlen(value). - * @return Pointer on the duplicate instance of string. - */ -static inline char * -duplicateStringValue( const char *value, - unsigned int length = unknown ) -{ - if ( length == unknown ) - length = (unsigned int)strlen(value); - - // Avoid an integer overflow in the call to malloc below by limiting length - // to a sane value. - if (length >= (unsigned)Value::maxInt) - length = Value::maxInt - 1; - - char *newString = static_cast<char *>( malloc( length + 1 ) ); - JSON_ASSERT_MESSAGE( newString != 0, "Failed to allocate string value buffer" ); - memcpy( newString, value, length ); - newString[length] = 0; - return newString; -} - - -/** Free the string duplicated by duplicateStringValue(). - */ -static inline void -releaseStringValue( char *value ) -{ - if ( value ) - free( value ); -} - -} // namespace Json - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ValueInternals... -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -#if !defined(JSON_IS_AMALGAMATION) -# ifdef JSON_VALUE_USE_INTERNAL_MAP -# include "json_internalarray.inl" -# include "json_internalmap.inl" -# endif // JSON_VALUE_USE_INTERNAL_MAP - -# include "json_valueiterator.inl" -#endif // if !defined(JSON_IS_AMALGAMATION) - -namespace Json { - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::CommentInfo -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - - -Value::CommentInfo::CommentInfo() - : comment_( 0 ) -{ -} - -Value::CommentInfo::~CommentInfo() -{ - if ( comment_ ) - releaseStringValue( comment_ ); -} - - -void -Value::CommentInfo::setComment( const char *text ) -{ - if ( comment_ ) - releaseStringValue( comment_ ); - JSON_ASSERT( text != 0 ); - JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /"); - // It seems that /**/ style comments are acceptable as well. - comment_ = duplicateStringValue( text ); -} - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::CZString -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -# ifndef JSON_VALUE_USE_INTERNAL_MAP - -// Notes: index_ indicates if the string was allocated when -// a string is stored. - -Value::CZString::CZString( ArrayIndex index ) - : cstr_( 0 ) - , index_( index ) -{ -} - -Value::CZString::CZString( const char *cstr, DuplicationPolicy allocate ) - : cstr_( allocate == duplicate ? duplicateStringValue(cstr) - : cstr ) - , index_( allocate ) -{ -} - -Value::CZString::CZString( const CZString &other ) -: cstr_( other.index_ != noDuplication && other.cstr_ != 0 - ? duplicateStringValue( other.cstr_ ) - : other.cstr_ ) - , index_( other.cstr_ ? (other.index_ == noDuplication ? noDuplication : duplicate) - : other.index_ ) -{ -} - -Value::CZString::~CZString() -{ - if ( cstr_ && index_ == duplicate ) - releaseStringValue( const_cast<char *>( cstr_ ) ); -} - -void -Value::CZString::swap( CZString &other ) -{ - std::swap( cstr_, other.cstr_ ); - std::swap( index_, other.index_ ); -} - -Value::CZString & -Value::CZString::operator =( const CZString &other ) -{ - CZString temp( other ); - swap( temp ); - return *this; -} - -bool -Value::CZString::operator<( const CZString &other ) const -{ - if ( cstr_ ) - return strcmp( cstr_, other.cstr_ ) < 0; - return index_ < other.index_; -} - -bool -Value::CZString::operator==( const CZString &other ) const -{ - if ( cstr_ ) - return strcmp( cstr_, other.cstr_ ) == 0; - return index_ == other.index_; -} - - -ArrayIndex -Value::CZString::index() const -{ - return index_; -} - - -const char * -Value::CZString::c_str() const -{ - return cstr_; -} - -bool -Value::CZString::isStaticString() const -{ - return index_ == noDuplication; -} - -#endif // ifndef JSON_VALUE_USE_INTERNAL_MAP - - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::Value -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -/*! \internal Default constructor initialization must be equivalent to: - * memset( this, 0, sizeof(Value) ) - * This optimization is used in ValueInternalMap fast allocator. - */ -Value::Value( ValueType type ) - : type_( type ) - , allocated_( false ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - switch ( type ) - { - case nullValue: - break; - case intValue: - case uintValue: - value_.int_ = 0; - break; - case realValue: - value_.real_ = 0.0; - break; - case stringValue: - value_.string_ = 0; - break; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues(); - break; -#else - case arrayValue: - value_.array_ = arrayAllocator()->newArray(); - break; - case objectValue: - value_.map_ = mapAllocator()->newMap(); - break; -#endif - case booleanValue: - value_.bool_ = false; - break; - default: - JSON_ASSERT_UNREACHABLE; - } -} - - -Value::Value( UInt value ) - : type_( uintValue ) - , allocated_( false ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - value_.uint_ = value; -} - -Value::Value( Int value ) - : type_( intValue ) - , allocated_( false ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - value_.int_ = value; -} - - -# if defined(JSON_HAS_INT64) -Value::Value( Int64 value ) - : type_( intValue ) - , allocated_( false ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - value_.int_ = value; -} - - -Value::Value( UInt64 value ) - : type_( uintValue ) - , allocated_( false ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - value_.uint_ = value; -} -#endif // defined(JSON_HAS_INT64) - -Value::Value( double value ) - : type_( realValue ) - , allocated_( false ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - value_.real_ = value; -} - -Value::Value( const char *value ) - : type_( stringValue ) - , allocated_( true ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - value_.string_ = duplicateStringValue( value ); -} - - -Value::Value( const char *beginValue, - const char *endValue ) - : type_( stringValue ) - , allocated_( true ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - value_.string_ = duplicateStringValue( beginValue, - (unsigned int)(endValue - beginValue) ); -} - - -Value::Value( const std::string &value ) - : type_( stringValue ) - , allocated_( true ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - value_.string_ = duplicateStringValue( value.c_str(), - (unsigned int)value.length() ); - -} - -Value::Value( const StaticString &value ) - : type_( stringValue ) - , allocated_( false ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - value_.string_ = const_cast<char *>( value.c_str() ); -} - - -# ifdef JSON_USE_CPPTL -Value::Value( const CppTL::ConstString &value ) - : type_( stringValue ) - , allocated_( true ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - value_.string_ = duplicateStringValue( value, value.length() ); -} -# endif - -Value::Value( bool value ) - : type_( booleanValue ) - , allocated_( false ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - value_.bool_ = value; -} - - -Value::Value( const Value &other ) - : type_( other.type_ ) - , allocated_( false ) -# ifdef JSON_VALUE_USE_INTERNAL_MAP - , itemIsUsed_( 0 ) -#endif - , comments_( 0 ) -{ - switch ( type_ ) - { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - value_ = other.value_; - break; - case stringValue: - if ( other.value_.string_ ) - { - value_.string_ = duplicateStringValue( other.value_.string_ ); - allocated_ = true; - } - else - value_.string_ = 0; - break; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues( *other.value_.map_ ); - break; -#else - case arrayValue: - value_.array_ = arrayAllocator()->newArrayCopy( *other.value_.array_ ); - break; - case objectValue: - value_.map_ = mapAllocator()->newMapCopy( *other.value_.map_ ); - break; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - if ( other.comments_ ) - { - comments_ = new CommentInfo[numberOfCommentPlacement]; - for ( int comment =0; comment < numberOfCommentPlacement; ++comment ) - { - const CommentInfo &otherComment = other.comments_[comment]; - if ( otherComment.comment_ ) - comments_[comment].setComment( otherComment.comment_ ); - } - } -} - - -Value::~Value() -{ - switch ( type_ ) - { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - break; - case stringValue: - if ( allocated_ ) - releaseStringValue( value_.string_ ); - break; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - delete value_.map_; - break; -#else - case arrayValue: - arrayAllocator()->destructArray( value_.array_ ); - break; - case objectValue: - mapAllocator()->destructMap( value_.map_ ); - break; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - - if ( comments_ ) - delete[] comments_; -} - -Value & -Value::operator=( const Value &other ) -{ - Value temp( other ); - swap( temp ); - return *this; -} - -void -Value::swap( Value &other ) -{ - ValueType temp = type_; - type_ = other.type_; - other.type_ = temp; - std::swap( value_, other.value_ ); - int temp2 = allocated_; - allocated_ = other.allocated_; - other.allocated_ = temp2; -} - -ValueType -Value::type() const -{ - return type_; -} - - -int -Value::compare( const Value &other ) const -{ - if ( *this < other ) - return -1; - if ( *this > other ) - return 1; - return 0; -} - - -bool -Value::operator <( const Value &other ) const -{ - int typeDelta = type_ - other.type_; - if ( typeDelta ) - return typeDelta < 0 ? true : false; - switch ( type_ ) - { - case nullValue: - return false; - case intValue: - return value_.int_ < other.value_.int_; - case uintValue: - return value_.uint_ < other.value_.uint_; - case realValue: - return value_.real_ < other.value_.real_; - case booleanValue: - return value_.bool_ < other.value_.bool_; - case stringValue: - return ( value_.string_ == 0 && other.value_.string_ ) - || ( other.value_.string_ - && value_.string_ - && strcmp( value_.string_, other.value_.string_ ) < 0 ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - { - int delta = int( value_.map_->size() - other.value_.map_->size() ); - if ( delta ) - return delta < 0; - return (*value_.map_) < (*other.value_.map_); - } -#else - case arrayValue: - return value_.array_->compare( *(other.value_.array_) ) < 0; - case objectValue: - return value_.map_->compare( *(other.value_.map_) ) < 0; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - return false; // unreachable -} - -bool -Value::operator <=( const Value &other ) const -{ - return !(other < *this); -} - -bool -Value::operator >=( const Value &other ) const -{ - return !(*this < other); -} - -bool -Value::operator >( const Value &other ) const -{ - return other < *this; -} - -bool -Value::operator ==( const Value &other ) const -{ - //if ( type_ != other.type_ ) - // GCC 2.95.3 says: - // attempt to take address of bit-field structure member `Json::Value::type_' - // Beats me, but a temp solves the problem. - int temp = other.type_; - if ( type_ != temp ) - return false; - switch ( type_ ) - { - case nullValue: - return true; - case intValue: - return value_.int_ == other.value_.int_; - case uintValue: - return value_.uint_ == other.value_.uint_; - case realValue: - return value_.real_ == other.value_.real_; - case booleanValue: - return value_.bool_ == other.value_.bool_; - case stringValue: - return ( value_.string_ == other.value_.string_ ) - || ( other.value_.string_ - && value_.string_ - && strcmp( value_.string_, other.value_.string_ ) == 0 ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - return value_.map_->size() == other.value_.map_->size() - && (*value_.map_) == (*other.value_.map_); -#else - case arrayValue: - return value_.array_->compare( *(other.value_.array_) ) == 0; - case objectValue: - return value_.map_->compare( *(other.value_.map_) ) == 0; -#endif - default: - JSON_ASSERT_UNREACHABLE; - } - return false; // unreachable -} - -bool -Value::operator !=( const Value &other ) const -{ - return !( *this == other ); -} - -const char * -Value::asCString() const -{ - JSON_ASSERT( type_ == stringValue ); - return value_.string_; -} - - -std::string -Value::asString() const -{ - switch ( type_ ) - { - case nullValue: - return ""; - case stringValue: - return value_.string_ ? value_.string_ : ""; - case booleanValue: - return value_.bool_ ? "true" : "false"; - case intValue: - return valueToString( value_.int_ ); - case uintValue: - return valueToString( value_.uint_ ); - case realValue: - return valueToString( value_.real_ ); - default: - JSON_FAIL_MESSAGE( "Type is not convertible to string" ); - } -} - -# ifdef JSON_USE_CPPTL -CppTL::ConstString -Value::asConstString() const -{ - return CppTL::ConstString( asString().c_str() ); -} -# endif - - -Value::Int -Value::asInt() const -{ - switch ( type_ ) - { - case intValue: - JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range"); - return Int(value_.int_); - case uintValue: - JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range"); - return Int(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt), "double out of Int range"); - return Int(value_.real_); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to Int."); -} - - -Value::UInt -Value::asUInt() const -{ - switch ( type_ ) - { - case intValue: - JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range"); - return UInt(value_.int_); - case uintValue: - JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range"); - return UInt(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt), "double out of UInt range"); - return UInt( value_.real_ ); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to UInt."); -} - - -# if defined(JSON_HAS_INT64) - -Value::Int64 -Value::asInt64() const -{ - switch ( type_ ) - { - case intValue: - return Int64(value_.int_); - case uintValue: - JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range"); - return Int64(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64), "double out of Int64 range"); - return Int64(value_.real_); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to Int64."); -} - - -Value::UInt64 -Value::asUInt64() const -{ - switch ( type_ ) - { - case intValue: - JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range"); - return UInt64(value_.int_); - case uintValue: - return UInt64(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64), "double out of UInt64 range"); - return UInt64( value_.real_ ); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to UInt64."); -} -# endif // if defined(JSON_HAS_INT64) - - -LargestInt -Value::asLargestInt() const -{ -#if defined(JSON_NO_INT64) - return asInt(); -#else - return asInt64(); -#endif -} - - -LargestUInt -Value::asLargestUInt() const -{ -#if defined(JSON_NO_INT64) - return asUInt(); -#else - return asUInt64(); -#endif -} - - -double -Value::asDouble() const -{ - switch ( type_ ) - { - case intValue: - return static_cast<double>( value_.int_ ); - case uintValue: -#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - return static_cast<double>( value_.uint_ ); -#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - return integerToDouble( value_.uint_ ); -#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - case realValue: - return value_.real_; - case nullValue: - return 0.0; - case booleanValue: - return value_.bool_ ? 1.0 : 0.0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to double."); -} - -float -Value::asFloat() const -{ - switch ( type_ ) - { - case intValue: - return static_cast<float>( value_.int_ ); - case uintValue: -#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - return static_cast<float>( value_.uint_ ); -#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - return integerToDouble( value_.uint_ ); -#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - case realValue: - return static_cast<float>( value_.real_ ); - case nullValue: - return 0.0; - case booleanValue: - return value_.bool_ ? 1.0f : 0.0f; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to float."); -} - -bool -Value::asBool() const -{ - switch ( type_ ) - { - case booleanValue: - return value_.bool_; - case nullValue: - return false; - case intValue: - return value_.int_ ? true : false; - case uintValue: - return value_.uint_ ? true : false; - case realValue: - return value_.real_ ? true : false; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to bool."); -} - - -bool -Value::isConvertibleTo( ValueType other ) const -{ - switch ( other ) - { - case nullValue: - return ( isNumeric() && asDouble() == 0.0 ) - || ( type_ == booleanValue && value_.bool_ == false ) - || ( type_ == stringValue && asString() == "" ) - || ( type_ == arrayValue && value_.map_->size() == 0 ) - || ( type_ == objectValue && value_.map_->size() == 0 ) - || type_ == nullValue; - case intValue: - return isInt() - || (type_ == realValue && InRange(value_.real_, minInt, maxInt)) - || type_ == booleanValue - || type_ == nullValue; - case uintValue: - return isUInt() - || (type_ == realValue && InRange(value_.real_, 0, maxUInt)) - || type_ == booleanValue - || type_ == nullValue; - case realValue: - return isNumeric() - || type_ == booleanValue - || type_ == nullValue; - case booleanValue: - return isNumeric() - || type_ == booleanValue - || type_ == nullValue; - case stringValue: - return isNumeric() - || type_ == booleanValue - || type_ == stringValue - || type_ == nullValue; - case arrayValue: - return type_ == arrayValue - || type_ == nullValue; - case objectValue: - return type_ == objectValue - || type_ == nullValue; - } - JSON_ASSERT_UNREACHABLE; - return false; -} - - -/// Number of values in array or object -ArrayIndex -Value::size() const -{ - switch ( type_ ) - { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - case stringValue: - return 0; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: // size of the array is highest index + 1 - if ( !value_.map_->empty() ) - { - ObjectValues::const_iterator itLast = value_.map_->end(); - --itLast; - return (*itLast).first.index()+1; - } - return 0; - case objectValue: - return ArrayIndex( value_.map_->size() ); -#else - case arrayValue: - return Int( value_.array_->size() ); - case objectValue: - return Int( value_.map_->size() ); -#endif - } - JSON_ASSERT_UNREACHABLE; - return 0; // unreachable; -} - - -bool -Value::empty() const -{ - if ( isNull() || isArray() || isObject() ) - return size() == 0u; - else - return false; -} - - -bool -Value::operator!() const -{ - return isNull(); -} - - -void -Value::clear() -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue || type_ == objectValue ); - - switch ( type_ ) - { -#ifndef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - case objectValue: - value_.map_->clear(); - break; -#else - case arrayValue: - value_.array_->clear(); - break; - case objectValue: - value_.map_->clear(); - break; -#endif - default: - break; - } -} - -void -Value::resize( ArrayIndex newSize ) -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); - if ( type_ == nullValue ) - *this = Value( arrayValue ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - ArrayIndex oldSize = size(); - if ( newSize == 0 ) - clear(); - else if ( newSize > oldSize ) - (*this)[ newSize - 1 ]; - else - { - for ( ArrayIndex index = newSize; index < oldSize; ++index ) - { - value_.map_->erase( index ); - } - assert( size() == newSize ); - } -#else - value_.array_->resize( newSize ); -#endif -} - - -Value & -Value::operator[]( ArrayIndex index ) -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); - if ( type_ == nullValue ) - *this = Value( arrayValue ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString key( index ); - ObjectValues::iterator it = value_.map_->lower_bound( key ); - if ( it != value_.map_->end() && (*it).first == key ) - return (*it).second; - - ObjectValues::value_type defaultValue( key, null ); - it = value_.map_->insert( it, defaultValue ); - return (*it).second; -#else - return value_.array_->resolveReference( index ); -#endif -} - - -Value & -Value::operator[]( int index ) -{ - JSON_ASSERT( index >= 0 ); - return (*this)[ ArrayIndex(index) ]; -} - - -const Value & -Value::operator[]( ArrayIndex index ) const -{ - JSON_ASSERT( type_ == nullValue || type_ == arrayValue ); - if ( type_ == nullValue ) - return null; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString key( index ); - ObjectValues::const_iterator it = value_.map_->find( key ); - if ( it == value_.map_->end() ) - return null; - return (*it).second; -#else - Value *value = value_.array_->find( index ); - return value ? *value : null; -#endif -} - - -const Value & -Value::operator[]( int index ) const -{ - JSON_ASSERT( index >= 0 ); - return (*this)[ ArrayIndex(index) ]; -} - - -Value & -Value::operator[]( const char *key ) -{ - return resolveReference( key, false ); -} - - -Value & -Value::resolveReference( const char *key, - bool isStatic ) -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - *this = Value( objectValue ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString actualKey( key, isStatic ? CZString::noDuplication - : CZString::duplicateOnCopy ); - ObjectValues::iterator it = value_.map_->lower_bound( actualKey ); - if ( it != value_.map_->end() && (*it).first == actualKey ) - return (*it).second; - - ObjectValues::value_type defaultValue( actualKey, null ); - it = value_.map_->insert( it, defaultValue ); - Value &value = (*it).second; - return value; -#else - return value_.map_->resolveReference( key, isStatic ); -#endif -} - - -Value -Value::get( ArrayIndex index, - const Value &defaultValue ) const -{ - const Value *value = &((*this)[index]); - return value == &null ? defaultValue : *value; -} - - -bool -Value::isValidIndex( ArrayIndex index ) const -{ - return index < size(); -} - - - -const Value & -Value::operator[]( const char *key ) const -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - return null; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString actualKey( key, CZString::noDuplication ); - ObjectValues::const_iterator it = value_.map_->find( actualKey ); - if ( it == value_.map_->end() ) - return null; - return (*it).second; -#else - const Value *value = value_.map_->find( key ); - return value ? *value : null; -#endif -} - - -Value & -Value::operator[]( const std::string &key ) -{ - return (*this)[ key.c_str() ]; -} - - -const Value & -Value::operator[]( const std::string &key ) const -{ - return (*this)[ key.c_str() ]; -} - -Value & -Value::operator[]( const StaticString &key ) -{ - return resolveReference( key, true ); -} - - -# ifdef JSON_USE_CPPTL -Value & -Value::operator[]( const CppTL::ConstString &key ) -{ - return (*this)[ key.c_str() ]; -} - - -const Value & -Value::operator[]( const CppTL::ConstString &key ) const -{ - return (*this)[ key.c_str() ]; -} -# endif - - -Value & -Value::append( const Value &value ) -{ - return (*this)[size()] = value; -} - - -Value -Value::get( const char *key, - const Value &defaultValue ) const -{ - const Value *value = &((*this)[key]); - return value == &null ? defaultValue : *value; -} - - -Value -Value::get( const std::string &key, - const Value &defaultValue ) const -{ - return get( key.c_str(), defaultValue ); -} - -Value -Value::removeMember( const char* key ) -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - return null; -#ifndef JSON_VALUE_USE_INTERNAL_MAP - CZString actualKey( key, CZString::noDuplication ); - ObjectValues::iterator it = value_.map_->find( actualKey ); - if ( it == value_.map_->end() ) - return null; - Value old(it->second); - value_.map_->erase(it); - return old; -#else - Value *value = value_.map_->find( key ); - if (value){ - Value old(*value); - value_.map_.remove( key ); - return old; - } else { - return null; - } -#endif -} - -Value -Value::removeMember( const std::string &key ) -{ - return removeMember( key.c_str() ); -} - -# ifdef JSON_USE_CPPTL -Value -Value::get( const CppTL::ConstString &key, - const Value &defaultValue ) const -{ - return get( key.c_str(), defaultValue ); -} -# endif - -bool -Value::isMember( const char *key ) const -{ - const Value *value = &((*this)[key]); - return value != &null; -} - - -bool -Value::isMember( const std::string &key ) const -{ - return isMember( key.c_str() ); -} - - -# ifdef JSON_USE_CPPTL -bool -Value::isMember( const CppTL::ConstString &key ) const -{ - return isMember( key.c_str() ); -} -#endif - -Value::Members -Value::getMemberNames() const -{ - JSON_ASSERT( type_ == nullValue || type_ == objectValue ); - if ( type_ == nullValue ) - return Value::Members(); - Members members; - members.reserve( value_.map_->size() ); -#ifndef JSON_VALUE_USE_INTERNAL_MAP - ObjectValues::const_iterator it = value_.map_->begin(); - ObjectValues::const_iterator itEnd = value_.map_->end(); - for ( ; it != itEnd; ++it ) - members.push_back( std::string( (*it).first.c_str() ) ); -#else - ValueInternalMap::IteratorState it; - ValueInternalMap::IteratorState itEnd; - value_.map_->makeBeginIterator( it ); - value_.map_->makeEndIterator( itEnd ); - for ( ; !ValueInternalMap::equals( it, itEnd ); ValueInternalMap::increment(it) ) - members.push_back( std::string( ValueInternalMap::key( it ) ) ); -#endif - return members; -} -// -//# ifdef JSON_USE_CPPTL -//EnumMemberNames -//Value::enumMemberNames() const -//{ -// if ( type_ == objectValue ) -// { -// return CppTL::Enum::any( CppTL::Enum::transform( -// CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>() ), -// MemberNamesTransform() ) ); -// } -// return EnumMemberNames(); -//} -// -// -//EnumValues -//Value::enumValues() const -//{ -// if ( type_ == objectValue || type_ == arrayValue ) -// return CppTL::Enum::anyValues( *(value_.map_), -// CppTL::Type<const Value &>() ); -// return EnumValues(); -//} -// -//# endif - -static bool IsIntegral(double d) { - double integral_part; - return modf(d, &integral_part) == 0.0; -} - - -bool -Value::isNull() const -{ - return type_ == nullValue; -} - - -bool -Value::isBool() const -{ - return type_ == booleanValue; -} - - -bool -Value::isInt() const -{ - switch ( type_ ) - { - case intValue: - return value_.int_ >= minInt && value_.int_ <= maxInt; - case uintValue: - return value_.uint_ <= UInt(maxInt); - case realValue: - return value_.real_ >= minInt && - value_.real_ <= maxInt && - IsIntegral(value_.real_); - default: - break; - } - return false; -} - - -bool -Value::isUInt() const -{ - switch ( type_ ) - { - case intValue: - return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt); - case uintValue: - return value_.uint_ <= maxUInt; - case realValue: - return value_.real_ >= 0 && - value_.real_ <= maxUInt && - IsIntegral(value_.real_); - default: - break; - } - return false; -} - -bool -Value::isInt64() const -{ -# if defined(JSON_HAS_INT64) - switch ( type_ ) - { - case intValue: - return true; - case uintValue: - return value_.uint_ <= UInt64(maxInt64); - case realValue: - // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a - // double, so double(maxInt64) will be rounded up to 2^63. Therefore we - // require the value to be strictly less than the limit. - return value_.real_ >= double(minInt64) && - value_.real_ < double(maxInt64) && - IsIntegral(value_.real_); - default: - break; - } -# endif // JSON_HAS_INT64 - return false; -} - -bool -Value::isUInt64() const -{ -# if defined(JSON_HAS_INT64) - switch ( type_ ) - { - case intValue: - return value_.int_ >= 0; - case uintValue: - return true; - case realValue: - // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a - // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we - // require the value to be strictly less than the limit. - return value_.real_ >= 0 && - value_.real_ < maxUInt64AsDouble && - IsIntegral(value_.real_); - default: - break; - } -# endif // JSON_HAS_INT64 - return false; -} - - -bool -Value::isIntegral() const -{ -#if defined(JSON_HAS_INT64) - return isInt64() || isUInt64(); -#else - return isInt() || isUInt(); -#endif -} - - -bool -Value::isDouble() const -{ - return type_ == realValue || isIntegral(); -} - - -bool -Value::isNumeric() const -{ - return isIntegral() || isDouble(); -} - - -bool -Value::isString() const -{ - return type_ == stringValue; -} - - -bool -Value::isArray() const -{ - return type_ == arrayValue; -} - - -bool -Value::isObject() const -{ - return type_ == objectValue; -} - - -void -Value::setComment( const char *comment, - CommentPlacement placement ) -{ - if ( !comments_ ) - comments_ = new CommentInfo[numberOfCommentPlacement]; - comments_[placement].setComment( comment ); -} - - -void -Value::setComment( const std::string &comment, - CommentPlacement placement ) -{ - setComment( comment.c_str(), placement ); -} - - -bool -Value::hasComment( CommentPlacement placement ) const -{ - return comments_ != 0 && comments_[placement].comment_ != 0; -} - -std::string -Value::getComment( CommentPlacement placement ) const -{ - if ( hasComment(placement) ) - return comments_[placement].comment_; - return ""; -} - - -std::string -Value::toStyledString() const -{ - StyledWriter writer; - return writer.write( *this ); -} - - -Value::const_iterator -Value::begin() const -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeBeginIterator( it ); - return const_iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeBeginIterator( it ); - return const_iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return const_iterator( value_.map_->begin() ); - break; -#endif - default: - break; - } - return const_iterator(); -} - -Value::const_iterator -Value::end() const -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeEndIterator( it ); - return const_iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeEndIterator( it ); - return const_iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return const_iterator( value_.map_->end() ); - break; -#endif - default: - break; - } - return const_iterator(); -} - - -Value::iterator -Value::begin() -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeBeginIterator( it ); - return iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeBeginIterator( it ); - return iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return iterator( value_.map_->begin() ); - break; -#endif - default: - break; - } - return iterator(); -} - -Value::iterator -Value::end() -{ - switch ( type_ ) - { -#ifdef JSON_VALUE_USE_INTERNAL_MAP - case arrayValue: - if ( value_.array_ ) - { - ValueInternalArray::IteratorState it; - value_.array_->makeEndIterator( it ); - return iterator( it ); - } - break; - case objectValue: - if ( value_.map_ ) - { - ValueInternalMap::IteratorState it; - value_.map_->makeEndIterator( it ); - return iterator( it ); - } - break; -#else - case arrayValue: - case objectValue: - if ( value_.map_ ) - return iterator( value_.map_->end() ); - break; -#endif - default: - break; - } - return iterator(); -} - - -// class PathArgument -// ////////////////////////////////////////////////////////////////// - -PathArgument::PathArgument() - : key_() - , index_() - , kind_( kindNone ) -{ -} - - -PathArgument::PathArgument( ArrayIndex index ) - : key_() - , index_( index ) - , kind_( kindIndex ) -{ -} - - -PathArgument::PathArgument( const char *key ) - : key_( key ) - , index_() - , kind_( kindKey ) -{ -} - - -PathArgument::PathArgument( const std::string &key ) - : key_( key.c_str() ) - , index_() - , kind_( kindKey ) -{ -} - -// class Path -// ////////////////////////////////////////////////////////////////// - -Path::Path( const std::string &path, - const PathArgument &a1, - const PathArgument &a2, - const PathArgument &a3, - const PathArgument &a4, - const PathArgument &a5 ) -{ - InArgs in; - in.push_back( &a1 ); - in.push_back( &a2 ); - in.push_back( &a3 ); - in.push_back( &a4 ); - in.push_back( &a5 ); - makePath( path, in ); -} - - -void -Path::makePath( const std::string &path, - const InArgs &in ) -{ - const char *current = path.c_str(); - const char *end = current + path.length(); - InArgs::const_iterator itInArg = in.begin(); - while ( current != end ) - { - if ( *current == '[' ) - { - ++current; - if ( *current == '%' ) - addPathInArg( path, in, itInArg, PathArgument::kindIndex ); - else - { - ArrayIndex index = 0; - for ( ; current != end && *current >= '0' && *current <= '9'; ++current ) - index = index * 10 + ArrayIndex(*current - '0'); - args_.push_back( index ); - } - if ( current == end || *current++ != ']' ) - invalidPath( path, int(current - path.c_str()) ); - } - else if ( *current == '%' ) - { - addPathInArg( path, in, itInArg, PathArgument::kindKey ); - ++current; - } - else if ( *current == '.' ) - { - ++current; - } - else - { - const char *beginName = current; - while ( current != end && !strchr( "[.", *current ) ) - ++current; - args_.push_back( std::string( beginName, current ) ); - } - } -} - - -void -Path::addPathInArg( const std::string &path, - const InArgs &in, - InArgs::const_iterator &itInArg, - PathArgument::Kind kind ) -{ - if ( itInArg == in.end() ) - { - // Error: missing argument %d - } - else if ( (*itInArg)->kind_ != kind ) - { - // Error: bad argument type - } - else - { - args_.push_back( **itInArg ); - } -} - - -void -Path::invalidPath( const std::string &path, - int location ) -{ - // Error: invalid path. -} - - -const Value & -Path::resolve( const Value &root ) const -{ - const Value *node = &root; - for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) - { - const PathArgument &arg = *it; - if ( arg.kind_ == PathArgument::kindIndex ) - { - if ( !node->isArray() || !node->isValidIndex( arg.index_ ) ) - { - // Error: unable to resolve path (array value expected at position... - } - node = &((*node)[arg.index_]); - } - else if ( arg.kind_ == PathArgument::kindKey ) - { - if ( !node->isObject() ) - { - // Error: unable to resolve path (object value expected at position...) - } - node = &((*node)[arg.key_]); - if ( node == &Value::null ) - { - // Error: unable to resolve path (object has no member named '' at position...) - } - } - } - return *node; -} - - -Value -Path::resolve( const Value &root, - const Value &defaultValue ) const -{ - const Value *node = &root; - for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) - { - const PathArgument &arg = *it; - if ( arg.kind_ == PathArgument::kindIndex ) - { - if ( !node->isArray() || !node->isValidIndex( arg.index_ ) ) - return defaultValue; - node = &((*node)[arg.index_]); - } - else if ( arg.kind_ == PathArgument::kindKey ) - { - if ( !node->isObject() ) - return defaultValue; - node = &((*node)[arg.key_]); - if ( node == &Value::null ) - return defaultValue; - } - } - return *node; -} - - -Value & -Path::make( Value &root ) const -{ - Value *node = &root; - for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it ) - { - const PathArgument &arg = *it; - if ( arg.kind_ == PathArgument::kindIndex ) - { - if ( !node->isArray() ) - { - // Error: node is not an array at position ... - } - node = &((*node)[arg.index_]); - } - else if ( arg.kind_ == PathArgument::kindKey ) - { - if ( !node->isObject() ) - { - // Error: node is not an object at position... - } - node = &((*node)[arg.key_]); - } - } - return *node; -} - - -} // namespace Json - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: src/lib_json/json_value.cpp -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: src/lib_json/json_writer.cpp -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2011 Baptiste Lepilleur -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#if !defined(JSON_IS_AMALGAMATION) -# include <json/writer.h> -# include "json_tool.h" -#endif // if !defined(JSON_IS_AMALGAMATION) -#include <utility> -#include <assert.h> -#include <stdio.h> -#include <string.h> -#include <sstream> -#include <iomanip> - -#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 -#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. -#endif - -namespace Json { - -static bool containsControlCharacter( const char* str ) -{ - while ( *str ) - { - if ( isControlCharacter( *(str++) ) ) - return true; - } - return false; -} - - -std::string valueToString( LargestInt value ) -{ - UIntToStringBuffer buffer; - char *current = buffer + sizeof(buffer); - bool isNegative = value < 0; - if ( isNegative ) - value = -value; - uintToString( LargestUInt(value), current ); - if ( isNegative ) - *--current = '-'; - assert( current >= buffer ); - return current; -} - - -std::string valueToString( LargestUInt value ) -{ - UIntToStringBuffer buffer; - char *current = buffer + sizeof(buffer); - uintToString( value, current ); - assert( current >= buffer ); - return current; -} - -#if defined(JSON_HAS_INT64) - -std::string valueToString( Int value ) -{ - return valueToString( LargestInt(value) ); -} - - -std::string valueToString( UInt value ) -{ - return valueToString( LargestUInt(value) ); -} - -#endif // # if defined(JSON_HAS_INT64) - - -std::string valueToString( double value ) -{ - char buffer[32]; -#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning. - sprintf_s(buffer, sizeof(buffer), "%#.16g", value); -#else - sprintf(buffer, "%#.16g", value); -#endif - char* ch = buffer + strlen(buffer) - 1; - if (*ch != '0') return buffer; // nothing to truncate, so save time - while(ch > buffer && *ch == '0'){ - --ch; - } - char* last_nonzero = ch; - while(ch >= buffer){ - switch(*ch){ - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - --ch; - continue; - case '.': - // Truncate zeroes to save bytes in output, but keep one. - *(last_nonzero+2) = '\0'; - return buffer; - default: - return buffer; - } - } - return buffer; -} - - -std::string valueToString( bool value ) -{ - return value ? "true" : "false"; -} - -std::string valueToQuotedString( const char *value ) -{ - if (value == NULL) - return ""; - // Not sure how to handle unicode... - if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && !containsControlCharacter( value )) - return std::string("\"") + value + "\""; - // We have to walk value and escape any special characters. - // Appending to std::string is not efficient, but this should be rare. - // (Note: forward slashes are *not* rare, but I am not escaping them.) - std::string::size_type maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL - std::string result; - result.reserve(maxsize); // to avoid lots of mallocs - result += "\""; - for (const char* c=value; *c != 0; ++c) - { - switch(*c) - { - case '\"': - result += "\\\""; - break; - case '\\': - result += "\\\\"; - break; - case '\b': - result += "\\b"; - break; - case '\f': - result += "\\f"; - break; - case '\n': - result += "\\n"; - break; - case '\r': - result += "\\r"; - break; - case '\t': - result += "\\t"; - break; - //case '/': - // Even though \/ is considered a legal escape in JSON, a bare - // slash is also legal, so I see no reason to escape it. - // (I hope I am not misunderstanding something. - // blep notes: actually escaping \/ may be useful in javascript to avoid </ - // sequence. - // Should add a flag to allow this compatibility mode and prevent this - // sequence from occurring. - default: - if ( isControlCharacter( *c ) ) - { - std::ostringstream oss; - oss << "\\u" << std::hex << std::uppercase << std::setfill('0') << std::setw(4) << static_cast<int>(*c); - result += oss.str(); - } - else - { - result += *c; - } - break; - } - } - result += "\""; - return result; -} - -// Class Writer -// ////////////////////////////////////////////////////////////////// -Writer::~Writer() -{ -} - - -// Class FastWriter -// ////////////////////////////////////////////////////////////////// - -FastWriter::FastWriter() - : yamlCompatiblityEnabled_( false ), - dropNullPlaceholders_( false ) -{ -} - - -void -FastWriter::enableYAMLCompatibility() -{ - yamlCompatiblityEnabled_ = true; -} - - -void -FastWriter::dropNullPlaceholders() -{ - dropNullPlaceholders_ = true; -} - - -std::string -FastWriter::write( const Value &root ) -{ - document_ = ""; - writeValue( root ); - document_ += "\n"; - return document_; -} - - -void -FastWriter::writeValue( const Value &value ) -{ - switch ( value.type() ) - { - case nullValue: - if (!dropNullPlaceholders_) document_ += "null"; - break; - case intValue: - document_ += valueToString( value.asLargestInt() ); - break; - case uintValue: - document_ += valueToString( value.asLargestUInt() ); - break; - case realValue: - document_ += valueToString( value.asDouble() ); - break; - case stringValue: - document_ += valueToQuotedString( value.asCString() ); - break; - case booleanValue: - document_ += valueToString( value.asBool() ); - break; - case arrayValue: - { - document_ += "["; - int size = value.size(); - for ( int index =0; index < size; ++index ) - { - if ( index > 0 ) - document_ += ","; - writeValue( value[index] ); - } - document_ += "]"; - } - break; - case objectValue: - { - Value::Members members( value.getMemberNames() ); - document_ += "{"; - for ( Value::Members::iterator it = members.begin(); - it != members.end(); - ++it ) - { - const std::string &name = *it; - if ( it != members.begin() ) - document_ += ","; - document_ += valueToQuotedString( name.c_str() ); - document_ += yamlCompatiblityEnabled_ ? ": " - : ":"; - writeValue( value[name] ); - } - document_ += "}"; - } - break; - } -} - - -// Class StyledWriter -// ////////////////////////////////////////////////////////////////// - -StyledWriter::StyledWriter() - : rightMargin_( 74 ) - , indentSize_( 3 ) - , addChildValues_() -{ -} - - -std::string -StyledWriter::write( const Value &root ) -{ - document_ = ""; - addChildValues_ = false; - indentString_ = ""; - writeCommentBeforeValue( root ); - writeValue( root ); - writeCommentAfterValueOnSameLine( root ); - document_ += "\n"; - return document_; -} - - -void -StyledWriter::writeValue( const Value &value ) -{ - switch ( value.type() ) - { - case nullValue: - pushValue( "null" ); - break; - case intValue: - pushValue( valueToString( value.asLargestInt() ) ); - break; - case uintValue: - pushValue( valueToString( value.asLargestUInt() ) ); - break; - case realValue: - pushValue( valueToString( value.asDouble() ) ); - break; - case stringValue: - pushValue( valueToQuotedString( value.asCString() ) ); - break; - case booleanValue: - pushValue( valueToString( value.asBool() ) ); - break; - case arrayValue: - writeArrayValue( value); - break; - case objectValue: - { - Value::Members members( value.getMemberNames() ); - if ( members.empty() ) - pushValue( "{}" ); - else - { - writeWithIndent( "{" ); - indent(); - Value::Members::iterator it = members.begin(); - for (;;) - { - const std::string &name = *it; - const Value &childValue = value[name]; - writeCommentBeforeValue( childValue ); - writeWithIndent( valueToQuotedString( name.c_str() ) ); - document_ += " : "; - writeValue( childValue ); - if ( ++it == members.end() ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - document_ += ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "}" ); - } - } - break; - } -} - - -void -StyledWriter::writeArrayValue( const Value &value ) -{ - unsigned size = value.size(); - if ( size == 0 ) - pushValue( "[]" ); - else - { - bool isArrayMultiLine = isMultineArray( value ); - if ( isArrayMultiLine ) - { - writeWithIndent( "[" ); - indent(); - bool hasChildValue = !childValues_.empty(); - unsigned index =0; - for (;;) - { - const Value &childValue = value[index]; - writeCommentBeforeValue( childValue ); - if ( hasChildValue ) - writeWithIndent( childValues_[index] ); - else - { - writeIndent(); - writeValue( childValue ); - } - if ( ++index == size ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - document_ += ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "]" ); - } - else // output on a single line - { - assert( childValues_.size() == size ); - document_ += "[ "; - for ( unsigned index =0; index < size; ++index ) - { - if ( index > 0 ) - document_ += ", "; - document_ += childValues_[index]; - } - document_ += " ]"; - } - } -} - - -bool -StyledWriter::isMultineArray( const Value &value ) -{ - int size = value.size(); - bool isMultiLine = size*3 >= rightMargin_ ; - childValues_.clear(); - for ( int index =0; index < size && !isMultiLine; ++index ) - { - const Value &childValue = value[index]; - isMultiLine = isMultiLine || - ( (childValue.isArray() || childValue.isObject()) && - childValue.size() > 0 ); - } - if ( !isMultiLine ) // check if line length > max line length - { - childValues_.reserve( size ); - addChildValues_ = true; - int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' - for ( int index =0; index < size && !isMultiLine; ++index ) - { - writeValue( value[index] ); - lineLength += int( childValues_[index].length() ); - isMultiLine = isMultiLine && hasCommentForValue( value[index] ); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - - -void -StyledWriter::pushValue( const std::string &value ) -{ - if ( addChildValues_ ) - childValues_.push_back( value ); - else - document_ += value; -} - - -void -StyledWriter::writeIndent() -{ - if ( !document_.empty() ) - { - char last = document_[document_.length()-1]; - if ( last == ' ' ) // already indented - return; - if ( last != '\n' ) // Comments may add new-line - document_ += '\n'; - } - document_ += indentString_; -} - - -void -StyledWriter::writeWithIndent( const std::string &value ) -{ - writeIndent(); - document_ += value; -} - - -void -StyledWriter::indent() -{ - indentString_ += std::string( indentSize_, ' ' ); -} - - -void -StyledWriter::unindent() -{ - assert( int(indentString_.size()) >= indentSize_ ); - indentString_.resize( indentString_.size() - indentSize_ ); -} - - -void -StyledWriter::writeCommentBeforeValue( const Value &root ) -{ - if ( !root.hasComment( commentBefore ) ) - return; - document_ += normalizeEOL( root.getComment( commentBefore ) ); - document_ += "\n"; -} - - -void -StyledWriter::writeCommentAfterValueOnSameLine( const Value &root ) -{ - if ( root.hasComment( commentAfterOnSameLine ) ) - document_ += " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); - - if ( root.hasComment( commentAfter ) ) - { - document_ += "\n"; - document_ += normalizeEOL( root.getComment( commentAfter ) ); - document_ += "\n"; - } -} - - -bool -StyledWriter::hasCommentForValue( const Value &value ) -{ - return value.hasComment( commentBefore ) - || value.hasComment( commentAfterOnSameLine ) - || value.hasComment( commentAfter ); -} - - -std::string -StyledWriter::normalizeEOL( const std::string &text ) -{ - std::string normalized; - normalized.reserve( text.length() ); - const char *begin = text.c_str(); - const char *end = begin + text.length(); - const char *current = begin; - while ( current != end ) - { - char c = *current++; - if ( c == '\r' ) // mac or dos EOL - { - if ( *current == '\n' ) // convert dos EOL - ++current; - normalized += '\n'; - } - else // handle unix EOL & other char - normalized += c; - } - return normalized; -} - - -// Class StyledStreamWriter -// ////////////////////////////////////////////////////////////////// - -StyledStreamWriter::StyledStreamWriter( std::string indentation ) - : document_(NULL) - , rightMargin_( 74 ) - , indentation_( indentation ) - , addChildValues_() -{ -} - - -void -StyledStreamWriter::write( std::ostream &out, const Value &root ) -{ - document_ = &out; - addChildValues_ = false; - indentString_ = ""; - writeCommentBeforeValue( root ); - writeValue( root ); - writeCommentAfterValueOnSameLine( root ); - *document_ << "\n"; - document_ = NULL; // Forget the stream, for safety. -} - - -void -StyledStreamWriter::writeValue( const Value &value ) -{ - switch ( value.type() ) - { - case nullValue: - pushValue( "null" ); - break; - case intValue: - pushValue( valueToString( value.asLargestInt() ) ); - break; - case uintValue: - pushValue( valueToString( value.asLargestUInt() ) ); - break; - case realValue: - pushValue( valueToString( value.asDouble() ) ); - break; - case stringValue: - pushValue( valueToQuotedString( value.asCString() ) ); - break; - case booleanValue: - pushValue( valueToString( value.asBool() ) ); - break; - case arrayValue: - writeArrayValue( value); - break; - case objectValue: - { - Value::Members members( value.getMemberNames() ); - if ( members.empty() ) - pushValue( "{}" ); - else - { - writeWithIndent( "{" ); - indent(); - Value::Members::iterator it = members.begin(); - for (;;) - { - const std::string &name = *it; - const Value &childValue = value[name]; - writeCommentBeforeValue( childValue ); - writeWithIndent( valueToQuotedString( name.c_str() ) ); - *document_ << " : "; - writeValue( childValue ); - if ( ++it == members.end() ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - *document_ << ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "}" ); - } - } - break; - } -} - - -void -StyledStreamWriter::writeArrayValue( const Value &value ) -{ - unsigned size = value.size(); - if ( size == 0 ) - pushValue( "[]" ); - else - { - bool isArrayMultiLine = isMultineArray( value ); - if ( isArrayMultiLine ) - { - writeWithIndent( "[" ); - indent(); - bool hasChildValue = !childValues_.empty(); - unsigned index =0; - for (;;) - { - const Value &childValue = value[index]; - writeCommentBeforeValue( childValue ); - if ( hasChildValue ) - writeWithIndent( childValues_[index] ); - else - { - writeIndent(); - writeValue( childValue ); - } - if ( ++index == size ) - { - writeCommentAfterValueOnSameLine( childValue ); - break; - } - *document_ << ","; - writeCommentAfterValueOnSameLine( childValue ); - } - unindent(); - writeWithIndent( "]" ); - } - else // output on a single line - { - assert( childValues_.size() == size ); - *document_ << "[ "; - for ( unsigned index =0; index < size; ++index ) - { - if ( index > 0 ) - *document_ << ", "; - *document_ << childValues_[index]; - } - *document_ << " ]"; - } - } -} - - -bool -StyledStreamWriter::isMultineArray( const Value &value ) -{ - int size = value.size(); - bool isMultiLine = size*3 >= rightMargin_ ; - childValues_.clear(); - for ( int index =0; index < size && !isMultiLine; ++index ) - { - const Value &childValue = value[index]; - isMultiLine = isMultiLine || - ( (childValue.isArray() || childValue.isObject()) && - childValue.size() > 0 ); - } - if ( !isMultiLine ) // check if line length > max line length - { - childValues_.reserve( size ); - addChildValues_ = true; - int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' - for ( int index =0; index < size && !isMultiLine; ++index ) - { - writeValue( value[index] ); - lineLength += int( childValues_[index].length() ); - isMultiLine = isMultiLine && hasCommentForValue( value[index] ); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - - -void -StyledStreamWriter::pushValue( const std::string &value ) -{ - if ( addChildValues_ ) - childValues_.push_back( value ); - else - *document_ << value; -} - - -void -StyledStreamWriter::writeIndent() -{ - /* - Some comments in this method would have been nice. ;-) - - if ( !document_.empty() ) - { - char last = document_[document_.length()-1]; - if ( last == ' ' ) // already indented - return; - if ( last != '\n' ) // Comments may add new-line - *document_ << '\n'; - } - */ - *document_ << '\n' << indentString_; -} - - -void -StyledStreamWriter::writeWithIndent( const std::string &value ) -{ - writeIndent(); - *document_ << value; -} - - -void -StyledStreamWriter::indent() -{ - indentString_ += indentation_; -} - - -void -StyledStreamWriter::unindent() -{ - assert( indentString_.size() >= indentation_.size() ); - indentString_.resize( indentString_.size() - indentation_.size() ); -} - - -void -StyledStreamWriter::writeCommentBeforeValue( const Value &root ) -{ - if ( !root.hasComment( commentBefore ) ) - return; - *document_ << normalizeEOL( root.getComment( commentBefore ) ); - *document_ << "\n"; -} - - -void -StyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root ) -{ - if ( root.hasComment( commentAfterOnSameLine ) ) - *document_ << " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); - - if ( root.hasComment( commentAfter ) ) - { - *document_ << "\n"; - *document_ << normalizeEOL( root.getComment( commentAfter ) ); - *document_ << "\n"; - } -} - - -bool -StyledStreamWriter::hasCommentForValue( const Value &value ) -{ - return value.hasComment( commentBefore ) - || value.hasComment( commentAfterOnSameLine ) - || value.hasComment( commentAfter ); -} - - -std::string -StyledStreamWriter::normalizeEOL( const std::string &text ) -{ - std::string normalized; - normalized.reserve( text.length() ); - const char *begin = text.c_str(); - const char *end = begin + text.length(); - const char *current = begin; - while ( current != end ) - { - char c = *current++; - if ( c == '\r' ) // mac or dos EOL - { - if ( *current == '\n' ) // convert dos EOL - ++current; - normalized += '\n'; - } - else // handle unix EOL & other char - normalized += c; - } - return normalized; -} - - -std::ostream& operator<<( std::ostream &sout, const Value &root ) -{ - Json::StyledStreamWriter writer; - writer.write(sout, root); - return sout; -} - - -} // namespace Json - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: src/lib_json/json_writer.cpp -// ////////////////////////////////////////////////////////////////////// - - - - - diff --git a/src/keycode.cpp b/src/keycode.cpp index 2e211ad59..66708fb19 100644 --- a/src/keycode.cpp +++ b/src/keycode.cpp @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "debug.h" #include "util/hex.h" #include "util/string.h" +#include "util/basic_macros.h" class UnknownKeycode : public BaseException { @@ -242,11 +243,10 @@ static const struct table_key table[] = { #undef N_ -#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) struct table_key lookup_keyname(const char *name) { - for (u16 i = 0; i < ARRAYSIZE(table); i++) { + for (u16 i = 0; i < ARRLEN(table); i++) { if (strcmp(table[i].Name, name) == 0) return table[i]; } @@ -256,7 +256,7 @@ struct table_key lookup_keyname(const char *name) struct table_key lookup_keykey(irr::EKEY_CODE key) { - for (u16 i = 0; i < ARRAYSIZE(table); i++) { + for (u16 i = 0; i < ARRLEN(table); i++) { if (table[i].Key == key) return table[i]; } @@ -268,7 +268,7 @@ struct table_key lookup_keykey(irr::EKEY_CODE key) struct table_key lookup_keychar(wchar_t Char) { - for (u16 i = 0; i < ARRAYSIZE(table); i++) { + for (u16 i = 0; i < ARRLEN(table); i++) { if (table[i].Char == Char) return table[i]; } diff --git a/src/keycode.h b/src/keycode.h index 4d66cf7b5..4cd0b707e 100644 --- a/src/keycode.h +++ b/src/keycode.h @@ -34,16 +34,16 @@ public: KeyPress(); KeyPress(const char *name); - KeyPress(const irr::SEvent::SKeyInput &in, bool prefer_character=false); + KeyPress(const irr::SEvent::SKeyInput &in, bool prefer_character = false); bool operator==(const KeyPress &o) const { - return (Char > 0 && Char == o.Char) || - (valid_kcode(Key) && Key == o.Key); + return (Char > 0 && Char == o.Char) || (valid_kcode(Key) && Key == o.Key); } const char *sym() const; const char *name() const; + protected: static bool valid_kcode(irr::EKEY_CODE k) { @@ -68,4 +68,3 @@ void clearKeyCache(); irr::EKEY_CODE keyname_to_keycode(const char *name); #endif - diff --git a/src/light.cpp b/src/light.cpp index 5dc01fcf0..4a3ca5a60 100644 --- a/src/light.cpp +++ b/src/light.cpp @@ -26,29 +26,9 @@ with this program; if not, write to the Free Software Foundation, Inc., // Length of LIGHT_MAX+1 means LIGHT_MAX is the last value. // LIGHT_SUN is read as LIGHT_MAX from here. -u8 light_LUT[LIGHT_MAX+1] = -{ - /* Middle-raised variation of a_n+1 = a_n * 0.786 - * Length of LIGHT_MAX+1 means LIGHT_MAX is the last value. - * LIGHT_SUN is read as LIGHT_MAX from here. - */ - 8, - 11+2, - 14+7, - 18+10, - 22+15, - 29+20, - 37+20, - 47+15, - 60+10, - 76+7, - 97+5, - 123+2, - 157, - 200, - 255, -}; +u8 light_LUT[LIGHT_MAX+1]; +// the const ref to light_LUT is what is actually used in the code. const u8 *light_decode_table = light_LUT; /** Initialize or update the light value tables using the specified \p gamma. @@ -65,26 +45,26 @@ void set_light_table(float gamma) { static const float brightness_step = 255.0f / (LIGHT_MAX + 1); - /* These are adjustment values that are added to the calculated light value - * after gamma is applied. Currently they are used so that given a gamma - * of 1.8 the light values set by this function are the same as those - * hardcoded in the initalizer list for the declaration of light_LUT. - */ + // this table is pure arbitrary values, made so that + // at gamma 2.2 the game looks not too dark at light=1, + // and mostly linear for the rest of the scale. + // we could try to inverse the gamma power function, but this + // is simpler and quicker. static const int adjustments[LIGHT_MAX + 1] = { - 7, - 7, - 7, - 5, - 2, - 0, - -7, - -20, - -31, - -39, - -43, - -45, - -40, - -25, + -67, + -91, + -125, + -115, + -104, + -85, + -70, + -63, + -56, + -49, + -42, + -35, + -28, + -22, 0 }; @@ -93,296 +73,13 @@ void set_light_table(float gamma) float brightness = brightness_step; for (size_t i = 0; i < LIGHT_MAX; i++) { - light_LUT[i] = (u8)(255 * powf(brightness / 255.0f, gamma)); + light_LUT[i] = (u8)(255 * powf(brightness / 255.0f, 1.0 / gamma)); light_LUT[i] = rangelim(light_LUT[i] + adjustments[i], 0, 255); - if (i > 1 && light_LUT[i] < light_LUT[i-1]) - light_LUT[i] = light_LUT[i-1] + 1; + if (i > 1 && light_LUT[i] < light_LUT[i - 1]) + light_LUT[i] = light_LUT[i - 1] + 1; brightness += brightness_step; } light_LUT[LIGHT_MAX] = 255; } #endif - - -#if 0 -/* -Made using this and: -- adding 220 as the second last one -- replacing the third last one (212) with 195 - -#!/usr/bin/python - -from math import * -from sys import stdout - -# We want 0 at light=0 and 255 at light=LIGHT_MAX -LIGHT_MAX = 14 -#FACTOR = 0.69 -#FACTOR = 0.75 -FACTOR = 0.83 -START_FROM_ZERO = False - -L = [] -if START_FROM_ZERO: - for i in range(1,LIGHT_MAX+1): - L.append(int(round(255.0 * FACTOR ** (i-1)))) - L.append(0) -else: - for i in range(1,LIGHT_MAX+1): - L.append(int(round(255.0 * FACTOR ** (i-1)))) - L.append(255) - -L.reverse() -for i in L: - stdout.write(str(i)+",\n") -*/ -u8 light_decode_table[LIGHT_MAX+1] = -{ -23, -27, -33, -40, -48, -57, -69, -83, -100, -121, -146, -176, -195, -220, -255, -}; -#endif - -#if 0 -// This is good -// a_n+1 = a_n * 0.786 -// Length of LIGHT_MAX+1 means LIGHT_MAX is the last value. -// LIGHT_SUN is read as LIGHT_MAX from here. -u8 light_decode_table[LIGHT_MAX+1] = -{ -8, -11, -14, -18, -22, -29, -37, -47, -60, -76, -97, -123, -157, -200, -255, -}; -#endif - -#if 0 -// Use for debugging in dark -u8 light_decode_table[LIGHT_MAX+1] = -{ -58, -64, -72, -80, -88, -98, -109, -121, -135, -150, -167, -185, -206, -229, -255, -}; -#endif - -// This is reasonable with classic lighting with a light source -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -2, -3, -4, -6, -9, -13, -18, -25, -32, -35, -45, -57, -69, -79, -255 -};*/ - - -// As in minecraft, a_n+1 = a_n * 0.8 -// NOTE: This doesn't really work that well because this defines -// LIGHT_MAX as dimmer than LIGHT_SUN -// NOTE: Uh, this has had 34 left out; forget this. -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -8, -11, -14, -17, -21, -27, -42, -53, -66, -83, -104, -130, -163, -204, -255, -};*/ - -// This was a quick try of more light, manually quickly made -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -7, -11, -15, -21, -29, -42, -53, -69, -85, -109, -135, -167, -205, -255, -};*/ - -// This was used for a long time, manually made -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -6, -8, -11, -14, -19, -26, -34, -45, -61, -81, -108, -143, -191, -255, -};*/ - -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -3, -6, -10, -18, -25, -35, -50, -75, -95, -120, -150, -185, -215, -255, -};*/ -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -5, -12, -22, -35, -50, -65, -85, -100, -120, -140, -160, -185, -215, -255, -};*/ -// LIGHT_MAX is 14, 0-14 is 15 values -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -9, -12, -14, -16, -20, -26, -34, -45, -61, -81, -108, -143, -191, -255, -};*/ - -#if 0 -/* -#!/usr/bin/python - -from math import * -from sys import stdout - -# We want 0 at light=0 and 255 at light=LIGHT_MAX -LIGHT_MAX = 14 -#FACTOR = 0.69 -FACTOR = 0.75 - -L = [] -for i in range(1,LIGHT_MAX+1): - L.append(int(round(255.0 * FACTOR ** (i-1)))) -L.append(0) - -L.reverse() -for i in L: - stdout.write(str(i)+",\n") -*/ -u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -6, -8, -11, -14, -19, -26, -34, -45, -61, -81, -108, -143, -191, -255, -}; -#endif - - diff --git a/src/light.h b/src/light.h index 984e6d7c2..30a647581 100644 --- a/src/light.h +++ b/src/light.h @@ -38,30 +38,30 @@ with this program; if not, write to the Free Software Foundation, Inc., inline u8 diminish_light(u8 light) { - if(light == 0) + if (light == 0) return 0; - if(light >= LIGHT_MAX) + if (light >= LIGHT_MAX) return LIGHT_MAX - 1; - + return light - 1; } inline u8 diminish_light(u8 light, u8 distance) { - if(distance >= light) + if (distance >= light) return 0; - return light - distance; + return light - distance; } inline u8 undiminish_light(u8 light) { // We don't know if light should undiminish from this particular 0. // Thus, keep it at 0. - if(light == 0) + if (light == 0) return 0; - if(light == LIGHT_MAX) + if (light == LIGHT_MAX) return light; - + return light + 1; } @@ -85,9 +85,9 @@ extern const u8 *light_decode_table; // 0 <= return value <= 255 inline u8 decode_light(u8 light) { - if(light > LIGHT_MAX) + if (light > LIGHT_MAX) light = LIGHT_MAX; - + return light_decode_table[light]; } @@ -97,12 +97,12 @@ inline float decode_light_f(float light_f) { s32 i = (u32)(light_f * LIGHT_MAX + 0.5); - if(i <= 0) + if (i <= 0) return (float)light_decode_table[0] / 255.0; - if(i >= LIGHT_MAX) + if (i >= LIGHT_MAX) return (float)light_decode_table[LIGHT_MAX] / 255.0; - float v1 = (float)light_decode_table[i-1] / 255.0; + float v1 = (float)light_decode_table[i - 1] / 255.0; float v2 = (float)light_decode_table[i] / 255.0; float f0 = (float)i - 0.5; float f = light_f * LIGHT_MAX - f0; @@ -119,11 +119,10 @@ void set_light_table(float gamma); inline u8 blend_light(u32 daylight_factor, u8 lightday, u8 lightnight) { u32 c = 1000; - u32 l = ((daylight_factor * lightday + (c-daylight_factor) * lightnight))/c; - if(l > LIGHT_SUN) + u32 l = ((daylight_factor * lightday + (c - daylight_factor) * lightnight)) / c; + if (l > LIGHT_SUN) l = LIGHT_SUN; return l; } #endif - diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 4d0ca0600..b587f7bbb 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -21,22 +21,21 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "event.h" #include "collision.h" -#include "gamedef.h" #include "nodedef.h" #include "settings.h" #include "environment.h" #include "map.h" #include "client.h" +#include "content_cao.h" /* LocalPlayer */ -LocalPlayer::LocalPlayer(Client *gamedef, const char *name): - Player(name, gamedef->idef()), +LocalPlayer::LocalPlayer(Client *client, const char *name): + Player(name, client->idef()), parent(0), hp(PLAYER_MAX_HP), - got_teleported(false), isAttached(false), touching_ground(false), in_liquid(false), @@ -49,7 +48,8 @@ LocalPlayer::LocalPlayer(Client *gamedef, const char *name): physics_override_jump(1.0f), physics_override_gravity(1.0f), physics_override_sneak(true), - physics_override_sneak_glitch(true), + physics_override_sneak_glitch(false), + physics_override_new_move(true), // Temporary option for old move code overridePosition(v3f(0,0,0)), last_position(v3f(0,0,0)), last_speed(v3f(0,0,0)), @@ -59,6 +59,7 @@ LocalPlayer::LocalPlayer(Client *gamedef, const char *name): last_camera_fov(0), last_wanted_range(0), camera_impact(0.f), + makes_footstep_sound(true), last_animation(NO_ANIM), hotbar_image(""), hotbar_selected_image(""), @@ -67,9 +68,12 @@ LocalPlayer::LocalPlayer(Client *gamedef, const char *name): hurt_tilt_strength(0.0f), m_position(0,0,0), m_sneak_node(32767,32767,32767), + m_sneak_node_bb_ymax(0), // To support temporary option for old move code + m_sneak_node_bb_top(0,0,0,0,0,0), m_sneak_node_exists(false), m_need_to_get_new_sneak_node(true), - m_sneak_node_bb_ymax(0), + m_sneak_ladder_detected(false), + m_ledge_detected(false), m_old_node_below(32767,32767,32767), m_old_node_below_type("air"), m_can_jump(false), @@ -79,7 +83,7 @@ LocalPlayer::LocalPlayer(Client *gamedef, const char *name): camera_barely_in_ceiling(false), m_collisionbox(-BS * 0.30, 0.0, -BS * 0.30, BS * 0.30, BS * 1.75, BS * 0.30), m_cao(NULL), - m_gamedef(gamedef) + m_client(client) { // Initialize hp to 0, so that no hearts will be shown if server // doesn't support health points @@ -92,11 +96,99 @@ LocalPlayer::~LocalPlayer() { } +static aabb3f getTopBoundingBox(const std::vector<aabb3f> &nodeboxes) +{ + aabb3f b_max; + b_max.reset(-BS, -BS, -BS); + for (std::vector<aabb3f>::const_iterator it = nodeboxes.begin(); + it != nodeboxes.end(); ++it) { + aabb3f box = *it; + if (box.MaxEdge.Y > b_max.MaxEdge.Y) + b_max = box; + else if (box.MaxEdge.Y == b_max.MaxEdge.Y) + b_max.addInternalBox(box); + } + return aabb3f(v3f(b_max.MinEdge.X, b_max.MaxEdge.Y, b_max.MinEdge.Z), b_max.MaxEdge); +} + +#define GETNODE(map, p3, v2, y, valid) \ + (map)->getNodeNoEx((p3) + v3s16((v2).X, y, (v2).Y), valid) + +// pos is the node the player is standing inside(!) +static bool detectSneakLadder(Map *map, INodeDefManager *nodemgr, v3s16 pos) +{ + // Detects a structure known as "sneak ladder" or "sneak elevator" + // that relies on bugs to provide a fast means of vertical transportation, + // the bugs have since been fixed but this function remains to keep it working. + // NOTE: This is just entirely a huge hack and causes way too many problems. + bool is_valid_position; + MapNode node; + // X/Z vectors for 4 neighboring nodes + static const v2s16 vecs[] = { v2s16(-1, 0), v2s16(1, 0), v2s16(0, -1), v2s16(0, 1) }; + + for (u16 i = 0; i < ARRLEN(vecs); i++) { + const v2s16 vec = vecs[i]; + + // walkability of bottom & top node should differ + node = GETNODE(map, pos, vec, 0, &is_valid_position); + if (!is_valid_position) + continue; + bool w = nodemgr->get(node).walkable; + node = GETNODE(map, pos, vec, 1, &is_valid_position); + if (!is_valid_position || w == nodemgr->get(node).walkable) + continue; + + // check one more node above OR below with corresponding walkability + node = GETNODE(map, pos, vec, -1, &is_valid_position); + bool ok = is_valid_position && w != nodemgr->get(node).walkable; + if (!ok) { + node = GETNODE(map, pos, vec, 2, &is_valid_position); + ok = is_valid_position && w == nodemgr->get(node).walkable; + } + + if (ok) + return true; + } + + return false; +} + +static bool detectLedge(Map *map, INodeDefManager *nodemgr, v3s16 pos) +{ + bool is_valid_position; + MapNode node; + // X/Z vectors for 4 neighboring nodes + static const v2s16 vecs[] = {v2s16(-1, 0), v2s16(1, 0), v2s16(0, -1), v2s16(0, 1)}; + + for (u16 i = 0; i < ARRLEN(vecs); i++) { + const v2s16 vec = vecs[i]; + + node = GETNODE(map, pos, vec, 1, &is_valid_position); + if (is_valid_position && nodemgr->get(node).walkable) { + // Ledge exists + node = GETNODE(map, pos, vec, 2, &is_valid_position); + if (is_valid_position && !nodemgr->get(node).walkable) + // Space above ledge exists + return true; + } + } + + return false; +} + +#undef GETNODE + void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, std::vector<CollisionInfo> *collision_info) { + // Temporary option for old move code + if (!physics_override_new_move) { + old_move(dtime, env, pos_max_d, collision_info); + return; + } + Map *map = &env->getMap(); - INodeDefManager *nodemgr = m_gamedef->ndef(); + INodeDefManager *nodemgr = m_client->ndef(); v3f position = getPosition(); @@ -109,8 +201,8 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, } // Skip collision detection if noclip mode is used - bool fly_allowed = m_gamedef->checkLocalPrivilege("fly"); - bool noclip = m_gamedef->checkLocalPrivilege("noclip") && + bool fly_allowed = m_client->checkLocalPrivilege("fly"); + bool noclip = m_client->checkLocalPrivilege("noclip") && g_settings->getBool("noclip"); bool free_move = noclip && fly_allowed && g_settings->getBool("free_move"); if (free_move) { @@ -199,49 +291,69 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, // This should always apply, otherwise there are glitches sanity_check(d > pos_max_d); - // Maximum distance over border for sneaking - f32 sneak_max = BS*0.4; + // Max. distance (X, Z) over border for sneaking determined by collision box + // * 0.49 to keep the center just barely on the node + v3f sneak_max = m_collisionbox.getExtent() * 0.49; + if (m_sneak_ladder_detected) { + // restore legacy behaviour (this makes the m_speed.Y hack necessary) + sneak_max = v3f(0.4 * BS, 0, 0.4 * BS); + } /* If sneaking, keep in range from the last walked node and don't fall off from it */ if (control.sneak && m_sneak_node_exists && - !(fly_allowed && g_settings->getBool("free_move")) && !in_liquid && - physics_override_sneak && !got_teleported) { - f32 maxd = 0.5 * BS + sneak_max; - v3f lwn_f = intToFloat(m_sneak_node, BS); - position.X = rangelim(position.X, lwn_f.X-maxd, lwn_f.X+maxd); - position.Z = rangelim(position.Z, lwn_f.Z-maxd, lwn_f.Z+maxd); + !(fly_allowed && g_settings->getBool("free_move")) && + !in_liquid && !is_climbing && + physics_override_sneak) { + const v3f sn_f = intToFloat(m_sneak_node, BS); + const v3f bmin = sn_f + m_sneak_node_bb_top.MinEdge; + const v3f bmax = sn_f + m_sneak_node_bb_top.MaxEdge; + const v3f old_pos = position; + const v3f old_speed = m_speed; + + position.X = rangelim(position.X, + bmin.X - sneak_max.X, bmax.X + sneak_max.X); + position.Z = rangelim(position.Z, + bmin.Z - sneak_max.Z, bmax.Z + sneak_max.Z); + + if (position.X != old_pos.X) + m_speed.X = 0; + if (position.Z != old_pos.Z) + m_speed.Z = 0; + + // Because we keep the player collision box on the node, limiting + // position.Y is not necessary but useful to prevent players from + // being inside a node if sneaking on e.g. the lower part of a stair + if (!m_sneak_ladder_detected) { + position.Y = MYMAX(position.Y, bmax.Y); + } else { + // legacy behaviour that sometimes causes some weird slow sinking + m_speed.Y = MYMAX(m_speed.Y, 0); + } - if (!is_climbing) { - // Move up if necessary - f32 new_y = (lwn_f.Y - 0.5 * BS) + m_sneak_node_bb_ymax; - if (position.Y < new_y) - position.Y = new_y; - /* - Collision seems broken, since player is sinking when - sneaking over the edges of current sneaking_node. - TODO (when fixed): Set Y-speed only to 0 when position.Y < new_y. - */ - if (m_speed.Y < 0) - m_speed.Y = 0; + if (collision_info != NULL && + m_speed.Y - old_speed.Y > BS) { + // Collide with sneak node, report fall damage + CollisionInfo sn_info; + sn_info.node_p = m_sneak_node; + sn_info.old_speed = old_speed; + sn_info.new_speed = m_speed; + collision_info->push_back(sn_info); } } - if (got_teleported) - got_teleported = false; - - // this shouldn't be hardcoded but transmitted from server - float player_stepheight = touching_ground ? (BS*0.6) : (BS*0.2); + // TODO: this shouldn't be hardcoded but transmitted from server + float player_stepheight = (touching_ground) ? (BS * 0.6f) : (BS * 0.2f); #ifdef __ANDROID__ - player_stepheight += (0.6 * BS); + player_stepheight += (0.6f * BS); #endif v3f accel_f = v3f(0,0,0); - collisionMoveResult result = collisionMoveSimple(env, m_gamedef, + collisionMoveResult result = collisionMoveSimple(env, m_client, pos_max_d, m_collisionbox, player_stepheight, dtime, &position, &m_speed, accel_f); @@ -254,17 +366,18 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, bool touching_ground_was = touching_ground; touching_ground = result.touching_ground; - //bool standing_on_unloaded = result.standing_on_unloaded; - + // We want the top of the sneak node to be below the players feet + f32 position_y_mod; + if (m_sneak_node_exists) + position_y_mod = m_sneak_node_bb_top.MaxEdge.Y - 0.05 * BS; + else + position_y_mod = (0.5 - 0.05) * BS; + v3s16 current_node = floatToInt(position - v3f(0, position_y_mod, 0), BS); /* Check the nodes under the player to see from which node the player is sneaking from, if any. If the node from under the player has been removed, the player falls. */ - f32 position_y_mod = 0.05 * BS; - if (m_sneak_node_bb_ymax > 0) - position_y_mod = m_sneak_node_bb_ymax - position_y_mod; - v3s16 current_node = floatToInt(position - v3f(0, position_y_mod, 0), BS); if (m_sneak_node_exists && nodemgr->get(map->getNodeNoEx(m_old_node_below)).name == "air" && m_old_node_below_type != "air") { @@ -279,88 +392,83 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, } if (m_need_to_get_new_sneak_node && physics_override_sneak) { - m_sneak_node_bb_ymax = 0; - v3s16 pos_i_bottom = floatToInt(position - v3f(0, position_y_mod, 0), BS); v2f player_p2df(position.X, position.Z); f32 min_distance_f = 100000.0 * BS; - // If already seeking from some node, compare to it. - /*if(m_sneak_node_exists) - { - v3f sneaknode_pf = intToFloat(m_sneak_node, BS); - v2f sneaknode_p2df(sneaknode_pf.X, sneaknode_pf.Z); - f32 d_horiz_f = player_p2df.getDistanceFrom(sneaknode_p2df); - f32 d_vert_f = fabs(sneaknode_pf.Y + BS*0.5 - position.Y); - // Ignore if player is not on the same level (likely dropped) - if(d_vert_f < 0.15*BS) - min_distance_f = d_horiz_f; - }*/ v3s16 new_sneak_node = m_sneak_node; for(s16 x=-1; x<=1; x++) for(s16 z=-1; z<=1; z++) { - v3s16 p = pos_i_bottom + v3s16(x,0,z); + v3s16 p = current_node + v3s16(x,0,z); v3f pf = intToFloat(p, BS); v2f node_p2df(pf.X, pf.Z); f32 distance_f = player_p2df.getDistanceFrom(node_p2df); - f32 max_axis_distance_f = MYMAX( - fabs(player_p2df.X-node_p2df.X), - fabs(player_p2df.Y-node_p2df.Y)); - if(distance_f > min_distance_f || - max_axis_distance_f > 0.5*BS + sneak_max + 0.1*BS) + if (distance_f > min_distance_f || + fabs(player_p2df.X-node_p2df.X) > (.5+.1)*BS + sneak_max.X || + fabs(player_p2df.Y-node_p2df.Y) > (.5+.1)*BS + sneak_max.Z) continue; // The node to be sneaked on has to be walkable node = map->getNodeNoEx(p, &is_valid_position); - if (!is_valid_position || nodemgr->get(node).walkable == false) - continue; - // And the node above it has to be nonwalkable - node = map->getNodeNoEx(p + v3s16(0,1,0), &is_valid_position); - if (!is_valid_position || nodemgr->get(node).walkable) { + if (!is_valid_position || !nodemgr->get(node).walkable) continue; - } + // And the node(s) above have to be nonwalkable + bool ok = true; if (!physics_override_sneak_glitch) { - node =map->getNodeNoEx(p + v3s16(0,2,0), &is_valid_position); - if (!is_valid_position || nodemgr->get(node).walkable) - continue; + u16 height = ceilf( + (m_collisionbox.MaxEdge.Y - m_collisionbox.MinEdge.Y) / BS + ); + for (u16 y = 1; y <= height; y++) { + node = map->getNodeNoEx(p + v3s16(0,y,0), &is_valid_position); + if (!is_valid_position || nodemgr->get(node).walkable) { + ok = false; + break; + } + } + } else { + // legacy behaviour: check just one node + node = map->getNodeNoEx(p + v3s16(0,1,0), &is_valid_position); + ok = is_valid_position && !nodemgr->get(node).walkable; } + if (!ok) + continue; min_distance_f = distance_f; new_sneak_node = p; } - bool sneak_node_found = (min_distance_f < 100000.0 * BS * 0.9); - + bool sneak_node_found = (min_distance_f < 100000.0 * BS); m_sneak_node = new_sneak_node; m_sneak_node_exists = sneak_node_found; if (sneak_node_found) { - f32 cb_max = 0; + // Update saved top bounding box of sneak node MapNode n = map->getNodeNoEx(m_sneak_node); std::vector<aabb3f> nodeboxes; n.getCollisionBoxes(nodemgr, &nodeboxes); - for (std::vector<aabb3f>::iterator it = nodeboxes.begin(); - it != nodeboxes.end(); ++it) { - aabb3f box = *it; - if (box.MaxEdge.Y > cb_max) - cb_max = box.MaxEdge.Y; - } - m_sneak_node_bb_ymax = cb_max; - } + m_sneak_node_bb_top = getTopBoundingBox(nodeboxes); - /* - If sneaking, the player's collision box can be in air, so - this has to be set explicitly - */ - if(sneak_node_found && control.sneak) - touching_ground = true; + m_sneak_ladder_detected = physics_override_sneak_glitch && + detectSneakLadder(map, nodemgr, floatToInt(position, BS)); + } else { + m_sneak_ladder_detected = false; + } } /* - Set new position + If 'sneak glitch' enabled detect ledge for old sneak-jump + behaviour of climbing onto a ledge 2 nodes up. */ + if (physics_override_sneak_glitch && control.sneak && control.jump) + m_ledge_detected = detectLedge(map, nodemgr, floatToInt(position, BS)); + + /* + Set new position but keep sneak node set + */ + bool sneak_node_exists = m_sneak_node_exists; setPosition(position); + m_sneak_node_exists = sneak_node_exists; /* Report collisions @@ -376,7 +484,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, if(!result.standing_on_object && !touching_ground_was && touching_ground) { MtEvent *e = new SimpleTriggerEvent("PlayerRegainGround"); - m_gamedef->event()->put(e); + m_client->event()->put(e); // Set camera impact value to be used for view bobbing camera_impact = getSpeed().Y * -1; @@ -405,8 +513,11 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, const ContentFeatures &f = nodemgr->get(map->getNodeNoEx(getStandingNodePos())); // Determine if jumping is possible m_can_jump = touching_ground && !in_liquid; - if(itemgroup_get(f.groups, "disable_jump")) + if (itemgroup_get(f.groups, "disable_jump")) m_can_jump = false; + else if (control.sneak && m_sneak_ladder_detected && !in_liquid && !is_climbing) + m_can_jump = true; + // Jump key pressed while jumping off from a bouncy block if (m_can_jump && control.jump && itemgroup_get(f.groups, "bouncy") && m_speed.Y >= -0.5 * BS) { @@ -448,8 +559,8 @@ void LocalPlayer::applyControl(float dtime) v3f speedH = v3f(0,0,0); // Horizontal (X, Z) v3f speedV = v3f(0,0,0); // Vertical (Y) - bool fly_allowed = m_gamedef->checkLocalPrivilege("fly"); - bool fast_allowed = m_gamedef->checkLocalPrivilege("fast"); + bool fly_allowed = m_client->checkLocalPrivilege("fly"); + bool fast_allowed = m_client->checkLocalPrivilege("fast"); bool free_move = fly_allowed && g_settings->getBool("free_move"); bool fast_move = fast_allowed && g_settings->getBool("fast_move"); @@ -593,13 +704,21 @@ void LocalPlayer::applyControl(float dtime) at its starting value */ v3f speedJ = getSpeed(); - if(speedJ.Y >= -0.5 * BS) - { - speedJ.Y = movement_speed_jump * physics_override_jump; - setSpeed(speedJ); + if(speedJ.Y >= -0.5 * BS) { + if (m_ledge_detected) { + // Limit jump speed to a minimum that allows + // jumping up onto a ledge 2 nodes up. + speedJ.Y = movement_speed_jump * + MYMAX(physics_override_jump, 1.3f); + setSpeed(speedJ); + m_ledge_detected = false; + } else { + speedJ.Y = movement_speed_jump * physics_override_jump; + setSpeed(speedJ); + } MtEvent *e = new SimpleTriggerEvent("PlayerJump"); - m_gamedef->event()->put(e); + m_client->event()->put(e); } } else if(in_liquid) @@ -656,6 +775,29 @@ v3s16 LocalPlayer::getStandingNodePos() return floatToInt(getPosition() - v3f(0, BS, 0), BS); } +v3s16 LocalPlayer::getFootstepNodePos() +{ + if (touching_ground) + // BS * 0.05 below the player's feet ensures a 1/16th height + // nodebox is detected instead of the node below it. + return floatToInt(getPosition() - v3f(0, BS * 0.05f, 0), BS); + // A larger distance below is necessary for a footstep sound + // when landing after a jump or fall. BS * 0.5 ensures water + // sounds when swimming in 1 node deep water. + return floatToInt(getPosition() - v3f(0, BS * 0.5f, 0), BS); +} + +v3s16 LocalPlayer::getLightPosition() const +{ + return floatToInt(m_position + v3f(0,BS+BS/2,0), BS); +} + +v3f LocalPlayer::getEyeOffset() const +{ + float eye_height = camera_barely_in_ceiling ? 1.5f : 1.625f; + return v3f(0, BS * eye_height, 0); +} + // Horizontal acceleration (X and Z), Y direction is ignored void LocalPlayer::accelerateHorizontal(const v3f &target_speed, const f32 max_increase) { @@ -689,3 +831,303 @@ void LocalPlayer::accelerateVertical(const v3f &target_speed, const f32 max_incr m_speed.Y += d_wanted; } +// Temporary option for old move code +void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d, + std::vector<CollisionInfo> *collision_info) +{ + Map *map = &env->getMap(); + INodeDefManager *nodemgr = m_client->ndef(); + + v3f position = getPosition(); + + // Copy parent position if local player is attached + if (isAttached) { + setPosition(overridePosition); + m_sneak_node_exists = false; + return; + } + + // Skip collision detection if noclip mode is used + bool fly_allowed = m_client->checkLocalPrivilege("fly"); + bool noclip = m_client->checkLocalPrivilege("noclip") && + g_settings->getBool("noclip"); + bool free_move = noclip && fly_allowed && g_settings->getBool("free_move"); + if (free_move) { + position += m_speed * dtime; + setPosition(position); + m_sneak_node_exists = false; + return; + } + + /* + Collision detection + */ + bool is_valid_position; + MapNode node; + v3s16 pp; + + /* + Check if player is in liquid (the oscillating value) + */ + if (in_liquid) { + // If in liquid, the threshold of coming out is at higher y + pp = floatToInt(position + v3f(0, BS * 0.1, 0), BS); + node = map->getNodeNoEx(pp, &is_valid_position); + if (is_valid_position) { + in_liquid = nodemgr->get(node.getContent()).isLiquid(); + liquid_viscosity = nodemgr->get(node.getContent()).liquid_viscosity; + } else { + in_liquid = false; + } + } else { + // If not in liquid, the threshold of going in is at lower y + pp = floatToInt(position + v3f(0, BS * 0.5, 0), BS); + node = map->getNodeNoEx(pp, &is_valid_position); + if (is_valid_position) { + in_liquid = nodemgr->get(node.getContent()).isLiquid(); + liquid_viscosity = nodemgr->get(node.getContent()).liquid_viscosity; + } else { + in_liquid = false; + } + } + + /* + Check if player is in liquid (the stable value) + */ + pp = floatToInt(position + v3f(0, 0, 0), BS); + node = map->getNodeNoEx(pp, &is_valid_position); + if (is_valid_position) + in_liquid_stable = nodemgr->get(node.getContent()).isLiquid(); + else + in_liquid_stable = false; + + /* + Check if player is climbing + */ + pp = floatToInt(position + v3f(0, 0.5 * BS, 0), BS); + v3s16 pp2 = floatToInt(position + v3f(0, -0.2 * BS, 0), BS); + node = map->getNodeNoEx(pp, &is_valid_position); + bool is_valid_position2; + MapNode node2 = map->getNodeNoEx(pp2, &is_valid_position2); + + if (!(is_valid_position && is_valid_position2)) + is_climbing = false; + else + is_climbing = (nodemgr->get(node.getContent()).climbable || + nodemgr->get(node2.getContent()).climbable) && !free_move; + + /* + Collision uncertainty radius + Make it a bit larger than the maximum distance of movement + */ + //f32 d = pos_max_d * 1.1; + // A fairly large value in here makes moving smoother + f32 d = 0.15 * BS; + // This should always apply, otherwise there are glitches + sanity_check(d > pos_max_d); + // Maximum distance over border for sneaking + f32 sneak_max = BS * 0.4; + + /* + If sneaking, keep in range from the last walked node and don't + fall off from it + */ + if (control.sneak && m_sneak_node_exists && + !(fly_allowed && g_settings->getBool("free_move")) && !in_liquid && + physics_override_sneak) { + f32 maxd = 0.5 * BS + sneak_max; + v3f lwn_f = intToFloat(m_sneak_node, BS); + position.X = rangelim(position.X, lwn_f.X - maxd, lwn_f.X + maxd); + position.Z = rangelim(position.Z, lwn_f.Z - maxd, lwn_f.Z + maxd); + + if (!is_climbing) { + // Move up if necessary + f32 new_y = (lwn_f.Y - 0.5 * BS) + m_sneak_node_bb_ymax; + if (position.Y < new_y) + position.Y = new_y; + /* + Collision seems broken, since player is sinking when + sneaking over the edges of current sneaking_node. + TODO (when fixed): Set Y-speed only to 0 when position.Y < new_y. + */ + if (m_speed.Y < 0) + m_speed.Y = 0; + } + } + + // this shouldn't be hardcoded but transmitted from server + float player_stepheight = touching_ground ? (BS * 0.6) : (BS * 0.2); + +#ifdef __ANDROID__ + player_stepheight += (0.6 * BS); +#endif + + v3f accel_f = v3f(0, 0, 0); + + collisionMoveResult result = collisionMoveSimple(env, m_client, + pos_max_d, m_collisionbox, player_stepheight, dtime, + &position, &m_speed, accel_f); + + /* + If the player's feet touch the topside of any node, this is + set to true. + + Player is allowed to jump when this is true. + */ + bool touching_ground_was = touching_ground; + touching_ground = result.touching_ground; + + //bool standing_on_unloaded = result.standing_on_unloaded; + + /* + Check the nodes under the player to see from which node the + player is sneaking from, if any. If the node from under + the player has been removed, the player falls. + */ + f32 position_y_mod = 0.05 * BS; + if (m_sneak_node_bb_ymax > 0) + position_y_mod = m_sneak_node_bb_ymax - position_y_mod; + v3s16 current_node = floatToInt(position - v3f(0, position_y_mod, 0), BS); + if (m_sneak_node_exists && + nodemgr->get(map->getNodeNoEx(m_old_node_below)).name == "air" && + m_old_node_below_type != "air") { + // Old node appears to have been removed; that is, + // it wasn't air before but now it is + m_need_to_get_new_sneak_node = false; + m_sneak_node_exists = false; + } else if (nodemgr->get(map->getNodeNoEx(current_node)).name != "air") { + // We are on something, so make sure to recalculate the sneak + // node. + m_need_to_get_new_sneak_node = true; + } + + if (m_need_to_get_new_sneak_node && physics_override_sneak) { + m_sneak_node_bb_ymax = 0; + v3s16 pos_i_bottom = floatToInt(position - v3f(0, position_y_mod, 0), BS); + v2f player_p2df(position.X, position.Z); + f32 min_distance_f = 100000.0 * BS; + // If already seeking from some node, compare to it. + v3s16 new_sneak_node = m_sneak_node; + for (s16 x= -1; x <= 1; x++) + for (s16 z= -1; z <= 1; z++) { + v3s16 p = pos_i_bottom + v3s16(x, 0, z); + v3f pf = intToFloat(p, BS); + v2f node_p2df(pf.X, pf.Z); + f32 distance_f = player_p2df.getDistanceFrom(node_p2df); + f32 max_axis_distance_f = MYMAX( + fabs(player_p2df.X - node_p2df.X), + fabs(player_p2df.Y - node_p2df.Y)); + + if (distance_f > min_distance_f || + max_axis_distance_f > 0.5 * BS + sneak_max + 0.1 * BS) + continue; + + // The node to be sneaked on has to be walkable + node = map->getNodeNoEx(p, &is_valid_position); + if (!is_valid_position || nodemgr->get(node).walkable == false) + continue; + // And the node above it has to be nonwalkable + node = map->getNodeNoEx(p + v3s16(0, 1, 0), &is_valid_position); + if (!is_valid_position || nodemgr->get(node).walkable) + continue; + // If not 'sneak_glitch' the node 2 nodes above it has to be nonwalkable + if (!physics_override_sneak_glitch) { + node =map->getNodeNoEx(p + v3s16(0, 2, 0), &is_valid_position); + if (!is_valid_position || nodemgr->get(node).walkable) + continue; + } + + min_distance_f = distance_f; + new_sneak_node = p; + } + + bool sneak_node_found = (min_distance_f < 100000.0 * BS * 0.9); + + m_sneak_node = new_sneak_node; + m_sneak_node_exists = sneak_node_found; + + if (sneak_node_found) { + f32 cb_max = 0; + MapNode n = map->getNodeNoEx(m_sneak_node); + std::vector<aabb3f> nodeboxes; + n.getCollisionBoxes(nodemgr, &nodeboxes); + for (std::vector<aabb3f>::iterator it = nodeboxes.begin(); + it != nodeboxes.end(); ++it) { + aabb3f box = *it; + if (box.MaxEdge.Y > cb_max) + cb_max = box.MaxEdge.Y; + } + m_sneak_node_bb_ymax = cb_max; + } + + /* + If sneaking, the player's collision box can be in air, so + this has to be set explicitly + */ + if (sneak_node_found && control.sneak) + touching_ground = true; + } + + /* + Set new position but keep sneak node set + */ + bool sneak_node_exists = m_sneak_node_exists; + setPosition(position); + m_sneak_node_exists = sneak_node_exists; + + /* + Report collisions + */ + // Dont report if flying + if (collision_info && !(g_settings->getBool("free_move") && fly_allowed)) { + for (size_t i = 0; i < result.collisions.size(); i++) { + const CollisionInfo &info = result.collisions[i]; + collision_info->push_back(info); + } + } + + if (!result.standing_on_object && !touching_ground_was && touching_ground) { + MtEvent *e = new SimpleTriggerEvent("PlayerRegainGround"); + m_client->event()->put(e); + // Set camera impact value to be used for view bobbing + camera_impact = getSpeed().Y * -1; + } + + { + camera_barely_in_ceiling = false; + v3s16 camera_np = floatToInt(getEyePosition(), BS); + MapNode n = map->getNodeNoEx(camera_np); + if (n.getContent() != CONTENT_IGNORE) { + if (nodemgr->get(n).walkable && nodemgr->get(n).solidness == 2) + camera_barely_in_ceiling = true; + } + } + + /* + Update the node last under the player + */ + m_old_node_below = floatToInt(position - v3f(0, BS / 2, 0), BS); + m_old_node_below_type = nodemgr->get(map->getNodeNoEx(m_old_node_below)).name; + + /* + Check properties of the node on which the player is standing + */ + const ContentFeatures &f = nodemgr->get(map->getNodeNoEx(getStandingNodePos())); + // Determine if jumping is possible + m_can_jump = touching_ground && !in_liquid; + if (itemgroup_get(f.groups, "disable_jump")) + m_can_jump = false; + // Jump key pressed while jumping off from a bouncy block + if (m_can_jump && control.jump && itemgroup_get(f.groups, "bouncy") && + m_speed.Y >= -0.5 * BS) { + float jumpspeed = movement_speed_jump * physics_override_jump; + if (m_speed.Y > 1) { + // Reduce boost when speed already is high + m_speed.Y += jumpspeed / (1 + (m_speed.Y / 16 )); + } else { + m_speed.Y += jumpspeed; + } + setSpeed(m_speed); + m_can_jump = false; + } +} diff --git a/src/localplayer.h b/src/localplayer.h index 7a1cb7466..9cbefae23 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -30,18 +30,23 @@ class GenericCAO; class ClientActiveObject; class IGameDef; -enum LocalPlayerAnimations {NO_ANIM, WALK_ANIM, DIG_ANIM, WD_ANIM}; // no local animation, walking, digging, both +enum LocalPlayerAnimations +{ + NO_ANIM, + WALK_ANIM, + DIG_ANIM, + WD_ANIM +}; // no local animation, walking, digging, both class LocalPlayer : public Player { public: - LocalPlayer(Client *gamedef, const char *name); + LocalPlayer(Client *client, const char *name); virtual ~LocalPlayer(); ClientActiveObject *parent; u16 hp; - bool got_teleported; bool isAttached; bool touching_ground; // This oscillates so that the player jumps a bit above the surface @@ -58,16 +63,22 @@ public: float physics_override_gravity; bool physics_override_sneak; bool physics_override_sneak_glitch; + // Temporary option for old move code + bool physics_override_new_move; v3f overridePosition; void move(f32 dtime, Environment *env, f32 pos_max_d); void move(f32 dtime, Environment *env, f32 pos_max_d, std::vector<CollisionInfo> *collision_info); + // Temporary option for old move code + void old_move(f32 dtime, Environment *env, f32 pos_max_d, + std::vector<CollisionInfo> *collision_info); void applyControl(float dtime); v3s16 getStandingNodePos(); + v3s16 getFootstepNodePos(); // Used to check if anything changed and prevent sending packets if not v3f last_position; @@ -80,6 +91,8 @@ public: float camera_impact; + bool makes_footstep_sound; + int last_animation; float last_animation_speed; @@ -91,12 +104,11 @@ public: float hurt_tilt_timer; float hurt_tilt_strength; - GenericCAO* getCAO() const { - return m_cao; - } + GenericCAO *getCAO() const { return m_cao; } - void setCAO(GenericCAO* toset) { - assert( m_cao == NULL ); // Pre-condition + void setCAO(GenericCAO *toset) + { + assert(m_cao == NULL); // Pre-condition m_cao = toset; } @@ -105,51 +117,49 @@ public: u16 getBreath() const { return m_breath; } void setBreath(u16 breath) { m_breath = breath; } - v3s16 getLightPosition() const - { - return floatToInt(m_position + v3f(0,BS+BS/2,0), BS); - } + v3s16 getLightPosition() const; - void setYaw(f32 yaw) - { - m_yaw = yaw; - } + void setYaw(f32 yaw) { m_yaw = yaw; } f32 getYaw() const { return m_yaw; } - void setPitch(f32 pitch) - { - m_pitch = pitch; - } + void setPitch(f32 pitch) { m_pitch = pitch; } f32 getPitch() const { return m_pitch; } - void setPosition(const v3f &position) + inline void setPosition(const v3f &position) { m_position = position; + m_sneak_node_exists = false; } v3f getPosition() const { return m_position; } v3f getEyePosition() const { return m_position + getEyeOffset(); } - v3f getEyeOffset() const - { - float eye_height = camera_barely_in_ceiling ? 1.5f : 1.625f; - return v3f(0, BS * eye_height, 0); - } + v3f getEyeOffset() const; + private: void accelerateHorizontal(const v3f &target_speed, const f32 max_increase); void accelerateVertical(const v3f &target_speed, const f32 max_increase); v3f m_position; - // This is used for determining the sneaking range + v3s16 m_sneak_node; + // Stores the max player uplift by m_sneak_node + // To support temporary option for old move code + f32 m_sneak_node_bb_ymax; + // Stores the top bounding box of m_sneak_node + aabb3f m_sneak_node_bb_top; // Whether the player is allowed to sneak bool m_sneak_node_exists; - // Whether recalculation of the sneak node is needed + // Whether recalculation of m_sneak_node and its top bbox is needed bool m_need_to_get_new_sneak_node; - // Stores the max player uplift by m_sneak_node and is updated - // when m_need_to_get_new_sneak_node == true - f32 m_sneak_node_bb_ymax; + // Whether a "sneak ladder" structure is detected at the players pos + // see detectSneakLadder() in the .cpp for more info (always false if disabled) + bool m_sneak_ladder_detected; + // Whether a 2-node-up ledge is detected at the players pos, + // see detectLedge() in the .cpp for more info (always false if disabled). + bool m_ledge_detected; + // Node below player, used to determine whether it has been removed, // and its old type v3s16 m_old_node_below; @@ -161,9 +171,8 @@ private: bool camera_barely_in_ceiling; aabb3f m_collisionbox; - GenericCAO* m_cao; - Client *m_gamedef; + GenericCAO *m_cao; + Client *m_client; }; #endif - diff --git a/src/main.cpp b/src/main.cpp index a54454653..6a2e89f7a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,9 +17,6 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -// This would get rid of the console window -//#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") - #include "irrlicht.h" // createDevice #include "mainmenumanager.h" @@ -44,11 +41,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gameparams.h" #include "database.h" #include "config.h" +#include "porting.h" #if USE_CURSES #include "terminal_chat_console.h" #endif #ifndef SERVER #include "client/clientlauncher.h" + #endif #ifdef HAVE_TOUCHSCREENGUI @@ -104,28 +103,10 @@ static bool get_game_from_cmdline(GameParams *game_params, const Settings &cmd_a static bool determine_subgame(GameParams *game_params); static bool run_dedicated_server(const GameParams &game_params, const Settings &cmd_args); -static bool migrate_database(const GameParams &game_params, const Settings &cmd_args); +static bool migrate_map_database(const GameParams &game_params, const Settings &cmd_args); /**********************************************************************/ -/* - gettime.h implementation -*/ - -#ifdef SERVER - -u32 getTimeMs() -{ - /* Use imprecise system calls directly (from porting.h) */ - return porting::getTime(PRECISION_MILLI); -} - -u32 getTime(TimePrecision prec) -{ - return porting::getTime(prec); -} - -#endif FileLogOutput file_log_output; @@ -134,7 +115,6 @@ static OptionList allowed_options; int main(int argc, char *argv[]) { int retval; - debug_set_exception_handler(); g_logger.registerThread("Main"); @@ -145,11 +125,15 @@ int main(int argc, char *argv[]) if (!cmd_args_ok || cmd_args.getFlag("help") || cmd_args.exists("nonopt1")) { + porting::attachOrCreateConsole(); print_help(allowed_options); return cmd_args_ok ? 0 : 1; } + if (cmd_args.getFlag("console")) + porting::attachOrCreateConsole(); if (cmd_args.getFlag("version")) { + porting::attachOrCreateConsole(); print_version(); return 0; } @@ -191,6 +175,9 @@ int main(int argc, char *argv[]) if (!init_common(cmd_args, argc, argv)) return 1; + if (g_settings->getBool("enable_console")) + porting::attachOrCreateConsole(); + #ifndef __ANDROID__ // Run unit tests if (cmd_args.getFlag("run-unittests")) { @@ -200,9 +187,13 @@ int main(int argc, char *argv[]) GameParams game_params; #ifdef SERVER + porting::attachOrCreateConsole(); game_params.is_dedicated_server = true; #else - game_params.is_dedicated_server = cmd_args.getFlag("server"); + const bool isServer = cmd_args.getFlag("server"); + if (isServer) + porting::attachOrCreateConsole(); + game_params.is_dedicated_server = isServer; #endif if (!game_configure(&game_params, cmd_args)) @@ -213,10 +204,6 @@ int main(int argc, char *argv[]) infostream << "Using commanded world path [" << game_params.world_path << "]" << std::endl; - //Run dedicated server if asked to or no other option - g_settings->set("server_dedicated", - game_params.is_dedicated_server ? "true" : "false"); - if (game_params.is_dedicated_server) return run_dedicated_server(game_params, cmd_args) ? 0 : 1; @@ -288,6 +275,8 @@ static void set_allowed_options(OptionList *allowed_options) _("Set gameid (\"--gameid list\" prints available ones)")))); allowed_options->insert(std::make_pair("migrate", ValueSpec(VALUETYPE_STRING, _("Migrate from current map backend to another (Only works when using minetestserver or with --server)")))); + allowed_options->insert(std::make_pair("migrate-players", ValueSpec(VALUETYPE_STRING, + _("Migrate from current players backend to another (Only works when using minetestserver or with --server)")))); allowed_options->insert(std::make_pair("terminal", ValueSpec(VALUETYPE_FLAG, _("Feature an interactive terminal (Only works when using minetestserver or with --server)")))); #ifndef SERVER @@ -307,6 +296,8 @@ static void set_allowed_options(OptionList *allowed_options) _("Set password")))); allowed_options->insert(std::make_pair("go", ValueSpec(VALUETYPE_FLAG, _("Disable main menu")))); + allowed_options->insert(std::make_pair("console", ValueSpec(VALUETYPE_FLAG, + _("Starts with the console (Windows only)")))); #endif } @@ -326,7 +317,7 @@ static void print_allowed_options(const OptionList &allowed_options) if (i->second.type != VALUETYPE_FLAG) os1 << _(" <value>"); - std::cout << padStringRight(os1.str(), 24); + std::cout << padStringRight(os1.str(), 30); if (i->second.help != NULL) std::cout << i->second.help; @@ -822,7 +813,9 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings & // Database migration if (cmd_args.exists("migrate")) - return migrate_database(game_params, cmd_args); + return migrate_map_database(game_params, cmd_args); + else if (cmd_args.exists("migrate-players")) + return ServerEnvironment::migratePlayersDatabase(game_params, cmd_args); if (cmd_args.exists("terminal")) { #if USE_CURSES @@ -852,8 +845,8 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings & try { // Create server - Server server(game_params.world_path, - game_params.game_spec, false, bind_addr.isIPv6(), &iface); + Server server(game_params.world_path, game_params.game_spec, + false, bind_addr.isIPv6(), true, &iface); g_term_console.setup(&iface, &kill, admin_nick); @@ -887,7 +880,7 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings & try { // Create server Server server(game_params.world_path, game_params.game_spec, false, - bind_addr.isIPv6()); + bind_addr.isIPv6(), true); server.start(bind_addr); // Run server @@ -906,7 +899,7 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings & return true; } -static bool migrate_database(const GameParams &game_params, const Settings &cmd_args) +static bool migrate_map_database(const GameParams &game_params, const Settings &cmd_args) { std::string migrate_to = cmd_args.get("migrate"); Settings world_mt; @@ -915,20 +908,23 @@ static bool migrate_database(const GameParams &game_params, const Settings &cmd_ errorstream << "Cannot read world.mt!" << std::endl; return false; } + if (!world_mt.exists("backend")) { errorstream << "Please specify your current backend in world.mt:" << std::endl - << " backend = {sqlite3|leveldb|redis|dummy}" + << " backend = {sqlite3|leveldb|redis|dummy|postgresql}" << std::endl; return false; } + std::string backend = world_mt.get("backend"); if (backend == migrate_to) { errorstream << "Cannot migrate: new backend is same" << " as the old one" << std::endl; return false; } - Database *old_db = ServerMap::createDatabase(backend, game_params.world_path, world_mt), + + MapDatabase *old_db = ServerMap::createDatabase(backend, game_params.world_path, world_mt), *new_db = ServerMap::createDatabase(migrate_to, game_params.world_path, world_mt); u32 count = 0; @@ -970,4 +966,3 @@ static bool migrate_database(const GameParams &game_params, const Settings &cmd_ return true; } - diff --git a/src/mainmenumanager.h b/src/mainmenumanager.h index 17133b164..fb715ca9b 100644 --- a/src/mainmenumanager.h +++ b/src/mainmenumanager.h @@ -83,7 +83,7 @@ public: /*core::list<GUIModalMenu*>::Iterator i = m_stack.getLast(); assert(*i == menu); m_stack.erase(i);*/ - + if(!m_stack.empty()) m_stack.back()->setVisible(true); } @@ -119,7 +119,7 @@ public: extern MainMenuManager g_menumgr; -extern bool noMenuActive(); +extern bool isMenuActive(); class MainGameCallback : public IGameCallback { @@ -168,7 +168,7 @@ public: keyconfig_changed = true; } - + bool disconnect_requested; bool changepassword_requested; bool changevolume_requested; diff --git a/src/map.cpp b/src/map.cpp index 7bb8c4a13..3b02ac02f 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -32,7 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include "gamedef.h" #include "util/directiontables.h" -#include "util/mathconstants.h" +#include "util/basic_macros.h" #include "rollback_interface.h" #include "environment.h" #include "reflowscan.h" @@ -44,6 +44,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "database.h" #include "database-dummy.h" #include "database-sqlite3.h" +#include "script/scripting_server.h" #include <deque> #include <queue> #if USE_LEVELDB @@ -56,8 +57,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "database-postgresql.h" #endif -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - /* Map @@ -67,6 +66,7 @@ Map::Map(std::ostream &dout, IGameDef *gamedef): m_dout(dout), m_gamedef(gamedef), m_sector_cache(NULL), + m_nodedef(gamedef->ndef()), m_transforming_liquid_loop_count_multiplier(1.0f), m_unprocessed_count(0), m_inc_trending_up_start_time(0), @@ -228,7 +228,7 @@ void Map::setNode(v3s16 p, MapNode & n) bool temp_bool; errorstream<<"Map::setNode(): Not allowing to place CONTENT_IGNORE" <<" while trying to replace \"" - <<m_gamedef->ndef()->get(block->getNodeNoCheck(relpos, &temp_bool)).name + <<m_nodedef->get(block->getNodeNoCheck(relpos, &temp_bool)).name <<"\" at "<<PP(p)<<" (block "<<PP(blockpos)<<")"<<std::endl; debug_stacks_print_to(infostream); return; @@ -236,583 +236,10 @@ void Map::setNode(v3s16 p, MapNode & n) block->setNodeNoCheck(relpos, n); } -/* - Goes recursively through the neighbours of the node. - - Alters only transparent nodes. - - If the lighting of the neighbour is lower than the lighting of - the node was (before changing it to 0 at the step before), the - lighting of the neighbour is set to 0 and then the same stuff - repeats for the neighbour. - - The ending nodes of the routine are stored in light_sources. - This is useful when a light is removed. In such case, this - routine can be called for the light node and then again for - light_sources to re-light the area without the removed light. - - values of from_nodes are lighting values. -*/ -void Map::unspreadLight(enum LightBank bank, - std::map<v3s16, u8> & from_nodes, - std::set<v3s16> & light_sources, - std::map<v3s16, MapBlock*> & modified_blocks) -{ - INodeDefManager *nodemgr = m_gamedef->ndef(); - - v3s16 dirs[6] = { - v3s16(0,0,1), // back - v3s16(0,1,0), // top - v3s16(1,0,0), // right - v3s16(0,0,-1), // front - v3s16(0,-1,0), // bottom - v3s16(-1,0,0), // left - }; - - if(from_nodes.empty()) - return; - - u32 blockchangecount = 0; - - std::map<v3s16, u8> unlighted_nodes; - - /* - Initialize block cache - */ - v3s16 blockpos_last; - MapBlock *block = NULL; - // Cache this a bit, too - bool block_checked_in_modified = false; - - for(std::map<v3s16, u8>::iterator j = from_nodes.begin(); - j != from_nodes.end(); ++j) - { - v3s16 pos = j->first; - v3s16 blockpos = getNodeBlockPos(pos); - - // Only fetch a new block if the block position has changed - try{ - if(block == NULL || blockpos != blockpos_last){ - block = getBlockNoCreate(blockpos); - blockpos_last = blockpos; - - block_checked_in_modified = false; - blockchangecount++; - } - } - catch(InvalidPositionException &e) - { - continue; - } - - if(block->isDummy()) - continue; - - // Calculate relative position in block - //v3s16 relpos = pos - blockpos_last * MAP_BLOCKSIZE; - - // Get node straight from the block - //MapNode n = block->getNode(relpos); - - u8 oldlight = j->second; - - // Loop through 6 neighbors - for(u16 i=0; i<6; i++) - { - // Get the position of the neighbor node - v3s16 n2pos = pos + dirs[i]; - - // Get the block where the node is located - v3s16 blockpos, relpos; - getNodeBlockPosWithOffset(n2pos, blockpos, relpos); - - // Only fetch a new block if the block position has changed - try { - if(block == NULL || blockpos != blockpos_last){ - block = getBlockNoCreate(blockpos); - blockpos_last = blockpos; - - block_checked_in_modified = false; - blockchangecount++; - } - } - catch(InvalidPositionException &e) { - continue; - } - - // Get node straight from the block - bool is_valid_position; - MapNode n2 = block->getNode(relpos, &is_valid_position); - if (!is_valid_position) - continue; - - bool changed = false; - - //TODO: Optimize output by optimizing light_sources? - - /* - If the neighbor is dimmer than what was specified - as oldlight (the light of the previous node) - */ - if(n2.getLight(bank, nodemgr) < oldlight) - { - /* - And the neighbor is transparent and it has some light - */ - if(nodemgr->get(n2).light_propagates - && n2.getLight(bank, nodemgr) != 0) - { - /* - Set light to 0 and add to queue - */ - - u8 current_light = n2.getLight(bank, nodemgr); - n2.setLight(bank, 0, nodemgr); - block->setNode(relpos, n2); - - unlighted_nodes[n2pos] = current_light; - changed = true; - - /* - Remove from light_sources if it is there - NOTE: This doesn't happen nearly at all - */ - /*if(light_sources.find(n2pos)) - { - infostream<<"Removed from light_sources"<<std::endl; - light_sources.remove(n2pos); - }*/ - } - - /*// DEBUG - if(light_sources.find(n2pos) != NULL) - light_sources.remove(n2pos);*/ - } - else{ - light_sources.insert(n2pos); - } - - // Add to modified_blocks - if(changed == true && block_checked_in_modified == false) - { - // If the block is not found in modified_blocks, add. - if(modified_blocks.find(blockpos) == modified_blocks.end()) - { - modified_blocks[blockpos] = block; - } - block_checked_in_modified = true; - } - } - } - - /*infostream<<"unspreadLight(): Changed block " - <<blockchangecount<<" times" - <<" for "<<from_nodes.size()<<" nodes" - <<std::endl;*/ - - if(!unlighted_nodes.empty()) - unspreadLight(bank, unlighted_nodes, light_sources, modified_blocks); -} - -/* - Lights neighbors of from_nodes, collects all them and then - goes on recursively. -*/ -void Map::spreadLight(enum LightBank bank, - std::set<v3s16> & from_nodes, - std::map<v3s16, MapBlock*> & modified_blocks) -{ - INodeDefManager *nodemgr = m_gamedef->ndef(); - - const v3s16 dirs[6] = { - v3s16(0,0,1), // back - v3s16(0,1,0), // top - v3s16(1,0,0), // right - v3s16(0,0,-1), // front - v3s16(0,-1,0), // bottom - v3s16(-1,0,0), // left - }; - - if(from_nodes.empty()) - return; - - u32 blockchangecount = 0; - - std::set<v3s16> lighted_nodes; - - /* - Initialize block cache - */ - v3s16 blockpos_last; - MapBlock *block = NULL; - // Cache this a bit, too - bool block_checked_in_modified = false; - - for(std::set<v3s16>::iterator j = from_nodes.begin(); - j != from_nodes.end(); ++j) - { - v3s16 pos = *j; - v3s16 blockpos, relpos; - - getNodeBlockPosWithOffset(pos, blockpos, relpos); - - // Only fetch a new block if the block position has changed - try { - if(block == NULL || blockpos != blockpos_last){ - block = getBlockNoCreate(blockpos); - blockpos_last = blockpos; - - block_checked_in_modified = false; - blockchangecount++; - } - } - catch(InvalidPositionException &e) { - continue; - } - - if(block->isDummy()) - continue; - - // Get node straight from the block - bool is_valid_position; - MapNode n = block->getNode(relpos, &is_valid_position); - - u8 oldlight = is_valid_position ? n.getLight(bank, nodemgr) : 0; - u8 newlight = diminish_light(oldlight); - - // Loop through 6 neighbors - for(u16 i=0; i<6; i++){ - // Get the position of the neighbor node - v3s16 n2pos = pos + dirs[i]; - - // Get the block where the node is located - v3s16 blockpos, relpos; - getNodeBlockPosWithOffset(n2pos, blockpos, relpos); - - // Only fetch a new block if the block position has changed - try { - if(block == NULL || blockpos != blockpos_last){ - block = getBlockNoCreate(blockpos); - blockpos_last = blockpos; - - block_checked_in_modified = false; - blockchangecount++; - } - } - catch(InvalidPositionException &e) { - continue; - } - - // Get node straight from the block - MapNode n2 = block->getNode(relpos, &is_valid_position); - if (!is_valid_position) - continue; - - bool changed = false; - /* - If the neighbor is brighter than the current node, - add to list (it will light up this node on its turn) - */ - if(n2.getLight(bank, nodemgr) > undiminish_light(oldlight)) - { - lighted_nodes.insert(n2pos); - changed = true; - } - /* - If the neighbor is dimmer than how much light this node - would spread on it, add to list - */ - if(n2.getLight(bank, nodemgr) < newlight) - { - if(nodemgr->get(n2).light_propagates) - { - n2.setLight(bank, newlight, nodemgr); - block->setNode(relpos, n2); - lighted_nodes.insert(n2pos); - changed = true; - } - } - - // Add to modified_blocks - if(changed == true && block_checked_in_modified == false) - { - // If the block is not found in modified_blocks, add. - if(modified_blocks.find(blockpos) == modified_blocks.end()) - { - modified_blocks[blockpos] = block; - } - block_checked_in_modified = true; - } - } - } - - /*infostream<<"spreadLight(): Changed block " - <<blockchangecount<<" times" - <<" for "<<from_nodes.size()<<" nodes" - <<std::endl;*/ - - if(!lighted_nodes.empty()) - spreadLight(bank, lighted_nodes, modified_blocks); -} - -void Map::updateLighting(enum LightBank bank, - std::map<v3s16, MapBlock*> & a_blocks, - std::map<v3s16, MapBlock*> & modified_blocks) -{ - INodeDefManager *nodemgr = m_gamedef->ndef(); - - /*m_dout<<"Map::updateLighting(): " - <<a_blocks.size()<<" blocks."<<std::endl;*/ - - //TimeTaker timer("updateLighting"); - - // For debugging - //bool debug=true; - //u32 count_was = modified_blocks.size(); - - //std::map<v3s16, MapBlock*> blocks_to_update; - - std::set<v3s16> light_sources; - - std::map<v3s16, u8> unlight_from; - - int num_bottom_invalid = 0; - - { - //TimeTaker t("first stuff"); - - for(std::map<v3s16, MapBlock*>::iterator i = a_blocks.begin(); - i != a_blocks.end(); ++i) - { - MapBlock *block = i->second; - - for(;;) - { - // Don't bother with dummy blocks. - if(block->isDummy()) - break; - - v3s16 pos = block->getPos(); - v3s16 posnodes = block->getPosRelative(); - modified_blocks[pos] = block; - //blocks_to_update[pos] = block; - - /* - Clear all light from block - */ - for(s16 z=0; z<MAP_BLOCKSIZE; z++) - for(s16 x=0; x<MAP_BLOCKSIZE; x++) - for(s16 y=0; y<MAP_BLOCKSIZE; y++) - { - v3s16 p(x,y,z); - bool is_valid_position; - MapNode n = block->getNode(p, &is_valid_position); - if (!is_valid_position) { - /* This would happen when dealing with a - dummy block. - */ - infostream<<"updateLighting(): InvalidPositionException" - <<std::endl; - continue; - } - u8 oldlight = n.getLight(bank, nodemgr); - n.setLight(bank, 0, nodemgr); - block->setNode(p, n); - - // If node sources light, add to list - u8 source = nodemgr->get(n).light_source; - if(source != 0) - light_sources.insert(p + posnodes); - - // Collect borders for unlighting - if((x==0 || x == MAP_BLOCKSIZE-1 - || y==0 || y == MAP_BLOCKSIZE-1 - || z==0 || z == MAP_BLOCKSIZE-1) - && oldlight != 0) - { - v3s16 p_map = p + posnodes; - unlight_from[p_map] = oldlight; - } - - - } - - if(bank == LIGHTBANK_DAY) - { - bool bottom_valid = block->propagateSunlight(light_sources); - - if(!bottom_valid) - num_bottom_invalid++; - - // If bottom is valid, we're done. - if(bottom_valid) - break; - } - else if(bank == LIGHTBANK_NIGHT) - { - // For night lighting, sunlight is not propagated - break; - } - else - { - assert("Invalid lighting bank" == NULL); - } - - /*infostream<<"Bottom for sunlight-propagated block (" - <<pos.X<<","<<pos.Y<<","<<pos.Z<<") not valid" - <<std::endl;*/ - - // Bottom sunlight is not valid; get the block and loop to it - - pos.Y--; - try{ - block = getBlockNoCreate(pos); - } - catch(InvalidPositionException &e) - { - FATAL_ERROR("Invalid position"); - } - - } - } - - } - - /* - Enable this to disable proper lighting for speeding up map - generation for testing or whatever - */ -#if 0 - //if(g_settings->get("")) - { - core::map<v3s16, MapBlock*>::Iterator i; - i = blocks_to_update.getIterator(); - for(; i.atEnd() == false; i++) - { - MapBlock *block = i.getNode()->getValue(); - v3s16 p = block->getPos(); - block->setLightingExpired(false); - } - return; - } -#endif - -#if 1 - { - //TimeTaker timer("unspreadLight"); - unspreadLight(bank, unlight_from, light_sources, modified_blocks); - } - - /*if(debug) - { - u32 diff = modified_blocks.size() - count_was; - count_was = modified_blocks.size(); - infostream<<"unspreadLight modified "<<diff<<std::endl; - }*/ - - { - //TimeTaker timer("spreadLight"); - spreadLight(bank, light_sources, modified_blocks); - } - - /*if(debug) - { - u32 diff = modified_blocks.size() - count_was; - count_was = modified_blocks.size(); - infostream<<"spreadLight modified "<<diff<<std::endl; - }*/ -#endif - -#if 0 - { - //MapVoxelManipulator vmanip(this); - - // Make a manual voxel manipulator and load all the blocks - // that touch the requested blocks - ManualMapVoxelManipulator vmanip(this); - - { - //TimeTaker timer("initialEmerge"); - - core::map<v3s16, MapBlock*>::Iterator i; - i = blocks_to_update.getIterator(); - for(; i.atEnd() == false; i++) - { - MapBlock *block = i.getNode()->getValue(); - v3s16 p = block->getPos(); - - // Add all surrounding blocks - vmanip.initialEmerge(p - v3s16(1,1,1), p + v3s16(1,1,1)); - - /* - Add all surrounding blocks that have up-to-date lighting - NOTE: This doesn't quite do the job (not everything - appropriate is lighted) - */ - /*for(s16 z=-1; z<=1; z++) - for(s16 y=-1; y<=1; y++) - for(s16 x=-1; x<=1; x++) - { - v3s16 p2 = p + v3s16(x,y,z); - MapBlock *block = getBlockNoCreateNoEx(p2); - if(block == NULL) - continue; - if(block->isDummy()) - continue; - if(block->getLightingExpired()) - continue; - vmanip.initialEmerge(p2, p2); - }*/ - - // Lighting of block will be updated completely - block->setLightingExpired(false); - } - } - - { - //TimeTaker timer("unSpreadLight"); - vmanip.unspreadLight(bank, unlight_from, light_sources, nodemgr); - } - { - //TimeTaker timer("spreadLight"); - vmanip.spreadLight(bank, light_sources, nodemgr); - } - { - //TimeTaker timer("blitBack"); - vmanip.blitBack(modified_blocks); - } - /*infostream<<"emerge_time="<<emerge_time<<std::endl; - emerge_time = 0;*/ - } -#endif - - //m_dout<<"Done ("<<getTimestamp()<<")"<<std::endl; -} - -void Map::updateLighting(std::map<v3s16, MapBlock*> & a_blocks, - std::map<v3s16, MapBlock*> & modified_blocks) -{ - updateLighting(LIGHTBANK_DAY, a_blocks, modified_blocks); - updateLighting(LIGHTBANK_NIGHT, a_blocks, modified_blocks); - - /* - Update information about whether day and night light differ - */ - for(std::map<v3s16, MapBlock*>::iterator - i = modified_blocks.begin(); - i != modified_blocks.end(); ++i) - { - MapBlock *block = i->second; - block->expireDayNightDiff(); - } -} - void Map::addNodeAndUpdate(v3s16 p, MapNode n, std::map<v3s16, MapBlock*> &modified_blocks, bool remove_metadata) { - INodeDefManager *ndef = m_gamedef->ndef(); - // Collect old node for rollback RollbackNode rollback_oldnode(this, p, m_gamedef); @@ -826,14 +253,14 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, // Set the node on the map // Ignore light (because calling voxalgo::update_lighting_nodes) - n.setLight(LIGHTBANK_DAY, 0, ndef); - n.setLight(LIGHTBANK_NIGHT, 0, ndef); + n.setLight(LIGHTBANK_DAY, 0, m_nodedef); + n.setLight(LIGHTBANK_NIGHT, 0, m_nodedef); setNode(p, n); // Update lighting std::vector<std::pair<v3s16, MapNode> > oldnodes; oldnodes.push_back(std::pair<v3s16, MapNode>(p, oldnode)); - voxalgo::update_lighting_nodes(this, ndef, oldnodes, modified_blocks); + voxalgo::update_lighting_nodes(this, oldnodes, modified_blocks); for(std::map<v3s16, MapBlock*>::iterator i = modified_blocks.begin(); @@ -870,11 +297,10 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, bool is_valid_position; MapNode n2 = getNodeNoEx(p2, &is_valid_position); - if(is_valid_position - && (ndef->get(n2).isLiquid() || n2.getContent() == CONTENT_AIR)) - { + if(is_valid_position && + (m_nodedef->get(n2).isLiquid() || + n2.getContent() == CONTENT_AIR)) m_transforming_liquid.push_back(p2); - } } } @@ -1212,11 +638,9 @@ s32 Map::transforming_liquid_size() { return m_transforming_liquid.size(); } -void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) +void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, + ServerEnvironment *env) { - - INodeDefManager *nodemgr = m_gamedef->ndef(); - DSTACK(FUNCTION_NAME); //TimeTaker timer("transformLiquids()"); @@ -1276,12 +700,12 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) // The node which will be placed there if liquid // can't flow into this node. content_t floodable_node = CONTENT_AIR; - const ContentFeatures &cf = nodemgr->get(n0); + const ContentFeatures &cf = m_nodedef->get(n0); LiquidType liquid_type = cf.liquid_type; switch (liquid_type) { case LIQUID_SOURCE: liquid_level = LIQUID_LEVEL_SOURCE; - liquid_kind = nodemgr->getId(cf.liquid_alternative_flowing); + liquid_kind = m_nodedef->getId(cf.liquid_alternative_flowing); break; case LIQUID_FLOWING: liquid_level = (n0.param2 & LIQUID_LEVEL_MASK); @@ -1323,8 +747,8 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) } v3s16 npos = p0 + dirs[i]; NodeNeighbor nb(getNodeNoEx(npos), nt, npos); - const ContentFeatures &cfnb = nodemgr->get(nb.n); - switch (nodemgr->get(nb.n.getContent()).liquid_type) { + const ContentFeatures &cfnb = m_nodedef->get(nb.n); + switch (m_nodedef->get(nb.n.getContent()).liquid_type) { case LIQUID_NONE: if (cfnb.floodable) { airs[num_airs++] = nb; @@ -1352,8 +776,8 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) case LIQUID_SOURCE: // if this node is not (yet) of a liquid type, choose the first liquid type we encounter if (liquid_kind == CONTENT_AIR) - liquid_kind = nodemgr->getId(cfnb.liquid_alternative_flowing); - if (nodemgr->getId(cfnb.liquid_alternative_flowing) != liquid_kind) { + liquid_kind = m_nodedef->getId(cfnb.liquid_alternative_flowing); + if (m_nodedef->getId(cfnb.liquid_alternative_flowing) != liquid_kind) { neutrals[num_neutrals++] = nb; } else { // Do not count bottom source, it will screw things up @@ -1364,8 +788,8 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) case LIQUID_FLOWING: // if this node is not (yet) of a liquid type, choose the first liquid type we encounter if (liquid_kind == CONTENT_AIR) - liquid_kind = nodemgr->getId(cfnb.liquid_alternative_flowing); - if (nodemgr->getId(cfnb.liquid_alternative_flowing) != liquid_kind) { + liquid_kind = m_nodedef->getId(cfnb.liquid_alternative_flowing); + if (m_nodedef->getId(cfnb.liquid_alternative_flowing) != liquid_kind) { neutrals[num_neutrals++] = nb; } else { flows[num_flows++] = nb; @@ -1383,15 +807,15 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) s8 new_node_level = -1; s8 max_node_level = -1; - u8 range = nodemgr->get(liquid_kind).liquid_range; + u8 range = m_nodedef->get(liquid_kind).liquid_range; if (range > LIQUID_LEVEL_MAX + 1) range = LIQUID_LEVEL_MAX + 1; - if ((num_sources >= 2 && nodemgr->get(liquid_kind).liquid_renewable) || liquid_type == LIQUID_SOURCE) { + if ((num_sources >= 2 && m_nodedef->get(liquid_kind).liquid_renewable) || liquid_type == LIQUID_SOURCE) { // liquid_kind will be set to either the flowing alternative of the node (if it's a liquid) // or the flowing alternative of the first of the surrounding sources (if it's air), so // it's perfectly safe to use liquid_kind here to determine the new node content. - new_node_content = nodemgr->getId(nodemgr->get(liquid_kind).liquid_alternative_source); + new_node_content = m_nodedef->getId(m_nodedef->get(liquid_kind).liquid_alternative_source); } else if (num_sources >= 1 && sources[0].t != NEIGHBOR_LOWER) { // liquid_kind is set properly, see above max_node_level = new_node_level = LIQUID_LEVEL_MAX; @@ -1428,7 +852,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) } } - u8 viscosity = nodemgr->get(liquid_kind).liquid_viscosity; + u8 viscosity = m_nodedef->get(liquid_kind).liquid_viscosity; if (viscosity > 1 && max_node_level != liquid_level) { // amount to gain, limited by viscosity // must be at least 1 in absolute value @@ -1456,7 +880,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) check if anything has changed. if not, just continue with the next node. */ if (new_node_content == n0.getContent() && - (nodemgr->get(n0.getContent()).liquid_type != LIQUID_FLOWING || + (m_nodedef->get(n0.getContent()).liquid_type != LIQUID_FLOWING || ((n0.param2 & LIQUID_LEVEL_MASK) == (u8)new_node_level && ((n0.param2 & LIQUID_FLOW_DOWN_MASK) == LIQUID_FLOW_DOWN_MASK) == flowing_down))) @@ -1468,18 +892,26 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) */ MapNode n00 = n0; //bool flow_down_enabled = (flowing_down && ((n0.param2 & LIQUID_FLOW_DOWN_MASK) != LIQUID_FLOW_DOWN_MASK)); - if (nodemgr->get(new_node_content).liquid_type == LIQUID_FLOWING) { + if (m_nodedef->get(new_node_content).liquid_type == LIQUID_FLOWING) { // set level to last 3 bits, flowing down bit to 4th bit n0.param2 = (flowing_down ? LIQUID_FLOW_DOWN_MASK : 0x00) | (new_node_level & LIQUID_LEVEL_MASK); } else { // set the liquid level and flow bit to 0 n0.param2 = ~(LIQUID_LEVEL_MASK | LIQUID_FLOW_DOWN_MASK); } + + // change the node. n0.setContent(new_node_content); + // on_flood() the node + if (floodable_node != CONTENT_AIR) { + if (env->getScriptIface()->node_on_flood(p0, n00, n0)) + continue; + } + // Ignore light (because calling voxalgo::update_lighting_nodes) - n0.setLight(LIGHTBANK_DAY, 0, nodemgr); - n0.setLight(LIGHTBANK_NIGHT, 0, nodemgr); + n0.setLight(LIGHTBANK_DAY, 0, m_nodedef); + n0.setLight(LIGHTBANK_NIGHT, 0, m_nodedef); // Find out whether there is a suspect for this action std::string suspect; @@ -1513,7 +945,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) /* enqueue neighbors for update if neccessary */ - switch (nodemgr->get(n0.getContent()).liquid_type) { + switch (m_nodedef->get(n0.getContent()).liquid_type) { case LIQUID_SOURCE: case LIQUID_FLOWING: // make sure source flows into all neighboring nodes @@ -1536,7 +968,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) for (std::deque<v3s16>::iterator iter = must_reflow.begin(); iter != must_reflow.end(); ++iter) m_transforming_liquid.push_back(*iter); - voxalgo::update_lighting_nodes(this, nodemgr, changed_nodes, modified_blocks); + voxalgo::update_lighting_nodes(this, changed_nodes, modified_blocks); /* ---------------------------------------------------------------------- @@ -1549,7 +981,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks) time_until_purge *= 1000; // seconds -> milliseconds - u32 curr_time = getTime(PRECISION_MILLI); + u64 curr_time = porting::getTimeMs(); u32 prev_unprocessed = m_unprocessed_count; m_unprocessed_count = m_transforming_liquid.size(); @@ -1735,10 +1167,77 @@ void Map::removeNodeTimer(v3s16 p) block->m_node_timers.remove(p_rel); } +bool Map::isOccluded(v3s16 p0, v3s16 p1, float step, float stepfac, + float start_off, float end_off, u32 needed_count) +{ + float d0 = (float)BS * p0.getDistanceFrom(p1); + v3s16 u0 = p1 - p0; + v3f uf = v3f(u0.X, u0.Y, u0.Z) * BS; + uf.normalize(); + v3f p0f = v3f(p0.X, p0.Y, p0.Z) * BS; + u32 count = 0; + for(float s=start_off; s<d0+end_off; s+=step){ + v3f pf = p0f + uf * s; + v3s16 p = floatToInt(pf, BS); + MapNode n = getNodeNoEx(p); + const ContentFeatures &f = m_nodedef->get(n); + if(f.drawtype == NDT_NORMAL){ + // not transparent, see ContentFeature::updateTextures + count++; + if(count >= needed_count) + return true; + } + step *= stepfac; + } + return false; +} + +bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes) { + v3s16 cpn = block->getPos() * MAP_BLOCKSIZE; + cpn += v3s16(MAP_BLOCKSIZE / 2, MAP_BLOCKSIZE / 2, MAP_BLOCKSIZE / 2); + float step = BS * 1; + float stepfac = 1.1; + float startoff = BS * 1; + // The occlusion search of 'isOccluded()' must stop short of the target + // point by distance 'endoff' (end offset) to not enter the target mapblock. + // For the 8 mapblock corners 'endoff' must therefore be the maximum diagonal + // of a mapblock, because we must consider all view angles. + // sqrt(1^2 + 1^2 + 1^2) = 1.732 + float endoff = -BS * MAP_BLOCKSIZE * 1.732050807569; + v3s16 spn = cam_pos_nodes; + s16 bs2 = MAP_BLOCKSIZE / 2 + 1; + // to reduce the likelihood of falsely occluded blocks + // require at least two solid blocks + // this is a HACK, we should think of a more precise algorithm + u32 needed_count = 2; + + return ( + // For the central point of the mapblock 'endoff' can be halved + isOccluded(spn, cpn, + step, stepfac, startoff, endoff / 2.0f, needed_count) && + isOccluded(spn, cpn + v3s16(bs2,bs2,bs2), + step, stepfac, startoff, endoff, needed_count) && + isOccluded(spn, cpn + v3s16(bs2,bs2,-bs2), + step, stepfac, startoff, endoff, needed_count) && + isOccluded(spn, cpn + v3s16(bs2,-bs2,bs2), + step, stepfac, startoff, endoff, needed_count) && + isOccluded(spn, cpn + v3s16(bs2,-bs2,-bs2), + step, stepfac, startoff, endoff, needed_count) && + isOccluded(spn, cpn + v3s16(-bs2,bs2,bs2), + step, stepfac, startoff, endoff, needed_count) && + isOccluded(spn, cpn + v3s16(-bs2,bs2,-bs2), + step, stepfac, startoff, endoff, needed_count) && + isOccluded(spn, cpn + v3s16(-bs2,-bs2,bs2), + step, stepfac, startoff, endoff, needed_count) && + isOccluded(spn, cpn + v3s16(-bs2,-bs2,-bs2), + step, stepfac, startoff, endoff, needed_count)); +} + /* ServerMap */ -ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emerge): +ServerMap::ServerMap(const std::string &savedir, IGameDef *gamedef, + EmergeManager *emerge): Map(dout_server, gamedef), settings_mgr(g_settings, savedir + DIR_DELIM + "map_meta.txt"), m_emerge(emerge), @@ -1879,6 +1378,24 @@ s16 ServerMap::getWaterLevel() return getMapgenParams()->water_level; } +bool ServerMap::saoPositionOverLimit(const v3f &p) +{ + return getMapgenParams()->saoPosOverLimit(p); +} + +bool ServerMap::blockpos_over_mapgen_limit(v3s16 p) +{ + const s16 mapgen_limit_bp = rangelim( + getMapgenParams()->mapgen_limit, 0, MAX_MAP_GENERATION_LIMIT) / + MAP_BLOCKSIZE; + return p.X < -mapgen_limit_bp || + p.X > mapgen_limit_bp || + p.Y < -mapgen_limit_bp || + p.Y > mapgen_limit_bp || + p.Z < -mapgen_limit_bp || + p.Z > mapgen_limit_bp; +} + bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data) { s16 csize = getMapgenParams()->chunksize; @@ -1892,16 +1409,16 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data) v3s16 full_bpmin = bpmin - extra_borders; v3s16 full_bpmax = bpmax + extra_borders; - // Do nothing if not inside limits (+-1 because of neighbors) - if (blockpos_over_limit(full_bpmin) || - blockpos_over_limit(full_bpmax)) + // Do nothing if not inside mapgen limits (+-1 because of neighbors) + if (blockpos_over_mapgen_limit(full_bpmin) || + blockpos_over_mapgen_limit(full_bpmax)) return false; data->seed = getSeed(); data->blockpos_min = bpmin; data->blockpos_max = bpmax; data->blockpos_requested = blockpos; - data->nodedef = m_gamedef->ndef(); + data->nodedef = m_nodedef; /* Create the whole area of this and the neighboring blocks @@ -1968,28 +1485,11 @@ void ServerMap::finishBlockMake(BlockMakeData *data, v3s16 bpmax = data->blockpos_max; v3s16 extra_borders(1, 1, 1); - v3s16 full_bpmin = bpmin - extra_borders; - v3s16 full_bpmax = bpmax + extra_borders; bool enable_mapgen_debug_info = m_emerge->enable_mapgen_debug_info; EMERGE_DBG_OUT("finishBlockMake(): " PP(bpmin) " - " PP(bpmax)); /* - Set lighting to non-expired state in all of them. - This is cheating, but it is not fast enough if all of them - would actually be updated. - */ - for (s16 x = full_bpmin.X; x <= full_bpmax.X; x++) - for (s16 z = full_bpmin.Z; z <= full_bpmax.Z; z++) - for (s16 y = full_bpmin.Y; y <= full_bpmax.Y; y++) { - MapBlock *block = emergeBlock(v3s16(x, y, z), false); - if (!block) - continue; - - block->setLightingExpired(false); - } - - /* Blit generated stuff to map NOTE: blitBackAll adds nearly everything to changed_blocks */ @@ -2076,16 +1576,16 @@ ServerMapSector *ServerMap::createSector(v2s16 p2d) return sector; } #endif + /* - Do not create over-limit + Do not create over max mapgen limit */ - const static u16 map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT, - g_settings->getU16("map_generation_limit")); - if(p2d.X < -map_gen_limit / MAP_BLOCKSIZE - || p2d.X > map_gen_limit / MAP_BLOCKSIZE - || p2d.Y < -map_gen_limit / MAP_BLOCKSIZE - || p2d.Y > map_gen_limit / MAP_BLOCKSIZE) - throw InvalidPositionException("createSector(): pos. over limit"); + const s16 max_limit_bp = MAX_MAP_GENERATION_LIMIT / MAP_BLOCKSIZE; + if (p2d.X < -max_limit_bp || + p2d.X > max_limit_bp || + p2d.Y < -max_limit_bp || + p2d.Y > max_limit_bp) + throw InvalidPositionException("createSector(): pos. over max mapgen limit"); /* Generate blank sector @@ -2226,10 +1726,10 @@ MapBlock * ServerMap::createBlock(v3s16 p) FUNCTION_NAME, p.X, p.Y, p.Z); /* - Do not create over-limit + Do not create over max mapgen limit */ - if (blockpos_over_limit(p)) - throw InvalidPositionException("createBlock(): pos. over limit"); + if (blockpos_over_max_limit(p)) + throw InvalidPositionException("createBlock(): pos. over max mapgen limit"); v2s16 p2d(p.X, p.Z); s16 block_y = p.Y; @@ -2343,9 +1843,6 @@ MapBlock *ServerMap::getBlockOrEmerge(v3s16 p3d) return block; } -void ServerMap::prepareBlock(MapBlock *block) { -} - // N.B. This requires no synchronization, since data will not be modified unless // the VoxelManipulator being updated belongs to the same thread. void ServerMap::updateVManip(v3s16 pos) @@ -2452,7 +1949,7 @@ std::string ServerMap::getSectorDir(v2s16 pos, int layout) } } -v2s16 ServerMap::getSectorPos(std::string dirname) +v2s16 ServerMap::getSectorPos(const std::string &dirname) { unsigned int x = 0, y = 0; int r; @@ -2482,7 +1979,7 @@ v2s16 ServerMap::getSectorPos(std::string dirname) return pos; } -v3s16 ServerMap::getBlockPos(std::string sectordir, std::string blockfile) +v3s16 ServerMap::getBlockPos(const std::string §ordir, const std::string &blockfile) { v2s16 p2d = getSectorPos(sectordir); @@ -2791,13 +2288,13 @@ bool ServerMap::loadSectorFull(v2s16 p2d) } #endif -Database *ServerMap::createDatabase( +MapDatabase *ServerMap::createDatabase( const std::string &name, const std::string &savedir, Settings &conf) { if (name == "sqlite3") - return new Database_SQLite3(savedir); + return new MapDatabaseSQLite3(savedir); if (name == "dummy") return new Database_Dummy(); #if USE_LEVELDB @@ -2809,8 +2306,11 @@ Database *ServerMap::createDatabase( return new Database_Redis(conf); #endif #if USE_POSTGRESQL - else if (name == "postgresql") - return new Database_PostgreSQL(conf); + else if (name == "postgresql") { + std::string connect_string = ""; + conf.getNoEx("pgsql_connection", connect_string); + return new MapDatabasePostgreSQL(connect_string); + } #endif else throw BaseException(std::string("Database backend ") + name + " not supported."); @@ -2831,7 +2331,7 @@ bool ServerMap::saveBlock(MapBlock *block) return saveBlock(block, dbase); } -bool ServerMap::saveBlock(MapBlock *block, Database *db) +bool ServerMap::saveBlock(MapBlock *block, MapDatabase *db) { v3s16 p3d = block->getPos(); @@ -2862,16 +2362,15 @@ bool ServerMap::saveBlock(MapBlock *block, Database *db) return ret; } -void ServerMap::loadBlock(std::string sectordir, std::string blockfile, +void ServerMap::loadBlock(const std::string §ordir, const std::string &blockfile, MapSector *sector, bool save_after_load) { DSTACK(FUNCTION_NAME); std::string fullpath = sectordir + DIR_DELIM + blockfile; try { - std::ifstream is(fullpath.c_str(), std::ios_base::binary); - if(is.good() == false) + if (!is.good()) throw FileNotGoodException("Cannot open block file"); v3s16 p3d = getBlockPos(sectordir, blockfile); @@ -2956,13 +2455,6 @@ void ServerMap::loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool throw SerializationError("ServerMap::loadBlock(): Failed" " to read MapBlock version"); - /*u32 block_size = MapBlock::serializedLength(version); - SharedBuffer<u8> data(block_size); - is.read((char*)*data, block_size);*/ - - // This will always return a sector because we're the server - //MapSector *sector = emergeSector(p2d); - MapBlock *block = NULL; bool created_new = false; block = sector->getBlockNoCreateNoEx(p3d.Y); @@ -2993,7 +2485,6 @@ void ServerMap::loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool // We just loaded it from, so it's up-to-date. block->resetModified(); - } catch(SerializationError &e) { @@ -3017,71 +2508,80 @@ MapBlock* ServerMap::loadBlock(v3s16 blockpos) { DSTACK(FUNCTION_NAME); + bool created_new = (getBlockNoCreateNoEx(blockpos) == NULL); + v2s16 p2d(blockpos.X, blockpos.Z); std::string ret; dbase->loadBlock(blockpos, &ret); if (ret != "") { loadBlock(&ret, blockpos, createSector(p2d), false); - return getBlockNoCreateNoEx(blockpos); - } - // Not found in database, try the files - - // The directory layout we're going to load from. - // 1 - original sectors/xxxxzzzz/ - // 2 - new sectors2/xxx/zzz/ - // If we load from anything but the latest structure, we will - // immediately save to the new one, and remove the old. - int loadlayout = 1; - std::string sectordir1 = getSectorDir(p2d, 1); - std::string sectordir; - if(fs::PathExists(sectordir1)) - { - sectordir = sectordir1; - } - else - { - loadlayout = 2; - sectordir = getSectorDir(p2d, 2); - } + } else { + // Not found in database, try the files + + // The directory layout we're going to load from. + // 1 - original sectors/xxxxzzzz/ + // 2 - new sectors2/xxx/zzz/ + // If we load from anything but the latest structure, we will + // immediately save to the new one, and remove the old. + int loadlayout = 1; + std::string sectordir1 = getSectorDir(p2d, 1); + std::string sectordir; + if (fs::PathExists(sectordir1)) { + sectordir = sectordir1; + } else { + loadlayout = 2; + sectordir = getSectorDir(p2d, 2); + } - /* + /* Make sure sector is loaded - */ + */ - MapSector *sector = getSectorNoGenerateNoEx(p2d); - if(sector == NULL) - { - try{ - sector = loadSectorMeta(sectordir, loadlayout != 2); - } - catch(InvalidFilenameException &e) - { - return NULL; - } - catch(FileNotGoodException &e) - { - return NULL; - } - catch(std::exception &e) - { - return NULL; + MapSector *sector = getSectorNoGenerateNoEx(p2d); + if (sector == NULL) { + try { + sector = loadSectorMeta(sectordir, loadlayout != 2); + } catch(InvalidFilenameException &e) { + return NULL; + } catch(FileNotGoodException &e) { + return NULL; + } catch(std::exception &e) { + return NULL; + } } - } - /* + + /* Make sure file exists - */ + */ - std::string blockfilename = getBlockFilename(blockpos); - if(fs::PathExists(sectordir + DIR_DELIM + blockfilename) == false) - return NULL; + std::string blockfilename = getBlockFilename(blockpos); + if (fs::PathExists(sectordir + DIR_DELIM + blockfilename) == false) + return NULL; - /* + /* Load block and save it to the database - */ - loadBlock(sectordir, blockfilename, sector, true); - return getBlockNoCreateNoEx(blockpos); + */ + loadBlock(sectordir, blockfilename, sector, true); + } + MapBlock *block = getBlockNoCreateNoEx(blockpos); + if (created_new && (block != NULL)) { + std::map<v3s16, MapBlock*> modified_blocks; + // Fix lighting if necessary + voxalgo::update_block_border_lighting(this, block, modified_blocks); + if (!modified_blocks.empty()) { + //Modified lighting, send event + MapEditEvent event; + event.type = MEET_OTHER; + std::map<v3s16, MapBlock *>::iterator it; + for (it = modified_blocks.begin(); + it != modified_blocks.end(); ++it) + event.modified_blocks.insert(it->first); + dispatchEvent(&event); + } + } + return block; } bool ServerMap::deleteBlock(v3s16 blockpos) @@ -3106,6 +2606,16 @@ void ServerMap::PrintInfo(std::ostream &out) out<<"ServerMap: "; } +bool ServerMap::repairBlockLight(v3s16 blockpos, + std::map<v3s16, MapBlock *> *modified_blocks) +{ + MapBlock *block = emergeBlock(blockpos, false); + if (!block || !block->isGenerated()) + return false; + voxalgo::repair_block_light(this, block, modified_blocks); + return true; +} + MMVManip::MMVManip(Map *map): VoxelManipulator(), m_is_dirty(false), @@ -3172,7 +2682,7 @@ void MMVManip::initialEmerge(v3s16 blockpos_min, v3s16 blockpos_max, if(block_data_inexistent) { - if (load_if_inexistent) { + if (load_if_inexistent && !blockpos_over_max_limit(p)) { ServerMap *svrmap = (ServerMap *)m_map; block = svrmap->emergeBlock(p, false); if (block == NULL) @@ -37,7 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map_settings_manager.h" class Settings; -class Database; +class MapDatabase; class ClientMap; class MapSector; class ServerMapSector; @@ -193,6 +193,8 @@ public: virtual MapBlock * emergeBlock(v3s16 p, bool create_blank=true) { return getBlockNoCreateNoEx(p); } + inline INodeDefManager * getNodeDefManager() { return m_nodedef; } + // Returns InvalidPositionException if not found bool isNodeUnderground(v3s16 p); @@ -206,22 +208,6 @@ public: // position is valid, otherwise false MapNode getNodeNoEx(v3s16 p, bool *is_valid_position = NULL); - void unspreadLight(enum LightBank bank, - std::map<v3s16, u8> & from_nodes, - std::set<v3s16> & light_sources, - std::map<v3s16, MapBlock*> & modified_blocks); - - void spreadLight(enum LightBank bank, - std::set<v3s16> & from_nodes, - std::map<v3s16, MapBlock*> & modified_blocks); - - void updateLighting(enum LightBank bank, - std::map<v3s16, MapBlock*> & a_blocks, - std::map<v3s16, MapBlock*> & modified_blocks); - - void updateLighting(std::map<v3s16, MapBlock*> & a_blocks, - std::map<v3s16, MapBlock*> & modified_blocks); - /* These handle lighting but not faces. */ @@ -280,7 +266,8 @@ public: // For debug printing. Prints "Map: ", "ServerMap: " or "ClientMap: " virtual void PrintInfo(std::ostream &out); - void transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks); + void transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks, + ServerEnvironment *env); /* Node metadata @@ -328,6 +315,7 @@ public: void transforming_liquid_add(v3s16 p); s32 transforming_liquid_size(); + bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes); protected: friend class LuaVoxelManip; @@ -346,10 +334,16 @@ protected: // Queued transforming water nodes UniqueQueue<v3s16> m_transforming_liquid; + // This stores the properties of the nodes on the map. + INodeDefManager *m_nodedef; + + bool isOccluded(v3s16 p0, v3s16 p1, float step, float stepfac, + float start_off, float end_off, u32 needed_count); + private: f32 m_transforming_liquid_loop_count_multiplier; u32 m_unprocessed_count; - u32 m_inc_trending_up_start_time; // milliseconds + u64 m_inc_trending_up_start_time; // milliseconds bool m_queue_size_timer_started; DISABLE_CLASS_COPY(Map); @@ -367,7 +361,7 @@ public: /* savedir: directory to which map data should be saved */ - ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emerge); + ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge); ~ServerMap(); s32 mapType() const @@ -383,9 +377,12 @@ public: */ ServerMapSector *createSector(v2s16 p); + bool saoPositionOverLimit(const v3f &p); + /* Blocks are generated by using these and makeBlock(). */ + bool blockpos_over_mapgen_limit(v3s16 p); bool initBlockMake(v3s16 blockpos, BlockMakeData *data); void finishBlockMake(BlockMakeData *data, std::map<v3s16, MapBlock*> *changed_blocks); @@ -414,9 +411,6 @@ public: */ MapBlock *getBlockOrEmerge(v3s16 p3d); - // Carries out any initialization necessary before block is sent - void prepareBlock(MapBlock *block); - // Helper for placing objects on ground level s16 findGroundLevel(v2s16 p2d); @@ -428,16 +422,14 @@ public: // returns something like "map/sectors/xxxxxxxx" std::string getSectorDir(v2s16 pos, int layout = 2); // dirname: final directory name - v2s16 getSectorPos(std::string dirname); - v3s16 getBlockPos(std::string sectordir, std::string blockfile); + v2s16 getSectorPos(const std::string &dirname); + v3s16 getBlockPos(const std::string §ordir, const std::string &blockfile); static std::string getBlockFilename(v3s16 p); /* Database functions */ - static Database *createDatabase(const std::string &name, const std::string &savedir, Settings &conf); - // Verify we can read/write to the database - void verifyDatabase(); + static MapDatabase *createDatabase(const std::string &name, const std::string &savedir, Settings &conf); // Returns true if the database file does not exist bool loadFromFolders(); @@ -464,17 +456,11 @@ public: MapSector* loadSectorMeta(std::string dirname, bool save_after_load); bool loadSectorMeta(v2s16 p2d); - // Full load of a sector including all blocks. - // returns true on success, false on failure. - bool loadSectorFull(v2s16 p2d); - // If sector is not found in memory, try to load it from disk. - // Returns true if sector now resides in memory - //bool deFlushSector(v2s16 p2d); - bool saveBlock(MapBlock *block); - static bool saveBlock(MapBlock *block, Database *db); + static bool saveBlock(MapBlock *block, MapDatabase *db); // This will generate a sector with getSector if not found. - void loadBlock(std::string sectordir, std::string blockfile, MapSector *sector, bool save_after_load=false); + void loadBlock(const std::string §ordir, const std::string &blockfile, + MapSector *sector, bool save_after_load=false); MapBlock* loadBlock(v3s16 p); // Database version void loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool save_after_load=false); @@ -491,6 +477,16 @@ public: u64 getSeed(); s16 getWaterLevel(); + /*! + * Fixes lighting in one map block. + * May modify other blocks as well, as light can spread + * out of the specified block. + * Returns false if the block is not generated (so nothing + * changed), true otherwise. + */ + bool repairBlockLight(v3s16 blockpos, + std::map<v3s16, MapBlock *> *modified_blocks); + MapSettingsManager settings_mgr; private: @@ -513,7 +509,7 @@ private: This is reset to false when written on disk. */ bool m_map_metadata_changed; - Database *dbase; + MapDatabase *dbase; }; diff --git a/src/map_settings_manager.cpp b/src/map_settings_manager.cpp index 53d17125c..52f88778c 100644 --- a/src/map_settings_manager.cpp +++ b/src/map_settings_manager.cpp @@ -25,14 +25,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map_settings_manager.h" -MapSettingsManager::MapSettingsManager( - Settings *user_settings, const std::string &map_meta_path) +MapSettingsManager::MapSettingsManager(Settings *user_settings, + const std::string &map_meta_path): + mapgen_params(NULL), + m_map_meta_path(map_meta_path), + m_map_settings(new Settings()), + m_user_settings(user_settings) { - m_map_meta_path = map_meta_path; - m_user_settings = user_settings; - m_map_settings = new Settings; - mapgen_params = NULL; - assert(m_user_settings != NULL); } diff --git a/src/mapblock.cpp b/src/mapblock.cpp index f8747f52b..ec10a49bb 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -35,8 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #endif #include "util/string.h" #include "util/serialize.h" - -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" +#include "util/basic_macros.h" static const char *modified_reason_strings[] = { "initial", @@ -74,7 +73,7 @@ MapBlock::MapBlock(Map *parent, v3s16 pos, IGameDef *gamedef, bool dummy): m_modified(MOD_STATE_WRITE_NEEDED), m_modified_reason(MOD_REASON_INITIAL), is_underground(false), - m_lighting_expired(true), + m_lighting_complete(0xFFFF), m_day_night_differs(false), m_day_night_differs_expired(true), m_generated(false), @@ -572,11 +571,12 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk) flags |= 0x01; if(getDayNightDiff()) flags |= 0x02; - if(m_lighting_expired) - flags |= 0x04; if(m_generated == false) flags |= 0x08; writeU8(os, flags); + if (version >= 27) { + writeU16(os, m_lighting_complete); + } /* Bulk node data @@ -611,7 +611,7 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk) Node metadata */ std::ostringstream oss(std::ios_base::binary); - m_node_metadata.serialize(oss); + m_node_metadata.serialize(oss, version, disk); compressZlib(oss.str(), os); /* @@ -640,19 +640,15 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk) } } -void MapBlock::serializeNetworkSpecific(std::ostream &os, u16 net_proto_version) +void MapBlock::serializeNetworkSpecific(std::ostream &os) { - if(data == NULL) - { + if (!data) { throw SerializationError("ERROR: Not writing dummy block."); } - if(net_proto_version >= 21){ - int version = 1; - writeU8(os, version); - writeF1000(os, 0); // deprecated heat - writeF1000(os, 0); // deprecated humidity - } + writeU8(os, 1); // version + writeF1000(os, 0); // deprecated heat + writeF1000(os, 0); // deprecated humidity } void MapBlock::deSerialize(std::istream &is, u8 version, bool disk) @@ -673,7 +669,10 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk) u8 flags = readU8(is); is_underground = (flags & 0x01) ? true : false; m_day_night_differs = (flags & 0x02) ? true : false; - m_lighting_expired = (flags & 0x04) ? true : false; + if (version < 27) + m_lighting_complete = 0xFFFF; + else + m_lighting_complete = readU16(is); m_generated = (flags & 0x08) ? false : true; /* @@ -784,7 +783,7 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk) // Initialize default flags is_underground = false; m_day_night_differs = false; - m_lighting_expired = false; + m_lighting_complete = 0xFFFF; m_generated = true; // Make a temporary buffer @@ -850,7 +849,6 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk) is.read((char*)&flags, 1); is_underground = (flags & 0x01) ? true : false; m_day_night_differs = (flags & 0x02) ? true : false; - m_lighting_expired = (flags & 0x04) ? true : false; if(version >= 18) m_generated = (flags & 0x08) ? false : true; @@ -1028,10 +1026,7 @@ std::string analyze_block(MapBlock *block) else desc<<"is_ug [ ], "; - if(block->getLightingExpired()) - desc<<"lighting_exp [X], "; - else - desc<<"lighting_exp [ ], "; + desc<<"lighting_complete: "<<block->getLightingComplete()<<", "; if(block->isDummy()) { diff --git a/src/mapblock.h b/src/mapblock.h index 5adfcf3fb..8816dc817 100644 --- a/src/mapblock.h +++ b/src/mapblock.h @@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "modifiedstate.h" #include "util/numeric.h" // getContainerPos #include "settings.h" +#include "mapgen.h" class Map; class NodeMetadataList; @@ -105,7 +106,7 @@ public: #define MOD_REASON_INITIAL (1 << 0) #define MOD_REASON_REALLOCATE (1 << 1) #define MOD_REASON_SET_IS_UNDERGROUND (1 << 2) -#define MOD_REASON_SET_LIGHTING_EXPIRED (1 << 3) +#define MOD_REASON_SET_LIGHTING_COMPLETE (1 << 3) #define MOD_REASON_SET_GENERATED (1 << 4) #define MOD_REASON_SET_NODE (1 << 5) #define MOD_REASON_SET_NODE_NO_CHECK (1 << 6) @@ -153,6 +154,11 @@ public: raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_REALLOCATE); } + MapNode* getData() + { + return data; + } + //// //// Modification tracking methods //// @@ -213,17 +219,42 @@ public: raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_SET_IS_UNDERGROUND); } - inline void setLightingExpired(bool expired) + inline void setLightingComplete(u16 newflags) { - if (expired != m_lighting_expired){ - m_lighting_expired = expired; - raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_SET_LIGHTING_EXPIRED); + if (newflags != m_lighting_complete) { + m_lighting_complete = newflags; + raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_SET_LIGHTING_COMPLETE); } } - inline bool getLightingExpired() + inline u16 getLightingComplete() + { + return m_lighting_complete; + } + + inline void setLightingComplete(LightBank bank, u8 direction, + bool is_complete) { - return m_lighting_expired; + assert(direction >= 0 && direction <= 5); + if (bank == LIGHTBANK_NIGHT) { + direction += 6; + } + u16 newflags = m_lighting_complete; + if (is_complete) { + newflags |= 1 << direction; + } else { + newflags &= ~(1 << direction); + } + setLightingComplete(newflags); + } + + inline bool isLightingComplete(LightBank bank, u8 direction) + { + assert(direction >= 0 && direction <= 5); + if (bank == LIGHTBANK_NIGHT) { + direction += 6; + } + return (m_lighting_complete & (1 << direction)) != 0; } inline bool isGenerated() @@ -239,15 +270,6 @@ public: } } - inline bool isValid() - { - if (m_lighting_expired) - return false; - if (data == NULL) - return false; - return true; - } - //// //// Position stuff //// @@ -305,8 +327,7 @@ public: inline MapNode getNodeNoEx(v3s16 p) { bool is_valid; - MapNode node = getNode(p.X, p.Y, p.Z, &is_valid); - return is_valid ? node : MapNode(CONTENT_IGNORE); + return getNode(p.X, p.Y, p.Z, &is_valid); } inline void setNode(s16 x, s16 y, s16 z, MapNode & n) @@ -341,6 +362,22 @@ public: return getNodeNoCheck(p.X, p.Y, p.Z, valid_position); } + //// + //// Non-checking, unsafe variants of the above + //// MapBlock must be loaded by another function in the same scope/function + //// Caller must ensure that this is not a dummy block (by calling isDummy()) + //// + + inline const MapNode &getNodeUnsafe(s16 x, s16 y, s16 z) + { + return data[z * zstride + y * ystride + x]; + } + + inline const MapNode &getNodeUnsafe(v3s16 &p) + { + return getNodeUnsafe(p.X, p.Y, p.Z); + } + inline void setNodeNoCheck(s16 x, s16 y, s16 z, MapNode & n) { if (data == NULL) @@ -510,9 +547,8 @@ public: // unknown blocks from id-name mapping to wndef void deSerialize(std::istream &is, u8 version, bool disk); - void serializeNetworkSpecific(std::ostream &os, u16 net_proto_version); + void serializeNetworkSpecific(std::ostream &os); void deSerializeNetworkSpecific(std::istream &is); - private: /* Private methods @@ -599,14 +635,15 @@ private: */ bool is_underground; - /* - Set to true if changes has been made that make the old lighting - values wrong but the lighting hasn't been actually updated. - - If this is false, lighting is exactly right. - If this is true, lighting might be wrong or right. + /*! + * Each bit indicates if light spreading was finished + * in a direction. (Because the neighbor could also be unloaded.) + * Bits (most significant first): + * nothing, nothing, nothing, nothing, + * night X-, night Y-, night Z-, night Z+, night Y+, night X+, + * day X-, day Y-, day Z-, day Z+, day Y+, day X+. */ - bool m_lighting_expired; + u16 m_lighting_complete; // Whether day and night lighting differs bool m_day_night_differs; @@ -639,26 +676,24 @@ typedef std::vector<MapBlock*> MapBlockVect; inline bool objectpos_over_limit(v3f p) { - const static float map_gen_limit_bs = MYMIN(MAX_MAP_GENERATION_LIMIT, - g_settings->getU16("map_generation_limit")) * BS; - return (p.X < -map_gen_limit_bs - || p.X > map_gen_limit_bs - || p.Y < -map_gen_limit_bs - || p.Y > map_gen_limit_bs - || p.Z < -map_gen_limit_bs - || p.Z > map_gen_limit_bs); + const float max_limit_bs = MAX_MAP_GENERATION_LIMIT * BS; + return p.X < -max_limit_bs || + p.X > max_limit_bs || + p.Y < -max_limit_bs || + p.Y > max_limit_bs || + p.Z < -max_limit_bs || + p.Z > max_limit_bs; } -inline bool blockpos_over_limit(v3s16 p) +inline bool blockpos_over_max_limit(v3s16 p) { - const static u16 map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT, - g_settings->getU16("map_generation_limit")); - return (p.X < -map_gen_limit / MAP_BLOCKSIZE - || p.X > map_gen_limit / MAP_BLOCKSIZE - || p.Y < -map_gen_limit / MAP_BLOCKSIZE - || p.Y > map_gen_limit / MAP_BLOCKSIZE - || p.Z < -map_gen_limit / MAP_BLOCKSIZE - || p.Z > map_gen_limit / MAP_BLOCKSIZE); + const s16 max_limit_bp = MAX_MAP_GENERATION_LIMIT / MAP_BLOCKSIZE; + return p.X < -max_limit_bp || + p.X > max_limit_bp || + p.Y < -max_limit_bp || + p.Y > max_limit_bp || + p.Z < -max_limit_bp || + p.Z > max_limit_bp; } /* diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index 00f83e7ab..6781f21af 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -23,7 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "profiler.h" #include "nodedef.h" -#include "gamedef.h" #include "mesh.h" #include "minimap.h" #include "content_mapblock.h" @@ -33,71 +32,59 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/directiontables.h" #include <IMeshManipulator.h> -static void applyFacesShading(video::SColor &color, const float factor) -{ - color.setRed(core::clamp(core::round32(color.getRed() * factor), 0, 255)); - color.setGreen(core::clamp(core::round32(color.getGreen() * factor), 0, 255)); -} - /* MeshMakeData */ -MeshMakeData::MeshMakeData(IGameDef *gamedef, bool use_shaders, +MeshMakeData::MeshMakeData(Client *client, bool use_shaders, bool use_tangent_vertices): m_vmanip(), m_blockpos(-1337,-1337,-1337), m_crack_pos_relative(-1337, -1337, -1337), m_smooth_lighting(false), m_show_hud(false), - m_gamedef(gamedef), + m_client(client), m_use_shaders(use_shaders), m_use_tangent_vertices(use_tangent_vertices) {} -void MeshMakeData::fill(MapBlock *block) +void MeshMakeData::fillBlockDataBegin(const v3s16 &blockpos) { - m_blockpos = block->getPos(); + m_blockpos = blockpos; v3s16 blockpos_nodes = m_blockpos*MAP_BLOCKSIZE; - /* - Copy data - */ - - // Allocate this block + neighbors m_vmanip.clear(); VoxelArea voxel_area(blockpos_nodes - v3s16(1,1,1) * MAP_BLOCKSIZE, blockpos_nodes + v3s16(1,1,1) * MAP_BLOCKSIZE*2-v3s16(1,1,1)); m_vmanip.addArea(voxel_area); +} - { - //TimeTaker timer("copy central block data"); - // 0ms +void MeshMakeData::fillBlockData(const v3s16 &block_offset, MapNode *data) +{ + v3s16 data_size(MAP_BLOCKSIZE, MAP_BLOCKSIZE, MAP_BLOCKSIZE); + VoxelArea data_area(v3s16(0,0,0), data_size - v3s16(1,1,1)); - // Copy our data - block->copyTo(m_vmanip); - } - { - //TimeTaker timer("copy neighbor block data"); - // 0ms + v3s16 bp = m_blockpos + block_offset; + v3s16 blockpos_nodes = bp * MAP_BLOCKSIZE; + m_vmanip.copyFrom(data, data_area, v3s16(0,0,0), blockpos_nodes, data_size); +} - /* - Copy neighbors. This is lightning fast. - Copying only the borders would be *very* slow. - */ +void MeshMakeData::fill(MapBlock *block) +{ + fillBlockDataBegin(block->getPos()); - // Get map - Map *map = block->getParent(); + fillBlockData(v3s16(0,0,0), block->getData()); - for(u16 i=0; i<26; i++) - { - const v3s16 &dir = g_26dirs[i]; - v3s16 bp = m_blockpos + dir; - MapBlock *b = map->getBlockNoCreateNoEx(bp); - if(b) - b->copyTo(m_vmanip); - } + // Get map for reading neigbhor blocks + Map *map = block->getParent(); + + for (u16 i=0; i<26; i++) { + const v3s16 &dir = g_26dirs[i]; + v3s16 bp = m_blockpos + dir; + MapBlock *b = map->getBlockNoCreateNoEx(bp); + if(b) + fillBlockData(dir, b->getData()); } } @@ -233,7 +220,7 @@ static u16 getSmoothLightCombined(v3s16 p, MeshMakeData *data) v3s16(1,1,1), }; - INodeDefManager *ndef = data->m_gamedef->ndef(); + INodeDefManager *ndef = data->m_client->ndef(); u16 ambient_occlusion = 0; u16 light_count = 0; @@ -243,7 +230,7 @@ static u16 getSmoothLightCombined(v3s16 p, MeshMakeData *data) for (u32 i = 0; i < 8; i++) { - const MapNode &n = data->m_vmanip.getNodeRefUnsafeCheckFlags(p - dirs8[i]); + MapNode n = data->m_vmanip.getNodeNoExNoEmerge(p - dirs8[i]); // if it's CONTENT_IGNORE we can't do any light calculations if (n.getContent() == CONTENT_IGNORE) { @@ -322,19 +309,34 @@ u16 getSmoothLight(v3s16 p, v3s16 corner, MeshMakeData *data) return getSmoothLightCombined(p, data); } -/* - Converts from day + night color values (0..255) - and a given daynight_ratio to the final SColor shown on screen. -*/ -void finalColorBlend(video::SColor& result, - u8 day, u8 night, u32 daynight_ratio) +void get_sunlight_color(video::SColorf *sunlight, u32 daynight_ratio){ + f32 rg = daynight_ratio / 1000.0f - 0.04f; + f32 b = (0.98f * daynight_ratio) / 1000.0f + 0.078f; + sunlight->r = rg; + sunlight->g = rg; + sunlight->b = b; +} + +void final_color_blend(video::SColor *result, + u16 light, u32 daynight_ratio) { - s32 rg = (day * daynight_ratio + night * (1000-daynight_ratio)) / 1000; - s32 b = rg; + video::SColorf dayLight; + get_sunlight_color(&dayLight, daynight_ratio); + final_color_blend(result, + encode_light(light, 0), dayLight); +} - // Moonlight is blue - b += (day - night) / 13; - rg -= (day - night) / 23; +void final_color_blend(video::SColor *result, + const video::SColor &data, const video::SColorf &dayLight) +{ + static const video::SColorf artificialColor(1.04f, 1.04f, 1.04f); + + video::SColorf c(data); + f32 n = 1 - c.a; + + f32 r = c.r * (c.a * dayLight.r + n * artificialColor.r) * 2.0f; + f32 g = c.g * (c.a * dayLight.g + n * artificialColor.g) * 2.0f; + f32 b = c.b * (c.a * dayLight.b + n * artificialColor.b) * 2.0f; // Emphase blue a bit in darker places // Each entry of this array represents a range of 8 blue levels @@ -342,19 +344,13 @@ void finalColorBlend(video::SColor& result, 1, 4, 6, 6, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - b += emphase_blue_when_dark[irr::core::clamp(b, 0, 255) / 8]; - b = irr::core::clamp(b, 0, 255); - // Artificial light is yellow-ish - static const u8 emphase_yellow_when_artificial[16] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 10, 15, 15, 15 - }; - rg += emphase_yellow_when_artificial[night/16]; - rg = irr::core::clamp(rg, 0, 255); + b += emphase_blue_when_dark[irr::core::clamp((s32) ((r + g + b) / 3 * 255), + 0, 255) / 8] / 255.0f; - result.setRed(rg); - result.setGreen(rg); - result.setBlue(b); + result->setRed(core::clamp((s32) (r * 255.0f), 0, 255)); + result->setGreen(core::clamp((s32) (g * 255.0f), 0, 255)); + result->setBlue(core::clamp((s32) (b * 255.0f), 0, 255)); } /* @@ -426,12 +422,19 @@ static void getNodeVertexDirs(v3s16 dir, v3s16 *vertex_dirs) struct FastFace { - TileSpec tile; + TileLayer layer; video::S3DVertex vertices[4]; // Precalculated vertices + /*! + * The face is divided into two triangles. If this is true, + * vertices 0 and 2 are connected, othervise vertices 1 and 3 + * are connected. + */ + bool vertex_0_2_connected; + u8 layernum; }; -static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3, - v3f p, v3s16 dir, v3f scale, u8 light_source, std::vector<FastFace> &dest) +static void makeFastFace(const TileSpec &tile, u16 li0, u16 li1, u16 li2, u16 li3, + v3f p, v3s16 dir, v3f scale, std::vector<FastFace> &dest) { // Position is at the center of the cube. v3f pos = p * BS; @@ -581,26 +584,50 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3, v3f normal(dir.X, dir.Y, dir.Z); - u8 alpha = tile.alpha; + u16 li[4] = { li0, li1, li2, li3 }; + u16 day[4]; + u16 night[4]; + + for (u8 i = 0; i < 4; i++) { + day[i] = li[i] >> 8; + night[i] = li[i] & 0xFF; + } + + bool vertex_0_2_connected = abs(day[0] - day[2]) + abs(night[0] - night[2]) + < abs(day[1] - day[3]) + abs(night[1] - night[3]); + + v2f32 f[4] = { + core::vector2d<f32>(x0 + w * abs_scale, y0 + h), + core::vector2d<f32>(x0, y0 + h), + core::vector2d<f32>(x0, y0), + core::vector2d<f32>(x0 + w * abs_scale, y0) }; - dest.push_back(FastFace()); + for (int layernum = 0; layernum < MAX_TILE_LAYERS; layernum++) { + const TileLayer *layer = &tile.layers[layernum]; + if (layer->texture_id == 0) + continue; + + dest.push_back(FastFace()); + FastFace& face = *dest.rbegin(); - FastFace& face = *dest.rbegin(); + for (u8 i = 0; i < 4; i++) { + video::SColor c = encode_light(li[i], tile.emissive_light); + if (!tile.emissive_light) + applyFacesShading(c, normal); - face.vertices[0] = video::S3DVertex(vertex_pos[0], normal, - MapBlock_LightColor(alpha, li0, light_source), - core::vector2d<f32>(x0+w*abs_scale, y0+h)); - face.vertices[1] = video::S3DVertex(vertex_pos[1], normal, - MapBlock_LightColor(alpha, li1, light_source), - core::vector2d<f32>(x0, y0+h)); - face.vertices[2] = video::S3DVertex(vertex_pos[2], normal, - MapBlock_LightColor(alpha, li2, light_source), - core::vector2d<f32>(x0, y0)); - face.vertices[3] = video::S3DVertex(vertex_pos[3], normal, - MapBlock_LightColor(alpha, li3, light_source), - core::vector2d<f32>(x0+w*abs_scale, y0)); + face.vertices[i] = video::S3DVertex(vertex_pos[i], normal, c, f[i]); + } - face.tile = tile; + /* + Revert triangles for nicer looking gradient if the + brightness of vertices 1 and 3 differ less than + the brightness of vertices 0 and 2. + */ + face.vertex_0_2_connected = vertex_0_2_connected; + + face.layer = *layer; + face.layernum = layernum; + } } /* @@ -662,22 +689,31 @@ static u8 face_contents(content_t m1, content_t m2, bool *equivalent, /* Gets nth node tile (0 <= n <= 5). */ -TileSpec getNodeTileN(MapNode mn, v3s16 p, u8 tileindex, MeshMakeData *data) +void getNodeTileN(MapNode mn, v3s16 p, u8 tileindex, MeshMakeData *data, TileSpec &tile) { - INodeDefManager *ndef = data->m_gamedef->ndef(); - TileSpec spec = ndef->get(mn).tiles[tileindex]; + INodeDefManager *ndef = data->m_client->ndef(); + const ContentFeatures &f = ndef->get(mn); + tile = f.tiles[tileindex]; + TileLayer *top_layer = NULL; + for (int layernum = 0; layernum < MAX_TILE_LAYERS; layernum++) { + TileLayer *layer = &tile.layers[layernum]; + if (layer->texture_id == 0) + continue; + top_layer = layer; + if (!layer->has_color) + mn.getColor(f, &(layer->color)); + } // Apply temporary crack if (p == data->m_crack_pos_relative) - spec.material_flags |= MATERIAL_FLAG_CRACK; - return spec; + top_layer->material_flags |= MATERIAL_FLAG_CRACK; } /* Gets node tile given a face direction. */ -TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data) +void getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data, TileSpec &tile) { - INodeDefManager *ndef = data->m_gamedef->ndef(); + INodeDefManager *ndef = data->m_client->ndef(); // Direction must be (1,0,0), (-1,0,0), (0,1,0), (0,-1,0), // (0,0,1), (0,0,-1) or (0,0,0) @@ -732,10 +768,8 @@ TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data) }; u16 tile_index=facedir*16 + dir_i; - TileSpec spec = getNodeTileN(mn, p, dir_to_tile[tile_index], data); - spec.rotation=dir_to_tile[tile_index + 1]; - spec.texture = data->m_gamedef->tsrc()->getTexture(spec.texture_id); - return spec; + getNodeTileN(mn, p, dir_to_tile[tile_index], data, tile); + tile.rotation = dir_to_tile[tile_index + 1]; } static void getTileInfo( @@ -748,15 +782,14 @@ static void getTileInfo( v3s16 &p_corrected, v3s16 &face_dir_corrected, u16 *lights, - TileSpec &tile, - u8 &light_source + TileSpec &tile ) { VoxelManipulator &vmanip = data->m_vmanip; - INodeDefManager *ndef = data->m_gamedef->ndef(); + INodeDefManager *ndef = data->m_client->ndef(); v3s16 blockpos_nodes = data->m_blockpos * MAP_BLOCKSIZE; - MapNode &n0 = vmanip.getNodeRefUnsafe(blockpos_nodes + p); + const MapNode &n0 = vmanip.getNodeRefUnsafe(blockpos_nodes + p); // Don't even try to get n1 if n0 is already CONTENT_IGNORE if (n0.getContent() == CONTENT_IGNORE) { @@ -776,51 +809,48 @@ static void getTileInfo( u8 mf = face_contents(n0.getContent(), n1.getContent(), &equivalent, ndef); - if(mf == 0) - { + if (mf == 0) { makes_face = false; return; } makes_face = true; - if(mf == 1) - { - tile = getNodeTile(n0, p, face_dir, data); + MapNode n = n0; + + if (mf == 1) { p_corrected = p; face_dir_corrected = face_dir; - light_source = ndef->get(n0).light_source; - } - else - { - tile = getNodeTile(n1, p + face_dir, -face_dir, data); + } else { + n = n1; p_corrected = p + face_dir; face_dir_corrected = -face_dir; - light_source = ndef->get(n1).light_source; } + getNodeTile(n, p_corrected, face_dir_corrected, data, tile); + const ContentFeatures &f = ndef->get(n); + tile.emissive_light = f.light_source; + // eg. water and glass - if(equivalent) - tile.material_flags |= MATERIAL_FLAG_BACKFACE_CULLING; + if (equivalent) { + for (int layernum = 0; layernum < MAX_TILE_LAYERS; layernum++) + tile.layers[layernum].material_flags |= + MATERIAL_FLAG_BACKFACE_CULLING; + } - if(data->m_smooth_lighting == false) - { + if (!data->m_smooth_lighting) { lights[0] = lights[1] = lights[2] = lights[3] = getFaceLight(n0, n1, face_dir, ndef); } - else - { + else { v3s16 vertex_dirs[4]; getNodeVertexDirs(face_dir_corrected, vertex_dirs); - for(u16 i=0; i<4; i++) - { - lights[i] = getSmoothLight( - blockpos_nodes + p_corrected, - vertex_dirs[i], data); + + v3s16 light_p = blockpos_nodes + p_corrected; + for (u16 i = 0; i < 4; i++) { + lights[i] = getSmoothLight(light_p, vertex_dirs[i], data); } } - - return; } /* @@ -846,13 +876,13 @@ static void updateFastFaceRow( v3s16 face_dir_corrected; u16 lights[4] = {0,0,0,0}; TileSpec tile; - u8 light_source = 0; getTileInfo(data, p, face_dir, makes_face, p_corrected, face_dir_corrected, - lights, tile, light_source); + lights, tile); - for(u16 j=0; j<MAP_BLOCKSIZE; j++) - { + // Unroll this variable which has a significant build cost + TileSpec next_tile; + for (u16 j = 0; j < MAP_BLOCKSIZE; j++) { // If tiling can be done, this is set to false in the next step bool next_is_different = true; @@ -862,70 +892,38 @@ static void updateFastFaceRow( v3s16 next_p_corrected; v3s16 next_face_dir_corrected; u16 next_lights[4] = {0,0,0,0}; - TileSpec next_tile; - u8 next_light_source = 0; + // If at last position, there is nothing to compare to and // the face must be drawn anyway - if(j != MAP_BLOCKSIZE - 1) - { + if (j != MAP_BLOCKSIZE - 1) { p_next = p + translate_dir; getTileInfo(data, p_next, face_dir, next_makes_face, next_p_corrected, next_face_dir_corrected, next_lights, - next_tile, next_light_source); + next_tile); - if(next_makes_face == makes_face + if (next_makes_face == makes_face && next_p_corrected == p_corrected + translate_dir && next_face_dir_corrected == face_dir_corrected - && next_lights[0] == lights[0] - && next_lights[1] == lights[1] - && next_lights[2] == lights[2] - && next_lights[3] == lights[3] - && next_tile == tile - && tile.rotation == 0 - && next_light_source == light_source - && (tile.material_flags & MATERIAL_FLAG_TILEABLE_HORIZONTAL) - && (tile.material_flags & MATERIAL_FLAG_TILEABLE_VERTICAL)) { + && memcmp(next_lights, lights, ARRLEN(lights) * sizeof(u16)) == 0 + && next_tile.isTileable(tile)) { next_is_different = false; continuous_tiles_count++; - } else { - /*if(makes_face){ - g_profiler->add("Meshgen: diff: next_makes_face != makes_face", - next_makes_face != makes_face ? 1 : 0); - g_profiler->add("Meshgen: diff: n_p_corr != p_corr + t_dir", - (next_p_corrected != p_corrected + translate_dir) ? 1 : 0); - g_profiler->add("Meshgen: diff: next_f_dir_corr != f_dir_corr", - next_face_dir_corrected != face_dir_corrected ? 1 : 0); - g_profiler->add("Meshgen: diff: next_lights[] != lights[]", - (next_lights[0] != lights[0] || - next_lights[0] != lights[0] || - next_lights[0] != lights[0] || - next_lights[0] != lights[0]) ? 1 : 0); - g_profiler->add("Meshgen: diff: !(next_tile == tile)", - !(next_tile == tile) ? 1 : 0); - }*/ } - /*g_profiler->add("Meshgen: Total faces checked", 1); - if(makes_face) - g_profiler->add("Meshgen: Total makes_face checked", 1);*/ - } else { - /*if(makes_face) - g_profiler->add("Meshgen: diff: last position", 1);*/ } - if(next_is_different) - { + if (next_is_different) { /* Create a face if there should be one */ - if(makes_face) - { + if (makes_face) { // Floating point conversion of the position vector v3f pf(p_corrected.X, p_corrected.Y, p_corrected.Z); // Center point of face (kind of) - v3f sp = pf - ((f32)continuous_tiles_count / 2.0 - 0.5) * translate_dir_f; + v3f sp = pf - + ((f32)continuous_tiles_count / 2.0f - 0.5f) * translate_dir_f; v3f scale(1,1,1); if(translate_dir.X != 0) { @@ -939,8 +937,7 @@ static void updateFastFaceRow( } makeFastFace(tile, lights[0], lights[1], lights[2], lights[3], - sp, face_dir_corrected, scale, light_source, - dest); + sp, face_dir_corrected, scale, dest); g_profiler->avg("Meshgen: faces drawn by tiling", 0); for(int i = 1; i < continuous_tiles_count; i++){ @@ -954,12 +951,9 @@ static void updateFastFaceRow( makes_face = next_makes_face; p_corrected = next_p_corrected; face_dir_corrected = next_face_dir_corrected; - lights[0] = next_lights[0]; - lights[1] = next_lights[1]; - lights[2] = next_lights[2]; - lights[3] = next_lights[3]; - tile = next_tile; - light_source = next_light_source; + std::memcpy(lights, next_lights, ARRLEN(lights) * sizeof(u16)); + if (next_is_different) + tile = next_tile; p = p_next; } } @@ -1018,18 +1012,19 @@ static void updateAllFastFaceRows(MeshMakeData *data, */ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): - m_mesh(new scene::SMesh()), m_minimap_mapblock(NULL), - m_gamedef(data->m_gamedef), - m_driver(m_gamedef->tsrc()->getDevice()->getVideoDriver()), - m_tsrc(m_gamedef->getTextureSource()), - m_shdrsrc(m_gamedef->getShaderSource()), + m_client(data->m_client), + m_driver(m_client->tsrc()->getDevice()->getVideoDriver()), + m_tsrc(m_client->getTextureSource()), + m_shdrsrc(m_client->getShaderSource()), m_animation_force_timer(0), // force initial animation m_last_crack(-1), m_crack_materials(), m_last_daynight_ratio((u32) -1), m_daynight_diffs() { + for (int m = 0; m < MAX_TILE_LAYERS; m++) + m_mesh[m] = new scene::SMesh(); m_enable_shaders = data->m_use_shaders; m_use_tangent_vertices = data->m_use_tangent_vertices; m_enable_vbo = g_settings->getBool("enable_vbo"); @@ -1078,21 +1073,14 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): const u16 indices[] = {0,1,2,2,3,0}; const u16 indices_alternate[] = {0,1,3,2,3,1}; - if(f.tile.texture == NULL) + if (f.layer.texture == NULL) continue; - const u16 *indices_p = indices; - - /* - Revert triangles for nicer looking gradient if vertices - 1 and 3 have same color or 0 and 2 have different color. - getRed() is the day color. - */ - if(f.vertices[0].Color.getRed() != f.vertices[2].Color.getRed() - || f.vertices[1].Color.getRed() == f.vertices[3].Color.getRed()) - indices_p = indices_alternate; + const u16 *indices_p = + f.vertex_0_2_connected ? indices : indices_alternate; - collector.append(f.tile, f.vertices, 4, indices_p, 6); + collector.append(f.layer, f.vertices, 4, indices_p, 6, + f.layernum); } } @@ -1104,162 +1092,155 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): - whatever */ - mapblock_mesh_generate_special(data, collector); + { + MapblockMeshGenerator generator(data, &collector); + generator.generate(); + } + + collector.applyTileColors(); /* Convert MeshCollector to SMesh */ - for(u32 i = 0; i < collector.prebuffers.size(); i++) - { - PreMeshBuffer &p = collector.prebuffers[i]; - - // Generate animation data - // - Cracks - if(p.tile.material_flags & MATERIAL_FLAG_CRACK) + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { + for(u32 i = 0; i < collector.prebuffers[layer].size(); i++) { - // Find the texture name plus ^[crack:N: - std::ostringstream os(std::ios::binary); - os<<m_tsrc->getTextureName(p.tile.texture_id)<<"^[crack"; - if(p.tile.material_flags & MATERIAL_FLAG_CRACK_OVERLAY) - os<<"o"; // use ^[cracko - os<<":"<<(u32)p.tile.animation_frame_count<<":"; - m_crack_materials.insert(std::make_pair(i, os.str())); - // Replace tile texture with the cracked one - p.tile.texture = m_tsrc->getTextureForMesh( - os.str()+"0", - &p.tile.texture_id); - } - // - Texture animation - if(p.tile.material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) - { - // Add to MapBlockMesh in order to animate these tiles - m_animation_tiles[i] = p.tile; - m_animation_frames[i] = 0; - if(g_settings->getBool("desynchronize_mapblock_texture_animation")){ - // Get starting position from noise - m_animation_frame_offsets[i] = 100000 * (2.0 + noise3d( - data->m_blockpos.X, data->m_blockpos.Y, - data->m_blockpos.Z, 0)); - } else { - // Play all synchronized - m_animation_frame_offsets[i] = 0; - } - // Replace tile texture with the first animation frame - FrameSpec animation_frame = p.tile.frames[0]; - p.tile.texture = animation_frame.texture; - } + PreMeshBuffer &p = collector.prebuffers[layer][i]; - u32 vertex_count = m_use_tangent_vertices ? - p.tangent_vertices.size() : p.vertices.size(); - for (u32 j = 0; j < vertex_count; j++) { - v3f *Normal; - video::SColor *vc; - if (m_use_tangent_vertices) { - vc = &p.tangent_vertices[j].Color; - Normal = &p.tangent_vertices[j].Normal; - } else { - vc = &p.vertices[j].Color; - Normal = &p.vertices[j].Normal; + // Generate animation data + // - Cracks + if(p.layer.material_flags & MATERIAL_FLAG_CRACK) + { + // Find the texture name plus ^[crack:N: + std::ostringstream os(std::ios::binary); + os<<m_tsrc->getTextureName(p.layer.texture_id)<<"^[crack"; + if(p.layer.material_flags & MATERIAL_FLAG_CRACK_OVERLAY) + os<<"o"; // use ^[cracko + os<<":"<<(u32)p.layer.animation_frame_count<<":"; + m_crack_materials.insert(std::make_pair(std::pair<u8, u32>(layer, i), os.str())); + // Replace tile texture with the cracked one + p.layer.texture = m_tsrc->getTextureForMesh( + os.str()+"0", + &p.layer.texture_id); } - // Note applyFacesShading second parameter is precalculated sqrt - // value for speed improvement - // Skip it for lightsources and top faces. - if (!vc->getBlue()) { - if (Normal->Y < -0.5) { - applyFacesShading(*vc, 0.447213); - } else if (Normal->X > 0.5) { - applyFacesShading(*vc, 0.670820); - } else if (Normal->X < -0.5) { - applyFacesShading(*vc, 0.670820); - } else if (Normal->Z > 0.5) { - applyFacesShading(*vc, 0.836660); - } else if (Normal->Z < -0.5) { - applyFacesShading(*vc, 0.836660); + // - Texture animation + if (p.layer.material_flags & MATERIAL_FLAG_ANIMATION) { + // Add to MapBlockMesh in order to animate these tiles + m_animation_tiles[std::pair<u8, u32>(layer, i)] = p.layer; + m_animation_frames[std::pair<u8, u32>(layer, i)] = 0; + if(g_settings->getBool("desynchronize_mapblock_texture_animation")){ + // Get starting position from noise + m_animation_frame_offsets[std::pair<u8, u32>(layer, i)] = 100000 * (2.0 + noise3d( + data->m_blockpos.X, data->m_blockpos.Y, + data->m_blockpos.Z, 0)); + } else { + // Play all synchronized + m_animation_frame_offsets[std::pair<u8, u32>(layer, i)] = 0; } + // Replace tile texture with the first animation frame + p.layer.texture = p.layer.frames[0].texture; } + if (!m_enable_shaders) { - // - Classic lighting (shaders handle this by themselves) - // Set initial real color and store for later updates - u8 day = vc->getRed(); - u8 night = vc->getGreen(); - finalColorBlend(*vc, day, night, 1000); - if (day != night) { - m_daynight_diffs[i][j] = std::make_pair(day, night); + // Extract colors for day-night animation + // Dummy sunlight to handle non-sunlit areas + video::SColorf sunlight; + get_sunlight_color(&sunlight, 0); + u32 vertex_count = + m_use_tangent_vertices ? + p.tangent_vertices.size() : p.vertices.size(); + for (u32 j = 0; j < vertex_count; j++) { + video::SColor *vc; + if (m_use_tangent_vertices) { + vc = &p.tangent_vertices[j].Color; + } else { + vc = &p.vertices[j].Color; + } + video::SColor copy(*vc); + if (vc->getAlpha() == 0) // No sunlight - no need to animate + final_color_blend(vc, copy, sunlight); // Finalize color + else // Record color to animate + m_daynight_diffs[std::pair<u8, u32>(layer, i)][j] = copy; + + // The sunlight ratio has been stored, + // delete alpha (for the final rendering). + vc->setAlpha(255); } } - } - // Create material - video::SMaterial material; - material.setFlag(video::EMF_LIGHTING, false); - material.setFlag(video::EMF_BACK_FACE_CULLING, true); - material.setFlag(video::EMF_BILINEAR_FILTER, false); - material.setFlag(video::EMF_FOG_ENABLE, true); - material.setTexture(0, p.tile.texture); + // Create material + video::SMaterial material; + material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_BACK_FACE_CULLING, true); + material.setFlag(video::EMF_BILINEAR_FILTER, false); + material.setFlag(video::EMF_FOG_ENABLE, true); + material.setTexture(0, p.layer.texture); + + if (m_enable_shaders) { + material.MaterialType = m_shdrsrc->getShaderInfo(p.layer.shader_id).material; + p.layer.applyMaterialOptionsWithShaders(material); + if (p.layer.normal_texture) { + material.setTexture(1, p.layer.normal_texture); + } + material.setTexture(2, p.layer.flags_texture); + } else { + p.layer.applyMaterialOptions(material); + } - if (m_enable_shaders) { - material.MaterialType = m_shdrsrc->getShaderInfo(p.tile.shader_id).material; - p.tile.applyMaterialOptionsWithShaders(material); - if (p.tile.normal_texture) { - material.setTexture(1, p.tile.normal_texture); + scene::SMesh *mesh = (scene::SMesh *)m_mesh[layer]; + + // Create meshbuffer, add to mesh + if (m_use_tangent_vertices) { + scene::SMeshBufferTangents *buf = new scene::SMeshBufferTangents(); + // Set material + buf->Material = material; + // Add to mesh + mesh->addMeshBuffer(buf); + // Mesh grabbed it + buf->drop(); + buf->append(&p.tangent_vertices[0], p.tangent_vertices.size(), + &p.indices[0], p.indices.size()); + } else { + scene::SMeshBuffer *buf = new scene::SMeshBuffer(); + // Set material + buf->Material = material; + // Add to mesh + mesh->addMeshBuffer(buf); + // Mesh grabbed it + buf->drop(); + buf->append(&p.vertices[0], p.vertices.size(), + &p.indices[0], p.indices.size()); } - material.setTexture(2, p.tile.flags_texture); - } else { - p.tile.applyMaterialOptions(material); } - scene::SMesh *mesh = (scene::SMesh *)m_mesh; - // Create meshbuffer, add to mesh + /* + Do some stuff to the mesh + */ + m_camera_offset = camera_offset; + translateMesh(m_mesh[layer], + intToFloat(data->m_blockpos * MAP_BLOCKSIZE - camera_offset, BS)); + if (m_use_tangent_vertices) { - scene::SMeshBufferTangents *buf = new scene::SMeshBufferTangents(); - // Set material - buf->Material = material; - // Add to mesh - mesh->addMeshBuffer(buf); - // Mesh grabbed it - buf->drop(); - buf->append(&p.tangent_vertices[0], p.tangent_vertices.size(), - &p.indices[0], p.indices.size()); - } else { - scene::SMeshBuffer *buf = new scene::SMeshBuffer(); - // Set material - buf->Material = material; - // Add to mesh - mesh->addMeshBuffer(buf); - // Mesh grabbed it - buf->drop(); - buf->append(&p.vertices[0], p.vertices.size(), - &p.indices[0], p.indices.size()); + scene::IMeshManipulator* meshmanip = + m_client->getSceneManager()->getMeshManipulator(); + meshmanip->recalculateTangents(m_mesh[layer], true, false, false); } - } - /* - Do some stuff to the mesh - */ - m_camera_offset = camera_offset; - translateMesh(m_mesh, - intToFloat(data->m_blockpos * MAP_BLOCKSIZE - camera_offset, BS)); - - if (m_use_tangent_vertices) { - scene::IMeshManipulator* meshmanip = - m_gamedef->getSceneManager()->getMeshManipulator(); - meshmanip->recalculateTangents(m_mesh, true, false, false); - } - - if (m_mesh) - { + if (m_mesh[layer]) + { #if 0 - // Usually 1-700 faces and 1-7 materials - std::cout<<"Updated MapBlock has "<<fastfaces_new.size()<<" faces " - <<"and uses "<<m_mesh->getMeshBufferCount() - <<" materials (meshbuffers)"<<std::endl; + // Usually 1-700 faces and 1-7 materials + std::cout<<"Updated MapBlock has "<<fastfaces_new.size()<<" faces " + <<"and uses "<<m_mesh[layer]->getMeshBufferCount() + <<" materials (meshbuffers)"<<std::endl; #endif - // Use VBO for mesh (this just would set this for ever buffer) - if (m_enable_vbo) { - m_mesh->setHardwareMappingHint(scene::EHM_STATIC); + // Use VBO for mesh (this just would set this for ever buffer) + if (m_enable_vbo) { + m_mesh[layer]->setHardwareMappingHint(scene::EHM_STATIC); + } } } @@ -1274,14 +1255,15 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): MapBlockMesh::~MapBlockMesh() { - if (m_enable_vbo && m_mesh) { - for (u32 i = 0; i < m_mesh->getMeshBufferCount(); i++) { - scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i); - m_driver->removeHardwareBuffer(buf); - } + for (int m = 0; m < MAX_TILE_LAYERS; m++) { + if (m_enable_vbo && m_mesh[m]) + for (u32 i = 0; i < m_mesh[m]->getMeshBufferCount(); i++) { + scene::IMeshBuffer *buf = m_mesh[m]->getMeshBuffer(i); + m_driver->removeHardwareBuffer(buf); + } + m_mesh[m]->drop(); + m_mesh[m] = NULL; } - m_mesh->drop(); - m_mesh = NULL; delete m_minimap_mapblock; } @@ -1298,9 +1280,10 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat // Cracks if(crack != m_last_crack) { - for (UNORDERED_MAP<u32, std::string>::iterator i = m_crack_materials.begin(); - i != m_crack_materials.end(); ++i) { - scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i->first); + for (std::map<std::pair<u8, u32>, std::string>::iterator i = + m_crack_materials.begin(); i != m_crack_materials.end(); ++i) { + scene::IMeshBuffer *buf = m_mesh[i->first.first]-> + getMeshBuffer(i->first.second); std::string basename = i->second; // Create new texture name from original @@ -1313,10 +1296,10 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat // If the current material is also animated, // update animation info - UNORDERED_MAP<u32, TileSpec>::iterator anim_iter = - m_animation_tiles.find(i->first); + std::map<std::pair<u8, u32>, TileLayer>::iterator anim_iter = + m_animation_tiles.find(i->first); if (anim_iter != m_animation_tiles.end()){ - TileSpec &tile = anim_iter->second; + TileLayer &tile = anim_iter->second; tile.texture = new_texture; tile.texture_id = new_texture_id; // force animation update @@ -1328,9 +1311,9 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat } // Texture animation - for (UNORDERED_MAP<u32, TileSpec>::iterator i = m_animation_tiles.begin(); - i != m_animation_tiles.end(); ++i) { - const TileSpec &tile = i->second; + for (std::map<std::pair<u8, u32>, TileLayer>::iterator i = + m_animation_tiles.begin(); i != m_animation_tiles.end(); ++i) { + const TileLayer &tile = i->second; // Figure out current frame int frameoffset = m_animation_frame_offsets[i->first]; int frame = (int)(time * 1000 / tile.animation_frame_length_ms @@ -1341,9 +1324,10 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat m_animation_frames[i->first] = frame; - scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i->first); + scene::IMeshBuffer *buf = m_mesh[i->first.first]-> + getMeshBuffer(i->first.second); - FrameSpec animation_frame = tile.frames[frame]; + const FrameSpec &animation_frame = tile.frames[frame]; buf->getMaterial().setTexture(0, animation_frame.texture); if (m_enable_shaders) { if (animation_frame.normal_texture) { @@ -1357,22 +1341,24 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat if(!m_enable_shaders && (daynight_ratio != m_last_daynight_ratio)) { // Force reload mesh to VBO - if (m_enable_vbo) { - m_mesh->setDirty(); - } - for(std::map<u32, std::map<u32, std::pair<u8, u8> > >::iterator + if (m_enable_vbo) + for (int m = 0; m < MAX_TILE_LAYERS; m++) + m_mesh[m]->setDirty(); + video::SColorf day_color; + get_sunlight_color(&day_color, daynight_ratio); + for(std::map<std::pair<u8, u32>, std::map<u32, video::SColor > >::iterator i = m_daynight_diffs.begin(); i != m_daynight_diffs.end(); ++i) { - scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i->first); + scene::IMeshBuffer *buf = m_mesh[i->first.first]-> + getMeshBuffer(i->first.second); video::S3DVertex *vertices = (video::S3DVertex *)buf->getVertices(); - for(std::map<u32, std::pair<u8, u8 > >::iterator + for(std::map<u32, video::SColor >::iterator j = i->second.begin(); j != i->second.end(); ++j) { - u8 day = j->second.first; - u8 night = j->second.second; - finalColorBlend(vertices[j->first].Color, day, night, daynight_ratio); + final_color_blend(&(vertices[j->first].Color), + j->second, day_color); } } m_last_daynight_ratio = daynight_ratio; @@ -1384,9 +1370,12 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat void MapBlockMesh::updateCameraOffset(v3s16 camera_offset) { if (camera_offset != m_camera_offset) { - translateMesh(m_mesh, intToFloat(m_camera_offset-camera_offset, BS)); - if (m_enable_vbo) { - m_mesh->setDirty(); + for (u8 layer = 0; layer < 2; layer++) { + translateMesh(m_mesh[layer], + intToFloat(m_camera_offset - camera_offset, BS)); + if (m_enable_vbo) { + m_mesh[layer]->setDirty(); + } } m_camera_offset = camera_offset; } @@ -1400,15 +1389,29 @@ void MeshCollector::append(const TileSpec &tile, const video::S3DVertex *vertices, u32 numVertices, const u16 *indices, u32 numIndices) { + for (int layernum = 0; layernum < MAX_TILE_LAYERS; layernum++) { + const TileLayer *layer = &tile.layers[layernum]; + if (layer->texture_id == 0) + continue; + append(*layer, vertices, numVertices, indices, numIndices, + layernum); + } +} + +void MeshCollector::append(const TileLayer &layer, + const video::S3DVertex *vertices, u32 numVertices, + const u16 *indices, u32 numIndices, u8 layernum) +{ if (numIndices > 65535) { dstream<<"FIXME: MeshCollector::append() called with numIndices="<<numIndices<<" (limit 65535)"<<std::endl; return; } + std::vector<PreMeshBuffer> *buffers = &prebuffers[layernum]; PreMeshBuffer *p = NULL; - for (u32 i = 0; i < prebuffers.size(); i++) { - PreMeshBuffer &pp = prebuffers[i]; - if (pp.tile != tile) + for (u32 i = 0; i < buffers->size(); i++) { + PreMeshBuffer &pp = (*buffers)[i]; + if (pp.layer != layer) continue; if (pp.indices.size() + numIndices > 65535) continue; @@ -1419,9 +1422,9 @@ void MeshCollector::append(const TileSpec &tile, if (p == NULL) { PreMeshBuffer pp; - pp.tile = tile; - prebuffers.push_back(pp); - p = &prebuffers[prebuffers.size() - 1]; + pp.layer = layer; + buffers->push_back(pp); + p = &(*buffers)[buffers->size() - 1]; } u32 vertex_count; @@ -1454,17 +1457,32 @@ void MeshCollector::append(const TileSpec &tile, void MeshCollector::append(const TileSpec &tile, const video::S3DVertex *vertices, u32 numVertices, const u16 *indices, u32 numIndices, - v3f pos, video::SColor c) + v3f pos, video::SColor c, u8 light_source) +{ + for (int layernum = 0; layernum < MAX_TILE_LAYERS; layernum++) { + const TileLayer *layer = &tile.layers[layernum]; + if (layer->texture_id == 0) + continue; + append(*layer, vertices, numVertices, indices, numIndices, pos, + c, light_source, layernum); + } +} + +void MeshCollector::append(const TileLayer &layer, + const video::S3DVertex *vertices, u32 numVertices, + const u16 *indices, u32 numIndices, + v3f pos, video::SColor c, u8 light_source, u8 layernum) { if (numIndices > 65535) { dstream<<"FIXME: MeshCollector::append() called with numIndices="<<numIndices<<" (limit 65535)"<<std::endl; return; } + std::vector<PreMeshBuffer> *buffers = &prebuffers[layernum]; PreMeshBuffer *p = NULL; - for (u32 i = 0; i < prebuffers.size(); i++) { - PreMeshBuffer &pp = prebuffers[i]; - if(pp.tile != tile) + for (u32 i = 0; i < buffers->size(); i++) { + PreMeshBuffer &pp = (*buffers)[i]; + if(pp.layer != layer) continue; if(pp.indices.size() + numIndices > 65535) continue; @@ -1475,15 +1493,20 @@ void MeshCollector::append(const TileSpec &tile, if (p == NULL) { PreMeshBuffer pp; - pp.tile = tile; - prebuffers.push_back(pp); - p = &prebuffers[prebuffers.size() - 1]; + pp.layer = layer; + buffers->push_back(pp); + p = &(*buffers)[buffers->size() - 1]; } + video::SColor original_c = c; u32 vertex_count; if (m_use_tangent_vertices) { vertex_count = p->tangent_vertices.size(); for (u32 i = 0; i < numVertices; i++) { + if (!light_source) { + c = original_c; + applyFacesShading(c, vertices[i].Normal); + } video::S3DVertexTangents vert(vertices[i].Pos + pos, vertices[i].Normal, c, vertices[i].TCoords); p->tangent_vertices.push_back(vert); @@ -1491,8 +1514,12 @@ void MeshCollector::append(const TileSpec &tile, } else { vertex_count = p->vertices.size(); for (u32 i = 0; i < numVertices; i++) { - video::S3DVertex vert(vertices[i].Pos + pos, - vertices[i].Normal, c, vertices[i].TCoords); + if (!light_source) { + c = original_c; + applyFacesShading(c, vertices[i].Normal); + } + video::S3DVertex vert(vertices[i].Pos + pos, vertices[i].Normal, c, + vertices[i].TCoords); p->vertices.push_back(vert); } } @@ -1502,3 +1529,67 @@ void MeshCollector::append(const TileSpec &tile, p->indices.push_back(j); } } + +void MeshCollector::applyTileColors() +{ + if (m_use_tangent_vertices) + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { + std::vector<PreMeshBuffer> *p = &prebuffers[layer]; + for (std::vector<PreMeshBuffer>::iterator it = p->begin(); + it != p->end(); ++it) { + video::SColor tc = it->layer.color; + if (tc == video::SColor(0xFFFFFFFF)) + continue; + for (u32 index = 0; index < it->tangent_vertices.size(); index++) { + video::SColor *c = &it->tangent_vertices[index].Color; + c->set(c->getAlpha(), c->getRed() * tc.getRed() / 255, + c->getGreen() * tc.getGreen() / 255, + c->getBlue() * tc.getBlue() / 255); + } + } + } + else + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { + std::vector<PreMeshBuffer> *p = &prebuffers[layer]; + for (std::vector<PreMeshBuffer>::iterator it = p->begin(); + it != p->end(); ++it) { + video::SColor tc = it->layer.color; + if (tc == video::SColor(0xFFFFFFFF)) + continue; + for (u32 index = 0; index < it->vertices.size(); index++) { + video::SColor *c = &it->vertices[index].Color; + c->set(c->getAlpha(), c->getRed() * tc.getRed() / 255, + c->getGreen() * tc.getGreen() / 255, + c->getBlue() * tc.getBlue() / 255); + } + } + } +} + +video::SColor encode_light(u16 light, u8 emissive_light) +{ + // Get components + u32 day = (light & 0xff); + u32 night = (light >> 8); + // Add emissive light + night += emissive_light * 2.5f; + if (night > 255) + night = 255; + // Since we don't know if the day light is sunlight or + // artificial light, assume it is artificial when the night + // light bank is also lit. + if (day < night) + day = 0; + else + day = day - night; + u32 sum = day + night; + // Ratio of sunlight: + u32 r; + if (sum > 0) + r = day * 255 / sum; + else + r = 0; + // Average light: + float b = (day + night) / 2; + return video::SColor(r, b, b, b); +} diff --git a/src/mapblock_mesh.h b/src/mapblock_mesh.h index 8376468da..93d932a7b 100644 --- a/src/mapblock_mesh.h +++ b/src/mapblock_mesh.h @@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/cpp11_container.h" #include <map> -class IGameDef; +class Client; class IShaderSource; /* @@ -45,14 +45,20 @@ struct MeshMakeData bool m_smooth_lighting; bool m_show_hud; - IGameDef *m_gamedef; + Client *m_client; bool m_use_shaders; bool m_use_tangent_vertices; - MeshMakeData(IGameDef *gamedef, bool use_shaders, + MeshMakeData(Client *client, bool use_shaders, bool use_tangent_vertices = false); /* + Copy block data manually (to allow optimizations by the caller) + */ + void fillBlockDataBegin(const v3s16 &blockpos); + void fillBlockData(const v3s16 &block_offset, MapNode *data); + + /* Copy central data directly from block, and other data from parent of block. */ @@ -102,7 +108,12 @@ public: scene::IMesh *getMesh() { - return m_mesh; + return m_mesh[0]; + } + + scene::IMesh *getMesh(u8 layer) + { + return m_mesh[layer]; } MinimapMapblock *moveMinimapMapblock() @@ -126,9 +137,9 @@ public: void updateCameraOffset(v3s16 camera_offset); private: - scene::IMesh *m_mesh; + scene::IMesh *m_mesh[MAX_TILE_LAYERS]; MinimapMapblock *m_minimap_mapblock; - IGameDef *m_gamedef; + Client *m_client; video::IVideoDriver *m_driver; ITextureSource *m_tsrc; IShaderSource *m_shdrsrc; @@ -144,20 +155,23 @@ private: // Animation info: cracks // Last crack value passed to animate() int m_last_crack; - // Maps mesh buffer (i.e. material) indices to base texture names - UNORDERED_MAP<u32, std::string> m_crack_materials; + // Maps mesh and mesh buffer (i.e. material) indices to base texture names + std::map<std::pair<u8, u32>, std::string> m_crack_materials; // Animation info: texture animationi - // Maps meshbuffers to TileSpecs - UNORDERED_MAP<u32, TileSpec> m_animation_tiles; - UNORDERED_MAP<u32, int> m_animation_frames; // last animation frame - UNORDERED_MAP<u32, int> m_animation_frame_offsets; + // Maps mesh and mesh buffer indices to TileSpecs + // Keys are pairs of (mesh index, buffer index in the mesh) + std::map<std::pair<u8, u32>, TileLayer> m_animation_tiles; + std::map<std::pair<u8, u32>, int> m_animation_frames; // last animation frame + std::map<std::pair<u8, u32>, int> m_animation_frame_offsets; // Animation info: day/night transitions // Last daynight_ratio value passed to animate() u32 m_last_daynight_ratio; - // For each meshbuffer, maps vertex indices to (day,night) pairs - std::map<u32, std::map<u32, std::pair<u8, u8> > > m_daynight_diffs; + // For each mesh and mesh buffer, stores pre-baked colors + // of sunlit vertices + // Keys are pairs of (mesh index, buffer index in the mesh) + std::map<std::pair<u8, u32>, std::map<u32, video::SColor > > m_daynight_diffs; // Camera offset info -> do we have to translate the mesh? v3s16 m_camera_offset; @@ -170,7 +184,7 @@ private: */ struct PreMeshBuffer { - TileSpec tile; + TileLayer layer; std::vector<u16> indices; std::vector<video::S3DVertex> vertices; std::vector<video::S3DVertexTangents> tangent_vertices; @@ -178,7 +192,7 @@ struct PreMeshBuffer struct MeshCollector { - std::vector<PreMeshBuffer> prebuffers; + std::vector<PreMeshBuffer> prebuffers[MAX_TILE_LAYERS]; bool m_use_tangent_vertices; MeshCollector(bool use_tangent_vertices): @@ -187,38 +201,76 @@ struct MeshCollector } void append(const TileSpec &material, + const video::S3DVertex *vertices, u32 numVertices, + const u16 *indices, u32 numIndices); + void append(const TileLayer &material, const video::S3DVertex *vertices, u32 numVertices, - const u16 *indices, u32 numIndices); + const u16 *indices, u32 numIndices, u8 layernum); void append(const TileSpec &material, + const video::S3DVertex *vertices, u32 numVertices, + const u16 *indices, u32 numIndices, v3f pos, + video::SColor c, u8 light_source); + void append(const TileLayer &material, const video::S3DVertex *vertices, u32 numVertices, - const u16 *indices, u32 numIndices, - v3f pos, video::SColor c); + const u16 *indices, u32 numIndices, v3f pos, + video::SColor c, u8 light_source, u8 layernum); + /*! + * Colorizes all vertices in the collector. + */ + void applyTileColors(); }; -// This encodes -// alpha in the A channel of the returned SColor -// day light (0-255) in the R channel of the returned SColor -// night light (0-255) in the G channel of the returned SColor -// light source (0-255) in the B channel of the returned SColor -inline video::SColor MapBlock_LightColor(u8 alpha, u16 light, u8 light_source=0) -{ - return video::SColor(alpha, (light & 0xff), (light >> 8), light_source); -} +/*! + * Encodes light of a node. + * The result is not the final color, but a + * half-baked vertex color. + * You have to multiply the resulting color + * with the node's color. + * + * \param light the first 8 bits are day light, + * the last 8 bits are night light + * \param emissive_light amount of light the surface emits, + * from 0 to LIGHT_SUN. + */ +video::SColor encode_light(u16 light, u8 emissive_light); // Compute light at node u16 getInteriorLight(MapNode n, s32 increment, INodeDefManager *ndef); u16 getFaceLight(MapNode n, MapNode n2, v3s16 face_dir, INodeDefManager *ndef); u16 getSmoothLight(v3s16 p, v3s16 corner, MeshMakeData *data); -// Converts from day + night color values (0..255) -// and a given daynight_ratio to the final SColor shown on screen. -void finalColorBlend(video::SColor& result, - u8 day, u8 night, u32 daynight_ratio); +/*! + * Returns the sunlight's color from the current + * day-night ratio. + */ +void get_sunlight_color(video::SColorf *sunlight, u32 daynight_ratio); + +/*! + * Gives the final SColor shown on screen. + * + * \param result output color + * \param light first 8 bits are day light, second 8 bits are + * night light + */ +void final_color_blend(video::SColor *result, + u16 light, u32 daynight_ratio); + +/*! + * Gives the final SColor shown on screen. + * + * \param result output color + * \param data the half-baked vertex color + * \param dayLight color of the sunlight + */ +void final_color_blend(video::SColor *result, + const video::SColor &data, const video::SColorf &dayLight); // Retrieves the TileSpec of a face of a node // Adds MATERIAL_FLAG_CRACK if the node is cracked -TileSpec getNodeTileN(MapNode mn, v3s16 p, u8 tileindex, MeshMakeData *data); -TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data); +// TileSpec should be passed as reference due to the underlying TileFrame and its vector +// TileFrame vector copy cost very much to client +void getNodeTileN(MapNode mn, v3s16 p, u8 tileindex, MeshMakeData *data, TileSpec &tile); +void getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data, TileSpec &tile); #endif diff --git a/src/mapgen.cpp b/src/mapgen.cpp index fd4f5858f..1f7f98621 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -1,7 +1,8 @@ /* Minetest -Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net> Copyright (C) 2010-2015 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2015-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -84,7 +85,7 @@ static MapgenDesc g_reg_mapgens[] = { {"flat", true}, {"fractal", true}, {"valleys", true}, - {"singlenode", false}, + {"singlenode", true}, }; STATIC_ASSERT( @@ -97,11 +98,12 @@ STATIC_ASSERT( Mapgen::Mapgen() { - generating = false; - id = -1; - seed = 0; - water_level = 0; - flags = 0; + generating = false; + id = -1; + seed = 0; + water_level = 0; + mapgen_limit = 0; + flags = 0; vm = NULL; ndef = NULL; @@ -114,11 +116,12 @@ Mapgen::Mapgen() Mapgen::Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge) : gennotify(emerge->gen_notify_on, &emerge->gen_notify_on_deco_ids) { - generating = false; - id = mapgenid; - water_level = params->water_level; - flags = params->flags; - csize = v3s16(1, 1, 1) * (params->chunksize * MAP_BLOCKSIZE); + generating = false; + id = mapgenid; + water_level = params->water_level; + mapgen_limit = params->mapgen_limit; + flags = params->flags; + csize = v3s16(1, 1, 1) * (params->chunksize * MAP_BLOCKSIZE); /* We are losing half our entropy by doing this, but it is necessary to @@ -314,7 +317,6 @@ void Mapgen::updateHeightmap(v3s16 nmin, v3s16 nmax) heightmap[index] = y; } } - //printf("updateHeightmap: %dus\n", t.stop()); } inline bool Mapgen::isLiquidHorizontallyFlowable(u32 vi, v3s16 em) @@ -587,35 +589,39 @@ MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emer //// Look up some commonly used content c_stone = ndef->getId("mapgen_stone"); - c_water_source = ndef->getId("mapgen_water_source"); c_desert_stone = ndef->getId("mapgen_desert_stone"); c_sandstone = ndef->getId("mapgen_sandstone"); + c_water_source = ndef->getId("mapgen_water_source"); c_river_water_source = ndef->getId("mapgen_river_water_source"); + c_lava_source = ndef->getId("mapgen_lava_source"); // Fall back to more basic content if not defined + // river_water_source cannot fallback to water_source because river water + // needs to be non-renewable and have a short flow range. if (c_desert_stone == CONTENT_IGNORE) c_desert_stone = c_stone; if (c_sandstone == CONTENT_IGNORE) c_sandstone = c_stone; - if (c_river_water_source == CONTENT_IGNORE) - c_river_water_source = c_water_source; //// Content used for dungeon generation - c_cobble = ndef->getId("mapgen_cobble"); - c_stair_cobble = ndef->getId("mapgen_stair_cobble"); - c_mossycobble = ndef->getId("mapgen_mossycobble"); - c_sandstonebrick = ndef->getId("mapgen_sandstonebrick"); - c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick"); + c_cobble = ndef->getId("mapgen_cobble"); + c_mossycobble = ndef->getId("mapgen_mossycobble"); + c_stair_cobble = ndef->getId("mapgen_stair_cobble"); + c_stair_desert_stone = ndef->getId("mapgen_stair_desert_stone"); + c_sandstonebrick = ndef->getId("mapgen_sandstonebrick"); + c_stair_sandstone_block = ndef->getId("mapgen_stair_sandstone_block"); // Fall back to more basic content if not defined if (c_mossycobble == CONTENT_IGNORE) c_mossycobble = c_cobble; if (c_stair_cobble == CONTENT_IGNORE) c_stair_cobble = c_cobble; + if (c_stair_desert_stone == CONTENT_IGNORE) + c_stair_desert_stone = c_desert_stone; if (c_sandstonebrick == CONTENT_IGNORE) c_sandstonebrick = c_sandstone; - if (c_stair_sandstonebrick == CONTENT_IGNORE) - c_stair_sandstonebrick = c_sandstone; + if (c_stair_sandstone_block == CONTENT_IGNORE) + c_stair_sandstone_block = c_sandstonebrick; } @@ -835,6 +841,18 @@ void MapgenBasic::generateCaves(s16 max_stone_y, s16 large_cave_depth) } +bool MapgenBasic::generateCaverns(s16 max_stone_y) +{ + if (node_min.Y > max_stone_y || node_min.Y > cavern_limit) + return false; + + CavernsNoise caverns_noise(ndef, csize, &np_cavern, + seed, cavern_limit, cavern_taper, cavern_threshold); + + return caverns_noise.generateCaverns(vm, node_min, node_max); +} + + void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type) { if (max_stone_y < node_min.Y) @@ -842,47 +860,61 @@ void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type) DungeonParams dp; - dp.seed = seed; - dp.c_water = c_water_source; - dp.c_river_water = c_river_water_source; - dp.rooms_min = 2; - dp.rooms_max = 16; - dp.y_min = -MAX_MAP_GENERATION_LIMIT; - dp.y_max = MAX_MAP_GENERATION_LIMIT; - dp.np_density = nparams_dungeon_density; - dp.np_alt_wall = nparams_dungeon_alt_wall; + dp.seed = seed; + dp.c_water = c_water_source; + dp.c_river_water = c_river_water_source; + + dp.only_in_ground = true; + dp.corridor_len_min = 1; + dp.corridor_len_max = 13; + dp.rooms_min = 2; + dp.rooms_max = 16; + dp.y_min = -MAX_MAP_GENERATION_LIMIT; + dp.y_max = MAX_MAP_GENERATION_LIMIT; + + dp.np_density = nparams_dungeon_density; + dp.np_alt_wall = nparams_dungeon_alt_wall; switch (stone_type) { default: case MGSTONE_STONE: - dp.c_wall = c_cobble; - dp.c_alt_wall = c_mossycobble; - dp.c_stair = c_stair_cobble; - - dp.diagonal_dirs = false; - dp.holesize = v3s16(1, 2, 1); - dp.roomsize = v3s16(0, 0, 0); - dp.notifytype = GENNOTIFY_DUNGEON; + dp.c_wall = c_cobble; + dp.c_alt_wall = c_mossycobble; + dp.c_stair = c_stair_cobble; + + dp.diagonal_dirs = false; + dp.holesize = v3s16(1, 2, 1); + dp.room_size_min = v3s16(4, 4, 4); + dp.room_size_max = v3s16(8, 6, 8); + dp.room_size_large_min = v3s16(8, 8, 8); + dp.room_size_large_max = v3s16(16, 16, 16); + dp.notifytype = GENNOTIFY_DUNGEON; break; case MGSTONE_DESERT_STONE: - dp.c_wall = c_desert_stone; - dp.c_alt_wall = CONTENT_IGNORE; - dp.c_stair = c_desert_stone; - - dp.diagonal_dirs = true; - dp.holesize = v3s16(2, 3, 2); - dp.roomsize = v3s16(2, 5, 2); - dp.notifytype = GENNOTIFY_TEMPLE; + dp.c_wall = c_desert_stone; + dp.c_alt_wall = CONTENT_IGNORE; + dp.c_stair = c_stair_desert_stone; + + dp.diagonal_dirs = true; + dp.holesize = v3s16(2, 3, 2); + dp.room_size_min = v3s16(6, 9, 6); + dp.room_size_max = v3s16(10, 11, 10); + dp.room_size_large_min = v3s16(10, 13, 10); + dp.room_size_large_max = v3s16(18, 21, 18); + dp.notifytype = GENNOTIFY_TEMPLE; break; case MGSTONE_SANDSTONE: - dp.c_wall = c_sandstonebrick; - dp.c_alt_wall = CONTENT_IGNORE; - dp.c_stair = c_sandstonebrick; - - dp.diagonal_dirs = false; - dp.holesize = v3s16(2, 2, 2); - dp.roomsize = v3s16(2, 0, 2); - dp.notifytype = GENNOTIFY_DUNGEON; + dp.c_wall = c_sandstonebrick; + dp.c_alt_wall = CONTENT_IGNORE; + dp.c_stair = c_stair_sandstone_block; + + dp.diagonal_dirs = false; + dp.holesize = v3s16(2, 2, 2); + dp.room_size_min = v3s16(6, 4, 6); + dp.room_size_max = v3s16(10, 6, 10); + dp.room_size_large_min = v3s16(10, 8, 10); + dp.room_size_large_max = v3s16(18, 16, 18); + dp.notifytype = GENNOTIFY_DUNGEON; break; } @@ -984,10 +1016,14 @@ void MapgenParams::readParams(const Settings *settings) } std::string mg_name; - if (settings->getNoEx("mg_name", mg_name)) - this->mgtype = Mapgen::getMapgenType(mg_name); + if (settings->getNoEx("mg_name", mg_name)) { + mgtype = Mapgen::getMapgenType(mg_name); + if (mgtype == MAPGEN_INVALID) + mgtype = MAPGEN_DEFAULT; + } settings->getS16NoEx("water_level", water_level); + settings->getS16NoEx("mapgen_limit", mapgen_limit); settings->getS16NoEx("chunksize", chunksize); settings->getFlagStrNoEx("mg_flags", flags, flagdesc_mapgen); @@ -1005,9 +1041,61 @@ void MapgenParams::writeParams(Settings *settings) const settings->set("mg_name", Mapgen::getMapgenName(mgtype)); settings->setU64("seed", seed); settings->setS16("water_level", water_level); + settings->setS16("mapgen_limit", mapgen_limit); settings->setS16("chunksize", chunksize); settings->setFlagStr("mg_flags", flags, flagdesc_mapgen, U32_MAX); if (bparams) bparams->writeParams(settings); } + +// Calculate edges of outermost generated mapchunks (less than +// 'mapgen_limit'), and corresponding exact limits for SAO entities. +void MapgenParams::calcMapgenEdges() +{ + // Central chunk offset, in blocks + s16 ccoff_b = -chunksize / 2; + + // Chunksize, in nodes + s32 csize_n = chunksize * MAP_BLOCKSIZE; + + // Minp/maxp of central chunk, in nodes + s16 ccmin = ccoff_b * MAP_BLOCKSIZE; + s16 ccmax = ccmin + csize_n - 1; + // Fullminp/fullmaxp of central chunk, in nodes + s16 ccfmin = ccmin - MAP_BLOCKSIZE; + s16 ccfmax = ccmax + MAP_BLOCKSIZE; + // Effective mapgen limit, in blocks + // Uses same calculation as ServerMap::blockpos_over_mapgen_limit(v3s16 p) + s16 mapgen_limit_b = rangelim(mapgen_limit, + 0, MAX_MAP_GENERATION_LIMIT) / MAP_BLOCKSIZE; + // Effective mapgen limits, in nodes + s16 mapgen_limit_min = -mapgen_limit_b * MAP_BLOCKSIZE; + s16 mapgen_limit_max = (mapgen_limit_b + 1) * MAP_BLOCKSIZE - 1; + // Number of complete chunks from central chunk fullminp/fullmaxp + // to effective mapgen limits. + s16 numcmin = MYMAX((ccfmin - mapgen_limit_min) / csize_n, 0); + s16 numcmax = MYMAX((mapgen_limit_max - ccfmax) / csize_n, 0); + // Mapgen edges, in nodes + // These values may be useful later as additional class members + s16 mapgen_edge_min = ccmin - numcmin * csize_n; + s16 mapgen_edge_max = ccmax + numcmax * csize_n; + // SAO position limits, in Irrlicht units + m_sao_limit_min = mapgen_edge_min * BS - 3.0f; + m_sao_limit_max = mapgen_edge_max * BS + 3.0f; +} + + +bool MapgenParams::saoPosOverLimit(const v3f &p) +{ + if (!m_sao_limit_calculated) { + calcMapgenEdges(); + m_sao_limit_calculated = true; + } + return p.X < m_sao_limit_min || + p.X > m_sao_limit_max || + p.Y < m_sao_limit_min || + p.Y > m_sao_limit_max || + p.Z < m_sao_limit_min || + p.Z > m_sao_limit_max; +} diff --git a/src/mapgen.h b/src/mapgen.h index b18bfb930..222838011 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -1,6 +1,8 @@ /* Minetest -Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2010-2015 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2015-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -124,6 +126,7 @@ struct MapgenParams { s16 chunksize; u64 seed; s16 water_level; + s16 mapgen_limit; u32 flags; BiomeParams *bparams; @@ -133,8 +136,12 @@ struct MapgenParams { chunksize(5), seed(0), water_level(1), + mapgen_limit(MAX_MAP_GENERATION_LIMIT), flags(MG_CAVES | MG_LIGHT | MG_DECORATIONS), - bparams(NULL) + bparams(NULL), + m_sao_limit_min(MAX_MAP_GENERATION_LIMIT * BS), + m_sao_limit_max(MAX_MAP_GENERATION_LIMIT * BS), + m_sao_limit_calculated(false) { } @@ -142,6 +149,14 @@ struct MapgenParams { virtual void readParams(const Settings *settings); virtual void writeParams(Settings *settings) const; + + bool saoPosOverLimit(const v3f &p); +private: + void calcMapgenEdges(); + + float m_sao_limit_min; + float m_sao_limit_max; + bool m_sao_limit_calculated; }; @@ -158,6 +173,7 @@ class Mapgen { public: s32 seed; int water_level; + int mapgen_limit; u32 flags; bool generating; int id; @@ -240,6 +256,7 @@ public: virtual ~MapgenBasic(); virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth); + virtual bool generateCaverns(s16 max_stone_y); virtual void generateDungeons(s16 max_stone_y, MgStoneType stone_type); virtual MgStoneType generateBiomes(); virtual void dustTopNodes(); @@ -257,17 +274,19 @@ protected: // Content required for generateBiomes content_t c_stone; - content_t c_water_source; - content_t c_river_water_source; content_t c_desert_stone; content_t c_sandstone; + content_t c_water_source; + content_t c_river_water_source; + content_t c_lava_source; // Content required for generateDungeons content_t c_cobble; content_t c_stair_cobble; content_t c_mossycobble; + content_t c_stair_desert_stone; content_t c_sandstonebrick; - content_t c_stair_sandstonebrick; + content_t c_stair_sandstone_block; int ystride; int zstride; @@ -278,7 +297,11 @@ protected: NoiseParams np_cave1; NoiseParams np_cave2; + NoiseParams np_cavern; float cave_width; + float cavern_limit; + float cavern_taper; + float cavern_threshold; }; #endif diff --git a/src/mapgen_flat.cpp b/src/mapgen_flat.cpp index cc120b580..604c79dd0 100644 --- a/src/mapgen_flat.cpp +++ b/src/mapgen_flat.cpp @@ -1,7 +1,7 @@ /* Minetest -Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net> -Copyright (C) 2010-2015 paramat, Matt Gregory +Copyright (C) 2015-2017 paramat +Copyright (C) 2015-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -33,7 +33,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "emerge.h" #include "dungeongen.h" #include "cavegen.h" -#include "treegen.h" #include "mg_biome.h" #include "mg_ore.h" #include "mg_decoration.h" @@ -61,10 +60,12 @@ MapgenFlat::MapgenFlat(int mapgenid, MapgenFlatParams *params, EmergeManager *em this->hill_threshold = params->hill_threshold; this->hill_steepness = params->hill_steepness; - //// 2D noise - noise_terrain = new Noise(¶ms->np_terrain, seed, csize.X, csize.Z); + // 2D noise noise_filler_depth = new Noise(¶ms->np_filler_depth, seed, csize.X, csize.Z); + if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS)) + noise_terrain = new Noise(¶ms->np_terrain, seed, csize.X, csize.Z); + // 3D noise MapgenBasic::np_cave1 = params->np_cave1; MapgenBasic::np_cave2 = params->np_cave2; } @@ -72,8 +73,10 @@ MapgenFlat::MapgenFlat(int mapgenid, MapgenFlatParams *params, EmergeManager *em MapgenFlat::~MapgenFlat() { - delete noise_terrain; delete noise_filler_depth; + + if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS)) + delete noise_terrain; } @@ -137,7 +140,9 @@ void MapgenFlatParams::writeParams(Settings *settings) const int MapgenFlat::getSpawnLevelAtPoint(v2s16 p) { s16 level_at_point = ground_level; - float n_terrain = NoisePerlin2D(&noise_terrain->np, p.X, p.Y, seed); + float n_terrain = 0.0f; + if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS)) + n_terrain = NoisePerlin2D(&noise_terrain->np, p.X, p.Y, seed); if ((spflags & MGFLAT_LAKES) && n_terrain < lake_threshold) { level_at_point = ground_level - diff --git a/src/mapgen_flat.h b/src/mapgen_flat.h index 8b3de2bcf..18b84de76 100644 --- a/src/mapgen_flat.h +++ b/src/mapgen_flat.h @@ -1,7 +1,7 @@ /* Minetest -Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net> -Copyright (C) 2010-2015 paramat, Matt Gregory +Copyright (C) 2015-2017 paramat +Copyright (C) 2015-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -31,8 +31,8 @@ class BiomeManager; extern FlagDesc flagdesc_mapgen_flat[]; - -struct MapgenFlatParams : public MapgenParams { +struct MapgenFlatParams : public MapgenParams +{ u32 spflags; s16 ground_level; s16 large_cave_depth; @@ -53,7 +53,8 @@ struct MapgenFlatParams : public MapgenParams { void writeParams(Settings *settings) const; }; -class MapgenFlat : public MapgenBasic { +class MapgenFlat : public MapgenBasic +{ public: MapgenFlat(int mapgenid, MapgenFlatParams *params, EmergeManager *emerge); ~MapgenFlat(); diff --git a/src/mapgen_fractal.cpp b/src/mapgen_fractal.cpp index a6ed18ae7..faac9e1c1 100644 --- a/src/mapgen_fractal.cpp +++ b/src/mapgen_fractal.cpp @@ -1,7 +1,7 @@ /* Minetest -Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net> -Copyright (C) 2010-2015 paramat, Matt Gregory +Copyright (C) 2015-2017 paramat +Copyright (C) 2015-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -33,7 +33,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "emerge.h" #include "dungeongen.h" #include "cavegen.h" -#include "treegen.h" #include "mg_biome.h" #include "mg_ore.h" #include "mg_decoration.h" diff --git a/src/mapgen_fractal.h b/src/mapgen_fractal.h index 3331848bc..a5a09ccb9 100644 --- a/src/mapgen_fractal.h +++ b/src/mapgen_fractal.h @@ -1,7 +1,7 @@ /* Minetest -Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net> -Copyright (C) 2010-2015 paramat, Matt Gregory +Copyright (C) 2015-2017 paramat +Copyright (C) 2015-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> Fractal formulas from http://www.bugman123.com/Hypercomplex/index.html by Paul Nylander, and from http://www.fractalforums.com, thank you. @@ -32,8 +32,8 @@ class BiomeManager; extern FlagDesc flagdesc_mapgen_fractal[]; - -struct MapgenFractalParams : public MapgenParams { +struct MapgenFractalParams : public MapgenParams +{ u32 spflags; float cave_width; u16 fractal; @@ -57,7 +57,8 @@ struct MapgenFractalParams : public MapgenParams { void writeParams(Settings *settings) const; }; -class MapgenFractal : public MapgenBasic { +class MapgenFractal : public MapgenBasic +{ public: MapgenFractal(int mapgenid, MapgenFractalParams *params, EmergeManager *emerge); ~MapgenFractal(); diff --git a/src/mapgen_singlenode.cpp b/src/mapgen_singlenode.cpp index ff985dd34..f49059f7f 100644 --- a/src/mapgen_singlenode.cpp +++ b/src/mapgen_singlenode.cpp @@ -1,6 +1,8 @@ /* Minetest -Copyright (C) 2010-2015 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2013-2015 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2015-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by diff --git a/src/mapgen_singlenode.h b/src/mapgen_singlenode.h index 07520134d..5171bfbca 100644 --- a/src/mapgen_singlenode.h +++ b/src/mapgen_singlenode.h @@ -1,6 +1,8 @@ /* Minetest -Copyright (C) 2010-2015 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2013-2015 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2015-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -22,7 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapgen.h" -struct MapgenSinglenodeParams : public MapgenParams { +struct MapgenSinglenodeParams : public MapgenParams +{ MapgenSinglenodeParams() {} ~MapgenSinglenodeParams() {} @@ -30,7 +33,8 @@ struct MapgenSinglenodeParams : public MapgenParams { void writeParams(Settings *settings) const {} }; -class MapgenSinglenode : public Mapgen { +class MapgenSinglenode : public Mapgen +{ public: u32 flags; content_t c_node; diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp index 9f189e253..932677e2a 100644 --- a/src/mapgen_v5.cpp +++ b/src/mapgen_v5.cpp @@ -1,7 +1,7 @@ /* Minetest -Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net> -Copyright (C) 2010-2015 paramat, Matt Gregory +Copyright (C) 2014-2017 paramat +Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -33,7 +33,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "emerge.h" #include "dungeongen.h" #include "cavegen.h" -#include "treegen.h" #include "mg_biome.h" #include "mg_ore.h" #include "mg_decoration.h" @@ -41,15 +40,19 @@ with this program; if not, write to the Free Software Foundation, Inc., FlagDesc flagdesc_mapgen_v5[] = { - {NULL, 0} + {"caverns", MGV5_CAVERNS}, + {NULL, 0} }; MapgenV5::MapgenV5(int mapgenid, MapgenV5Params *params, EmergeManager *emerge) : MapgenBasic(mapgenid, params, emerge) { - this->spflags = params->spflags; - this->cave_width = params->cave_width; + this->spflags = params->spflags; + this->cave_width = params->cave_width; + this->cavern_limit = params->cavern_limit; + this->cavern_taper = params->cavern_taper; + this->cavern_threshold = params->cavern_threshold; // Terrain noise noise_filler_depth = new Noise(¶ms->np_filler_depth, seed, csize.X, csize.Z); @@ -59,9 +62,10 @@ MapgenV5::MapgenV5(int mapgenid, MapgenV5Params *params, EmergeManager *emerge) // 3D terrain noise // 1-up 1-down overgeneration noise_ground = new Noise(¶ms->np_ground, seed, csize.X, csize.Y + 2, csize.Z); - - MapgenBasic::np_cave1 = params->np_cave1; - MapgenBasic::np_cave2 = params->np_cave2; + // 1 down overgeneration + MapgenBasic::np_cave1 = params->np_cave1; + MapgenBasic::np_cave2 = params->np_cave2; + MapgenBasic::np_cavern = params->np_cavern; } @@ -76,47 +80,55 @@ MapgenV5::~MapgenV5() MapgenV5Params::MapgenV5Params() { - spflags = 0; - cave_width = 0.125; + spflags = MGV5_CAVERNS; + cave_width = 0.125; + cavern_limit = -256; + cavern_taper = 256; + cavern_threshold = 0.7; np_filler_depth = NoiseParams(0, 1, v3f(150, 150, 150), 261, 4, 0.7, 2.0); np_factor = NoiseParams(0, 1, v3f(250, 250, 250), 920381, 3, 0.45, 2.0); np_height = NoiseParams(0, 10, v3f(250, 250, 250), 84174, 4, 0.5, 2.0); + np_ground = NoiseParams(0, 40, v3f(80, 80, 80), 983240, 4, 0.55, 2.0, NOISE_FLAG_EASED); np_cave1 = NoiseParams(0, 12, v3f(50, 50, 50), 52534, 4, 0.5, 2.0); np_cave2 = NoiseParams(0, 12, v3f(50, 50, 50), 10325, 4, 0.5, 2.0); - np_ground = NoiseParams(0, 40, v3f(80, 80, 80), 983240, 4, 0.55, 2.0, NOISE_FLAG_EASED); + np_cavern = NoiseParams(0, 1, v3f(384, 128, 384), 723, 5, 0.63, 2.0); } -//#define CAVE_NOISE_SCALE 12.0 -//#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE) = 0.125 - - void MapgenV5Params::readParams(const Settings *settings) { - settings->getFlagStrNoEx("mgv5_spflags", spflags, flagdesc_mapgen_v5); - settings->getFloatNoEx("mgv5_cave_width", cave_width); + settings->getFlagStrNoEx("mgv5_spflags", spflags, flagdesc_mapgen_v5); + settings->getFloatNoEx("mgv5_cave_width", cave_width); + settings->getS16NoEx("mgv5_cavern_limit", cavern_limit); + settings->getS16NoEx("mgv5_cavern_taper", cavern_taper); + settings->getFloatNoEx("mgv5_cavern_threshold", cavern_threshold); settings->getNoiseParams("mgv5_np_filler_depth", np_filler_depth); settings->getNoiseParams("mgv5_np_factor", np_factor); settings->getNoiseParams("mgv5_np_height", np_height); + settings->getNoiseParams("mgv5_np_ground", np_ground); settings->getNoiseParams("mgv5_np_cave1", np_cave1); settings->getNoiseParams("mgv5_np_cave2", np_cave2); - settings->getNoiseParams("mgv5_np_ground", np_ground); + settings->getNoiseParams("mgv5_np_cavern", np_cavern); } void MapgenV5Params::writeParams(Settings *settings) const { - settings->setFlagStr("mgv5_spflags", spflags, flagdesc_mapgen_v5, U32_MAX); - settings->setFloat("mgv5_cave_width", cave_width); + settings->setFlagStr("mgv5_spflags", spflags, flagdesc_mapgen_v5, U32_MAX); + settings->setFloat("mgv5_cave_width", cave_width); + settings->setS16("mgv5_cavern_limit", cavern_limit); + settings->setS16("mgv5_cavern_taper", cavern_taper); + settings->setFloat("mgv5_cavern_threshold", cavern_threshold); settings->setNoiseParams("mgv5_np_filler_depth", np_filler_depth); settings->setNoiseParams("mgv5_np_factor", np_factor); settings->setNoiseParams("mgv5_np_height", np_height); + settings->setNoiseParams("mgv5_np_ground", np_ground); settings->setNoiseParams("mgv5_np_cave1", np_cave1); settings->setNoiseParams("mgv5_np_cave2", np_cave2); - settings->setNoiseParams("mgv5_np_ground", np_ground); + settings->setNoiseParams("mgv5_np_cavern", np_cavern); } @@ -190,9 +202,21 @@ void MapgenV5::makeChunk(BlockMakeData *data) biomegen->calcBiomeNoise(node_min); MgStoneType stone_type = generateBiomes(); - // Generate caves - if ((flags & MG_CAVES) && (stone_surface_max_y >= node_min.Y)) - generateCaves(stone_surface_max_y, MGV5_LARGE_CAVE_DEPTH); + // Generate caverns, tunnels and classic caves + if (flags & MG_CAVES) { + bool near_cavern = false; + // Generate caverns + if (spflags & MGV5_CAVERNS) + near_cavern = generateCaverns(stone_surface_max_y); + // Generate tunnels and classic caves + if (near_cavern) + // Disable classic caves in this mapchunk by setting + // 'large cave depth' to world base. Avoids excessive liquid in + // large caverns and floating blobs of overgenerated liquid. + generateCaves(stone_surface_max_y, -MAX_MAP_GENERATION_LIMIT); + else + generateCaves(stone_surface_max_y, MGV5_LARGE_CAVE_DEPTH); + } // Generate dungeons and desert temples if (flags & MG_DUNGEONS) @@ -223,23 +247,6 @@ void MapgenV5::makeChunk(BlockMakeData *data) } -//bool is_cave(u32 index) { -// double d1 = contour(noise_cave1->result[index]); -// double d2 = contour(noise_cave2->result[index]); -// return d1*d2 > CAVE_NOISE_THRESHOLD; -//} - -//bool val_is_ground(v3s16 p, u32 index, u32 index2d) { -// double f = 0.55 + noise_factor->result[index2d]; -// if(f < 0.01) -// f = 0.01; -// else if(f >= 1.0) -// f *= 1.6; -// double h = WATER_LEVEL + 10 * noise_height->result[index2d]; -// return (noise_ground->result[index] * f > (double)p.Y - h); -//} - - int MapgenV5::generateBaseTerrain() { u32 index = 0; diff --git a/src/mapgen_v5.h b/src/mapgen_v5.h index ddb090a9c..b742638cd 100644 --- a/src/mapgen_v5.h +++ b/src/mapgen_v5.h @@ -1,7 +1,7 @@ /* Minetest -Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net> -Copyright (C) 2010-2015 paramat, Matt Gregory +Copyright (C) 2014-2017 paramat +Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -25,20 +25,28 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MGV5_LARGE_CAVE_DEPTH -256 +///////// Mapgen V5 flags +#define MGV5_CAVERNS 0x01 + class BiomeManager; extern FlagDesc flagdesc_mapgen_v5[]; - -struct MapgenV5Params : public MapgenParams { +struct MapgenV5Params : public MapgenParams +{ u32 spflags; float cave_width; + s16 cavern_limit; + s16 cavern_taper; + float cavern_threshold; + NoiseParams np_filler_depth; NoiseParams np_factor; NoiseParams np_height; + NoiseParams np_ground; NoiseParams np_cave1; NoiseParams np_cave2; - NoiseParams np_ground; + NoiseParams np_cavern; MapgenV5Params(); ~MapgenV5Params() {} @@ -47,8 +55,8 @@ struct MapgenV5Params : public MapgenParams { void writeParams(Settings *settings) const; }; - -class MapgenV5 : public MapgenBasic { +class MapgenV5 : public MapgenBasic +{ public: MapgenV5(int mapgenid, MapgenV5Params *params, EmergeManager *emerge); ~MapgenV5(); diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index 79617a830..fe2b0b36f 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -1,6 +1,8 @@ /* Minetest Copyright (C) 2010-2015 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -99,18 +101,12 @@ MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge) c_snowblock = ndef->getId("mapgen_snowblock"); c_ice = ndef->getId("mapgen_ice"); - c_cobble = ndef->getId("mapgen_cobble"); - c_stair_cobble = ndef->getId("mapgen_stair_cobble"); - c_mossycobble = ndef->getId("mapgen_mossycobble"); - - if (c_desert_sand == CONTENT_IGNORE) - c_desert_sand = c_sand; + if (c_gravel == CONTENT_IGNORE) + c_gravel = c_stone; if (c_desert_stone == CONTENT_IGNORE) c_desert_stone = c_stone; - if (c_mossycobble == CONTENT_IGNORE) - c_mossycobble = c_cobble; - if (c_stair_cobble == CONTENT_IGNORE) - c_stair_cobble = c_cobble; + if (c_desert_sand == CONTENT_IGNORE) + c_desert_sand = c_sand; if (c_dirt_with_snow == CONTENT_IGNORE) c_dirt_with_snow = c_dirt_with_grass; if (c_snow == CONTENT_IGNORE) @@ -119,6 +115,18 @@ MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge) c_snowblock = c_dirt_with_grass; if (c_ice == CONTENT_IGNORE) c_ice = c_water_source; + + c_cobble = ndef->getId("mapgen_cobble"); + c_mossycobble = ndef->getId("mapgen_mossycobble"); + c_stair_cobble = ndef->getId("mapgen_stair_cobble"); + c_stair_desert_stone = ndef->getId("mapgen_stair_desert_stone"); + + if (c_mossycobble == CONTENT_IGNORE) + c_mossycobble = c_cobble; + if (c_stair_cobble == CONTENT_IGNORE) + c_stair_cobble = c_cobble; + if (c_stair_desert_stone == CONTENT_IGNORE) + c_stair_desert_stone = c_desert_stone; } @@ -558,34 +566,47 @@ void MapgenV6::makeChunk(BlockMakeData *data) if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) { DungeonParams dp; - dp.seed = seed; - dp.c_water = c_water_source; - dp.c_river_water = c_water_source; - dp.rooms_min = 2; - dp.rooms_max = 16; - dp.y_min = -MAX_MAP_GENERATION_LIMIT; - dp.y_max = MAX_MAP_GENERATION_LIMIT; - dp.np_density = NoiseParams(0.9, 0.5, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0); - dp.np_alt_wall = NoiseParams(-0.4, 1.0, v3f(40.0, 40.0, 40.0), 32474, 6, 1.1, 2.0); + dp.seed = seed; + dp.c_water = c_water_source; + dp.c_river_water = c_water_source; + + dp.only_in_ground = true; + dp.corridor_len_min = 1; + dp.corridor_len_max = 13; + dp.rooms_min = 2; + dp.rooms_max = 16; + dp.y_min = -MAX_MAP_GENERATION_LIMIT; + dp.y_max = MAX_MAP_GENERATION_LIMIT; + + dp.np_density + = NoiseParams(0.9, 0.5, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0); + dp.np_alt_wall + = NoiseParams(-0.4, 1.0, v3f(40.0, 40.0, 40.0), 32474, 6, 1.1, 2.0); if (getBiome(0, v2s16(node_min.X, node_min.Z)) == BT_DESERT) { - dp.c_wall = c_desert_stone; - dp.c_alt_wall = CONTENT_IGNORE; - dp.c_stair = c_desert_stone; - - dp.diagonal_dirs = true; - dp.holesize = v3s16(2, 3, 2); - dp.roomsize = v3s16(2, 5, 2); - dp.notifytype = GENNOTIFY_TEMPLE; + dp.c_wall = c_desert_stone; + dp.c_alt_wall = CONTENT_IGNORE; + dp.c_stair = c_stair_desert_stone; + + dp.diagonal_dirs = true; + dp.holesize = v3s16(2, 3, 2); + dp.room_size_min = v3s16(6, 9, 6); + dp.room_size_max = v3s16(10, 11, 10); + dp.room_size_large_min = v3s16(10, 13, 10); + dp.room_size_large_max = v3s16(18, 21, 18); + dp.notifytype = GENNOTIFY_TEMPLE; } else { - dp.c_wall = c_cobble; - dp.c_alt_wall = c_mossycobble; - dp.c_stair = c_stair_cobble; - - dp.diagonal_dirs = false; - dp.holesize = v3s16(1, 2, 1); - dp.roomsize = v3s16(0, 0, 0); - dp.notifytype = GENNOTIFY_DUNGEON; + dp.c_wall = c_cobble; + dp.c_alt_wall = c_mossycobble; + dp.c_stair = c_stair_cobble; + + dp.diagonal_dirs = false; + dp.holesize = v3s16(1, 2, 1); + dp.room_size_min = v3s16(4, 4, 4); + dp.room_size_max = v3s16(8, 6, 8); + dp.room_size_large_min = v3s16(8, 8, 8); + dp.room_size_large_max = v3s16(16, 16, 16); + dp.notifytype = GENNOTIFY_DUNGEON; } DungeonGen dgen(ndef, &gennotify, &dp); @@ -817,13 +838,17 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos) v3s16(-1, 0, 0), // left }; - // Check that upper is air or doesn't exist. - // Cancel dropping if upper keeps it in place + // Check that upper is walkable. Cancel + // dropping if upper keeps it in place. u32 i3 = i; vm->m_area.add_y(em, i3, 1); - if (vm->m_area.contains(i3) == true && - ndef->get(vm->m_data[i3]).walkable) - continue; + MapNode *n3 = NULL; + + if (vm->m_area.contains(i3)) { + n3 = &vm->m_data[i3]; + if (ndef->get(*n3).walkable) + continue; + } // Drop mud on side for (u32 di = 0; di < 4; di++) { @@ -866,10 +891,18 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos) if (!dropped_to_unknown) { *n2 = *n; // Set old place to be air (or water) - if (old_is_water) + if (old_is_water) { *n = MapNode(c_water_source); - else + } else { *n = MapNode(CONTENT_AIR); + // Upper (n3) is not walkable or is NULL. If it is + // not NULL and not air and not water it is a + // decoration that needs removing, to avoid + // unsupported decorations. + if (n3 && n3->getContent() != CONTENT_AIR && + n3->getContent() != c_water_source) + *n3 = MapNode(CONTENT_AIR); + } } // Done diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index f018ffaca..2b3b4444e 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -1,6 +1,8 @@ /* Minetest Copyright (C) 2010-2015 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -123,6 +125,7 @@ public: content_t c_cobble; content_t c_mossycobble; content_t c_stair_cobble; + content_t c_stair_desert_stone; MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge); ~MapgenV6(); diff --git a/src/mapgen_v7.cpp b/src/mapgen_v7.cpp index 04a9e3c16..5e9bc4aa3 100644 --- a/src/mapgen_v7.cpp +++ b/src/mapgen_v7.cpp @@ -1,7 +1,7 @@ /* Minetest -Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net> -Copyright (C) 2010-2015 paramat, Matt Gregory +Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -33,7 +33,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "emerge.h" #include "dungeongen.h" #include "cavegen.h" -#include "treegen.h" #include "mg_biome.h" #include "mg_ore.h" #include "mg_decoration.h" @@ -41,10 +40,11 @@ with this program; if not, write to the Free Software Foundation, Inc., FlagDesc flagdesc_mapgen_v7[] = { - {"mountains", MGV7_MOUNTAINS}, - {"ridges", MGV7_RIDGES}, - {"floatlands", MGV7_FLOATLANDS}, - {NULL, 0} + {"mountains", MGV7_MOUNTAINS}, + {"ridges", MGV7_RIDGES}, + {"floatlands", MGV7_FLOATLANDS}, + {"caverns", MGV7_CAVERNS}, + {NULL, 0} }; @@ -60,52 +60,77 @@ MapgenV7::MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge) this->float_mount_height = params->float_mount_height; this->floatland_level = params->floatland_level; this->shadow_limit = params->shadow_limit; + this->cavern_limit = params->cavern_limit; + this->cavern_taper = params->cavern_taper; + this->cavern_threshold = params->cavern_threshold; - //// Terrain noise - noise_terrain_base = new Noise(¶ms->np_terrain_base, seed, csize.X, csize.Z); - noise_terrain_alt = new Noise(¶ms->np_terrain_alt, seed, csize.X, csize.Z); - noise_terrain_persist = new Noise(¶ms->np_terrain_persist, seed, csize.X, csize.Z); - noise_height_select = new Noise(¶ms->np_height_select, seed, csize.X, csize.Z); - noise_filler_depth = new Noise(¶ms->np_filler_depth, seed, csize.X, csize.Z); - noise_mount_height = new Noise(¶ms->np_mount_height, seed, csize.X, csize.Z); - noise_ridge_uwater = new Noise(¶ms->np_ridge_uwater, seed, csize.X, csize.Z); - noise_floatland_base = new Noise(¶ms->np_floatland_base, seed, csize.X, csize.Z); - noise_float_base_height = new Noise(¶ms->np_float_base_height, seed, csize.X, csize.Z); - - //// 3d terrain noise - // 1-up 1-down overgeneration - noise_mountain = new Noise(¶ms->np_mountain, seed, csize.X, csize.Y + 2, csize.Z); - noise_ridge = new Noise(¶ms->np_ridge, seed, csize.X, csize.Y + 2, csize.Z); - - MapgenBasic::np_cave1 = params->np_cave1; - MapgenBasic::np_cave2 = params->np_cave2; + // 2D noise + noise_terrain_base = new Noise(¶ms->np_terrain_base, seed, csize.X, csize.Z); + noise_terrain_alt = new Noise(¶ms->np_terrain_alt, seed, csize.X, csize.Z); + noise_terrain_persist = new Noise(¶ms->np_terrain_persist, seed, csize.X, csize.Z); + noise_height_select = new Noise(¶ms->np_height_select, seed, csize.X, csize.Z); + noise_filler_depth = new Noise(¶ms->np_filler_depth, seed, csize.X, csize.Z); + + if (spflags & MGV7_MOUNTAINS) + noise_mount_height = new Noise(¶ms->np_mount_height, seed, csize.X, csize.Z); + + if (spflags & MGV7_FLOATLANDS) { + noise_floatland_base = new Noise(¶ms->np_floatland_base, seed, csize.X, csize.Z); + noise_float_base_height = new Noise(¶ms->np_float_base_height, seed, csize.X, csize.Z); + } + + if (spflags & MGV7_RIDGES) { + noise_ridge_uwater = new Noise(¶ms->np_ridge_uwater, seed, csize.X, csize.Z); + // 3D noise, 1-up 1-down overgeneration + noise_ridge = new Noise(¶ms->np_ridge, seed, csize.X, csize.Y + 2, csize.Z); + } + // 3D noise, 1 up, 1 down overgeneration + if ((spflags & MGV7_MOUNTAINS) || (spflags & MGV7_FLOATLANDS)) + noise_mountain = new Noise(¶ms->np_mountain, seed, csize.X, csize.Y + 2, csize.Z); + // 3D noise, 1 down overgeneration + MapgenBasic::np_cave1 = params->np_cave1; + MapgenBasic::np_cave2 = params->np_cave2; + MapgenBasic::np_cavern = params->np_cavern; } MapgenV7::~MapgenV7() { delete noise_terrain_base; + delete noise_terrain_alt; delete noise_terrain_persist; delete noise_height_select; - delete noise_terrain_alt; delete noise_filler_depth; - delete noise_mount_height; - delete noise_ridge_uwater; - delete noise_floatland_base; - delete noise_float_base_height; - delete noise_mountain; - delete noise_ridge; + + if (spflags & MGV7_MOUNTAINS) + delete noise_mount_height; + + if (spflags & MGV7_FLOATLANDS) { + delete noise_floatland_base; + delete noise_float_base_height; + } + + if (spflags & MGV7_RIDGES) { + delete noise_ridge_uwater; + delete noise_ridge; + } + + if ((spflags & MGV7_MOUNTAINS) || (spflags & MGV7_FLOATLANDS)) + delete noise_mountain; } MapgenV7Params::MapgenV7Params() { - spflags = MGV7_MOUNTAINS | MGV7_RIDGES; + spflags = MGV7_MOUNTAINS | MGV7_RIDGES | MGV7_CAVERNS; cave_width = 0.09; float_mount_density = 0.6; float_mount_height = 128.0; floatland_level = 1280; shadow_limit = 1024; + cavern_limit = -256; + cavern_taper = 256; + cavern_threshold = 0.7; np_terrain_base = NoiseParams(4, 70, v3f(600, 600, 600), 82341, 5, 0.6, 2.0); np_terrain_alt = NoiseParams(4, 25, v3f(600, 600, 600), 5934, 5, 0.6, 2.0); @@ -118,6 +143,7 @@ MapgenV7Params::MapgenV7Params() np_float_base_height = NoiseParams(48, 24, v3f(300, 300, 300), 907, 4, 0.7, 2.0); np_mountain = NoiseParams(-0.6, 1, v3f(250, 350, 250), 5333, 5, 0.63, 2.0); np_ridge = NoiseParams(0, 1, v3f(100, 100, 100), 6467, 4, 0.75, 2.0); + np_cavern = NoiseParams(0, 1, v3f(384, 128, 384), 723, 5, 0.63, 2.0); np_cave1 = NoiseParams(0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0); np_cave2 = NoiseParams(0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0); } @@ -131,6 +157,9 @@ void MapgenV7Params::readParams(const Settings *settings) settings->getFloatNoEx("mgv7_float_mount_height", float_mount_height); settings->getS16NoEx("mgv7_floatland_level", floatland_level); settings->getS16NoEx("mgv7_shadow_limit", shadow_limit); + settings->getS16NoEx("mgv7_cavern_limit", cavern_limit); + settings->getS16NoEx("mgv7_cavern_taper", cavern_taper); + settings->getFloatNoEx("mgv7_cavern_threshold", cavern_threshold); settings->getNoiseParams("mgv7_np_terrain_base", np_terrain_base); settings->getNoiseParams("mgv7_np_terrain_alt", np_terrain_alt); @@ -143,6 +172,7 @@ void MapgenV7Params::readParams(const Settings *settings) settings->getNoiseParams("mgv7_np_float_base_height", np_float_base_height); settings->getNoiseParams("mgv7_np_mountain", np_mountain); settings->getNoiseParams("mgv7_np_ridge", np_ridge); + settings->getNoiseParams("mgv7_np_cavern", np_cavern); settings->getNoiseParams("mgv7_np_cave1", np_cave1); settings->getNoiseParams("mgv7_np_cave2", np_cave2); } @@ -156,6 +186,9 @@ void MapgenV7Params::writeParams(Settings *settings) const settings->setFloat("mgv7_float_mount_height", float_mount_height); settings->setS16("mgv7_floatland_level", floatland_level); settings->setS16("mgv7_shadow_limit", shadow_limit); + settings->setS16("mgv7_cavern_limit", cavern_limit); + settings->setS16("mgv7_cavern_taper", cavern_taper); + settings->setFloat("mgv7_cavern_threshold", cavern_threshold); settings->setNoiseParams("mgv7_np_terrain_base", np_terrain_base); settings->setNoiseParams("mgv7_np_terrain_alt", np_terrain_alt); @@ -168,6 +201,7 @@ void MapgenV7Params::writeParams(Settings *settings) const settings->setNoiseParams("mgv7_np_float_base_height", np_float_base_height); settings->setNoiseParams("mgv7_np_mountain", np_mountain); settings->setNoiseParams("mgv7_np_ridge", np_ridge); + settings->setNoiseParams("mgv7_np_cavern", np_cavern); settings->setNoiseParams("mgv7_np_cave1", np_cave1); settings->setNoiseParams("mgv7_np_cave2", np_cave2); } @@ -256,9 +290,23 @@ void MapgenV7::makeChunk(BlockMakeData *data) biomegen->calcBiomeNoise(node_min); MgStoneType stone_type = generateBiomes(); - if (flags & MG_CAVES) - generateCaves(stone_surface_max_y, water_level); + // Generate caverns, tunnels and classic caves + if (flags & MG_CAVES) { + bool near_cavern = false; + // Generate caverns + if (spflags & MGV7_CAVERNS) + near_cavern = generateCaverns(stone_surface_max_y); + // Generate tunnels and classic caves + if (near_cavern) + // Disable classic caves in this mapchunk by setting + // 'large cave depth' to world base. Avoids excessive liquid in + // large caverns and floating blobs of overgenerated liquid. + generateCaves(stone_surface_max_y, -MAX_MAP_GENERATION_LIMIT); + else + generateCaves(stone_surface_max_y, water_level); + } + // Generate dungeons if (flags & MG_DUNGEONS) generateDungeons(stone_surface_max_y, stone_type); @@ -274,8 +322,10 @@ void MapgenV7::makeChunk(BlockMakeData *data) //printf("makeChunk: %dms\n", t.stop()); + // Update liquids updateLiquid(&data->transforming_liquid, full_node_min, full_node_max); + // Calculate lighting // Limit floatland shadow bool propagate_shadow = !((spflags & MGV7_FLOATLANDS) && node_min.Y <= shadow_limit && node_max.Y >= shadow_limit); diff --git a/src/mapgen_v7.h b/src/mapgen_v7.h index 3972387a7..a69170057 100644 --- a/src/mapgen_v7.h +++ b/src/mapgen_v7.h @@ -1,7 +1,7 @@ /* Minetest -Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net> -Copyright (C) 2010-2015 paramat, Matt Gregory +Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -23,10 +23,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapgen.h" -////////////// Mapgen V7 flags -#define MGV7_MOUNTAINS 0x01 -#define MGV7_RIDGES 0x02 -#define MGV7_FLOATLANDS 0x04 +//////////// Mapgen V7 flags +#define MGV7_MOUNTAINS 0x01 +#define MGV7_RIDGES 0x02 +#define MGV7_FLOATLANDS 0x04 +#define MGV7_CAVERNS 0x08 class BiomeManager; @@ -40,6 +41,9 @@ struct MapgenV7Params : public MapgenParams { float float_mount_height; s16 floatland_level; s16 shadow_limit; + s16 cavern_limit; + s16 cavern_taper; + float cavern_threshold; NoiseParams np_terrain_base; NoiseParams np_terrain_alt; @@ -52,6 +56,7 @@ struct MapgenV7Params : public MapgenParams { NoiseParams np_float_base_height; NoiseParams np_mountain; NoiseParams np_ridge; + NoiseParams np_cavern; NoiseParams np_cave1; NoiseParams np_cave2; diff --git a/src/mapgen_valleys.cpp b/src/mapgen_valleys.cpp index ce7a95329..df318291c 100644 --- a/src/mapgen_valleys.cpp +++ b/src/mapgen_valleys.cpp @@ -1,8 +1,7 @@ /* Minetest Valleys C -Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net> -Copyright (C) 2010-2015 paramat, Matt Gregory -Copyright (C) 2016 Duane Robertson <duane@duanerobertson.com> +Copyright (C) 2016-2017 Duane Robertson <duane@duanerobertson.com> +Copyright (C) 2016-2017 paramat Based on Valleys Mapgen by Gael de Sailly (https://forum.minetest.net/viewtopic.php?f=9&t=11430) @@ -37,7 +36,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" // For g_settings #include "emerge.h" #include "dungeongen.h" -#include "treegen.h" #include "mg_biome.h" #include "mg_ore.h" #include "mg_decoration.h" @@ -70,9 +68,6 @@ MapgenValleys::MapgenValleys(int mapgenid, MapgenValleysParams *params, EmergeMa // NOTE: MapgenValleys has a hard dependency on BiomeGenOriginal this->m_bgen = (BiomeGenOriginal *)biomegen; - this->map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT, - g_settings->getU16("map_generation_limit")); - BiomeParamsOriginal *bp = (BiomeParamsOriginal *)params->bparams; this->spflags = params->spflags; @@ -110,9 +105,6 @@ MapgenValleys::MapgenValleys(int mapgenid, MapgenValleysParams *params, EmergeMa this->lava_max_height = water_level + MYMAX(0, lava_features_lim - 4) * 50; tcave_cache = new float[csize.Y + 2]; - - // Resolve content to be used - c_lava_source = ndef->getId("mapgen_lava_source"); } @@ -238,17 +230,21 @@ void MapgenValleys::makeChunk(BlockMakeData *data) blockseed = getBlockSeed2(full_node_min, seed); - // Generate noise maps and base terrain height. - calculateNoise(); - // Generate biome noises. Note this must be executed strictly before // generateTerrain, because generateTerrain depends on intermediate // biome-related noises. m_bgen->calcBiomeNoise(node_min); + // Generate noise maps and base terrain height. + // Modify heat and humidity maps. + calculateNoise(); + // Generate base terrain with initial heightmaps s16 stone_surface_max_y = generateTerrain(); + // Recalculate heightmap + updateHeightmap(node_min, node_max); + // Place biome-specific nodes and build biomemap MgStoneType stone_type = generateBiomes(); @@ -549,10 +545,6 @@ int MapgenValleys::generateTerrain() index_3d += ystride; } - // This happens if we're generating a chunk that doesn't - // contain the terrain surface, in which case, we need - // to set heightmap to a value outside of the chunk, - // to avoid confusing lua mods that use heightmap. if (heightmap[index_2d] == -MAX_MAP_GENERATION_LIMIT) { s16 surface_y_int = myround(surface_y); if (surface_y_int > node_max.Y + 1 || surface_y_int < node_min.Y - 1) { @@ -621,7 +613,7 @@ void MapgenValleys::generateCaves(s16 max_stone_y, s16 large_cave_depth) const float massive_cave_threshold = 0.6f; // mct: 1 = small rare caves, 0.5 1/3rd ground volume, 0 = 1/2 ground volume. - float yblmin = -map_gen_limit + massive_cave_blend * 1.5f; + float yblmin = -mapgen_limit + massive_cave_blend * 1.5f; float yblmax = massive_cave_depth - massive_cave_blend * 1.5f; bool made_a_big_one = false; @@ -646,11 +638,11 @@ void MapgenValleys::generateCaves(s16 max_stone_y, s16 large_cave_depth) // lava_depth varies between one and ten as you approach // the bottom of the world. - s16 lava_depth = ceil((lava_max_height - node_min.Y + 1) * 10.f / map_gen_limit); + s16 lava_depth = ceil((lava_max_height - node_min.Y + 1) * 10.f / mapgen_limit); // This allows random lava spawns to be less common at the surface. s16 lava_chance = MYCUBE(lava_features_lim) * lava_depth; // water_depth varies between ten and one on the way down. - s16 water_depth = ceil((map_gen_limit - abs(node_min.Y) + 1) * 10.f / map_gen_limit); + s16 water_depth = ceil((mapgen_limit - abs(node_min.Y) + 1) * 10.f / mapgen_limit); // This allows random water spawns to be more common at the surface. s16 water_chance = MYCUBE(water_features_lim) * water_depth; diff --git a/src/mapgen_valleys.h b/src/mapgen_valleys.h index 6dd7ebc47..8a32a5a82 100644 --- a/src/mapgen_valleys.h +++ b/src/mapgen_valleys.h @@ -1,8 +1,7 @@ /* Minetest Valleys C -Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net> -Copyright (C) 2010-2015 paramat, Matt Gregory -Copyright (C) 2016 Duane Robertson <duane@duanerobertson.com> +Copyright (C) 2016-2017 Duane Robertson <duane@duanerobertson.com> +Copyright (C) 2016-2017 paramat Based on Valleys Mapgen by Gael de Sailly (https://forum.minetest.net/viewtopic.php?f=9&t=11430) @@ -101,8 +100,6 @@ public: private: BiomeGenOriginal *m_bgen; - float map_gen_limit; - bool humid_rivers; bool use_altitude_chill; float humidity_adjust; @@ -126,8 +123,6 @@ private: Noise *noise_valley_depth; Noise *noise_valley_profile; - content_t c_lava_source; - float terrainLevelAtPoint(s16 x, s16 z); void calculateNoise(); diff --git a/src/mapnode.cpp b/src/mapnode.cpp index 5efebf3d8..d835daba2 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapnode.h" #include "porting.h" #include "nodedef.h" +#include "map.h" #include "content_mapnode.h" // For mapnode_translate_*_internal #include "serialization.h" // For ser_ver_supported #include "util/serialize.h" @@ -54,6 +55,15 @@ MapNode::MapNode(INodeDefManager *ndef, const std::string &name, param2 = a_param2; } +void MapNode::getColor(const ContentFeatures &f, video::SColor *color) const +{ + if (f.palette) { + *color = (*f.palette)[param2]; + return; + } + *color = f.color; +} + void MapNode::setLight(enum LightBank bank, u8 a_light, const ContentFeatures &f) { // If node doesn't contain light data, ignore this @@ -145,7 +155,8 @@ bool MapNode::getLightBanks(u8 &lightday, u8 &lightnight, INodeDefManager *nodem u8 MapNode::getFaceDir(INodeDefManager *nodemgr) const { const ContentFeatures &f = nodemgr->get(*this); - if(f.param_type_2 == CPT2_FACEDIR) + if (f.param_type_2 == CPT2_FACEDIR || + f.param_type_2 == CPT2_COLORED_FACEDIR) return (getParam2() & 0x1F) % 24; return 0; } @@ -153,7 +164,8 @@ u8 MapNode::getFaceDir(INodeDefManager *nodemgr) const u8 MapNode::getWallMounted(INodeDefManager *nodemgr) const { const ContentFeatures &f = nodemgr->get(*this); - if(f.param_type_2 == CPT2_WALLMOUNTED) + if (f.param_type_2 == CPT2_WALLMOUNTED || + f.param_type_2 == CPT2_COLORED_WALLMOUNTED) return getParam2() & 0x07; return 0; } @@ -175,7 +187,7 @@ void MapNode::rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot) { ContentParamType2 cpt2 = nodemgr->get(*this).param_type_2; - if (cpt2 == CPT2_FACEDIR) { + if (cpt2 == CPT2_FACEDIR || cpt2 == CPT2_COLORED_FACEDIR) { static const u8 rotate_facedir[24 * 4] = { // Table value = rotated facedir // Columns: 0, 90, 180, 270 degrees rotation around vertical axis @@ -215,7 +227,8 @@ void MapNode::rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot) u8 index = facedir * 4 + rot; param2 &= ~31; param2 |= rotate_facedir[index]; - } else if (cpt2 == CPT2_WALLMOUNTED) { + } else if (cpt2 == CPT2_WALLMOUNTED || + cpt2 == CPT2_COLORED_WALLMOUNTED) { u8 wmountface = (param2 & 7); if (wmountface <= 1) return; @@ -453,6 +466,51 @@ void transformNodeBox(const MapNode &n, const NodeBox &nodebox, } } +static inline void getNeighborConnectingFace( + v3s16 p, INodeDefManager *nodedef, + Map *map, MapNode n, u8 bitmask, u8 *neighbors) +{ + MapNode n2 = map->getNodeNoEx(p); + if (nodedef->nodeboxConnects(n, n2, bitmask)) + *neighbors |= bitmask; +} + +u8 MapNode::getNeighbors(v3s16 p, Map *map) +{ + INodeDefManager *nodedef=map->getNodeDefManager(); + u8 neighbors = 0; + const ContentFeatures &f = nodedef->get(*this); + // locate possible neighboring nodes to connect to + if (f.drawtype == NDT_NODEBOX && f.node_box.type == NODEBOX_CONNECTED) { + v3s16 p2 = p; + + p2.Y++; + getNeighborConnectingFace(p2, nodedef, map, *this, 1, &neighbors); + + p2 = p; + p2.Y--; + getNeighborConnectingFace(p2, nodedef, map, *this, 2, &neighbors); + + p2 = p; + p2.Z--; + getNeighborConnectingFace(p2, nodedef, map, *this, 4, &neighbors); + + p2 = p; + p2.X--; + getNeighborConnectingFace(p2, nodedef, map, *this, 8, &neighbors); + + p2 = p; + p2.Z++; + getNeighborConnectingFace(p2, nodedef, map, *this, 16, &neighbors); + + p2 = p; + p2.X++; + getNeighborConnectingFace(p2, nodedef, map, *this, 32, &neighbors); + } + + return neighbors; +} + void MapNode::getNodeBoxes(INodeDefManager *nodemgr, std::vector<aabb3f> *boxes, u8 neighbors) { const ContentFeatures &f = nodemgr->get(*this); diff --git a/src/mapnode.h b/src/mapnode.h index 0bd61c554..9c56a7e17 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -20,14 +20,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef MAPNODE_HEADER #define MAPNODE_HEADER -#include "irrlichttypes.h" -#include "irr_v3d.h" -#include "irr_aabb3d.h" +#include "irrlichttypes_bloated.h" #include "light.h" #include <string> #include <vector> class INodeDefManager; +class Map; /* Naming scheme: @@ -142,11 +141,6 @@ struct MapNode MapNode() { } - MapNode(const MapNode & n) - { - *this = n; - } - MapNode(content_t content, u8 a_param1=0, u8 a_param2=0) : param0(content), param1(a_param1), @@ -191,6 +185,14 @@ struct MapNode param2 = p; } + /*! + * Returns the color of the node. + * + * \param f content features of this node + * \param color output, contains the node's color. + */ + void getColor(const ContentFeatures &f, video::SColor *color) const; + void setLight(enum LightBank bank, u8 a_light, const ContentFeatures &f); void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr); @@ -246,6 +248,13 @@ struct MapNode void rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot); + /*! + * Checks which neighbors does this node connect to. + * + * \param p coordinates of the node + */ + u8 getNeighbors(v3s16 p, Map *map); + /* Gets list of node boxes (used for rendering (NDT_NODEBOX)) */ diff --git a/src/mesh.cpp b/src/mesh.cpp index b68862d22..3ab67510a 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -33,13 +33,33 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MY_ETLM_READ_ONLY video::ETLM_READ_ONLY #endif -static void applyFacesShading(video::SColor& color, float factor) +inline static void applyShadeFactor(video::SColor& color, float factor) { color.setRed(core::clamp(core::round32(color.getRed()*factor), 0, 255)); color.setGreen(core::clamp(core::round32(color.getGreen()*factor), 0, 255)); color.setBlue(core::clamp(core::round32(color.getBlue()*factor), 0, 255)); } +void applyFacesShading(video::SColor &color, const v3f &normal) +{ + /* + Some drawtypes have normals set to (0, 0, 0), this must result in + maximum brightness: shade factor 1.0. + Shade factors for aligned cube faces are: + +Y 1.000000 sqrt(1.0) + -Y 0.447213 sqrt(0.2) + +-X 0.670820 sqrt(0.45) + +-Z 0.836660 sqrt(0.7) + */ + float x2 = normal.X * normal.X; + float y2 = normal.Y * normal.Y; + float z2 = normal.Z * normal.Z; + if (normal.Y < 0) + applyShadeFactor(color, 0.670820f * x2 + 0.447213f * y2 + 0.836660f * z2); + else if ((x2 > 1e-3) || (z2 > 1e-3)) + applyShadeFactor(color, 0.670820f * x2 + 1.000000f * y2 + 0.836660f * z2); +} + scene::IAnimatedMesh* createCubeMesh(v3f scale) { video::SColor c(255,255,255,255); @@ -155,6 +175,14 @@ void translateMesh(scene::IMesh *mesh, v3f vec) mesh->setBoundingBox(bbox); } +void setMeshBufferColor(scene::IMeshBuffer *buf, const video::SColor &color) +{ + const u32 stride = getVertexPitchFromType(buf->getVertexType()); + u32 vertex_count = buf->getVertexCount(); + u8 *vertices = (u8 *) buf->getVertices(); + for (u32 i = 0; i < vertex_count; i++) + ((video::S3DVertex *) (vertices + i * stride))->Color = color; +} void setMeshColor(scene::IMesh *mesh, const video::SColor &color) { @@ -162,42 +190,22 @@ void setMeshColor(scene::IMesh *mesh, const video::SColor &color) return; u32 mc = mesh->getMeshBufferCount(); - for (u32 j = 0; j < mc; j++) { - scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); - const u32 stride = getVertexPitchFromType(buf->getVertexType()); - u32 vertex_count = buf->getVertexCount(); - u8 *vertices = (u8 *)buf->getVertices(); - for (u32 i = 0; i < vertex_count; i++) - ((video::S3DVertex *)(vertices + i * stride))->Color = color; - } + for (u32 j = 0; j < mc; j++) + setMeshBufferColor(mesh->getMeshBuffer(j), color); } -void shadeMeshFaces(scene::IMesh *mesh) +void colorizeMeshBuffer(scene::IMeshBuffer *buf, const video::SColor *buffercolor) { - if (mesh == NULL) - return; - - u32 mc = mesh->getMeshBufferCount(); - for (u32 j = 0; j < mc; j++) { - scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); - const u32 stride = getVertexPitchFromType(buf->getVertexType()); - u32 vertex_count = buf->getVertexCount(); - u8 *vertices = (u8 *)buf->getVertices(); - for (u32 i = 0; i < vertex_count; i++) { - video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride); - video::SColor &vc = vertex->Color; - if (vertex->Normal.Y < -0.5) { - applyFacesShading (vc, 0.447213); - } else if (vertex->Normal.Z > 0.5) { - applyFacesShading (vc, 0.670820); - } else if (vertex->Normal.Z < -0.5) { - applyFacesShading (vc, 0.670820); - } else if (vertex->Normal.X > 0.5) { - applyFacesShading (vc, 0.836660); - } else if (vertex->Normal.X < -0.5) { - applyFacesShading (vc, 0.836660); - } - } + const u32 stride = getVertexPitchFromType(buf->getVertexType()); + u32 vertex_count = buf->getVertexCount(); + u8 *vertices = (u8 *) buf->getVertices(); + for (u32 i = 0; i < vertex_count; i++) { + video::S3DVertex *vertex = (video::S3DVertex *) (vertices + i * stride); + video::SColor *vc = &(vertex->Color); + // Reset color + *vc = *buffercolor; + // Apply shading + applyFacesShading(*vc, vertex->Normal); } } @@ -379,48 +387,52 @@ void recalculateBoundingBox(scene::IMesh *src_mesh) src_mesh->setBoundingBox(bbox); } -scene::IMesh* cloneMesh(scene::IMesh *src_mesh) +scene::IMeshBuffer* cloneMeshBuffer(scene::IMeshBuffer *mesh_buffer) +{ + switch (mesh_buffer->getVertexType()) { + case video::EVT_STANDARD: { + video::S3DVertex *v = (video::S3DVertex *) mesh_buffer->getVertices(); + u16 *indices = mesh_buffer->getIndices(); + scene::SMeshBuffer *cloned_buffer = new scene::SMeshBuffer(); + cloned_buffer->append(v, mesh_buffer->getVertexCount(), indices, + mesh_buffer->getIndexCount()); + return cloned_buffer; + } + case video::EVT_2TCOORDS: { + video::S3DVertex2TCoords *v = + (video::S3DVertex2TCoords *) mesh_buffer->getVertices(); + u16 *indices = mesh_buffer->getIndices(); + scene::SMeshBufferTangents *cloned_buffer = + new scene::SMeshBufferTangents(); + cloned_buffer->append(v, mesh_buffer->getVertexCount(), indices, + mesh_buffer->getIndexCount()); + return cloned_buffer; + } + case video::EVT_TANGENTS: { + video::S3DVertexTangents *v = + (video::S3DVertexTangents *) mesh_buffer->getVertices(); + u16 *indices = mesh_buffer->getIndices(); + scene::SMeshBufferTangents *cloned_buffer = + new scene::SMeshBufferTangents(); + cloned_buffer->append(v, mesh_buffer->getVertexCount(), indices, + mesh_buffer->getIndexCount()); + return cloned_buffer; + } + } + // This should not happen. + sanity_check(false); + return NULL; +} + +scene::SMesh* cloneMesh(scene::IMesh *src_mesh) { scene::SMesh* dst_mesh = new scene::SMesh(); for (u16 j = 0; j < src_mesh->getMeshBufferCount(); j++) { - scene::IMeshBuffer *buf = src_mesh->getMeshBuffer(j); - switch (buf->getVertexType()) { - case video::EVT_STANDARD: { - video::S3DVertex *v = - (video::S3DVertex *) buf->getVertices(); - u16 *indices = (u16*)buf->getIndices(); - scene::SMeshBuffer *temp_buf = new scene::SMeshBuffer(); - temp_buf->append(v, buf->getVertexCount(), - indices, buf->getIndexCount()); - dst_mesh->addMeshBuffer(temp_buf); - temp_buf->drop(); - break; - } - case video::EVT_2TCOORDS: { - video::S3DVertex2TCoords *v = - (video::S3DVertex2TCoords *) buf->getVertices(); - u16 *indices = (u16*)buf->getIndices(); - scene::SMeshBufferTangents *temp_buf = - new scene::SMeshBufferTangents(); - temp_buf->append(v, buf->getVertexCount(), - indices, buf->getIndexCount()); - dst_mesh->addMeshBuffer(temp_buf); - temp_buf->drop(); - break; - } - case video::EVT_TANGENTS: { - video::S3DVertexTangents *v = - (video::S3DVertexTangents *) buf->getVertices(); - u16 *indices = (u16*)buf->getIndices(); - scene::SMeshBufferTangents *temp_buf = - new scene::SMeshBufferTangents(); - temp_buf->append(v, buf->getVertexCount(), - indices, buf->getIndexCount()); - dst_mesh->addMeshBuffer(temp_buf); - temp_buf->drop(); - break; - } - } + scene::IMeshBuffer *temp_buf = cloneMeshBuffer( + src_mesh->getMeshBuffer(j)); + dst_mesh->addMeshBuffer(temp_buf); + temp_buf->drop(); + } return dst_mesh; } @@ -439,7 +451,7 @@ scene::IMesh* convertNodeboxesToMesh(const std::vector<aabb3f> &boxes, buf->drop(); } - video::SColor c(255,255,255,255); + video::SColor c(255,255,255,255); for (std::vector<aabb3f>::const_iterator i = boxes.begin(); @@ -526,7 +538,7 @@ scene::IMesh* convertNodeboxesToMesh(const std::vector<aabb3f> &boxes, buf->append(vertices + j, 4, indices, 6); } } - return dst_mesh; + return dst_mesh; } struct vcache diff --git a/src/mesh.h b/src/mesh.h index 10df97015..423e43aee 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -23,6 +23,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include "nodedef.h" +/*! + * Applies shading to a color based on the surface's + * normal vector. + */ +void applyFacesShading(video::SColor &color, const v3f &normal); + /* Create a new cube mesh. Vertices are at (+-scale.X/2, +-scale.Y/2, +-scale.Z/2). @@ -43,16 +49,21 @@ void scaleMesh(scene::IMesh *mesh, v3f scale); */ void translateMesh(scene::IMesh *mesh, v3f vec); +/*! + * Sets a constant color for all vertices in the mesh buffer. + */ +void setMeshBufferColor(scene::IMeshBuffer *buf, const video::SColor &color); + /* Set a constant color for all vertices in the mesh */ void setMeshColor(scene::IMesh *mesh, const video::SColor &color); -/* - Shade mesh faces according to their normals -*/ - -void shadeMeshFaces(scene::IMesh *mesh); +/*! + * Overwrites the color of a mesh buffer. + * The color is darkened based on the normal vector of the vertices. + */ +void colorizeMeshBuffer(scene::IMeshBuffer *buf, const video::SColor *buffercolor); /* Set the color of all vertices in the mesh. @@ -80,14 +91,20 @@ void rotateMeshBy6dFacedir(scene::IMesh *mesh, int facedir); void rotateMeshXYby (scene::IMesh *mesh, f64 degrees); void rotateMeshXZby (scene::IMesh *mesh, f64 degrees); void rotateMeshYZby (scene::IMesh *mesh, f64 degrees); + +/* + * Clone the mesh buffer. + * The returned pointer should be dropped. + */ +scene::IMeshBuffer* cloneMeshBuffer(scene::IMeshBuffer *mesh_buffer); /* Clone the mesh. */ -scene::IMesh* cloneMesh(scene::IMesh *src_mesh); +scene::SMesh* cloneMesh(scene::IMesh *src_mesh); /* - Convert nodeboxes to mesh. + Convert nodeboxes to mesh. Each tile goes into a different buffer. boxes - set of nodeboxes to be converted into cuboids uv_coords[24] - table of texture uv coords for each cuboid face expand - factor by which cuboids will be resized diff --git a/src/mesh_generator_thread.cpp b/src/mesh_generator_thread.cpp new file mode 100644 index 000000000..dce788a7c --- /dev/null +++ b/src/mesh_generator_thread.cpp @@ -0,0 +1,335 @@ +/* +Minetest +Copyright (C) 2013, 2017 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "mesh_generator_thread.h" +#include "settings.h" +#include "profiler.h" +#include "client.h" +#include "mapblock.h" +#include "map.h" + +/* + CachedMapBlockData +*/ + +CachedMapBlockData::CachedMapBlockData(): + p(-1337,-1337,-1337), + data(NULL), + refcount_from_queue(0), + last_used_timestamp(time(0)) +{ +} + +CachedMapBlockData::~CachedMapBlockData() +{ + assert(refcount_from_queue == 0); + + if (data) + delete[] data; +} + +/* + QueuedMeshUpdate +*/ + +QueuedMeshUpdate::QueuedMeshUpdate(): + p(-1337,-1337,-1337), + ack_block_to_server(false), + urgent(false), + crack_level(-1), + crack_pos(0,0,0), + data(NULL) +{ +} + +QueuedMeshUpdate::~QueuedMeshUpdate() +{ + if (data) + delete data; +} + +/* + MeshUpdateQueue +*/ + +MeshUpdateQueue::MeshUpdateQueue(Client *client): + m_client(client) +{ + m_cache_enable_shaders = g_settings->getBool("enable_shaders"); + m_cache_use_tangent_vertices = m_cache_enable_shaders && ( + g_settings->getBool("enable_bumpmapping") || + g_settings->getBool("enable_parallax_occlusion")); + m_cache_smooth_lighting = g_settings->getBool("smooth_lighting"); + m_meshgen_block_cache_size = g_settings->getS32("meshgen_block_cache_size"); +} + +MeshUpdateQueue::~MeshUpdateQueue() +{ + MutexAutoLock lock(m_mutex); + + for (std::map<v3s16, CachedMapBlockData *>::iterator i = m_cache.begin(); + i != m_cache.end(); ++i) { + delete i->second; + } + + for (std::vector<QueuedMeshUpdate*>::iterator i = m_queue.begin(); + i != m_queue.end(); ++i) { + QueuedMeshUpdate *q = *i; + delete q; + } +} + +void MeshUpdateQueue::addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent) +{ + DSTACK(FUNCTION_NAME); + + MutexAutoLock lock(m_mutex); + + cleanupCache(); + + /* + Cache the block data (force-update the center block, don't update the + neighbors but get them if they aren't already cached) + */ + std::vector<CachedMapBlockData*> cached_blocks; + size_t cache_hit_counter = 0; + cached_blocks.reserve(3*3*3); + v3s16 dp; + for (dp.X = -1; dp.X <= 1; dp.X++) + for (dp.Y = -1; dp.Y <= 1; dp.Y++) + for (dp.Z = -1; dp.Z <= 1; dp.Z++) { + v3s16 p1 = p + dp; + CachedMapBlockData *cached_block; + if (dp == v3s16(0, 0, 0)) + cached_block = cacheBlock(map, p1, FORCE_UPDATE); + else + cached_block = cacheBlock(map, p1, SKIP_UPDATE_IF_ALREADY_CACHED, + &cache_hit_counter); + cached_blocks.push_back(cached_block); + } + g_profiler->avg("MeshUpdateQueue MapBlock cache hit %", + 100.0f * cache_hit_counter / cached_blocks.size()); + + /* + Mark the block as urgent if requested + */ + if (urgent) + m_urgents.insert(p); + + /* + Find if block is already in queue. + If it is, update the data and quit. + */ + for (std::vector<QueuedMeshUpdate*>::iterator i = m_queue.begin(); + i != m_queue.end(); ++i) { + QueuedMeshUpdate *q = *i; + if (q->p == p) { + // NOTE: We are not adding a new position to the queue, thus + // refcount_from_queue stays the same. + if(ack_block_to_server) + q->ack_block_to_server = true; + q->crack_level = m_client->getCrackLevel(); + q->crack_pos = m_client->getCrackPos(); + return; + } + } + + /* + Add the block + */ + QueuedMeshUpdate *q = new QueuedMeshUpdate; + q->p = p; + q->ack_block_to_server = ack_block_to_server; + q->crack_level = m_client->getCrackLevel(); + q->crack_pos = m_client->getCrackPos(); + m_queue.push_back(q); + + // This queue entry is a new reference to the cached blocks + for (size_t i=0; i<cached_blocks.size(); i++) { + cached_blocks[i]->refcount_from_queue++; + } +} + +// Returned pointer must be deleted +// Returns NULL if queue is empty +QueuedMeshUpdate *MeshUpdateQueue::pop() +{ + MutexAutoLock lock(m_mutex); + + bool must_be_urgent = !m_urgents.empty(); + for (std::vector<QueuedMeshUpdate*>::iterator i = m_queue.begin(); + i != m_queue.end(); ++i) { + QueuedMeshUpdate *q = *i; + if(must_be_urgent && m_urgents.count(q->p) == 0) + continue; + m_queue.erase(i); + m_urgents.erase(q->p); + fillDataFromMapBlockCache(q); + return q; + } + return NULL; +} + +CachedMapBlockData* MeshUpdateQueue::cacheBlock(Map *map, v3s16 p, UpdateMode mode, + size_t *cache_hit_counter) +{ + std::map<v3s16, CachedMapBlockData*>::iterator it = + m_cache.find(p); + if (it != m_cache.end()) { + // Already in cache + CachedMapBlockData *cached_block = it->second; + if (mode == SKIP_UPDATE_IF_ALREADY_CACHED) { + if (cache_hit_counter) + (*cache_hit_counter)++; + return cached_block; + } + MapBlock *b = map->getBlockNoCreateNoEx(p); + if (b) { + if (cached_block->data == NULL) + cached_block->data = + new MapNode[MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE]; + memcpy(cached_block->data, b->getData(), + MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE * sizeof(MapNode)); + } else { + delete[] cached_block->data; + cached_block->data = NULL; + } + return cached_block; + } else { + // Not yet in cache + CachedMapBlockData *cached_block = new CachedMapBlockData(); + m_cache[p] = cached_block; + MapBlock *b = map->getBlockNoCreateNoEx(p); + if (b) { + cached_block->data = + new MapNode[MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE]; + memcpy(cached_block->data, b->getData(), + MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE * sizeof(MapNode)); + } + return cached_block; + } +} + +CachedMapBlockData* MeshUpdateQueue::getCachedBlock(const v3s16 &p) +{ + std::map<v3s16, CachedMapBlockData*>::iterator it = m_cache.find(p); + if (it != m_cache.end()) { + return it->second; + } + return NULL; +} + +void MeshUpdateQueue::fillDataFromMapBlockCache(QueuedMeshUpdate *q) +{ + MeshMakeData *data = new MeshMakeData(m_client, m_cache_enable_shaders, + m_cache_use_tangent_vertices); + q->data = data; + + data->fillBlockDataBegin(q->p); + + int t_now = time(0); + + // Collect data for 3*3*3 blocks from cache + v3s16 dp; + for (dp.X = -1; dp.X <= 1; dp.X++) + for (dp.Y = -1; dp.Y <= 1; dp.Y++) + for (dp.Z = -1; dp.Z <= 1; dp.Z++) { + v3s16 p = q->p + dp; + CachedMapBlockData *cached_block = getCachedBlock(p); + if (cached_block) { + cached_block->refcount_from_queue--; + cached_block->last_used_timestamp = t_now; + if (cached_block->data) + data->fillBlockData(dp, cached_block->data); + } + } + + data->setCrack(q->crack_level, q->crack_pos); + data->setSmoothLighting(m_cache_smooth_lighting); +} + +void MeshUpdateQueue::cleanupCache() +{ + const int mapblock_kB = MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE * + sizeof(MapNode) / 1000; + g_profiler->avg("MeshUpdateQueue MapBlock cache size kB", + mapblock_kB * m_cache.size()); + + // The cache size is kept roughly below cache_soft_max_size, not letting + // anything get older than cache_seconds_max or deleted before 2 seconds. + const int cache_seconds_max = 10; + const int cache_soft_max_size = m_meshgen_block_cache_size * 1000 / mapblock_kB; + int cache_seconds = MYMAX(2, cache_seconds_max - + m_cache.size() / (cache_soft_max_size / cache_seconds_max)); + + int t_now = time(0); + + for (std::map<v3s16, CachedMapBlockData*>::iterator it = m_cache.begin(); + it != m_cache.end(); ) { + CachedMapBlockData *cached_block = it->second; + if (cached_block->refcount_from_queue == 0 && + cached_block->last_used_timestamp < t_now - cache_seconds) { + m_cache.erase(it++); + delete cached_block; + } else { + ++it; + } + } +} + +/* + MeshUpdateThread +*/ + +MeshUpdateThread::MeshUpdateThread(Client *client): + UpdateThread("Mesh"), + m_queue_in(client) +{ + m_generation_interval = g_settings->getU16("mesh_generation_interval"); + m_generation_interval = rangelim(m_generation_interval, 0, 50); +} + +void MeshUpdateThread::updateBlock(Map *map, v3s16 p, bool ack_block_to_server, + bool urgent) +{ + // Allow the MeshUpdateQueue to do whatever it wants + m_queue_in.addBlock(map, p, ack_block_to_server, urgent); + deferUpdate(); +} + +void MeshUpdateThread::doUpdate() +{ + QueuedMeshUpdate *q; + while ((q = m_queue_in.pop())) { + if (m_generation_interval) + sleep_ms(m_generation_interval); + ScopeProfiler sp(g_profiler, "Client: Mesh making"); + + MapBlockMesh *mesh_new = new MapBlockMesh(q->data, m_camera_offset); + + MeshUpdateResult r; + r.p = q->p; + r.mesh = mesh_new; + r.ack_block_to_server = q->ack_block_to_server; + + m_queue_out.push_back(r); + + delete q; + } +} diff --git a/src/mesh_generator_thread.h b/src/mesh_generator_thread.h new file mode 100644 index 000000000..6edb6906d --- /dev/null +++ b/src/mesh_generator_thread.h @@ -0,0 +1,135 @@ +/* +Minetest +Copyright (C) 2013, 2017 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MESH_GENERATOR_THREAD_HEADER +#define MESH_GENERATOR_THREAD_HEADER + +#include "mapblock_mesh.h" +#include "threading/mutex_auto_lock.h" +#include "util/thread.h" + +struct CachedMapBlockData +{ + v3s16 p; + MapNode *data; // A copy of the MapBlock's data member + int refcount_from_queue; + int last_used_timestamp; + + CachedMapBlockData(); + ~CachedMapBlockData(); +}; + +struct QueuedMeshUpdate +{ + v3s16 p; + bool ack_block_to_server; + bool urgent; + int crack_level; + v3s16 crack_pos; + MeshMakeData *data; // This is generated in MeshUpdateQueue::pop() + + QueuedMeshUpdate(); + ~QueuedMeshUpdate(); +}; + +/* + A thread-safe queue of mesh update tasks and a cache of MapBlock data +*/ +class MeshUpdateQueue +{ + enum UpdateMode + { + FORCE_UPDATE, + SKIP_UPDATE_IF_ALREADY_CACHED, + }; + +public: + MeshUpdateQueue(Client *client); + + ~MeshUpdateQueue(); + + // Caches the block at p and its neighbors (if needed) and queues a mesh + // update for the block at p + void addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent); + + // Returned pointer must be deleted + // Returns NULL if queue is empty + QueuedMeshUpdate *pop(); + + u32 size() + { + MutexAutoLock lock(m_mutex); + return m_queue.size(); + } + +private: + Client *m_client; + std::vector<QueuedMeshUpdate *> m_queue; + std::set<v3s16> m_urgents; + std::map<v3s16, CachedMapBlockData *> m_cache; + Mutex m_mutex; + + // TODO: Add callback to update these when g_settings changes + bool m_cache_enable_shaders; + bool m_cache_use_tangent_vertices; + bool m_cache_smooth_lighting; + int m_meshgen_block_cache_size; + + CachedMapBlockData *cacheBlock(Map *map, v3s16 p, UpdateMode mode, + size_t *cache_hit_counter = NULL); + CachedMapBlockData *getCachedBlock(const v3s16 &p); + void fillDataFromMapBlockCache(QueuedMeshUpdate *q); + void cleanupCache(); +}; + +struct MeshUpdateResult +{ + v3s16 p; + MapBlockMesh *mesh; + bool ack_block_to_server; + + MeshUpdateResult() + : p(-1338, -1338, -1338), mesh(NULL), ack_block_to_server(false) + { + } +}; + +class MeshUpdateThread : public UpdateThread +{ +public: + MeshUpdateThread(Client *client); + + // Caches the block at p and its neighbors (if needed) and queues a mesh + // update for the block at p + void updateBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent); + + v3s16 m_camera_offset; + MutexedQueue<MeshUpdateResult> m_queue_out; + +private: + MeshUpdateQueue m_queue_in; + + // TODO: Add callback to update these when g_settings changes + int m_generation_interval; + +protected: + virtual void doUpdate(); +}; + +#endif diff --git a/src/metadata.cpp b/src/metadata.cpp new file mode 100644 index 000000000..833735464 --- /dev/null +++ b/src/metadata.cpp @@ -0,0 +1,108 @@ +/* +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "metadata.h" +#include "exceptions.h" +#include "gamedef.h" +#include "log.h" +#include <sstream> +#include "constants.h" // MAP_BLOCKSIZE +#include <sstream> + +/* + Metadata +*/ + +void Metadata::clear() +{ + m_stringvars.clear(); +} + +bool Metadata::empty() const +{ + return m_stringvars.size() == 0; +} + +size_t Metadata::size() const +{ + return m_stringvars.size(); +} + +bool Metadata::contains(const std::string &name) const +{ + return m_stringvars.find(name) != m_stringvars.end(); +} + +bool Metadata::operator==(const Metadata &other) const +{ + if (size() != other.size()) + return false; + + for (StringMap::const_iterator it = m_stringvars.begin(); + it != m_stringvars.end(); ++it) { + if (!other.contains(it->first) || + other.getString(it->first) != it->second) + return false; + } + + return true; +} + +const std::string &Metadata::getString(const std::string &name, u16 recursion) const +{ + StringMap::const_iterator it = m_stringvars.find(name); + if (it == m_stringvars.end()) { + static const std::string empty_string = std::string(""); + return empty_string; + } + + return resolveString(it->second, recursion); +} + +/** + * Sets var to name key in the metadata storage + * + * @param name + * @param var + * @return true if key-value pair is created or changed + */ +bool Metadata::setString(const std::string &name, const std::string &var) +{ + if (var.empty()) { + m_stringvars.erase(name); + return true; + } + + StringMap::iterator it = m_stringvars.find(name); + if (it != m_stringvars.end() && it->second == var) { + return false; + } + + m_stringvars[name] = var; + return true; +} + +const std::string &Metadata::resolveString(const std::string &str, u16 recursion) const +{ + if (recursion <= 1 && str.substr(0, 2) == "${" && str[str.length() - 1] == '}') { + return getString(str.substr(2, str.length() - 3), recursion + 1); + } else { + return str; + } +} diff --git a/src/metadata.h b/src/metadata.h new file mode 100644 index 000000000..a8270b4c4 --- /dev/null +++ b/src/metadata.h @@ -0,0 +1,61 @@ +/* +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef METADATA_HEADER +#define METADATA_HEADER + +#include "irr_v3d.h" +#include <iostream> +#include <vector> +#include "util/string.h" + +class Metadata +{ +public: + virtual ~Metadata() {} + + virtual void clear(); + virtual bool empty() const; + + bool operator==(const Metadata &other) const; + inline bool operator!=(const Metadata &other) const + { + return !(*this == other); + } + + // + // Key-value related + // + + size_t size() const; + bool contains(const std::string &name) const; + const std::string &getString(const std::string &name, u16 recursion = 0) const; + virtual bool setString(const std::string &name, const std::string &var); + const StringMap &getStrings() const + { + return m_stringvars; + } + // Add support for variable names in values + const std::string &resolveString(const std::string &str, u16 recursion = 0) const; +protected: + StringMap m_stringvars; + +}; + +#endif diff --git a/src/mg_biome.cpp b/src/mg_biome.cpp index 78034bf6c..2ef2ed16a 100644 --- a/src/mg_biome.cpp +++ b/src/mg_biome.cpp @@ -1,6 +1,7 @@ /* Minetest -Copyright (C) 2010-2013 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -20,12 +21,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mg_biome.h" #include "mg_decoration.h" #include "emerge.h" -#include "gamedef.h" +#include "server.h" #include "nodedef.h" #include "map.h" //for MMVManip -#include "log.h" #include "util/numeric.h" -#include "util/mathconstants.h" #include "porting.h" #include "settings.h" @@ -33,10 +32,10 @@ with this program; if not, write to the Free Software Foundation, Inc., /////////////////////////////////////////////////////////////////////////////// -BiomeManager::BiomeManager(IGameDef *gamedef) : - ObjDefManager(gamedef, OBJDEF_BIOME) +BiomeManager::BiomeManager(Server *server) : + ObjDefManager(server, OBJDEF_BIOME) { - m_gamedef = gamedef; + m_server = server; // Create default biome to be used in case none exist Biome *b = new Biome; @@ -73,7 +72,7 @@ BiomeManager::~BiomeManager() void BiomeManager::clear() { - EmergeManager *emerge = m_gamedef->getEmergeManager(); + EmergeManager *emerge = m_server->getEmergeManager(); // Remove all dangling references in Decorations DecorationManager *decomgr = emerge->decomgr; diff --git a/src/mg_biome.h b/src/mg_biome.h index a10193bc3..2e07fd9cf 100644 --- a/src/mg_biome.h +++ b/src/mg_biome.h @@ -1,6 +1,7 @@ /* Minetest -Copyright (C) 2010-2013 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -24,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include "noise.h" +class Server; class Settings; class BiomeManager; @@ -186,7 +188,7 @@ private: class BiomeManager : public ObjDefManager { public: - BiomeManager(IGameDef *gamedef); + BiomeManager(Server *server); virtual ~BiomeManager(); const char *getObjectTitle() const @@ -223,7 +225,7 @@ public: virtual void clear(); private: - IGameDef *m_gamedef; + Server *m_server; }; diff --git a/src/mg_decoration.cpp b/src/mg_decoration.cpp index 51e4fbbcc..b0566e830 100644 --- a/src/mg_decoration.cpp +++ b/src/mg_decoration.cpp @@ -1,6 +1,7 @@ /* Minetest -Copyright (C) 2010-2014 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2015-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -24,6 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "log.h" #include "util/numeric.h" +#include <algorithm> + FlagDesc flagdesc_deco[] = { {"place_center_x", DECO_PLACE_CENTER_X}, diff --git a/src/mg_decoration.h b/src/mg_decoration.h index 986328ec3..950800ec8 100644 --- a/src/mg_decoration.h +++ b/src/mg_decoration.h @@ -1,6 +1,7 @@ /* Minetest -Copyright (C) 2010-2013 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2015-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by diff --git a/src/mg_ore.cpp b/src/mg_ore.cpp index d840d745a..89319238e 100644 --- a/src/mg_ore.cpp +++ b/src/mg_ore.cpp @@ -1,6 +1,7 @@ /* Minetest -Copyright (C) 2010-2014 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2015-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -20,9 +21,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mg_ore.h" #include "mapgen.h" #include "noise.h" -#include "util/numeric.h" #include "map.h" #include "log.h" +#include <algorithm> + FlagDesc flagdesc_ore[] = { {"absheight", OREFLAG_ABSHEIGHT}, diff --git a/src/mg_ore.h b/src/mg_ore.h index e95fdd330..0503a6ca0 100644 --- a/src/mg_ore.h +++ b/src/mg_ore.h @@ -1,6 +1,7 @@ /* Minetest -Copyright (C) 2010-2013 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2015-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by diff --git a/src/mg_schematic.cpp b/src/mg_schematic.cpp index e028215dc..67931497f 100644 --- a/src/mg_schematic.cpp +++ b/src/mg_schematic.cpp @@ -1,6 +1,7 @@ /* Minetest -Copyright (C) 2010-2014 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2015-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -20,7 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <fstream> #include <typeinfo> #include "mg_schematic.h" -#include "gamedef.h" +#include "server.h" #include "mapgen.h" #include "emerge.h" #include "map.h" @@ -30,20 +31,21 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/serialize.h" #include "serialization.h" #include "filesys.h" +#include "voxelalgorithms.h" /////////////////////////////////////////////////////////////////////////////// -SchematicManager::SchematicManager(IGameDef *gamedef) : - ObjDefManager(gamedef, OBJDEF_SCHEMATIC) +SchematicManager::SchematicManager(Server *server) : + ObjDefManager(server, OBJDEF_SCHEMATIC) { - m_gamedef = gamedef; + m_server = server; } void SchematicManager::clear() { - EmergeManager *emerge = m_gamedef->getEmergeManager(); + EmergeManager *emerge = m_server->getEmergeManager(); // Remove all dangling references in Decorations DecorationManager *decomgr = emerge->decomgr; @@ -202,7 +204,7 @@ bool Schematic::placeOnVManip(MMVManip *vm, v3s16 p, u32 flags, return vm->m_area.contains(VoxelArea(p, p + s - v3s16(1,1,1))); } -void Schematic::placeOnMap(Map *map, v3s16 p, u32 flags, +void Schematic::placeOnMap(ServerMap *map, v3s16 p, u32 flags, Rotation rot, bool force_place) { std::map<v3s16, MapBlock *> lighting_modified_blocks; @@ -238,15 +240,10 @@ void Schematic::placeOnMap(Map *map, v3s16 p, u32 flags, blitToVManip(&vm, p, rot, force_place); - vm.blitBackAll(&modified_blocks); + voxalgo::blit_back_with_light(map, &vm, &modified_blocks); //// Carry out post-map-modification actions - //// Update lighting - // TODO: Optimize this by using Mapgen::calcLighting() instead - lighting_modified_blocks.insert(modified_blocks.begin(), modified_blocks.end()); - map->updateLighting(lighting_modified_blocks, modified_blocks); - //// Create & dispatch map modification events to observers MapEditEvent event; event.type = MEET_OTHER; diff --git a/src/mg_schematic.h b/src/mg_schematic.h index da8859540..db040343c 100644 --- a/src/mg_schematic.h +++ b/src/mg_schematic.h @@ -1,6 +1,7 @@ /* Minetest -Copyright (C) 2010-2013 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net> +Copyright (C) 2015-2017 paramat This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -25,11 +26,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" class Map; +class ServerMap; class Mapgen; class MMVManip; class PseudoRandom; class NodeResolver; -class IGameDef; +class Server; /* Minetest Schematic File Format @@ -108,7 +110,7 @@ public: void blitToVManip(MMVManip *vm, v3s16 p, Rotation rot, bool force_place); bool placeOnVManip(MMVManip *vm, v3s16 p, u32 flags, Rotation rot, bool force_place); - void placeOnMap(Map *map, v3s16 p, u32 flags, Rotation rot, bool force_place); + void placeOnMap(ServerMap *map, v3s16 p, u32 flags, Rotation rot, bool force_place); void applyProbabilities(v3s16 p0, std::vector<std::pair<v3s16, u8> > *plist, @@ -123,7 +125,7 @@ public: class SchematicManager : public ObjDefManager { public: - SchematicManager(IGameDef *gamedef); + SchematicManager(Server *server); virtual ~SchematicManager() {} virtual void clear(); @@ -139,7 +141,7 @@ public: } private: - IGameDef *m_gamedef; + Server *m_server; }; void generate_nodelist_and_update_ids(MapNode *nodes, size_t nodecount, diff --git a/src/minimap.cpp b/src/minimap.cpp index 8cd0a7beb..500f49828 100644 --- a/src/minimap.cpp +++ b/src/minimap.cpp @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" #include "util/numeric.h" #include "util/string.h" +#include "mapblock.h" #include <math.h> @@ -104,7 +105,7 @@ void MinimapUpdateThread::doUpdate() // Swap two values in the map using single lookup std::pair<std::map<v3s16, MinimapMapblock*>::iterator, bool> result = m_blocks_cache.insert(std::make_pair(update.pos, update.data)); - if (result.second == false) { + if (!result.second) { delete result.first->second; result.first->second = update.data; } @@ -119,89 +120,63 @@ void MinimapUpdateThread::doUpdate() } if (data->map_invalidated && data->mode != MINIMAP_MODE_OFF) { - getMap(data->pos, data->map_size, data->scan_height, data->is_radar); + getMap(data->pos, data->map_size, data->scan_height); data->map_invalidated = false; } } -MinimapPixel *MinimapUpdateThread::getMinimapPixel(v3s16 pos, - s16 scan_height, s16 *pixel_height) +void MinimapUpdateThread::getMap(v3s16 pos, s16 size, s16 height) { - s16 height = scan_height - MAP_BLOCKSIZE; - v3s16 blockpos_max, blockpos_min, relpos; - - getNodeBlockPosWithOffset( - v3s16(pos.X, pos.Y - scan_height / 2, pos.Z), - blockpos_min, relpos); - getNodeBlockPosWithOffset( - v3s16(pos.X, pos.Y + scan_height / 2, pos.Z), - blockpos_max, relpos); - - for (s16 i = blockpos_max.Y; i > blockpos_min.Y - 1; i--) { - std::map<v3s16, MinimapMapblock *>::iterator it = - m_blocks_cache.find(v3s16(blockpos_max.X, i, blockpos_max.Z)); - if (it != m_blocks_cache.end()) { - MinimapMapblock *mmblock = it->second; - MinimapPixel *pixel = &mmblock->data[relpos.Z * MAP_BLOCKSIZE + relpos.X]; - if (pixel->id != CONTENT_AIR) { - *pixel_height = height + pixel->height; - return pixel; - } - } - - height -= MAP_BLOCKSIZE; - } - - return NULL; -} - -s16 MinimapUpdateThread::getAirCount(v3s16 pos, s16 height) -{ - s16 air_count = 0; - v3s16 blockpos_max, blockpos_min, relpos; - - getNodeBlockPosWithOffset( - v3s16(pos.X, pos.Y - height / 2, pos.Z), - blockpos_min, relpos); - getNodeBlockPosWithOffset( - v3s16(pos.X, pos.Y + height / 2, pos.Z), - blockpos_max, relpos); - - for (s16 i = blockpos_max.Y; i > blockpos_min.Y - 1; i--) { - std::map<v3s16, MinimapMapblock *>::iterator it = - m_blocks_cache.find(v3s16(blockpos_max.X, i, blockpos_max.Z)); - if (it != m_blocks_cache.end()) { - MinimapMapblock *mmblock = it->second; - MinimapPixel *pixel = &mmblock->data[relpos.Z * MAP_BLOCKSIZE + relpos.X]; - air_count += pixel->air_count; - } + v3s16 region(size, 0, size); + v3s16 pos_min(pos.X - size / 2, pos.Y - height / 2, pos.Z - size / 2); + v3s16 pos_max(pos_min.X + size - 1, pos.Y + height / 2, pos_min.Z + size - 1); + v3s16 blockpos_min = getNodeBlockPos(pos_min); + v3s16 blockpos_max = getNodeBlockPos(pos_max); + +// clear the map + for (int z = 0; z < size; z++) + for (int x = 0; x < size; x++) { + MinimapPixel &mmpixel = data->minimap_scan[x + z * size]; + mmpixel.air_count = 0; + mmpixel.height = 0; + mmpixel.n = MapNode(CONTENT_AIR); } - return air_count; -} - -void MinimapUpdateThread::getMap(v3s16 pos, s16 size, s16 height, bool is_radar) -{ - v3s16 p = v3s16(pos.X - size / 2, pos.Y, pos.Z - size / 2); - - for (s16 x = 0; x < size; x++) - for (s16 z = 0; z < size; z++) { - u16 id = CONTENT_AIR; - MinimapPixel *mmpixel = &data->minimap_scan[x + z * size]; - - if (!is_radar) { - s16 pixel_height = 0; - MinimapPixel *cached_pixel = - getMinimapPixel(v3s16(p.X + x, p.Y, p.Z + z), height, &pixel_height); - if (cached_pixel) { - id = cached_pixel->id; - mmpixel->height = pixel_height; +// draw the map + v3s16 blockpos; + for (blockpos.Z = blockpos_min.Z; blockpos.Z <= blockpos_max.Z; ++blockpos.Z) + for (blockpos.Y = blockpos_min.Y; blockpos.Y <= blockpos_max.Y; ++blockpos.Y) + for (blockpos.X = blockpos_min.X; blockpos.X <= blockpos_max.X; ++blockpos.X) { + std::map<v3s16, MinimapMapblock *>::const_iterator pblock = + m_blocks_cache.find(blockpos); + if (pblock == m_blocks_cache.end()) + continue; + const MinimapMapblock &block = *pblock->second; + + v3s16 block_node_min(blockpos * MAP_BLOCKSIZE); + v3s16 block_node_max(block_node_min + MAP_BLOCKSIZE - 1); + // clip + v3s16 range_min = componentwise_max(block_node_min, pos_min); + v3s16 range_max = componentwise_min(block_node_max, pos_max); + + v3s16 pos; + pos.Y = range_min.Y; + for (pos.Z = range_min.Z; pos.Z <= range_max.Z; ++pos.Z) + for (pos.X = range_min.X; pos.X <= range_max.X; ++pos.X) { + v3s16 inblock_pos = pos - block_node_min; + const MinimapPixel &in_pixel = + block.data[inblock_pos.Z * MAP_BLOCKSIZE + inblock_pos.X]; + + v3s16 inmap_pos = pos - pos_min; + MinimapPixel &out_pixel = + data->minimap_scan[inmap_pos.X + inmap_pos.Z * size]; + + out_pixel.air_count += in_pixel.air_count; + if (in_pixel.n.param0 != CONTENT_AIR) { + out_pixel.n = in_pixel.n; + out_pixel.height = inmap_pos.Y + in_pixel.height; } - } else { - mmpixel->air_count = getAirCount(v3s16(p.X + x, p.Y, p.Z + z), height); } - - mmpixel->id = id; } } @@ -209,7 +184,7 @@ void MinimapUpdateThread::getMap(v3s16 pos, s16 size, s16 height, bool is_radar) //// Mapper //// -Mapper::Mapper(IrrlichtDevice *device, Client *client) +Minimap::Minimap(IrrlichtDevice *device, Client *client) { this->client = client; this->driver = device->getVideoDriver(); @@ -263,7 +238,7 @@ Mapper::Mapper(IrrlichtDevice *device, Client *client) m_minimap_update_thread->start(); } -Mapper::~Mapper() +Minimap::~Minimap() { m_minimap_update_thread->stop(); m_minimap_update_thread->wait(); @@ -283,17 +258,12 @@ Mapper::~Mapper() delete m_minimap_update_thread; } -void Mapper::addBlock(v3s16 pos, MinimapMapblock *data) +void Minimap::addBlock(v3s16 pos, MinimapMapblock *data) { m_minimap_update_thread->enqueueBlock(pos, data); } -MinimapMode Mapper::getMinimapMode() -{ - return data->mode; -} - -void Mapper::toggleMinimapShape() +void Minimap::toggleMinimapShape() { MutexAutoLock lock(m_mutex); @@ -302,7 +272,29 @@ void Mapper::toggleMinimapShape() m_minimap_update_thread->deferUpdate(); } -void Mapper::setMinimapMode(MinimapMode mode) +void Minimap::setMinimapShape(MinimapShape shape) +{ + MutexAutoLock lock(m_mutex); + + if (shape == MINIMAP_SHAPE_SQUARE) + data->minimap_shape_round = false; + else if (shape == MINIMAP_SHAPE_ROUND) + data->minimap_shape_round = true; + + g_settings->setBool("minimap_shape_round", data->minimap_shape_round); + m_minimap_update_thread->deferUpdate(); +} + +MinimapShape Minimap::getMinimapShape() +{ + if (data->minimap_shape_round) { + return MINIMAP_SHAPE_ROUND; + } else { + return MINIMAP_SHAPE_SQUARE; + } +} + +void Minimap::setMinimapMode(MinimapMode mode) { static const MinimapModeDef modedefs[MINIMAP_MODE_COUNT] = { {false, 0, 0}, @@ -327,7 +319,7 @@ void Mapper::setMinimapMode(MinimapMode mode) m_minimap_update_thread->deferUpdate(); } -void Mapper::setPos(v3s16 pos) +void Minimap::setPos(v3s16 pos) { bool do_update = false; @@ -345,36 +337,51 @@ void Mapper::setPos(v3s16 pos) m_minimap_update_thread->deferUpdate(); } -void Mapper::setAngle(f32 angle) +void Minimap::setAngle(f32 angle) { m_angle = angle; } -void Mapper::blitMinimapPixelsToImageRadar(video::IImage *map_image) +void Minimap::blitMinimapPixelsToImageRadar(video::IImage *map_image) { + video::SColor c(240, 0, 0, 0); for (s16 x = 0; x < data->map_size; x++) for (s16 z = 0; z < data->map_size; z++) { MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->map_size]; - video::SColor c(240, 0, 0, 0); if (mmpixel->air_count > 0) c.setGreen(core::clamp(core::round32(32 + mmpixel->air_count * 8), 0, 255)); + else + c.setGreen(0); map_image->setPixel(x, data->map_size - z - 1, c); } } -void Mapper::blitMinimapPixelsToImageSurface( +void Minimap::blitMinimapPixelsToImageSurface( video::IImage *map_image, video::IImage *heightmap_image) { + // This variable creation/destruction has a 1% cost on rendering minimap + video::SColor tilecolor; for (s16 x = 0; x < data->map_size; x++) for (s16 z = 0; z < data->map_size; z++) { MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->map_size]; - video::SColor c = m_ndef->get(mmpixel->id).minimap_color; - c.setAlpha(240); + const ContentFeatures &f = m_ndef->get(mmpixel->n); + const TileDef *tile = &f.tiledef[0]; - map_image->setPixel(x, data->map_size - z - 1, c); + // Color of the 0th tile (mostly this is the topmost) + if(tile->has_color) + tilecolor = tile->color; + else + mmpixel->n.getColor(f, &tilecolor); + + tilecolor.setRed(tilecolor.getRed() * f.minimap_color.getRed() / 255); + tilecolor.setGreen(tilecolor.getGreen() * f.minimap_color.getGreen() / 255); + tilecolor.setBlue(tilecolor.getBlue() * f.minimap_color.getBlue() / 255); + tilecolor.setAlpha(240); + + map_image->setPixel(x, data->map_size - z - 1, tilecolor); u32 h = mmpixel->height; heightmap_image->setPixel(x,data->map_size - z - 1, @@ -382,7 +389,7 @@ void Mapper::blitMinimapPixelsToImageSurface( } } -video::ITexture *Mapper::getMinimapTexture() +video::ITexture *Minimap::getMinimapTexture() { // update minimap textures when new scan is ready if (data->map_invalidated) @@ -410,7 +417,7 @@ video::ITexture *Mapper::getMinimapTexture() if (minimap_mask) { for (s16 y = 0; y < MINIMAP_MAX_SY; y++) for (s16 x = 0; x < MINIMAP_MAX_SX; x++) { - video::SColor mask_col = minimap_mask->getPixel(x, y); + const video::SColor &mask_col = minimap_mask->getPixel(x, y); if (!mask_col.getAlpha()) minimap_image->setPixel(x, y, video::SColor(0,0,0,0)); } @@ -432,7 +439,7 @@ video::ITexture *Mapper::getMinimapTexture() return data->texture; } -v3f Mapper::getYawVec() +v3f Minimap::getYawVec() { if (data->minimap_shape_round) { return v3f( @@ -444,12 +451,12 @@ v3f Mapper::getYawVec() } } -scene::SMeshBuffer *Mapper::getMinimapMeshBuffer() +scene::SMeshBuffer *Minimap::getMinimapMeshBuffer() { scene::SMeshBuffer *buf = new scene::SMeshBuffer(); buf->Vertices.set_used(4); buf->Indices.set_used(6); - video::SColor c(255, 255, 255, 255); + static const video::SColor c(255, 255, 255, 255); buf->Vertices[0] = video::S3DVertex(-1, -1, 0, 0, 0, 1, c, 0, 1); buf->Vertices[1] = video::S3DVertex(-1, 1, 0, 0, 0, 1, c, 0, 0); @@ -466,7 +473,7 @@ scene::SMeshBuffer *Mapper::getMinimapMeshBuffer() return buf; } -void Mapper::drawMinimap() +void Minimap::drawMinimap() { video::ITexture *minimap_texture = getMinimapTexture(); if (!minimap_texture) @@ -564,20 +571,18 @@ void Mapper::drawMinimap() } } -void Mapper::updateActiveMarkers () +void Minimap::updateActiveMarkers() { video::IImage *minimap_mask = data->minimap_shape_round ? data->minimap_mask_round : data->minimap_mask_square; - std::list<Nametag *> *nametags = client->getCamera()->getNametags(); + const std::list<Nametag *> &nametags = client->getCamera()->getNametags(); m_active_markers.clear(); - for (std::list<Nametag *>::const_iterator - i = nametags->begin(); - i != nametags->end(); ++i) { - Nametag *nametag = *i; - v3s16 pos = floatToInt(nametag->parent_node->getPosition() + + for (std::list<Nametag *>::const_iterator i = nametags.begin(); + i != nametags.end(); ++i) { + v3s16 pos = floatToInt((*i)->parent_node->getPosition() + intToFloat(client->getCamera()->getOffset(), BS), BS); pos -= data->pos - v3s16(data->map_size / 2, data->scan_height / 2, @@ -589,7 +594,7 @@ void Mapper::updateActiveMarkers () } pos.X = ((float)pos.X / data->map_size) * MINIMAP_MAX_SX; pos.Z = ((float)pos.Z / data->map_size) * MINIMAP_MAX_SY; - video::SColor mask_col = minimap_mask->getPixel(pos.X, pos.Z); + const video::SColor &mask_col = minimap_mask->getPixel(pos.X, pos.Z); if (!mask_col.getAlpha()) { continue; } @@ -616,7 +621,7 @@ void MinimapMapblock::getMinimapNodes(VoxelManipulator *vmanip, v3s16 pos) MapNode n = vmanip->getNodeNoEx(pos + p); if (!surface_found && n.getContent() != CONTENT_AIR) { mmpixel->height = y; - mmpixel->id = n.getContent(); + mmpixel->n = n; surface_found = true; } else if (n.getContent() == CONTENT_AIR) { air_count++; @@ -624,7 +629,7 @@ void MinimapMapblock::getMinimapNodes(VoxelManipulator *vmanip, v3s16 pos) } if (!surface_found) - mmpixel->id = CONTENT_AIR; + mmpixel->n = MapNode(CONTENT_AIR); mmpixel->air_count = air_count; } diff --git a/src/minimap.h b/src/minimap.h index 743b2bff2..c50530335 100644 --- a/src/minimap.h +++ b/src/minimap.h @@ -45,6 +45,11 @@ enum MinimapMode { MINIMAP_MODE_COUNT, }; +enum MinimapShape { + MINIMAP_SHAPE_SQUARE, + MINIMAP_SHAPE_ROUND, +}; + struct MinimapModeDef { bool is_radar; u16 scan_height; @@ -52,10 +57,10 @@ struct MinimapModeDef { }; struct MinimapPixel { - u16 id; + //! The topmost node that the minimap displays. + MapNode n; u16 height; u16 air_count; - u16 light; }; struct MinimapMapblock { @@ -96,13 +101,8 @@ public: MinimapUpdateThread() : UpdateThread("Minimap") {} virtual ~MinimapUpdateThread(); - void getMap(v3s16 pos, s16 size, s16 height, bool radar); - MinimapPixel *getMinimapPixel(v3s16 pos, s16 height, s16 *pixel_height); - s16 getAirCount(v3s16 pos, s16 height); - video::SColor getColorFromId(u16 id); - + void getMap(v3s16 pos, s16 size, s16 height); void enqueueBlock(v3s16 pos, MinimapMapblock *data); - bool pushBlockUpdate(v3s16 pos, MinimapMapblock *data); bool popBlockUpdate(QueuedMinimapUpdate *update); @@ -117,20 +117,24 @@ private: std::map<v3s16, MinimapMapblock *> m_blocks_cache; }; -class Mapper { +class Minimap { public: - Mapper(IrrlichtDevice *device, Client *client); - ~Mapper(); + Minimap(IrrlichtDevice *device, Client *client); + ~Minimap(); void addBlock(v3s16 pos, MinimapMapblock *data); v3f getYawVec(); - MinimapMode getMinimapMode(); void setPos(v3s16 pos); + v3s16 getPos() const { return data->pos; } void setAngle(f32 angle); + f32 getAngle() const { return m_angle; } void setMinimapMode(MinimapMode mode); + MinimapMode getMinimapMode() const { return data->mode; } void toggleMinimapShape(); + void setMinimapShape(MinimapShape shape); + MinimapShape getMinimapShape(); video::ITexture *getMinimapTexture(); diff --git a/src/modalMenu.h b/src/modalMenu.h index 43bb8e1b8..38a26535e 100644 --- a/src/modalMenu.h +++ b/src/modalMenu.h @@ -43,14 +43,13 @@ public: class GUIModalMenu : public gui::IGUIElement { public: - GUIModalMenu(gui::IGUIEnvironment* env, - gui::IGUIElement* parent, s32 id, + GUIModalMenu(gui::IGUIEnvironment* env, gui::IGUIElement* parent, s32 id, IMenuManager *menumgr): IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, core::rect<s32>(0,0,100,100)) { //m_force_regenerate_gui = false; - + m_menumgr = menumgr; m_allow_focus_removal = false; m_screensize_old = v2u32(0,0); @@ -59,6 +58,7 @@ public: Environment->setFocus(this); m_menumgr->createdMenu(this); } + virtual ~GUIModalMenu() { m_menumgr->deletingMenu(this); @@ -78,7 +78,7 @@ public: { if(!IsVisible) return; - + video::IVideoDriver* driver = Environment->getVideoDriver(); v2u32 screensize = driver->getScreenSize(); if(screensize != m_screensize_old /*|| m_force_regenerate_gui*/) @@ -90,7 +90,7 @@ public: drawMenu(); } - + /* This should be called when the menu wants to quit. diff --git a/src/modifiedstate.h b/src/modifiedstate.h index 75518f2f5..576c3c576 100644 --- a/src/modifiedstate.h +++ b/src/modifiedstate.h @@ -34,4 +34,3 @@ enum ModifiedState }; #endif - diff --git a/src/mods.cpp b/src/mods.cpp index 1b1bdb07b..0e583b2db 100644 --- a/src/mods.cpp +++ b/src/mods.cpp @@ -21,13 +21,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <fstream> #include "mods.h" #include "filesys.h" -#include "util/strfnd.h" #include "log.h" #include "subgame.h" #include "settings.h" -#include "util/strfnd.h" #include "convert_json.h" #include "exceptions.h" +#include "porting.h" static bool parseDependsLine(std::istream &is, std::string &dep, std::set<char> &symbols) @@ -110,28 +109,6 @@ std::map<std::string, ModSpec> getModsInPath(std::string path, bool part_of_modp return result; } -std::map<std::string, ModSpec> flattenModTree(std::map<std::string, ModSpec> mods) -{ - std::map<std::string, ModSpec> result; - for(std::map<std::string,ModSpec>::iterator it = mods.begin(); - it != mods.end(); ++it) - { - ModSpec mod = (*it).second; - if(mod.is_modpack) - { - std::map<std::string, ModSpec> content = - flattenModTree(mod.modpack_content); - result.insert(content.begin(),content.end()); - result.insert(std::make_pair(mod.name,mod)); - } - else //not a modpack - { - result.insert(std::make_pair(mod.name,mod)); - } - } - return result; -} - std::vector<ModSpec> flattenMods(std::map<std::string, ModSpec> mods) { std::vector<ModSpec> result; @@ -154,78 +131,32 @@ std::vector<ModSpec> flattenMods(std::map<std::string, ModSpec> mods) return result; } -ModConfiguration::ModConfiguration(std::string worldpath) +ModConfiguration::ModConfiguration(const std::string &worldpath): + m_unsatisfied_mods(), + m_sorted_mods(), + m_name_conflicts() { - SubgameSpec gamespec = findWorldSubgame(worldpath); - - // Add all game mods and all world mods - addModsInPath(gamespec.gamemods_path); - addModsInPath(worldpath + DIR_DELIM + "worldmods"); - - // check world.mt file for mods explicitely declared to be - // loaded or not by a load_mod_<modname> = ... line. - std::string worldmt = worldpath+DIR_DELIM+"world.mt"; - Settings worldmt_settings; - worldmt_settings.readConfigFile(worldmt.c_str()); - std::vector<std::string> names = worldmt_settings.getNames(); - std::set<std::string> include_mod_names; - for(std::vector<std::string>::iterator it = names.begin(); - it != names.end(); ++it) - { - std::string name = *it; - // for backwards compatibility: exclude only mods which are - // explicitely excluded. if mod is not mentioned at all, it is - // enabled. So by default, all installed mods are enabled. - if (name.compare(0,9,"load_mod_") == 0 && - worldmt_settings.getBool(name)) - { - include_mod_names.insert(name.substr(9)); - } - } - - // Collect all mods that are also in include_mod_names - std::vector<ModSpec> addon_mods; - for(std::set<std::string>::const_iterator it_path = gamespec.addon_mods_paths.begin(); - it_path != gamespec.addon_mods_paths.end(); ++it_path) - { - std::vector<ModSpec> addon_mods_in_path = flattenMods(getModsInPath(*it_path)); - for(std::vector<ModSpec>::iterator it = addon_mods_in_path.begin(); - it != addon_mods_in_path.end(); ++it) - { - ModSpec& mod = *it; - if(include_mod_names.count(mod.name) != 0) - addon_mods.push_back(mod); - else - worldmt_settings.setBool("load_mod_" + mod.name, false); - } - } - worldmt_settings.updateConfigFile(worldmt.c_str()); - - addMods(addon_mods); +} - // report on name conflicts - if(!m_name_conflicts.empty()){ - std::string s = "Unresolved name conflicts for mods "; - for(std::set<std::string>::const_iterator it = m_name_conflicts.begin(); - it != m_name_conflicts.end(); ++it) - { - if(it != m_name_conflicts.begin()) s += ", "; - s += std::string("\"") + (*it) + "\""; - } - s += "."; - throw ModError(s); +void ModConfiguration::printUnsatisfiedModsError() const +{ + for (std::vector<ModSpec>::const_iterator it = m_unsatisfied_mods.begin(); + it != m_unsatisfied_mods.end(); ++it) { + ModSpec mod = *it; + errorstream << "mod \"" << mod.name << "\" has unsatisfied dependencies: "; + for (UNORDERED_SET<std::string>::iterator dep_it = mod.unsatisfied_depends.begin(); + dep_it != mod.unsatisfied_depends.end(); ++dep_it) + errorstream << " \"" << *dep_it << "\""; + errorstream << std::endl; } - - // get the mods in order - resolveDependencies(); } -void ModConfiguration::addModsInPath(std::string path) +void ModConfiguration::addModsInPath(const std::string &path) { addMods(flattenMods(getModsInPath(path))); } -void ModConfiguration::addMods(std::vector<ModSpec> new_mods) +void ModConfiguration::addMods(const std::vector<ModSpec> &new_mods) { // Maintain a map of all existing m_unsatisfied_mods. // Keys are mod names and values are indices into m_unsatisfied_mods. @@ -243,8 +174,8 @@ void ModConfiguration::addMods(std::vector<ModSpec> new_mods) std::set<std::string> seen_this_iteration; - for(std::vector<ModSpec>::const_iterator it = new_mods.begin(); - it != new_mods.end(); ++it){ + for (std::vector<ModSpec>::const_iterator it = new_mods.begin(); + it != new_mods.end(); ++it) { const ModSpec &mod = *it; if(mod.part_of_modpack != (bool)want_from_modpack) continue; @@ -283,6 +214,73 @@ void ModConfiguration::addMods(std::vector<ModSpec> new_mods) } } +void ModConfiguration::addModsFormConfig(const std::string &settings_path, const std::set<std::string> &mods) +{ + Settings conf; + std::set<std::string> load_mod_names; + + conf.readConfigFile(settings_path.c_str()); + std::vector<std::string> names = conf.getNames(); + for (std::vector<std::string>::iterator it = names.begin(); + it != names.end(); ++it) { + std::string name = *it; + if (name.compare(0,9,"load_mod_")==0 && conf.getBool(name)) + load_mod_names.insert(name.substr(9)); + } + + std::vector<ModSpec> addon_mods; + for (std::set<std::string>::const_iterator i = mods.begin(); + i != mods.end(); ++i) { + std::vector<ModSpec> addon_mods_in_path = flattenMods(getModsInPath(*i)); + for (std::vector<ModSpec>::const_iterator it = addon_mods_in_path.begin(); + it != addon_mods_in_path.end(); ++it) { + const ModSpec& mod = *it; + if (load_mod_names.count(mod.name) != 0) + addon_mods.push_back(mod); + else + conf.setBool("load_mod_" + mod.name, false); + } + } + conf.updateConfigFile(settings_path.c_str()); + + addMods(addon_mods); + checkConflictsAndDeps(); + + // complain about mods declared to be loaded, but not found + for (std::vector<ModSpec>::iterator it = addon_mods.begin(); + it != addon_mods.end(); ++it) + load_mod_names.erase((*it).name); + std::vector<ModSpec> UnsatisfiedMods = getUnsatisfiedMods(); + for (std::vector<ModSpec>::iterator it = UnsatisfiedMods.begin(); + it != UnsatisfiedMods.end(); ++it) + load_mod_names.erase((*it).name); + if (!load_mod_names.empty()) { + errorstream << "The following mods could not be found:"; + for (std::set<std::string>::iterator it = load_mod_names.begin(); + it != load_mod_names.end(); ++it) + errorstream << " \"" << (*it) << "\""; + errorstream << std::endl; + } +} + +void ModConfiguration::checkConflictsAndDeps() +{ + // report on name conflicts + if (!m_name_conflicts.empty()) { + std::string s = "Unresolved name conflicts for mods "; + for (UNORDERED_SET<std::string>::const_iterator it = m_name_conflicts.begin(); + it != m_name_conflicts.end(); ++it) { + if (it != m_name_conflicts.begin()) s += ", "; + s += std::string("\"") + (*it) + "\""; + } + s += "."; + throw ModError(s); + } + + // get the mods in order + resolveDependencies(); +} + void ModConfiguration::resolveDependencies() { // Step 1: Compile a list of the mod names we're working with @@ -296,19 +294,19 @@ void ModConfiguration::resolveDependencies() // of each mod, split mods into satisfied and unsatisfied std::list<ModSpec> satisfied; std::list<ModSpec> unsatisfied; - for(std::vector<ModSpec>::iterator it = m_unsatisfied_mods.begin(); - it != m_unsatisfied_mods.end(); ++it){ + for (std::vector<ModSpec>::iterator it = m_unsatisfied_mods.begin(); + it != m_unsatisfied_mods.end(); ++it) { ModSpec mod = *it; mod.unsatisfied_depends = mod.depends; // check which optional dependencies actually exist - for(std::set<std::string>::iterator it_optdep = mod.optdepends.begin(); - it_optdep != mod.optdepends.end(); ++it_optdep){ + for (UNORDERED_SET<std::string>::iterator it_optdep = mod.optdepends.begin(); + it_optdep != mod.optdepends.end(); ++it_optdep) { std::string optdep = *it_optdep; - if(modnames.count(optdep) != 0) + if (modnames.count(optdep) != 0) mod.unsatisfied_depends.insert(optdep); } // if a mod has no depends it is initially satisfied - if(mod.unsatisfied_depends.empty()) + if (mod.unsatisfied_depends.empty()) satisfied.push_back(mod); else unsatisfied.push_back(mod); @@ -338,8 +336,36 @@ void ModConfiguration::resolveDependencies() m_unsatisfied_mods.assign(unsatisfied.begin(), unsatisfied.end()); } +ServerModConfiguration::ServerModConfiguration(const std::string &worldpath): + ModConfiguration(worldpath) +{ + SubgameSpec gamespec = findWorldSubgame(worldpath); + + // Add all game mods and all world mods + addModsInPath(gamespec.gamemods_path); + addModsInPath(worldpath + DIR_DELIM + "worldmods"); + + // Load normal mods + std::string worldmt = worldpath + DIR_DELIM + "world.mt"; + addModsFormConfig(worldmt, gamespec.addon_mods_paths); +} + +#ifndef SERVER +ClientModConfiguration::ClientModConfiguration(const std::string &path): + ModConfiguration(path) +{ + std::set<std::string> paths; + std::string path_user = porting::path_user + DIR_DELIM + "clientmods"; + paths.insert(path); + paths.insert(path_user); + + std::string settings_path = path_user + DIR_DELIM + "mods.conf"; + addModsFormConfig(settings_path, paths); +} +#endif + #if USE_CURL -Json::Value getModstoreUrl(std::string url) +Json::Value getModstoreUrl(const std::string &url) { std::vector<std::string> extra_headers; @@ -356,3 +382,80 @@ Json::Value getModstoreUrl(std::string url) } #endif + +ModMetadata::ModMetadata(const std::string &mod_name): + m_mod_name(mod_name), + m_modified(false) +{ + m_stringvars.clear(); +} + +void ModMetadata::clear() +{ + Metadata::clear(); + m_modified = true; +} + +bool ModMetadata::save(const std::string &root_path) +{ + Json::Value json; + for (StringMap::const_iterator it = m_stringvars.begin(); + it != m_stringvars.end(); ++it) { + json[it->first] = it->second; + } + + if (!fs::PathExists(root_path)) { + if (!fs::CreateAllDirs(root_path)) { + errorstream << "ModMetadata[" << m_mod_name << "]: Unable to save. '" + << root_path << "' tree cannot be created." << std::endl; + return false; + } + } else if (!fs::IsDir(root_path)) { + errorstream << "ModMetadata[" << m_mod_name << "]: Unable to save. '" + << root_path << "' is not a directory." << std::endl; + return false; + } + + bool w_ok = fs::safeWriteToFile(root_path + DIR_DELIM + m_mod_name, + Json::FastWriter().write(json)); + + if (w_ok) { + m_modified = false; + } else { + errorstream << "ModMetadata[" << m_mod_name << "]: failed write file." << std::endl; + } + return w_ok; +} + +bool ModMetadata::load(const std::string &root_path) +{ + m_stringvars.clear(); + + std::ifstream is((root_path + DIR_DELIM + m_mod_name).c_str(), std::ios_base::binary); + if (!is.good()) { + return false; + } + + Json::Reader reader; + Json::Value root; + if (!reader.parse(is, root)) { + errorstream << "ModMetadata[" << m_mod_name << "]: failed read data " + "(Json decoding failure)." << std::endl; + return false; + } + + const Json::Value::Members attr_list = root.getMemberNames(); + for (Json::Value::Members::const_iterator it = attr_list.begin(); + it != attr_list.end(); ++it) { + Json::Value attr_value = root[*it]; + m_stringvars[*it] = attr_value.asString(); + } + + return true; +} + +bool ModMetadata::setString(const std::string &name, const std::string &var) +{ + m_modified = Metadata::setString(name, var); + return m_modified; +} diff --git a/src/mods.h b/src/mods.h index af7777d18..7455a51ea 100644 --- a/src/mods.h +++ b/src/mods.h @@ -27,7 +27,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <string> #include <map> #include <json/json.h> +#include "util/cpp11_container.h" #include "config.h" +#include "metadata.h" #define MODNAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_" @@ -36,9 +38,9 @@ struct ModSpec std::string name; std::string path; //if normal mod: - std::set<std::string> depends; - std::set<std::string> optdepends; - std::set<std::string> unsatisfied_depends; + UNORDERED_SET<std::string> depends; + UNORDERED_SET<std::string> optdepends; + UNORDERED_SET<std::string> unsatisfied_depends; bool part_of_modpack; bool is_modpack; @@ -61,12 +63,6 @@ void parseModContents(ModSpec &mod); std::map<std::string,ModSpec> getModsInPath(std::string path, bool part_of_modpack = false); -// If failed, returned modspec has name=="" -ModSpec findCommonMod(const std::string &modname); - -// expands modpack contents, but does not replace them. -std::map<std::string, ModSpec> flattenModTree(std::map<std::string, ModSpec> mods); - // replaces modpack Modspecs with their content std::vector<ModSpec> flattenMods(std::map<std::string,ModSpec> mods); @@ -76,17 +72,8 @@ std::vector<ModSpec> flattenMods(std::map<std::string,ModSpec> mods); class ModConfiguration { public: - ModConfiguration(): - m_unsatisfied_mods(), - m_sorted_mods(), - m_name_conflicts() - {} - - - ModConfiguration(std::string worldpath); - // checks if all dependencies are fullfilled. - bool isConsistent() + bool isConsistent() const { return m_unsatisfied_mods.empty(); } @@ -96,19 +83,26 @@ public: return m_sorted_mods; } - std::vector<ModSpec> getUnsatisfiedMods() + const std::vector<ModSpec> &getUnsatisfiedMods() const { return m_unsatisfied_mods; } -private: + void printUnsatisfiedModsError() const; + +protected: + ModConfiguration(const std::string &worldpath); // adds all mods in the given path. used for games, modpacks // and world-specific mods (worldmods-folders) - void addModsInPath(std::string path); + void addModsInPath(const std::string &path); // adds all mods in the set. - void addMods(std::vector<ModSpec> new_mods); + void addMods(const std::vector<ModSpec> &new_mods); + void addModsFormConfig(const std::string &settings_path, const std::set<std::string> &mods); + + void checkConflictsAndDeps(); +private: // move mods from m_unsatisfied_mods to m_sorted_mods // in an order that satisfies dependencies void resolveDependencies(); @@ -131,14 +125,33 @@ private: // 1. game mod in modpack; 2. game mod; // 3. world mod in modpack; 4. world mod; // 5. addon mod in modpack; 6. addon mod. - std::set<std::string> m_name_conflicts; + UNORDERED_SET<std::string> m_name_conflicts; + + // Deleted default constructor + ModConfiguration() {} + +}; + +class ServerModConfiguration: public ModConfiguration +{ +public: + ServerModConfiguration(const std::string &worldpath); }; +#ifndef SERVER +class ClientModConfiguration: public ModConfiguration +{ +public: + ClientModConfiguration(const std::string &path); +}; +#endif + #if USE_CURL -Json::Value getModstoreUrl(std::string url); +Json::Value getModstoreUrl(const std::string &url); #else -inline Json::Value getModstoreUrl(std::string url) { +inline Json::Value getModstoreUrl(const std::string &url) +{ return Json::Value(); } #endif @@ -205,4 +218,24 @@ struct ModStoreModDetails { bool valid; }; +class ModMetadata: public Metadata +{ +public: + ModMetadata(const std::string &mod_name); + ~ModMetadata() {} + + virtual void clear(); + + bool save(const std::string &root_path); + bool load(const std::string &root_path); + + bool isModified() const { return m_modified; } + const std::string &getModName() const { return m_mod_name; } + + virtual bool setString(const std::string &name, const std::string &var); +private: + std::string m_mod_name; + bool m_modified; +}; + #endif diff --git a/src/nameidmapping.cpp b/src/nameidmapping.cpp index 2af8befff..d031f0808 100644 --- a/src/nameidmapping.cpp +++ b/src/nameidmapping.cpp @@ -25,27 +25,25 @@ void NameIdMapping::serialize(std::ostream &os) const { writeU8(os, 0); // version writeU16(os, m_id_to_name.size()); - for(UNORDERED_MAP<u16, std::string>::const_iterator - i = m_id_to_name.begin(); - i != m_id_to_name.end(); ++i){ + for (UNORDERED_MAP<u16, std::string>::const_iterator i = m_id_to_name.begin(); + i != m_id_to_name.end(); ++i) { writeU16(os, i->first); - os<<serializeString(i->second); + os << serializeString(i->second); } } void NameIdMapping::deSerialize(std::istream &is) { int version = readU8(is); - if(version != 0) + if (version != 0) throw SerializationError("unsupported NameIdMapping version"); u32 count = readU16(is); m_id_to_name.clear(); m_name_to_id.clear(); - for(u32 i=0; i<count; i++){ + for (u32 i = 0; i < count; i++) { u16 id = readU16(is); std::string name = deSerializeString(is); m_id_to_name[id] = name; m_name_to_id[name] = id; } } - diff --git a/src/nameidmapping.h b/src/nameidmapping.h index 23838c8ff..a2f3a3062 100644 --- a/src/nameidmapping.h +++ b/src/nameidmapping.h @@ -32,51 +32,57 @@ public: void serialize(std::ostream &os) const; void deSerialize(std::istream &is); - void clear(){ + void clear() + { m_id_to_name.clear(); m_name_to_id.clear(); } - void set(u16 id, const std::string &name){ + + void set(u16 id, const std::string &name) + { m_id_to_name[id] = name; m_name_to_id[name] = id; } - void removeId(u16 id){ + void removeId(u16 id) + { std::string name; bool found = getName(id, name); - if(!found) return; + if (!found) + return; m_id_to_name.erase(id); m_name_to_id.erase(name); } - void eraseName(const std::string &name){ + void eraseName(const std::string &name) + { u16 id; bool found = getId(name, id); - if(!found) return; + if (!found) + return; m_id_to_name.erase(id); m_name_to_id.erase(name); } - bool getName(u16 id, std::string &result) const{ + bool getName(u16 id, std::string &result) const + { UNORDERED_MAP<u16, std::string>::const_iterator i; i = m_id_to_name.find(id); - if(i == m_id_to_name.end()) + if (i == m_id_to_name.end()) return false; result = i->second; return true; } - bool getId(const std::string &name, u16 &result) const{ + bool getId(const std::string &name, u16 &result) const + { UNORDERED_MAP<std::string, u16>::const_iterator i; i = m_name_to_id.find(name); - if(i == m_name_to_id.end()) + if (i == m_name_to_id.end()) return false; result = i->second; return true; } - u16 size() const{ - return m_id_to_name.size(); - } + u16 size() const { return m_id_to_name.size(); } private: UNORDERED_MAP<u16, std::string> m_id_to_name; UNORDERED_MAP<std::string, u16> m_name_to_id; }; #endif - diff --git a/src/network/clientopcodes.cpp b/src/network/clientopcodes.cpp index 3364de8c5..bdcb1dfce 100644 --- a/src/network/clientopcodes.cpp +++ b/src/network/clientopcodes.cpp @@ -78,12 +78,12 @@ const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] = { "TOCLIENT_HP", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HP }, // 0x33 { "TOCLIENT_MOVE_PLAYER", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_MovePlayer }, // 0x34 { "TOCLIENT_ACCESS_DENIED_LEGACY", TOCLIENT_STATE_NOT_CONNECTED, &Client::handleCommand_AccessDenied }, // 0x35 - { "TOCLIENT_PLAYERITEM", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_PlayerItem }, // 0x36 + null_command_handler, { "TOCLIENT_DEATHSCREEN", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_DeathScreen }, // 0x37 { "TOCLIENT_MEDIA", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_Media }, // 0x38 - { "TOCLIENT_TOOLDEF", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_ToolDef }, // 0x39 + null_command_handler, { "TOCLIENT_NODEDEF", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_NodeDef }, // 0x3a - { "TOCLIENT_CRAFTITEMDEF", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_CraftItemDef }, // 0x3b + null_command_handler, { "TOCLIENT_ANNOUNCE_MEDIA", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_AnnounceMedia }, // 0x3c { "TOCLIENT_ITEMDEF", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_ItemDef }, // 0x3d null_command_handler, @@ -108,8 +108,8 @@ const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] = { "TOCLIENT_LOCAL_PLAYER_ANIMATIONS", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_LocalPlayerAnimations }, // 0x51 { "TOCLIENT_EYE_OFFSET", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_EyeOffset }, // 0x52 { "TOCLIENT_DELETE_PARTICLESPAWNER", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_DeleteParticleSpawner }, // 0x53 - null_command_handler, - null_command_handler, + { "TOCLIENT_CLOUD_PARAMS", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_CloudParams }, // 0x54 + { "TOCLIENT_FADE_SOUND", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_FadeSound }, // 0x55 null_command_handler, null_command_handler, null_command_handler, @@ -193,7 +193,7 @@ const ServerCommandFactory serverCommandFactoryTable[TOSERVER_NUM_MSG_TYPES] = null_command_factory, // 0x3f { "TOSERVER_REQUEST_MEDIA", 1, true }, // 0x40 { "TOSERVER_RECEIVED_MEDIA", 1, true }, // 0x41 - { "TOSERVER_BREATH", 0, true }, // 0x42 + { "TOSERVER_BREATH", 0, true }, // 0x42 old TOSERVER_BREATH. Ignored by servers { "TOSERVER_CLIENT_READY", 0, true }, // 0x43 null_command_factory, // 0x44 null_command_factory, // 0x45 diff --git a/src/network/clientopcodes.h b/src/network/clientopcodes.h index 9143865b8..43a93bb4f 100644 --- a/src/network/clientopcodes.h +++ b/src/network/clientopcodes.h @@ -41,7 +41,7 @@ struct ToClientCommandHandler struct ServerCommandFactory { const char* name; - u16 channel; + u8 channel; bool reliable; }; diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 411982f69..59669fe6d 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -30,8 +30,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "server.h" #include "util/strfnd.h" #include "network/clientopcodes.h" +#include "script/scripting_client.h" #include "util/serialize.h" #include "util/srp.h" +#include "tileanimation.h" void Client::handleCommand_Deprecated(NetworkPacket* pkt) { @@ -140,7 +142,7 @@ void Client::handleCommand_AcceptSudoMode(NetworkPacket* pkt) } void Client::handleCommand_DenySudoMode(NetworkPacket* pkt) { - m_chat_queue.push(L"Password change denied. Password NOT changed."); + pushToChatQueue(L"Password change denied. Password NOT changed."); // reset everything and be sad deleteAuthData(); } @@ -410,7 +412,10 @@ void Client::handleCommand_ChatMessage(NetworkPacket* pkt) message += (wchar_t)read_wchar; } - m_chat_queue.push(message); + // If chat message not consummed by client lua API + if (!moddingEnabled() || !m_script->on_receiving_message(wide_to_utf8(message))) { + pushToChatQueue(message); + } } void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt) @@ -521,6 +526,10 @@ void Client::handleCommand_HP(NetworkPacket* pkt) player->hp = hp; + if (moddingEnabled()) { + m_script->on_hp_modification(hp); + } + if (hp < oldhp) { // Add to ClientEvent queue ClientEvent event; @@ -552,7 +561,6 @@ void Client::handleCommand_MovePlayer(NetworkPacket* pkt) *pkt >> pos >> pitch >> yaw; - player->got_teleported = true; player->setPosition(pos); infostream << "Client got TOCLIENT_MOVE_PLAYER" @@ -578,11 +586,6 @@ void Client::handleCommand_MovePlayer(NetworkPacket* pkt) m_ignore_damage_timer = 3.0; } -void Client::handleCommand_PlayerItem(NetworkPacket* pkt) -{ - warningstream << "Client: Ignoring TOCLIENT_PLAYERITEM" << std::endl; -} - void Client::handleCommand_DeathScreen(NetworkPacket* pkt) { bool set_camera_point_target; @@ -709,11 +712,6 @@ void Client::handleCommand_Media(NetworkPacket* pkt) } } -void Client::handleCommand_ToolDef(NetworkPacket* pkt) -{ - warningstream << "Client: Ignoring TOCLIENT_TOOLDEF" << std::endl; -} - void Client::handleCommand_NodeDef(NetworkPacket* pkt) { infostream << "Client: Received node definitions: packet size: " @@ -724,9 +722,7 @@ void Client::handleCommand_NodeDef(NetworkPacket* pkt) sanity_check(!m_mesh_update_thread.isRunning()); // Decompress node definitions - std::string datastring(pkt->getString(0), pkt->getSize()); - std::istringstream is(datastring, std::ios_base::binary); - std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary); + std::istringstream tmp_is(pkt->readLongString(), std::ios::binary); std::ostringstream tmp_os; decompressZlib(tmp_is, tmp_os); @@ -736,11 +732,6 @@ void Client::handleCommand_NodeDef(NetworkPacket* pkt) m_nodedef_received = true; } -void Client::handleCommand_CraftItemDef(NetworkPacket* pkt) -{ - warningstream << "Client: Ignoring TOCLIENT_CRAFTITEMDEF" << std::endl; -} - void Client::handleCommand_ItemDef(NetworkPacket* pkt) { infostream << "Client: Received item definitions: packet size: " @@ -751,9 +742,7 @@ void Client::handleCommand_ItemDef(NetworkPacket* pkt) sanity_check(!m_mesh_update_thread.isRunning()); // Decompress item definitions - std::string datastring(pkt->getString(0), pkt->getSize()); - std::istringstream is(datastring, std::ios_base::binary); - std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary); + std::istringstream tmp_is(pkt->readLongString(), std::ios::binary); std::ostringstream tmp_os; decompressZlib(tmp_is, tmp_os); @@ -765,21 +754,39 @@ void Client::handleCommand_ItemDef(NetworkPacket* pkt) void Client::handleCommand_PlaySound(NetworkPacket* pkt) { + /* + [0] u32 server_id + [4] u16 name length + [6] char name[len] + [ 6 + len] f32 gain + [10 + len] u8 type + [11 + len] (f32 * 3) pos + [23 + len] u16 object_id + [25 + len] bool loop + [26 + len] f32 fade + */ + s32 server_id; std::string name; + float gain; u8 type; // 0=local, 1=positional, 2=object v3f pos; u16 object_id; bool loop; + float fade = 0; *pkt >> server_id >> name >> gain >> type >> pos >> object_id >> loop; + try { + *pkt >> fade; + } catch (PacketError &e) {}; + // Start playing int client_id = -1; switch(type) { case 0: // local - client_id = m_sound->playSound(name, loop, gain); + client_id = m_sound->playSound(name, loop, gain, fade); break; case 1: // positional client_id = m_sound->playSoundAt(name, loop, gain, pos); @@ -818,6 +825,21 @@ void Client::handleCommand_StopSound(NetworkPacket* pkt) } } +void Client::handleCommand_FadeSound(NetworkPacket *pkt) +{ + s32 sound_id; + float step; + float gain; + + *pkt >> sound_id >> step >> gain; + + UNORDERED_MAP<s32, int>::iterator i = + m_sounds_server_to_client.find(sound_id); + + if (i != m_sounds_server_to_client.end()) + m_sound->fadeSound(i->second, step, gain); +} + void Client::handleCommand_Privileges(NetworkPacket* pkt) { m_privileges.clear(); @@ -896,9 +918,14 @@ void Client::handleCommand_SpawnParticle(NetworkPacket* pkt) std::string texture = deSerializeLongString(is); bool vertical = false; bool collision_removal = false; + struct TileAnimationParams animation; + animation.type = TAT_NONE; + u8 glow = 0; try { vertical = readU8(is); collision_removal = readU8(is); + animation.deSerialize(is, m_proto_ver); + glow = readU8(is); } catch (...) {} ClientEvent event; @@ -912,6 +939,8 @@ void Client::handleCommand_SpawnParticle(NetworkPacket* pkt) event.spawn_particle.collision_removal = collision_removal; event.spawn_particle.vertical = vertical; event.spawn_particle.texture = new std::string(texture); + event.spawn_particle.animation = animation; + event.spawn_particle.glow = glow; m_client_event_queue.push(event); } @@ -943,12 +972,20 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt) bool vertical = false; bool collision_removal = false; + struct TileAnimationParams animation; + animation.type = TAT_NONE; + u8 glow = 0; u16 attached_id = 0; try { *pkt >> vertical; *pkt >> collision_removal; *pkt >> attached_id; + // This is horrible but required (why are there two ways to deserialize pkts?) + std::string datastring(pkt->getRemainingString(), pkt->getRemainingBytes()); + std::istringstream is(datastring, std::ios_base::binary); + animation.deSerialize(is, m_proto_ver); + glow = readU8(is); } catch (...) {} ClientEvent event; @@ -971,6 +1008,8 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt) event.add_particlespawner.vertical = vertical; event.add_particlespawner.texture = new std::string(texture); event.add_particlespawner.id = id; + event.add_particlespawner.animation = animation; + event.add_particlespawner.glow = glow; m_client_event_queue.push(event); } @@ -1111,10 +1150,10 @@ void Client::handleCommand_HudSetFlags(NetworkPacket* pkt) m_minimap_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE); // Hide minimap if it has been disabled by the server - if (m_minimap_disabled_by_server && was_minimap_visible) { + if (m_minimap && m_minimap_disabled_by_server && was_minimap_visible) { // defers a minimap update, therefore only call it if really // needed, by checking that minimap was visible before - m_mapper->setMinimapMode(MINIMAP_MODE_OFF); + m_minimap->setMinimapMode(MINIMAP_MODE_OFF); } } @@ -1153,11 +1192,45 @@ void Client::handleCommand_HudSetSky(NetworkPacket* pkt) for (size_t i = 0; i < count; i++) params->push_back(deSerializeString(is)); + bool clouds = true; + try { + clouds = readU8(is); + } catch (...) {} + ClientEvent event; event.type = CE_SET_SKY; event.set_sky.bgcolor = bgcolor; event.set_sky.type = type; event.set_sky.params = params; + event.set_sky.clouds = clouds; + m_client_event_queue.push(event); +} + +void Client::handleCommand_CloudParams(NetworkPacket* pkt) +{ + f32 density; + video::SColor color_bright; + video::SColor color_ambient; + f32 height; + f32 thickness; + v2f speed; + + *pkt >> density >> color_bright >> color_ambient + >> height >> thickness >> speed; + + ClientEvent event; + event.type = CE_CLOUD_PARAMS; + event.cloud_params.density = density; + // use the underlying u32 representation, because we can't + // use struct members with constructors here, and this way + // we avoid using new() and delete() for no good reason + event.cloud_params.color_bright = color_bright.color; + event.cloud_params.color_ambient = color_ambient.color; + event.cloud_params.height = height; + event.cloud_params.thickness = thickness; + // same here: deconstruct to skip constructor + event.cloud_params.speed_x = speed.X; + event.cloud_params.speed_y = speed.Y; m_client_event_queue.push(event); } diff --git a/src/network/connection.cpp b/src/network/connection.cpp index b711cae11..fb3ba92ae 100644 --- a/src/network/connection.cpp +++ b/src/network/connection.cpp @@ -54,7 +54,8 @@ Mutex log_message_mutex; #endif -static inline float CALC_DTIME(unsigned int lasttime, unsigned int curtime) { +static inline float CALC_DTIME(u64 lasttime, u64 curtime) +{ float value = ( curtime - lasttime) / 1000.0; return MYMAX(MYMIN(value,0.1),0.0); } @@ -930,7 +931,7 @@ void Peer::DecUseCount() delete this; } -void Peer::RTTStatistics(float rtt, std::string profiler_id, +void Peer::RTTStatistics(float rtt, const std::string &profiler_id, unsigned int num_samples) { if (m_last_rtt > 0) { @@ -969,8 +970,7 @@ void Peer::RTTStatistics(float rtt, std::string profiler_id, m_rtt.jitter_avg = m_rtt.jitter_avg * (num_samples/(num_samples-1)) + jitter * (1/num_samples); - if (profiler_id != "") - { + if (profiler_id != "") { g_profiler->graphAdd(profiler_id + "_rtt", rtt); g_profiler->graphAdd(profiler_id + "_jitter", jitter); } @@ -982,7 +982,7 @@ void Peer::RTTStatistics(float rtt, std::string profiler_id, bool Peer::isTimedOut(float timeout) { MutexAutoLock lock(m_exclusive_access_mutex); - u32 current_time = porting::getTimeMs(); + u64 current_time = porting::getTimeMs(); float dtime = CALC_DTIME(m_last_timeout_check,current_time); m_last_timeout_check = current_time; @@ -1237,7 +1237,7 @@ void UDPPeer::RunCommandQueues( u16 UDPPeer::getNextSplitSequenceNumber(u8 channel) { assert(channel < CHANNEL_COUNT); // Pre-condition - return channels[channel].readNextIncomingSeqNum(); + return channels[channel].readNextSplitSeqNum(); } void UDPPeer::setNextSplitSequenceNumber(u8 channel, u16 seqnum) @@ -1277,8 +1277,8 @@ void * ConnectionSendThread::run() LOG(dout_con<<m_connection->getDesc() <<"ConnectionSend thread started"<<std::endl); - u32 curtime = porting::getTimeMs(); - u32 lasttime = curtime; + u64 curtime = porting::getTimeMs(); + u64 lasttime = curtime; PROFILE(std::stringstream ThreadIdentifier); PROFILE(ThreadIdentifier << "ConnectionSend: [" << m_connection->getDesc() << "]"); @@ -2047,8 +2047,8 @@ void * ConnectionReceiveThread::run() PROFILE(ThreadIdentifier << "ConnectionReceive: [" << m_connection->getDesc() << "]"); #ifdef DEBUG_CONNECTION_KBPS - u32 curtime = porting::getTimeMs(); - u32 lasttime = curtime; + u64 curtime = porting::getTimeMs(); + u64 lasttime = curtime; float debug_print_timer = 0.0; #endif @@ -2391,7 +2391,7 @@ SharedBuffer<u8> ConnectionReceiveThread::processPacket(Channel *channel, // only calculate rtt from straight sent packets if (p.resend_count == 0) { // Get round trip time - unsigned int current_time = porting::getTimeMs(); + u64 current_time = porting::getTimeMs(); // a overflow is quite unlikely but as it'd result in major // rtt miscalculation we handle it here diff --git a/src/network/connection.h b/src/network/connection.h index 5ee53b9d4..8b7ed9773 100644 --- a/src/network/connection.h +++ b/src/network/connection.h @@ -175,7 +175,7 @@ struct BufferedPacket Buffer<u8> data; // Data of the packet, including headers float time; // Seconds from buffering the packet or re-sending float totaltime; // Seconds from buffering the packet - unsigned int absolute_send_time; + u64 absolute_send_time; Address address; // Sender or destination unsigned int resend_count; }; @@ -383,7 +383,7 @@ struct OutgoingPacket bool reliable; bool ack; - OutgoingPacket(u16 peer_id_, u8 channelnum_, SharedBuffer<u8> data_, + OutgoingPacket(u16 peer_id_, u8 channelnum_, const SharedBuffer<u8> &data_, bool reliable_,bool ack_=false): peer_id(peer_id_), channelnum(channelnum_), @@ -448,7 +448,7 @@ struct ConnectionCommand reliable = reliable_; } - void ack(u16 peer_id_, u8 channelnum_, SharedBuffer<u8> data_) + void ack(u16 peer_id_, u8 channelnum_, const SharedBuffer<u8> &data_) { type = CONCMD_ACK; peer_id = peer_id_; @@ -457,7 +457,7 @@ struct ConnectionCommand reliable = false; } - void createPeer(u16 peer_id_, SharedBuffer<u8> data_) + void createPeer(u16 peer_id_, const SharedBuffer<u8> &data_) { type = CONCMD_CREATE_PEER; peer_id = peer_id_; @@ -467,7 +467,7 @@ struct ConnectionCommand raw = true; } - void disableLegacy(u16 peer_id_, SharedBuffer<u8> data_) + void disableLegacy(u16 peer_id_, const SharedBuffer<u8> &data_) { type = CONCMD_DISABLE_LEGACY; peer_id = peer_id_; @@ -732,8 +732,8 @@ class Peer { virtual void reportRTT(float rtt) {}; void RTTStatistics(float rtt, - std::string profiler_id="", - unsigned int num_samples=1000); + const std::string &profiler_id = "", + unsigned int num_samples = 1000); bool IncUseCount(); void DecUseCount(); @@ -769,7 +769,7 @@ class Peer { // Seconds from last receive float m_timeout_counter; - u32 m_last_timeout_check; + u64 m_last_timeout_check; }; class UDPPeer : public Peer @@ -874,7 +874,7 @@ struct ConnectionEvent return "Invalid ConnectionEvent"; } - void dataReceived(u16 peer_id_, SharedBuffer<u8> data_) + void dataReceived(u16 peer_id_, const SharedBuffer<u8> &data_) { type = CONNEVENT_DATA_RECEIVED; peer_id = peer_id_; diff --git a/src/network/networkpacket.cpp b/src/network/networkpacket.cpp index 388afc18e..f7a6499dd 100644 --- a/src/network/networkpacket.cpp +++ b/src/network/networkpacket.cpp @@ -63,7 +63,7 @@ void NetworkPacket::putRawPacket(u8 *data, u32 datasize, u16 peer_id) m_data = std::vector<u8>(&data[2], &data[2 + m_datasize]); } -char* NetworkPacket::getString(u32 from_offset) +const char* NetworkPacket::getString(u32 from_offset) { checkReadOffset(from_offset, 0); @@ -105,7 +105,7 @@ NetworkPacket& NetworkPacket::operator>>(std::string& dst) return *this; } -NetworkPacket& NetworkPacket::operator<<(std::string src) +NetworkPacket& NetworkPacket::operator<<(const std::string &src) { u16 msgsize = src.size(); if (msgsize > STRING_MAX_LEN) { @@ -119,7 +119,7 @@ NetworkPacket& NetworkPacket::operator<<(std::string src) return *this; } -void NetworkPacket::putLongString(std::string src) +void NetworkPacket::putLongString(const std::string &src) { u32 msgsize = src.size(); if (msgsize > LONG_STRING_MAX_LEN) { @@ -155,7 +155,7 @@ NetworkPacket& NetworkPacket::operator>>(std::wstring& dst) return *this; } -NetworkPacket& NetworkPacket::operator<<(std::wstring src) +NetworkPacket& NetworkPacket::operator<<(const std::wstring &src) { u16 msgsize = src.size(); if (msgsize > WIDE_STRING_MAX_LEN) { diff --git a/src/network/networkpacket.h b/src/network/networkpacket.h index 524470999..83dc33f6f 100644 --- a/src/network/networkpacket.h +++ b/src/network/networkpacket.h @@ -41,20 +41,23 @@ public: u16 getPeerId() { return m_peer_id; } u16 getCommand() { return m_command; } const u32 getRemainingBytes() const { return m_datasize - m_read_offset; } + const char* getRemainingString() { return getString(m_read_offset); } // Returns a c-string without copying. // A better name for this would be getRawString() - char* getString(u32 from_offset); + const char* getString(u32 from_offset); // major difference to putCString(): doesn't write len into the buffer void putRawString(const char* src, u32 len); + void putRawString(const std::string &src) + { putRawString(src.c_str(), src.size()); } NetworkPacket& operator>>(std::string& dst); - NetworkPacket& operator<<(std::string src); + NetworkPacket& operator<<(const std::string &src); - void putLongString(std::string src); + void putLongString(const std::string &src); NetworkPacket& operator>>(std::wstring& dst); - NetworkPacket& operator<<(std::wstring src); + NetworkPacket& operator<<(const std::wstring &src); std::string readLongString(); diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index 018b392b6..7126c237b 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -50,6 +50,7 @@ with this program; if not, write to the Free Software Foundation, Inc., ContentFeatures and NodeDefManager use a different serialization format; better for future version cross-compatibility Many things + Obsolete TOCLIENT_PLAYERITEM PROTOCOL_VERSION 10: TOCLIENT_PRIVILEGES Version raised to force 'fly' and 'fast' privileges into effect. @@ -104,7 +105,8 @@ with this program; if not, write to the Free Software Foundation, Inc., PROTOCOL_VERSION 22: add swap_node PROTOCOL_VERSION 23: - TOSERVER_CLIENT_READY + Obsolete TOSERVER_RECEIVED_MEDIA + Server: Stop using TOSERVER_CLIENT_READY PROTOCOL_VERSION 24: ContentFeatures version 7 ContentFeatures: change number of special tiles to 6 (CF_SPECIAL_COUNT) @@ -138,19 +140,34 @@ with this program; if not, write to the Free Software Foundation, Inc., Add nodedef v3 - connected nodeboxes PROTOCOL_VERSION 28: CPT2_MESHOPTIONS + PROTOCOL_VERSION 29: + Server doesn't accept TOSERVER_BREATH anymore + serialization of TileAnimation params changed + TAT_SHEET_2D + Removed client-sided chat perdiction + PROTOCOL VERSION 30: + New ContentFeatures serialization version + Add node and tile color and palette + Fix plantlike visual_scale being applied squared and add compatibility + with pre-30 clients by sending sqrt(visual_scale) + PROTOCOL VERSION 31: + Add tile overlay + Stop sending TOSERVER_CLIENT_READY + PROTOCOL VERSION 32: + Add fading sounds */ -#define LATEST_PROTOCOL_VERSION 28 +#define LATEST_PROTOCOL_VERSION 32 // Server's supported network protocol range -#define SERVER_PROTOCOL_VERSION_MIN 13 +#define SERVER_PROTOCOL_VERSION_MIN 24 #define SERVER_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION // Client's supported network protocol range // The minimal version depends on whether // send_pre_v25_init is enabled or not #define CLIENT_PROTOCOL_VERSION_MIN 25 -#define CLIENT_PROTOCOL_VERSION_MIN_LEGACY 13 +#define CLIENT_PROTOCOL_VERSION_MIN_LEGACY 24 #define CLIENT_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION // Constant that differentiates the protocol from random data and other protocols @@ -567,6 +584,7 @@ enum ToClientCommand foreach count: u8 len u8[len] param + u8 clouds (boolean) */ TOCLIENT_OVERRIDE_DAY_NIGHT_RATIO = 0x50, @@ -595,6 +613,23 @@ enum ToClientCommand u32 id */ + TOCLIENT_CLOUD_PARAMS = 0x54, + /* + f1000 density + u8[4] color_diffuse (ARGB) + u8[4] color_ambient (ARGB) + f1000 height + f1000 thickness + v2f1000 speed + */ + + TOCLIENT_FADE_SOUND = 0x55, + /* + s32 sound_id + float step + float gain + */ + TOCLIENT_SRP_BYTES_S_B = 0x60, /* Belonging to AUTH_MECHANISM_LEGACY_PASSWORD and AUTH_MECHANISM_SRP. @@ -833,7 +868,7 @@ enum ToServerCommand <no payload data> */ - TOSERVER_BREATH = 0x42, + TOSERVER_BREATH = 0x42, // Obsolete /* u16 breath */ diff --git a/src/network/serveropcodes.cpp b/src/network/serveropcodes.cpp index 9b14a1be3..19978a2b6 100644 --- a/src/network/serveropcodes.cpp +++ b/src/network/serveropcodes.cpp @@ -89,8 +89,8 @@ const ToServerCommandHandler toServerCommandTable[TOSERVER_NUM_MSG_TYPES] = null_command_handler, // 0x3e null_command_handler, // 0x3f { "TOSERVER_REQUEST_MEDIA", TOSERVER_STATE_STARTUP, &Server::handleCommand_RequestMedia }, // 0x40 - { "TOSERVER_RECEIVED_MEDIA", TOSERVER_STATE_STARTUP, &Server::handleCommand_ReceivedMedia }, // 0x41 - { "TOSERVER_BREATH", TOSERVER_STATE_INGAME, &Server::handleCommand_Breath }, // 0x42 + { "TOSERVER_RECEIVED_MEDIA", TOSERVER_STATE_STARTUP, &Server::handleCommand_Deprecated }, // 0x41 not used by the server since protocol version 23 + { "TOSERVER_BREATH", TOSERVER_STATE_INGAME, &Server::handleCommand_Deprecated }, // 0x42 Old breath model which is now deprecated for anticheating { "TOSERVER_CLIENT_READY", TOSERVER_STATE_STARTUP, &Server::handleCommand_ClientReady }, // 0x43 null_command_handler, // 0x44 null_command_handler, // 0x45 @@ -197,8 +197,8 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] = { "TOCLIENT_LOCAL_PLAYER_ANIMATIONS", 0, true }, // 0x51 { "TOCLIENT_EYE_OFFSET", 0, true }, // 0x52 { "TOCLIENT_DELETE_PARTICLESPAWNER", 0, true }, // 0x53 - null_command_factory, - null_command_factory, + { "TOCLIENT_CLOUD_PARAMS", 0, true }, // 0x54 + { "TOCLIENT_FADE_SOUND", 0, true }, // 0x55 null_command_factory, null_command_factory, null_command_factory, diff --git a/src/network/serveropcodes.h b/src/network/serveropcodes.h index aa3301069..72323ae24 100644 --- a/src/network/serveropcodes.h +++ b/src/network/serveropcodes.h @@ -41,7 +41,7 @@ struct ToServerCommandHandler struct ClientCommandFactory { const char* name; - u16 channel; + u8 channel; bool reliable; }; diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index dca9aabc4..5b026bbdb 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -23,10 +23,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_abm.h" #include "content_sao.h" #include "emerge.h" +#include "mapblock.h" #include "nodedef.h" #include "player.h" #include "rollback_interface.h" -#include "scripting_game.h" +#include "scripting_server.h" #include "settings.h" #include "tool.h" #include "version.h" @@ -613,20 +614,6 @@ void Server::handleCommand_Init2(NetworkPacket* pkt) u16 protocol_version = m_clients.getProtocolVersion(pkt->getPeerId()); - ///// begin compatibility code - PlayerSAO* playersao = NULL; - if (protocol_version <= 22) { - playersao = StageTwoClientInit(pkt->getPeerId()); - - if (playersao == NULL) { - actionstream - << "TOSERVER_INIT2 stage 2 client init failed for peer " - << pkt->getPeerId() << std::endl; - return; - } - } - ///// end compatibility code - /* Send some initialization data */ @@ -656,13 +643,6 @@ void Server::handleCommand_Init2(NetworkPacket* pkt) float time_speed = g_settings->getFloat("time_speed"); SendTimeOfDay(pkt->getPeerId(), time, time_speed); - ///// begin compatibility code - if (protocol_version <= 22) { - m_clients.event(pkt->getPeerId(), CSE_SetClientReady); - m_script->on_joinplayer(playersao); - } - ///// end compatibility code - // Warnings about protocol version can be issued here if (getClient(pkt->getPeerId())->net_proto_version < LATEST_PROTOCOL_VERSION) { SendChatMessage(pkt->getPeerId(), L"# Server: WARNING: YOUR CLIENT'S " @@ -694,10 +674,6 @@ void Server::handleCommand_RequestMedia(NetworkPacket* pkt) sendRequestedMedia(pkt->getPeerId(), tosend); } -void Server::handleCommand_ReceivedMedia(NetworkPacket* pkt) -{ -} - void Server::handleCommand_ClientReady(NetworkPacket* pkt) { u16 peer_id = pkt->getPeerId(); @@ -742,6 +718,13 @@ void Server::handleCommand_ClientReady(NetworkPacket* pkt) m_clients.event(peer_id, CSE_SetClientReady); m_script->on_joinplayer(playersao); + // Send shutdown timer if shutdown has been scheduled + if (m_shutdown_timer > 0.0f) { + std::wstringstream ws; + ws << L"*** Server shutting down in " + << duration_to_string(myround(m_shutdown_timer)).c_str() << "."; + SendChatMessage(pkt->getPeerId(), ws.str()); + } } void Server::handleCommand_GotBlocks(NetworkPacket* pkt) @@ -810,7 +793,7 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao, v3f speed((f32)ss.X / 100.0, (f32)ss.Y / 100.0, (f32)ss.Z / 100.0); pitch = modulo360f(pitch); - yaw = modulo360f(yaw); + yaw = wrapDegrees_0_360(yaw); playersao->setBasePosition(position); player->setSpeed(speed); @@ -1021,6 +1004,15 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) delete a; return; } + + // Disallow dropping items if dead + if (playersao->isDead()) { + infostream << "Ignoring IDropAction from " + << (da->from_inv.dump()) << ":" << da->from_list + << " because player is dead." << std::endl; + delete a; + return; + } } /* Handle restrictions and special cases of the craft action @@ -1118,6 +1110,13 @@ void Server::handleCommand_Damage(NetworkPacket* pkt) } if (g_settings->getBool("enable_damage")) { + if (playersao->isDead()) { + verbosestream << "Server::ProcessData(): Info: " + "Ignoring damage as player " << player->getName() + << " is already dead." << std::endl; + return; + } + actionstream << player->getName() << " damaged by " << (int)damage << " hp at " << PP(playersao->getBasePosition() / BS) << std::endl; @@ -1127,46 +1126,6 @@ void Server::handleCommand_Damage(NetworkPacket* pkt) } } -void Server::handleCommand_Breath(NetworkPacket* pkt) -{ - u16 breath; - - *pkt >> breath; - - RemotePlayer *player = m_env->getPlayer(pkt->getPeerId()); - - if (player == NULL) { - errorstream << "Server::ProcessData(): Canceling: " - "No player for peer_id=" << pkt->getPeerId() - << " disconnecting peer!" << std::endl; - m_con.DisconnectPeer(pkt->getPeerId()); - return; - } - - - PlayerSAO *playersao = player->getPlayerSAO(); - if (playersao == NULL) { - errorstream << "Server::ProcessData(): Canceling: " - "No player object for peer_id=" << pkt->getPeerId() - << " disconnecting peer!" << std::endl; - m_con.DisconnectPeer(pkt->getPeerId()); - return; - } - - /* - * If player is dead, we don't need to update the breath - * He is dead ! - */ - if (playersao->isDead()) { - verbosestream << "TOSERVER_BREATH: " << player->getName() - << " is dead. Ignoring packet"; - return; - } - - playersao->setBreath(breath); - SendPlayerBreath(pkt->getPeerId()); -} - void Server::handleCommand_Password(NetworkPacket* pkt) { if (pkt->getSize() != PASSWORD_SIZE * 2) @@ -1313,6 +1272,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) 2: digging completed 3: place block or item (to abovesurface) 4: use item + 5: rightclick air ("activate") */ u8 action; u16 item_i; @@ -1345,8 +1305,16 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) } if (playersao->isDead()) { - verbosestream << "TOSERVER_INTERACT: " << player->getName() - << " is dead. Ignoring packet"; + actionstream << "Server: NoCheat: " << player->getName() + << " tried to interact while dead; ignoring." << std::endl; + if (pointed.type == POINTEDTHING_NODE) { + // Re-send block to revert change on client-side + RemoteClient *client = getClient(pkt->getPeerId()); + v3s16 blockpos = getNodeBlockPos(pointed.node_undersurface); + client->SetBlockNotSent(blockpos); + } + // Call callbacks + m_script->on_cheat(playersao, "interacted_while_dead"); return; } @@ -1385,15 +1353,48 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) } /* + Make sure the player is allowed to do it + */ + if (!checkPriv(player->getName(), "interact")) { + actionstream<<player->getName()<<" attempted to interact with " + <<pointed.dump()<<" without 'interact' privilege" + <<std::endl; + // Re-send block to revert change on client-side + RemoteClient *client = getClient(pkt->getPeerId()); + // Digging completed -> under + if (action == 2) { + v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_under, BS)); + client->SetBlockNotSent(blockpos); + } + // Placement -> above + if (action == 3) { + v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_above, BS)); + client->SetBlockNotSent(blockpos); + } + return; + } + + /* Check that target is reasonably close (only when digging or placing things) */ static const bool enable_anticheat = !g_settings->getBool("disable_anticheat"); - if ((action == 0 || action == 2 || action == 3) && + if ((action == 0 || action == 2 || action == 3 || action == 4) && (enable_anticheat && !isSingleplayer())) { float d = player_pos.getDistanceFrom(pointed_pos_under); - float max_d = BS * 14; // Just some large enough value - if (d > max_d) { + const ItemDefinition &playeritem_def = + playersao->getWieldedItem().getDefinition(m_itemdef); + float max_d = BS * playeritem_def.range; + InventoryList *hlist = playersao->getInventory()->getList("hand"); + const ItemDefinition &hand_def = + hlist ? (hlist->getItem(0).getDefinition(m_itemdef)) : (m_itemdef->get("")); + float max_d_hand = BS * hand_def.range; + if (max_d < 0 && max_d_hand >= 0) + max_d = max_d_hand; + else if (max_d < 0) + max_d = BS * 4.0; + // cube diagonal: sqrt(3) = 1.73 + if (d > max_d * 1.73) { actionstream << "Player " << player->getName() << " tried to access " << pointed.dump() << " from too far: " @@ -1411,28 +1412,6 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) } /* - Make sure the player is allowed to do it - */ - if (!checkPriv(player->getName(), "interact")) { - actionstream<<player->getName()<<" attempted to interact with " - <<pointed.dump()<<" without 'interact' privilege" - <<std::endl; - // Re-send block to revert change on client-side - RemoteClient *client = getClient(pkt->getPeerId()); - // Digging completed -> under - if (action == 2) { - v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_under, BS)); - client->SetBlockNotSent(blockpos); - } - // Placement -> above - if (action == 3) { - v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_above, BS)); - client->SetBlockNotSent(blockpos); - } - return; - } - - /* If something goes wrong, this player is to blame */ RollbackScopeActor rollback_scope(m_rollback, @@ -1443,11 +1422,6 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) */ if (action == 0) { if (pointed.type == POINTEDTHING_NODE) { - /* - NOTE: This can be used in the future to check if - somebody is cheating, by checking the timing. - */ - MapNode n(CONTENT_IGNORE); bool pos_ok; @@ -1475,7 +1449,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) <<pointed.object_id<<": " <<pointed_object->getDescription()<<std::endl; - ItemStack punchitem = playersao->getWieldedItem(); + ItemStack punchitem = playersao->getWieldedItemOrHand(); ToolCapabilities toolcap = punchitem.getToolCapabilities(m_itemdef); v3f dir = (pointed_object->getBasePosition() - @@ -1542,7 +1516,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) m_script->on_cheat(playersao, "finished_unknown_dig"); } // Get player's wielded item - ItemStack playeritem = playersao->getWieldedItem(); + ItemStack playeritem = playersao->getWieldedItemOrHand(); ToolCapabilities playeritem_toolcap = playeritem.getToolCapabilities(m_itemdef); // Get diggability and expected digging time @@ -1550,7 +1524,9 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) &playeritem_toolcap); // If can't dig, try hand if (!params.diggable) { - const ItemDefinition &hand = m_itemdef->get(""); + InventoryList *hlist = playersao->getInventory()->getList("hand"); + const ItemDefinition &hand = + hlist ? hlist->getItem(0).getDefinition(m_itemdef) : m_itemdef->get(""); const ToolCapabilities *tp = hand.tool_capabilities; if (tp) params = getDigParams(m_nodedef->get(n).groups, tp); diff --git a/src/nodedef.cpp b/src/nodedef.cpp index ccbb42c66..98b34ea9e 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef SERVER #include "client/tile.h" #include "mesh.h" +#include "client.h" #include <IMeshManipulator.h> #endif #include "log.h" @@ -60,11 +61,10 @@ void NodeBox::reset() void NodeBox::serialize(std::ostream &os, u16 protocol_version) const { - int version = 1; + // Protocol >= 21 + int version = 2; if (protocol_version >= 27) version = 3; - else if (protocol_version >= 21) - version = 2; writeU8(os, version); switch (type) { @@ -188,39 +188,51 @@ void NodeBox::deSerialize(std::istream &is) void TileDef::serialize(std::ostream &os, u16 protocol_version) const { - if (protocol_version >= 26) + if (protocol_version >= 30) + writeU8(os, 4); + else if (protocol_version >= 29) + writeU8(os, 3); + else if (protocol_version >= 26) writeU8(os, 2); - else if (protocol_version >= 17) - writeU8(os, 1); else - writeU8(os, 0); - os<<serializeString(name); - writeU8(os, animation.type); - writeU16(os, animation.aspect_w); - writeU16(os, animation.aspect_h); - writeF1000(os, animation.length); - if (protocol_version >= 17) - writeU8(os, backface_culling); + writeU8(os, 1); + + os << serializeString(name); + animation.serialize(os, protocol_version); + writeU8(os, backface_culling); if (protocol_version >= 26) { writeU8(os, tileable_horizontal); writeU8(os, tileable_vertical); } + if (protocol_version >= 30) { + writeU8(os, has_color); + if (has_color) { + writeU8(os, color.getRed()); + writeU8(os, color.getGreen()); + writeU8(os, color.getBlue()); + } + } } void TileDef::deSerialize(std::istream &is, const u8 contenfeatures_version, const NodeDrawType drawtype) { int version = readU8(is); name = deSerializeString(is); - animation.type = (TileAnimationType)readU8(is); - animation.aspect_w = readU16(is); - animation.aspect_h = readU16(is); - animation.length = readF1000(is); + animation.deSerialize(is, version >= 3 ? 29 : 26); if (version >= 1) backface_culling = readU8(is); if (version >= 2) { tileable_horizontal = readU8(is); tileable_vertical = readU8(is); } + if (version >= 4) { + has_color = readU8(is); + if (has_color) { + color.setRed(readU8(is)); + color.setGreen(readU8(is)); + color.setBlue(readU8(is)); + } + } if ((contenfeatures_version < 8) && ((drawtype == NDT_MESH) || @@ -254,10 +266,15 @@ void TextureSettings::readSettings() bool enable_shaders = g_settings->getBool("enable_shaders"); bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping"); bool enable_parallax_occlusion = g_settings->getBool("enable_parallax_occlusion"); + bool smooth_lighting = g_settings->getBool("smooth_lighting"); enable_mesh_cache = g_settings->getBool("enable_mesh_cache"); enable_minimap = g_settings->getBool("enable_minimap"); std::string leaves_style_str = g_settings->get("leaves_style"); + // Mesh cache is not supported in combination with smooth lighting + if (smooth_lighting) + enable_mesh_cache = false; + use_normal_texture = enable_shaders && (enable_bumpmapping || enable_parallax_occlusion); if (leaves_style_str == "fancy") { @@ -354,172 +371,224 @@ void ContentFeatures::reset() connects_to.clear(); connects_to_ids.clear(); connect_sides = 0; + color = video::SColor(0xFFFFFFFF); + palette_name = ""; + palette = NULL; } void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const { - if(protocol_version < 24){ + if (protocol_version < 31) { serializeOld(os, protocol_version); return; } - writeU8(os, protocol_version < 27 ? 7 : 8); + // version + writeU8(os, 10); - os<<serializeString(name); + // general + os << serializeString(name); writeU16(os, groups.size()); - for(ItemGroupList::const_iterator - i = groups.begin(); i != groups.end(); ++i){ - os<<serializeString(i->first); + for (ItemGroupList::const_iterator i = groups.begin(); i != groups.end(); + ++i) { + os << serializeString(i->first); writeS16(os, i->second); } + writeU8(os, param_type); + writeU8(os, param_type_2); + + // visual writeU8(os, drawtype); + os << serializeString(mesh); writeF1000(os, visual_scale); writeU8(os, 6); - for(u32 i = 0; i < 6; i++) + for (u32 i = 0; i < 6; i++) tiledef[i].serialize(os, protocol_version); + for (u32 i = 0; i < 6; i++) + tiledef_overlay[i].serialize(os, protocol_version); writeU8(os, CF_SPECIAL_COUNT); - for(u32 i = 0; i < CF_SPECIAL_COUNT; i++){ + for (u32 i = 0; i < CF_SPECIAL_COUNT; i++) { tiledef_special[i].serialize(os, protocol_version); } writeU8(os, alpha); + writeU8(os, color.getRed()); + writeU8(os, color.getGreen()); + writeU8(os, color.getBlue()); + os << serializeString(palette_name); + writeU8(os, waving); + writeU8(os, connect_sides); + writeU16(os, connects_to_ids.size()); + for (std::set<content_t>::const_iterator i = connects_to_ids.begin(); + i != connects_to_ids.end(); ++i) + writeU16(os, *i); writeU8(os, post_effect_color.getAlpha()); writeU8(os, post_effect_color.getRed()); writeU8(os, post_effect_color.getGreen()); writeU8(os, post_effect_color.getBlue()); - writeU8(os, param_type); - if ((protocol_version < 28) && (param_type_2 == CPT2_MESHOPTIONS)) - writeU8(os, CPT2_NONE); - else - writeU8(os, param_type_2); - writeU8(os, is_ground_content); + writeU8(os, leveled); + + // lighting writeU8(os, light_propagates); writeU8(os, sunlight_propagates); + writeU8(os, light_source); + + // map generation + writeU8(os, is_ground_content); + + // interaction writeU8(os, walkable); writeU8(os, pointable); writeU8(os, diggable); writeU8(os, climbable); writeU8(os, buildable_to); - os<<serializeString(""); // legacy: used to be metadata_name + writeU8(os, rightclickable); + writeU32(os, damage_per_second); + + // liquid writeU8(os, liquid_type); - os<<serializeString(liquid_alternative_flowing); - os<<serializeString(liquid_alternative_source); + os << serializeString(liquid_alternative_flowing); + os << serializeString(liquid_alternative_source); writeU8(os, liquid_viscosity); writeU8(os, liquid_renewable); - writeU8(os, light_source); - writeU32(os, damage_per_second); + writeU8(os, liquid_range); + writeU8(os, drowning); + writeU8(os, floodable); + + // node boxes node_box.serialize(os, protocol_version); selection_box.serialize(os, protocol_version); - writeU8(os, legacy_facedir_simple); - writeU8(os, legacy_wallmounted); + collision_box.serialize(os, protocol_version); + + // sound serializeSimpleSoundSpec(sound_footstep, os); serializeSimpleSoundSpec(sound_dig, os); serializeSimpleSoundSpec(sound_dug, os); - writeU8(os, rightclickable); - writeU8(os, drowning); - writeU8(os, leveled); - writeU8(os, liquid_range); - writeU8(os, waving); - // Stuff below should be moved to correct place in a version that otherwise changes - // the protocol version - os<<serializeString(mesh); - collision_box.serialize(os, protocol_version); - writeU8(os, floodable); - writeU16(os, connects_to_ids.size()); - for (std::set<content_t>::const_iterator i = connects_to_ids.begin(); - i != connects_to_ids.end(); ++i) - writeU16(os, *i); - writeU8(os, connect_sides); + + // legacy + writeU8(os, legacy_facedir_simple); + writeU8(os, legacy_wallmounted); +} + +void ContentFeatures::correctAlpha(TileDef *tiles, int length) +{ + // alpha == 0 means that the node is using texture alpha + if (alpha == 0 || alpha == 255) + return; + + for (int i = 0; i < length; i++) { + if (tiles[i].name == "") + continue; + std::stringstream s; + s << tiles[i].name << "^[noalpha^[opacity:" << ((int)alpha); + tiles[i].name = s.str(); + } } void ContentFeatures::deSerialize(std::istream &is) { + // version detection int version = readU8(is); - if (version < 7) { + if (version < 9) { deSerializeOld(is, version); return; - } else if (version > 8) { + } else if (version > 10) { throw SerializationError("unsupported ContentFeatures version"); } + // general name = deSerializeString(is); groups.clear(); u32 groups_size = readU16(is); - for(u32 i = 0; i < groups_size; i++){ + for (u32 i = 0; i < groups_size; i++) { std::string name = deSerializeString(is); int value = readS16(is); groups[name] = value; } - drawtype = (enum NodeDrawType)readU8(is); + param_type = (enum ContentParamType) readU8(is); + param_type_2 = (enum ContentParamType2) readU8(is); + // visual + drawtype = (enum NodeDrawType) readU8(is); + mesh = deSerializeString(is); visual_scale = readF1000(is); - if(readU8(is) != 6) + if (readU8(is) != 6) throw SerializationError("unsupported tile count"); - for(u32 i = 0; i < 6; i++) + for (u32 i = 0; i < 6; i++) tiledef[i].deSerialize(is, version, drawtype); - if(readU8(is) != CF_SPECIAL_COUNT) + if (version >= 10) + for (u32 i = 0; i < 6; i++) + tiledef_overlay[i].deSerialize(is, version, drawtype); + if (readU8(is) != CF_SPECIAL_COUNT) throw SerializationError("unsupported CF_SPECIAL_COUNT"); - for(u32 i = 0; i < CF_SPECIAL_COUNT; i++) + for (u32 i = 0; i < CF_SPECIAL_COUNT; i++) tiledef_special[i].deSerialize(is, version, drawtype); alpha = readU8(is); + color.setRed(readU8(is)); + color.setGreen(readU8(is)); + color.setBlue(readU8(is)); + palette_name = deSerializeString(is); + waving = readU8(is); + connect_sides = readU8(is); + u16 connects_to_size = readU16(is); + connects_to_ids.clear(); + for (u16 i = 0; i < connects_to_size; i++) + connects_to_ids.insert(readU16(is)); post_effect_color.setAlpha(readU8(is)); post_effect_color.setRed(readU8(is)); post_effect_color.setGreen(readU8(is)); post_effect_color.setBlue(readU8(is)); - param_type = (enum ContentParamType)readU8(is); - param_type_2 = (enum ContentParamType2)readU8(is); - is_ground_content = readU8(is); + leveled = readU8(is); + + // lighting-related light_propagates = readU8(is); sunlight_propagates = readU8(is); + light_source = readU8(is); + light_source = MYMIN(light_source, LIGHT_MAX); + + // map generation + is_ground_content = readU8(is); + + // interaction walkable = readU8(is); pointable = readU8(is); diggable = readU8(is); climbable = readU8(is); buildable_to = readU8(is); - deSerializeString(is); // legacy: used to be metadata_name - liquid_type = (enum LiquidType)readU8(is); + rightclickable = readU8(is); + damage_per_second = readU32(is); + + // liquid + liquid_type = (enum LiquidType) readU8(is); liquid_alternative_flowing = deSerializeString(is); liquid_alternative_source = deSerializeString(is); liquid_viscosity = readU8(is); liquid_renewable = readU8(is); - light_source = readU8(is); - light_source = MYMIN(light_source, LIGHT_MAX); - damage_per_second = readU32(is); + liquid_range = readU8(is); + drowning = readU8(is); + floodable = readU8(is); + + // node boxes node_box.deSerialize(is); selection_box.deSerialize(is); - legacy_facedir_simple = readU8(is); - legacy_wallmounted = readU8(is); + collision_box.deSerialize(is); + + // sounds deSerializeSimpleSoundSpec(sound_footstep, is); deSerializeSimpleSoundSpec(sound_dig, is); deSerializeSimpleSoundSpec(sound_dug, is); - rightclickable = readU8(is); - drowning = readU8(is); - leveled = readU8(is); - liquid_range = readU8(is); - waving = readU8(is); - // If you add anything here, insert it primarily inside the try-catch - // block to not need to increase the version. - try{ - // Stuff below should be moved to correct place in a version that - // otherwise changes the protocol version - mesh = deSerializeString(is); - collision_box.deSerialize(is); - floodable = readU8(is); - u16 connects_to_size = readU16(is); - connects_to_ids.clear(); - for (u16 i = 0; i < connects_to_size; i++) - connects_to_ids.insert(readU16(is)); - connect_sides = readU8(is); - }catch(SerializationError &e) {}; + + // read legacy properties + legacy_facedir_simple = readU8(is); + legacy_wallmounted = readU8(is); } #ifndef SERVER -void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, +void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileLayer *tile, TileDef *tiledef, u32 shader_id, bool use_normal_texture, - bool backface_culling, u8 alpha, u8 material_type) + bool backface_culling, u8 material_type) { tile->shader_id = shader_id; tile->texture = tsrc->getTextureForMesh(tiledef->name, &tile->texture_id); - tile->alpha = alpha; tile->material_type = material_type; // Normal texture and shader flags texture @@ -532,29 +601,32 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, tile->material_flags = 0; if (backface_culling) tile->material_flags |= MATERIAL_FLAG_BACKFACE_CULLING; - if (tiledef->animation.type == TAT_VERTICAL_FRAMES) - tile->material_flags |= MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES; + if (tiledef->animation.type != TAT_NONE) + tile->material_flags |= MATERIAL_FLAG_ANIMATION; if (tiledef->tileable_horizontal) tile->material_flags |= MATERIAL_FLAG_TILEABLE_HORIZONTAL; if (tiledef->tileable_vertical) tile->material_flags |= MATERIAL_FLAG_TILEABLE_VERTICAL; + // Color + tile->has_color = tiledef->has_color; + if (tiledef->has_color) + tile->color = tiledef->color; + else + tile->color = color; + // Animation parameters int frame_count = 1; - if (tile->material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) { - // Get texture size to determine frame count by aspect ratio - v2u32 size = tile->texture->getOriginalSize(); - int frame_height = (float)size.X / - (float)tiledef->animation.aspect_w * - (float)tiledef->animation.aspect_h; - frame_count = size.Y / frame_height; - int frame_length_ms = 1000.0 * tiledef->animation.length / frame_count; + if (tile->material_flags & MATERIAL_FLAG_ANIMATION) { + int frame_length_ms; + tiledef->animation.determineParams(tile->texture->getOriginalSize(), + &frame_count, &frame_length_ms, NULL); tile->animation_frame_count = frame_count; tile->animation_frame_length_ms = frame_length_ms; } if (frame_count == 1) { - tile->material_flags &= ~MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES; + tile->material_flags &= ~MATERIAL_FLAG_ANIMATION; } else { std::ostringstream os(std::ios::binary); tile->frames.resize(frame_count); @@ -564,8 +636,9 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, FrameSpec frame; os.str(""); - os << tiledef->name << "^[verticalframe:" - << frame_count << ":" << i; + os << tiledef->name; + tiledef->animation.getTextureModifer(os, + tile->texture->getOriginalSize(), i); frame.texture = tsrc->getTextureForMesh(os.str(), &frame.texture_id); if (tile->normal_texture) @@ -579,8 +652,7 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, #ifndef SERVER void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc, - scene::ISceneManager *smgr, scene::IMeshManipulator *meshmanip, - IGameDef *gamedef, const TextureSettings &tsettings) + scene::IMeshManipulator *meshmanip, Client *client, const TextureSettings &tsettings) { // minimap pixel color - the average color of a texture if (tsettings.enable_minimap && tiledef[0].name != "") @@ -593,9 +665,16 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc if (tdef[j].name == "") tdef[j].name = "unknown_node.png"; } + // also the overlay tiles + TileDef tdef_overlay[6]; + for (u32 j = 0; j < 6; j++) + tdef_overlay[j] = tiledef_overlay[j]; + // also the special tiles + TileDef tdef_spec[6]; + for (u32 j = 0; j < CF_SPECIAL_COUNT; j++) + tdef_spec[j] = tiledef_special[j]; bool is_liquid = false; - bool is_water_surface = false; u8 material_type = (alpha == 255) ? TILE_MATERIAL_BASIC : TILE_MATERIAL_ALPHA; @@ -646,8 +725,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc visual_solidness = 1; } else if (tsettings.leaves_style == LEAVES_SIMPLE) { for (u32 j = 0; j < 6; j++) { - if (tiledef_special[j].name != "") - tdef[j].name = tiledef_special[j].name; + if (tdef_spec[j].name != "") + tdef[j].name = tdef_spec[j].name; } drawtype = NDT_GLASSLIKE; solidness = 0; @@ -658,34 +737,40 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc for (u32 i = 0; i < 6; i++) tdef[i].name += std::string("^[noalpha"); } - if (waving == 1) + if (waving >= 1) material_type = TILE_MATERIAL_WAVING_LEAVES; break; case NDT_PLANTLIKE: solidness = 0; - if (waving == 1) + if (waving >= 1) material_type = TILE_MATERIAL_WAVING_PLANTS; break; case NDT_FIRELIKE: solidness = 0; break; case NDT_MESH: + case NDT_NODEBOX: solidness = 0; + if (waving == 1) + material_type = TILE_MATERIAL_WAVING_PLANTS; + else if (waving == 2) + material_type = TILE_MATERIAL_WAVING_LEAVES; break; case NDT_TORCHLIKE: case NDT_SIGNLIKE: case NDT_FENCELIKE: case NDT_RAILLIKE: - case NDT_NODEBOX: solidness = 0; break; } if (is_liquid) { + // Vertex alpha is no longer supported, correct if necessary. + correctAlpha(tdef, 6); + correctAlpha(tdef_overlay, 6); + correctAlpha(tdef_spec, CF_SPECIAL_COUNT); material_type = (alpha == 255) ? TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT; - if (name == "default:water_source") - is_water_surface = true; } u32 tile_shader[6]; @@ -694,29 +779,33 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc material_type, drawtype); } - if (is_water_surface) { - tile_shader[0] = shdsrc->getShader("water_surface_shader", - material_type, drawtype); - } - // Tiles (fill in f->tiles[]) for (u16 j = 0; j < 6; j++) { - fillTileAttribs(tsrc, &tiles[j], &tdef[j], tile_shader[j], + fillTileAttribs(tsrc, &tiles[j].layers[0], &tdef[j], tile_shader[j], tsettings.use_normal_texture, - tiledef[j].backface_culling, alpha, material_type); + tdef[j].backface_culling, material_type); + if (tdef_overlay[j].name != "") + fillTileAttribs(tsrc, &tiles[j].layers[1], &tdef_overlay[j], + tile_shader[j], tsettings.use_normal_texture, + tdef[j].backface_culling, material_type); } // Special tiles (fill in f->special_tiles[]) for (u16 j = 0; j < CF_SPECIAL_COUNT; j++) { - fillTileAttribs(tsrc, &special_tiles[j], &tiledef_special[j], + fillTileAttribs(tsrc, &special_tiles[j].layers[0], &tdef_spec[j], tile_shader[j], tsettings.use_normal_texture, - tiledef_special[j].backface_culling, alpha, material_type); + tdef_spec[j].backface_culling, material_type); } + if (param_type_2 == CPT2_COLOR || + param_type_2 == CPT2_COLORED_FACEDIR || + param_type_2 == CPT2_COLORED_WALLMOUNTED) + palette = tsrc->getPalette(palette_name); + if ((drawtype == NDT_MESH) && (mesh != "")) { // Meshnode drawtype // Read the mesh and apply scale - mesh_ptr[0] = gamedef->getMesh(mesh); + mesh_ptr[0] = client->getMesh(mesh); if (mesh_ptr[0]){ v3f scale = v3f(1.0, 1.0, 1.0) * BS * visual_scale; scaleMesh(mesh_ptr[0], scale); @@ -738,15 +827,19 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc } //Cache 6dfacedir and wallmounted rotated clones of meshes - if (tsettings.enable_mesh_cache && mesh_ptr[0] && (param_type_2 == CPT2_FACEDIR)) { + if (tsettings.enable_mesh_cache && mesh_ptr[0] && + (param_type_2 == CPT2_FACEDIR + || param_type_2 == CPT2_COLORED_FACEDIR)) { for (u16 j = 1; j < 24; j++) { mesh_ptr[j] = cloneMesh(mesh_ptr[0]); rotateMeshBy6dFacedir(mesh_ptr[j], j); recalculateBoundingBox(mesh_ptr[j]); meshmanip->recalculateNormals(mesh_ptr[j], true, false); } - } else if (tsettings.enable_mesh_cache && mesh_ptr[0] && (param_type_2 == CPT2_WALLMOUNTED)) { - static const u8 wm_to_6d[6] = {20, 0, 16+1, 12+3, 8, 4+2}; + } else if (tsettings.enable_mesh_cache && mesh_ptr[0] + && (param_type_2 == CPT2_WALLMOUNTED || + param_type_2 == CPT2_COLORED_WALLMOUNTED)) { + static const u8 wm_to_6d[6] = { 20, 0, 16 + 1, 12 + 3, 8, 4 + 2 }; for (u16 j = 1; j < 6; j++) { mesh_ptr[j] = cloneMesh(mesh_ptr[0]); rotateMeshBy6dFacedir(mesh_ptr[j], wm_to_6d[j]); @@ -788,7 +881,6 @@ public: void serialize(std::ostream &os, u16 protocol_version) const; void deSerialize(std::istream &is); - inline virtual bool getNodeRegistrationStatus() const; inline virtual void setNodeRegistrationStatus(bool completed); virtual void pendNodeResolve(NodeResolver *nr); @@ -797,9 +889,18 @@ public: virtual void resetNodeResolveState(); virtual void mapNodeboxConnections(); virtual bool nodeboxConnects(MapNode from, MapNode to, u8 connect_face); + virtual core::aabbox3d<s16> getSelectionBoxIntUnion() const + { + return m_selection_box_int_union; + } private: void addNameIdMapping(content_t i, std::string name); + /*! + * Recalculates m_selection_box_int_union based on + * m_selection_box_union. + */ + void fixSelectionBoxIntUnion(); // Features indexed by id std::vector<ContentFeatures> m_content_features; @@ -826,6 +927,14 @@ private: // True when all nodes have been registered bool m_node_registration_complete; + + //! The union of all nodes' selection boxes. + aabb3f m_selection_box_union; + /*! + * The smallest box in node coordinates that + * contains all nodes' selection boxes. + */ + core::aabbox3d<s16> m_selection_box_int_union; }; @@ -856,6 +965,8 @@ void CNodeDefManager::clear() m_name_id_mapping_with_aliases.clear(); m_group_to_items.clear(); m_next_id = 0; + m_selection_box_union.reset(0,0,0); + m_selection_box_int_union.reset(0,0,0); resetNodeResolveState(); @@ -1014,6 +1125,124 @@ content_t CNodeDefManager::allocateId() } +/*! + * Returns the smallest box that contains all boxes + * in the vector. Box_union is expanded. + * @param[in] boxes the vector containing the boxes + * @param[in, out] box_union the union of the arguments + */ +void boxVectorUnion(const std::vector<aabb3f> &boxes, aabb3f *box_union) +{ + for (std::vector<aabb3f>::const_iterator it = boxes.begin(); + it != boxes.end(); ++it) { + box_union->addInternalBox(*it); + } +} + + +/*! + * Returns a box that contains the nodebox in every case. + * The argument node_union is expanded. + * @param[in] nodebox the nodebox to be measured + * @param[in] features used to decide whether the nodebox + * can be rotated + * @param[in, out] box_union the union of the arguments + */ +void getNodeBoxUnion(const NodeBox &nodebox, const ContentFeatures &features, + aabb3f *box_union) +{ + switch(nodebox.type) { + case NODEBOX_FIXED: + case NODEBOX_LEVELED: { + // Raw union + aabb3f half_processed(0, 0, 0, 0, 0, 0); + boxVectorUnion(nodebox.fixed, &half_processed); + // Set leveled boxes to maximal + if (nodebox.type == NODEBOX_LEVELED) { + half_processed.MaxEdge.Y = +BS / 2; + } + if (features.param_type_2 == CPT2_FACEDIR || + features.param_type_2 == CPT2_COLORED_FACEDIR) { + // Get maximal coordinate + f32 coords[] = { + fabsf(half_processed.MinEdge.X), + fabsf(half_processed.MinEdge.Y), + fabsf(half_processed.MinEdge.Z), + fabsf(half_processed.MaxEdge.X), + fabsf(half_processed.MaxEdge.Y), + fabsf(half_processed.MaxEdge.Z) }; + f32 max = 0; + for (int i = 0; i < 6; i++) { + if (max < coords[i]) { + max = coords[i]; + } + } + // Add the union of all possible rotated boxes + box_union->addInternalPoint(-max, -max, -max); + box_union->addInternalPoint(+max, +max, +max); + } else { + box_union->addInternalBox(half_processed); + } + break; + } + case NODEBOX_WALLMOUNTED: { + // Add fix boxes + box_union->addInternalBox(nodebox.wall_top); + box_union->addInternalBox(nodebox.wall_bottom); + // Find maximal coordinate in the X-Z plane + f32 coords[] = { + fabsf(nodebox.wall_side.MinEdge.X), + fabsf(nodebox.wall_side.MinEdge.Z), + fabsf(nodebox.wall_side.MaxEdge.X), + fabsf(nodebox.wall_side.MaxEdge.Z) }; + f32 max = 0; + for (int i = 0; i < 4; i++) { + if (max < coords[i]) { + max = coords[i]; + } + } + // Add the union of all possible rotated boxes + box_union->addInternalPoint(-max, nodebox.wall_side.MinEdge.Y, -max); + box_union->addInternalPoint(max, nodebox.wall_side.MaxEdge.Y, max); + break; + } + case NODEBOX_CONNECTED: { + // Add all possible connected boxes + boxVectorUnion(nodebox.fixed, box_union); + boxVectorUnion(nodebox.connect_top, box_union); + boxVectorUnion(nodebox.connect_bottom, box_union); + boxVectorUnion(nodebox.connect_front, box_union); + boxVectorUnion(nodebox.connect_left, box_union); + boxVectorUnion(nodebox.connect_back, box_union); + boxVectorUnion(nodebox.connect_right, box_union); + break; + } + default: { + // NODEBOX_REGULAR + box_union->addInternalPoint(-BS / 2, -BS / 2, -BS / 2); + box_union->addInternalPoint(+BS / 2, +BS / 2, +BS / 2); + } + } +} + + +inline void CNodeDefManager::fixSelectionBoxIntUnion() +{ + m_selection_box_int_union.MinEdge.X = floorf( + m_selection_box_union.MinEdge.X / BS + 0.5f); + m_selection_box_int_union.MinEdge.Y = floorf( + m_selection_box_union.MinEdge.Y / BS + 0.5f); + m_selection_box_int_union.MinEdge.Z = floorf( + m_selection_box_union.MinEdge.Z / BS + 0.5f); + m_selection_box_int_union.MaxEdge.X = ceilf( + m_selection_box_union.MaxEdge.X / BS - 0.5f); + m_selection_box_int_union.MaxEdge.Y = ceilf( + m_selection_box_union.MaxEdge.Y / BS - 0.5f); + m_selection_box_int_union.MaxEdge.Z = ceilf( + m_selection_box_union.MaxEdge.Z / BS - 0.5f); +} + + // IWritableNodeDefManager content_t CNodeDefManager::set(const std::string &name, const ContentFeatures &def) { @@ -1044,6 +1273,8 @@ content_t CNodeDefManager::set(const std::string &name, const ContentFeatures &d verbosestream << "NodeDefManager: registering content id \"" << id << "\": name=\"" << def.name << "\""<<std::endl; + getNodeBoxUnion(def.selection_box, def, &m_selection_box_union); + fixSelectionBoxIntUnion(); // Add this content to the list of all groups it belongs to // FIXME: This should remove a node from groups it no longer // belongs to when a node is re-registered @@ -1088,34 +1319,34 @@ void CNodeDefManager::removeNode(const std::string &name) // Erase node content from all groups it belongs to for (UNORDERED_MAP<std::string, GroupItems>::iterator iter_groups = - m_group_to_items.begin(); - iter_groups != m_group_to_items.end();) { + m_group_to_items.begin(); iter_groups != m_group_to_items.end();) { GroupItems &items = iter_groups->second; for (GroupItems::iterator iter_groupitems = items.begin(); iter_groupitems != items.end();) { if (iter_groupitems->first == id) items.erase(iter_groupitems++); else - iter_groupitems++; + ++iter_groupitems; } // Check if group is empty if (items.size() == 0) m_group_to_items.erase(iter_groups++); else - iter_groups++; + ++iter_groups; } } void CNodeDefManager::updateAliases(IItemDefManager *idef) { - std::set<std::string> all = idef->getAll(); + std::set<std::string> all; + idef->getAll(all); m_name_id_mapping_with_aliases.clear(); - for (std::set<std::string>::iterator + for (std::set<std::string>::const_iterator i = all.begin(); i != all.end(); ++i) { - std::string name = *i; - std::string convert_to = idef->getAlias(name); + const std::string &name = *i; + const std::string &convert_to = idef->getAlias(name); content_t id; if (m_name_id_mapping.getId(convert_to, id)) { m_name_id_mapping_with_aliases.insert( @@ -1185,9 +1416,11 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef, #ifndef SERVER infostream << "CNodeDefManager::updateTextures(): Updating " "textures in node definitions" << std::endl; - ITextureSource *tsrc = gamedef->tsrc(); - IShaderSource *shdsrc = gamedef->getShaderSource(); - scene::ISceneManager* smgr = gamedef->getSceneManager(); + + Client *client = (Client *)gamedef; + ITextureSource *tsrc = client->tsrc(); + IShaderSource *shdsrc = client->getShaderSource(); + scene::ISceneManager* smgr = client->getSceneManager(); scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator(); TextureSettings tsettings; tsettings.readSettings(); @@ -1195,7 +1428,8 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef, u32 size = m_content_features.size(); for (u32 i = 0; i < size; i++) { - m_content_features[i].updateTextures(tsrc, shdsrc, smgr, meshmanip, gamedef, tsettings); + ContentFeatures *f = &(m_content_features[i]); + f->updateTextures(tsrc, shdsrc, meshmanip, client, tsettings); progress_callback(progress_callback_args, i, size); } #endif @@ -1273,6 +1507,9 @@ void CNodeDefManager::deSerialize(std::istream &is) m_content_features[i] = f; addNameIdMapping(i, f.name); verbosestream << "deserialized " << f.name << std::endl; + + getNodeBoxUnion(f.selection_box, f, &m_selection_box_union); + fixSelectionBoxIntUnion(); } } @@ -1293,72 +1530,52 @@ IWritableNodeDefManager *createNodeDefManager() //// Serialization of old ContentFeatures formats void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const { - if (protocol_version == 13) - { - writeU8(os, 5); // version - os<<serializeString(name); - writeU16(os, groups.size()); - for (ItemGroupList::const_iterator - i = groups.begin(); i != groups.end(); ++i) { - os<<serializeString(i->first); - writeS16(os, i->second); + u8 compatible_param_type_2 = param_type_2; + if ((protocol_version < 28) + && (compatible_param_type_2 == CPT2_MESHOPTIONS)) + compatible_param_type_2 = CPT2_NONE; + else if (protocol_version < 30) { + if (compatible_param_type_2 == CPT2_COLOR) + compatible_param_type_2 = CPT2_NONE; + else if (compatible_param_type_2 == CPT2_COLORED_FACEDIR) + compatible_param_type_2 = CPT2_FACEDIR; + else if (compatible_param_type_2 == CPT2_COLORED_WALLMOUNTED) + compatible_param_type_2 = CPT2_WALLMOUNTED; + } + + float compatible_visual_scale = visual_scale; + if (protocol_version < 30 && drawtype == NDT_PLANTLIKE) + compatible_visual_scale = sqrt(visual_scale); + + TileDef compatible_tiles[6]; + for (u8 i = 0; i < 6; i++) { + compatible_tiles[i] = tiledef[i]; + if (tiledef_overlay[i].name != "") { + std::stringstream s; + s << "(" << tiledef[i].name << ")^(" << tiledef_overlay[i].name + << ")"; + compatible_tiles[i].name = s.str(); } - writeU8(os, drawtype); - writeF1000(os, visual_scale); - writeU8(os, 6); - for (u32 i = 0; i < 6; i++) - tiledef[i].serialize(os, protocol_version); - //CF_SPECIAL_COUNT = 2 before cf ver. 7 and protocol ver. 24 - writeU8(os, 2); - for (u32 i = 0; i < 2; i++) - tiledef_special[i].serialize(os, protocol_version); - writeU8(os, alpha); - writeU8(os, post_effect_color.getAlpha()); - writeU8(os, post_effect_color.getRed()); - writeU8(os, post_effect_color.getGreen()); - writeU8(os, post_effect_color.getBlue()); - writeU8(os, param_type); - writeU8(os, param_type_2); - writeU8(os, is_ground_content); - writeU8(os, light_propagates); - writeU8(os, sunlight_propagates); - writeU8(os, walkable); - writeU8(os, pointable); - writeU8(os, diggable); - writeU8(os, climbable); - writeU8(os, buildable_to); - os<<serializeString(""); // legacy: used to be metadata_name - writeU8(os, liquid_type); - os<<serializeString(liquid_alternative_flowing); - os<<serializeString(liquid_alternative_source); - writeU8(os, liquid_viscosity); - writeU8(os, light_source); - writeU32(os, damage_per_second); - node_box.serialize(os, protocol_version); - selection_box.serialize(os, protocol_version); - writeU8(os, legacy_facedir_simple); - writeU8(os, legacy_wallmounted); - serializeSimpleSoundSpec(sound_footstep, os); - serializeSimpleSoundSpec(sound_dig, os); - serializeSimpleSoundSpec(sound_dug, os); } - else if (protocol_version > 13 && protocol_version < 24) { - writeU8(os, 6); // version - os<<serializeString(name); + + // Protocol >= 24 + if (protocol_version < 31) { + writeU8(os, protocol_version < 27 ? 7 : 8); + + os << serializeString(name); writeU16(os, groups.size()); - for (ItemGroupList::const_iterator - i = groups.begin(); i != groups.end(); ++i) { - os<<serializeString(i->first); - writeS16(os, i->second); + for (ItemGroupList::const_iterator i = groups.begin(); + i != groups.end(); ++i) { + os << serializeString(i->first); + writeS16(os, i->second); } writeU8(os, drawtype); - writeF1000(os, visual_scale); + writeF1000(os, compatible_visual_scale); writeU8(os, 6); for (u32 i = 0; i < 6; i++) - tiledef[i].serialize(os, protocol_version); - //CF_SPECIAL_COUNT = 2 before cf ver. 7 and protocol ver. 24 - writeU8(os, 2); - for (u32 i = 0; i < 2; i++) + compatible_tiles[i].serialize(os, protocol_version); + writeU8(os, CF_SPECIAL_COUNT); + for (u32 i = 0; i < CF_SPECIAL_COUNT; i++) tiledef_special[i].serialize(os, protocol_version); writeU8(os, alpha); writeU8(os, post_effect_color.getAlpha()); @@ -1366,7 +1583,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeU8(os, post_effect_color.getGreen()); writeU8(os, post_effect_color.getBlue()); writeU8(os, param_type); - writeU8(os, param_type_2); + writeU8(os, compatible_param_type_2); writeU8(os, is_ground_content); writeU8(os, light_propagates); writeU8(os, sunlight_propagates); @@ -1375,10 +1592,10 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeU8(os, diggable); writeU8(os, climbable); writeU8(os, buildable_to); - os<<serializeString(""); // legacy: used to be metadata_name + os << serializeString(""); // legacy: used to be metadata_name writeU8(os, liquid_type); - os<<serializeString(liquid_alternative_flowing); - os<<serializeString(liquid_alternative_source); + os << serializeString(liquid_alternative_flowing); + os << serializeString(liquid_alternative_source); writeU8(os, liquid_viscosity); writeU8(os, liquid_renewable); writeU8(os, light_source); @@ -1394,9 +1611,19 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeU8(os, drowning); writeU8(os, leveled); writeU8(os, liquid_range); - } else + writeU8(os, waving); + os << serializeString(mesh); + collision_box.serialize(os, protocol_version); + writeU8(os, floodable); + writeU16(os, connects_to_ids.size()); + for (std::set<content_t>::const_iterator i = connects_to_ids.begin(); + i != connects_to_ids.end(); ++i) + writeU16(os, *i); + writeU8(os, connect_sides); + } else { throw SerializationError("ContentFeatures::serialize(): " "Unsupported version requested"); + } } void ContentFeatures::deSerializeOld(std::istream &is, int version) @@ -1506,18 +1733,77 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version) drowning = readU8(is); leveled = readU8(is); liquid_range = readU8(is); - } else { + } else if (version == 7 || version == 8){ + name = deSerializeString(is); + groups.clear(); + u32 groups_size = readU16(is); + for (u32 i = 0; i < groups_size; i++) { + std::string name = deSerializeString(is); + int value = readS16(is); + groups[name] = value; + } + drawtype = (enum NodeDrawType) readU8(is); + + visual_scale = readF1000(is); + if (readU8(is) != 6) + throw SerializationError("unsupported tile count"); + for (u32 i = 0; i < 6; i++) + tiledef[i].deSerialize(is, version, drawtype); + if (readU8(is) != CF_SPECIAL_COUNT) + throw SerializationError("unsupported CF_SPECIAL_COUNT"); + for (u32 i = 0; i < CF_SPECIAL_COUNT; i++) + tiledef_special[i].deSerialize(is, version, drawtype); + alpha = readU8(is); + post_effect_color.setAlpha(readU8(is)); + post_effect_color.setRed(readU8(is)); + post_effect_color.setGreen(readU8(is)); + post_effect_color.setBlue(readU8(is)); + param_type = (enum ContentParamType) readU8(is); + param_type_2 = (enum ContentParamType2) readU8(is); + is_ground_content = readU8(is); + light_propagates = readU8(is); + sunlight_propagates = readU8(is); + walkable = readU8(is); + pointable = readU8(is); + diggable = readU8(is); + climbable = readU8(is); + buildable_to = readU8(is); + deSerializeString(is); // legacy: used to be metadata_name + liquid_type = (enum LiquidType) readU8(is); + liquid_alternative_flowing = deSerializeString(is); + liquid_alternative_source = deSerializeString(is); + liquid_viscosity = readU8(is); + liquid_renewable = readU8(is); + light_source = readU8(is); + light_source = MYMIN(light_source, LIGHT_MAX); + damage_per_second = readU32(is); + node_box.deSerialize(is); + selection_box.deSerialize(is); + legacy_facedir_simple = readU8(is); + legacy_wallmounted = readU8(is); + deSerializeSimpleSoundSpec(sound_footstep, is); + deSerializeSimpleSoundSpec(sound_dig, is); + deSerializeSimpleSoundSpec(sound_dug, is); + rightclickable = readU8(is); + drowning = readU8(is); + leveled = readU8(is); + liquid_range = readU8(is); + waving = readU8(is); + try { + mesh = deSerializeString(is); + collision_box.deSerialize(is); + floodable = readU8(is); + u16 connects_to_size = readU16(is); + connects_to_ids.clear(); + for (u16 i = 0; i < connects_to_size; i++) + connects_to_ids.insert(readU16(is)); + connect_sides = readU8(is); + } catch (SerializationError &e) {}; + }else{ throw SerializationError("unsupported ContentFeatures version"); } } - -inline bool CNodeDefManager::getNodeRegistrationStatus() const -{ - return m_node_registration_complete; -} - - inline void CNodeDefManager::setNodeRegistrationStatus(bool completed) { m_node_registration_complete = completed; @@ -1600,19 +1886,23 @@ bool CNodeDefManager::nodeboxConnects(MapNode from, MapNode to, u8 connect_face) // does to node declare usable faces? if (f2.connect_sides > 0) { - if ((f2.param_type_2 == CPT2_FACEDIR) && (connect_face >= 4)) { - static const u8 rot[33 * 4] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 32, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4 - back - 8, 4, 32, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8 - right - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16, 8, 4, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - front - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 16, 8, 4 // 32 - left - }; - return (f2.connect_sides & rot[(connect_face * 4) + to.param2]); + if ((f2.param_type_2 == CPT2_FACEDIR || + f2.param_type_2 == CPT2_COLORED_FACEDIR) + && (connect_face >= 4)) { + static const u8 rot[33 * 4] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 32, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, // 4 - back + 8, 4, 32, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, // 8 - right + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 8, 4, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, // 16 - front + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 16, 8, 4 // 32 - left + }; + return (f2.connect_sides + & rot[(connect_face * 4) + (to.param2 & 0x1F)]); } return (f2.connect_sides & connect_face); } diff --git a/src/nodedef.h b/src/nodedef.h index 80396f992..4669df7f0 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -30,10 +30,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef SERVER #include "client/tile.h" #include "shader.h" +class Client; #endif #include "itemgroup.h" #include "sound.h" // SimpleSoundSpec #include "constants.h" // BS +#include "tileanimation.h" class INodeDefManager; class IItemDefManager; @@ -66,7 +68,15 @@ enum ContentParamType2 // 2D rotation for things like plants CPT2_DEGROTATE, // Mesh options for plants - CPT2_MESHOPTIONS + CPT2_MESHOPTIONS, + // Index for palette + CPT2_COLOR, + // 3 bits of palette index, then facedir + CPT2_COLORED_FACEDIR, + // 5 bits of palette index, then wallmounted + CPT2_COLORED_WALLMOUNTED, + // Glasslike framed drawtype internal liquid level, param2 values 0 to 63 + CPT2_GLASSLIKE_LIQUID_LEVEL, }; enum LiquidType @@ -136,58 +146,87 @@ public: enum NodeDrawType { - NDT_NORMAL, // A basic solid block - NDT_AIRLIKE, // Nothing is drawn - NDT_LIQUID, // Do not draw face towards same kind of flowing/source liquid - NDT_FLOWINGLIQUID, // A very special kind of thing - NDT_GLASSLIKE, // Glass-like, don't draw faces towards other glass - NDT_ALLFACES, // Leaves-like, draw all faces no matter what - NDT_ALLFACES_OPTIONAL, // Fancy -> allfaces, fast -> normal + // A basic solid block + NDT_NORMAL, + // Nothing is drawn + NDT_AIRLIKE, + // Do not draw face towards same kind of flowing/source liquid + NDT_LIQUID, + // A very special kind of thing + NDT_FLOWINGLIQUID, + // Glass-like, don't draw faces towards other glass + NDT_GLASSLIKE, + // Leaves-like, draw all faces no matter what + NDT_ALLFACES, + // Enabled -> ndt_allfaces, disabled -> ndt_normal + NDT_ALLFACES_OPTIONAL, + // Single plane perpendicular to a surface NDT_TORCHLIKE, + // Single plane parallel to a surface NDT_SIGNLIKE, + // 2 vertical planes in a 'X' shape diagonal to XZ axes. + // paramtype2 = "meshoptions" allows various forms, sizes and + // vertical and horizontal random offsets. NDT_PLANTLIKE, + // Fenceposts that connect to neighbouring fenceposts with horizontal bars NDT_FENCELIKE, + // Selects appropriate junction texture to connect like rails to + // neighbouring raillikes. NDT_RAILLIKE, + // Custom Lua-definable structure of multiple cuboids NDT_NODEBOX, - NDT_GLASSLIKE_FRAMED, // Glass-like, draw connected frames and all all - // visible faces - // uses 2 textures, one for frames, second for faces - NDT_FIRELIKE, // Draw faces slightly rotated and only on connecting nodes, - NDT_GLASSLIKE_FRAMED_OPTIONAL, // enabled -> connected, disabled -> Glass-like - // uses 2 textures, one for frames, second for faces - NDT_MESH, // Uses static meshes + // Glass-like, draw connected frames and all visible faces. + // param2 > 0 defines 64 levels of internal liquid + // Uses 3 textures, one for frames, second for faces, + // optional third is a 'special tile' for the liquid. + NDT_GLASSLIKE_FRAMED, + // Draw faces slightly rotated and only on neighbouring nodes + NDT_FIRELIKE, + // Enabled -> ndt_glasslike_framed, disabled -> ndt_glasslike + NDT_GLASSLIKE_FRAMED_OPTIONAL, + // Uses static meshes + NDT_MESH, +}; + +// Mesh options for NDT_PLANTLIKE with CPT2_MESHOPTIONS +static const u8 MO_MASK_STYLE = 0x07; +static const u8 MO_BIT_RANDOM_OFFSET = 0x08; +static const u8 MO_BIT_SCALE_SQRT2 = 0x10; +static const u8 MO_BIT_RANDOM_OFFSET_Y = 0x20; +enum PlantlikeStyle { + PLANT_STYLE_CROSS, + PLANT_STYLE_CROSS2, + PLANT_STYLE_STAR, + PLANT_STYLE_HASH, + PLANT_STYLE_HASH2, }; /* Stand-alone definition of a TileSpec (basically a server-side TileSpec) */ -enum TileAnimationType{ - TAT_NONE=0, - TAT_VERTICAL_FRAMES=1, -}; + struct TileDef { std::string name; bool backface_culling; // Takes effect only in special cases bool tileable_horizontal; bool tileable_vertical; - struct{ - enum TileAnimationType type; - int aspect_w; // width for aspect ratio - int aspect_h; // height for aspect ratio - float length; // seconds - } animation; - - TileDef() + //! If true, the tile has its own color. + bool has_color; + //! The color of the tile. + video::SColor color; + + struct TileAnimationParams animation; + + TileDef() : + name(""), + backface_culling(true), + tileable_horizontal(true), + tileable_vertical(true), + has_color(false), + color(video::SColor(0xFFFFFFFF)) { - name = ""; - backface_culling = true; - tileable_horizontal = true; - tileable_vertical = true; animation.type = TAT_NONE; - animation.aspect_w = 1; - animation.aspect_h = 1; - animation.length = 1.0; } void serialize(std::ostream &os, u16 protocol_version) const; @@ -200,7 +239,7 @@ struct ContentFeatures { /* Cached stuff - */ + */ #ifndef SERVER // 0 1 2 3 4 5 // up down right left back front @@ -220,12 +259,19 @@ struct ContentFeatures /* Actual data - */ + */ + + // --- GENERAL PROPERTIES --- std::string name; // "" = undefined node ItemGroupList groups; // Same as in itemdef + // Type of MapNode::param1 + ContentParamType param_type; + // Type of MapNode::param2 + ContentParamType2 param_type_2; + + // --- VISUAL PROPERTIES --- - // Visual definition enum NodeDrawType drawtype; std::string mesh; #ifndef SERVER @@ -234,20 +280,41 @@ struct ContentFeatures #endif float visual_scale; // Misc. scale parameter TileDef tiledef[6]; + // These will be drawn over the base tiles. + TileDef tiledef_overlay[6]; TileDef tiledef_special[CF_SPECIAL_COUNT]; // eg. flowing liquid + // If 255, the node is opaque. + // Otherwise it uses texture alpha. u8 alpha; - + // The color of the node. + video::SColor color; + std::string palette_name; + std::vector<video::SColor> *palette; + // Used for waving leaves/plants + u8 waving; + // for NDT_CONNECTED pairing + u8 connect_sides; + std::vector<std::string> connects_to; + std::set<content_t> connects_to_ids; // Post effect color, drawn when the camera is inside the node. video::SColor post_effect_color; + // Flowing liquid or snow, value = default level + u8 leveled; + + // --- LIGHTING-RELATED --- - // Type of MapNode::param1 - ContentParamType param_type; - // Type of MapNode::param2 - ContentParamType2 param_type_2; - // True for all ground-like things like stone and mud, false for eg. trees - bool is_ground_content; bool light_propagates; bool sunlight_propagates; + // Amount of light the node emits + u8 light_source; + + // --- MAP GENERATION --- + + // True for all ground-like things like stone and mud, false for eg. trees + bool is_ground_content; + + // --- INTERACTION PROPERTIES --- + // This is used for collision detection. // Also for general solidness queries. bool walkable; @@ -259,12 +326,12 @@ struct ContentFeatures bool climbable; // Player can build on these bool buildable_to; - // Liquids flow into and replace node - bool floodable; // Player cannot build to these (placement prediction disabled) bool rightclickable; - // Flowing liquid or snow, value = default level - u8 leveled; + u32 damage_per_second; + + // --- LIQUID PROPERTIES --- + // Whether the node is non-liquid, source liquid or flowing liquid enum LiquidType liquid_type; // If the content is liquid, this is the flowing version of the liquid. @@ -280,29 +347,28 @@ struct ContentFeatures // Number of flowing liquids surrounding source u8 liquid_range; u8 drowning; - // Amount of light the node emits - u8 light_source; - u32 damage_per_second; + // Liquids flow into and replace node + bool floodable; + + // --- NODEBOXES --- + NodeBox node_box; NodeBox selection_box; NodeBox collision_box; - // Used for waving leaves/plants - u8 waving; - // Compatibility with old maps - // Set to true if paramtype used to be 'facedir_simple' - bool legacy_facedir_simple; - // Set to true if wall_mounted used to be set to true - bool legacy_wallmounted; - // for NDT_CONNECTED pairing - u8 connect_sides; - // Sound properties + // --- SOUND PROPERTIES --- + SimpleSoundSpec sound_footstep; SimpleSoundSpec sound_dig; SimpleSoundSpec sound_dug; - std::vector<std::string> connects_to; - std::set<content_t> connects_to_ids; + // --- LEGACY --- + + // Compatibility with old maps + // Set to true if paramtype used to be 'facedir_simple' + bool legacy_facedir_simple; + // Set to true if wall_mounted used to be set to true + bool legacy_wallmounted; /* Methods @@ -315,6 +381,14 @@ struct ContentFeatures void deSerialize(std::istream &is); void serializeOld(std::ostream &os, u16 protocol_version) const; void deSerializeOld(std::istream &is, int version); + /*! + * Since vertex alpha is no longer supported, this method + * adds opacity directly to the texture pixels. + * + * \param tiles array of the tile definitions. + * \param length length of tiles + */ + void correctAlpha(TileDef *tiles, int length); /* Some handy methods @@ -327,13 +401,17 @@ struct ContentFeatures return (liquid_alternative_flowing == f.liquid_alternative_flowing); } + int getGroup(const std::string &group) const + { + return itemgroup_get(groups, group); + } + #ifndef SERVER - void fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef, + void fillTileAttribs(ITextureSource *tsrc, TileLayer *tile, TileDef *tiledef, u32 shader_id, bool use_normal_texture, bool backface_culling, - u8 alpha, u8 material_type); + u8 material_type); void updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc, - scene::ISceneManager *smgr, scene::IMeshManipulator *meshmanip, - IGameDef *gamedef, const TextureSettings &tsettings); + scene::IMeshManipulator *meshmanip, Client *client, const TextureSettings &tsettings); #endif }; @@ -354,11 +432,14 @@ public: virtual void serialize(std::ostream &os, u16 protocol_version) const=0; - virtual bool getNodeRegistrationStatus() const=0; - virtual void pendNodeResolve(NodeResolver *nr)=0; virtual bool cancelNodeResolveCallback(NodeResolver *nr)=0; virtual bool nodeboxConnects(const MapNode from, const MapNode to, u8 connect_face)=0; + /*! + * Returns the smallest box in node coordinates that + * contains all nodes' selection boxes. + */ + virtual core::aabbox3d<s16> getSelectionBoxIntUnion() const=0; }; class IWritableNodeDefManager : public INodeDefManager { @@ -408,7 +489,6 @@ public: virtual void serialize(std::ostream &os, u16 protocol_version) const=0; virtual void deSerialize(std::istream &is)=0; - virtual bool getNodeRegistrationStatus() const=0; virtual void setNodeRegistrationStatus(bool completed)=0; virtual void pendNodeResolve(NodeResolver *nr)=0; @@ -416,6 +496,7 @@ public: virtual void runNodeResolveCallbacks()=0; virtual void resetNodeResolveState()=0; virtual void mapNodeboxConnections()=0; + virtual core::aabbox3d<s16> getSelectionBoxIntUnion() const=0; }; IWritableNodeDefManager *createNodeDefManager(); diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp index 0801a028b..0e8195c34 100644 --- a/src/nodemetadata.cpp +++ b/src/nodemetadata.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "inventory.h" #include "log.h" #include "util/serialize.h" +#include "util/basic_macros.h" #include "constants.h" // MAP_BLOCKSIZE #include <sstream> @@ -31,38 +32,46 @@ with this program; if not, write to the Free Software Foundation, Inc., */ NodeMetadata::NodeMetadata(IItemDefManager *item_def_mgr): - m_stringvars(), m_inventory(new Inventory(item_def_mgr)) -{ -} +{} NodeMetadata::~NodeMetadata() { delete m_inventory; } -void NodeMetadata::serialize(std::ostream &os) const +void NodeMetadata::serialize(std::ostream &os, u8 version, bool disk) const { - int num_vars = m_stringvars.size(); + int num_vars = disk ? m_stringvars.size() : countNonPrivate(); writeU32(os, num_vars); for (StringMap::const_iterator it = m_stringvars.begin(); it != m_stringvars.end(); ++it) { + bool priv = isPrivate(it->first); + if (!disk && priv) + continue; + os << serializeString(it->first); os << serializeLongString(it->second); + if (version >= 2) + writeU8(os, (priv) ? 1 : 0); } m_inventory->serialize(os); } -void NodeMetadata::deSerialize(std::istream &is) +void NodeMetadata::deSerialize(std::istream &is, u8 version) { - m_stringvars.clear(); + clear(); int num_vars = readU32(is); for(int i=0; i<num_vars; i++){ std::string name = deSerializeString(is); std::string var = deSerializeLongString(is); m_stringvars[name] = var; + if (version >= 2) { + if (readU8(is) == 1) + markPrivate(name, true); + } } m_inventory->deSerialize(is); @@ -70,20 +79,44 @@ void NodeMetadata::deSerialize(std::istream &is) void NodeMetadata::clear() { - m_stringvars.clear(); + Metadata::clear(); + m_privatevars.clear(); m_inventory->clear(); } bool NodeMetadata::empty() const { - return m_stringvars.size() == 0 && m_inventory->getLists().size() == 0; + return Metadata::empty() && m_inventory->getLists().size() == 0; +} + + +void NodeMetadata::markPrivate(const std::string &name, bool set) +{ + if (set) + m_privatevars.insert(name); + else + m_privatevars.erase(name); +} + +int NodeMetadata::countNonPrivate() const +{ + // m_privatevars can contain names not actually present + // DON'T: return m_stringvars.size() - m_privatevars.size(); + int n = 0; + for (StringMap::const_iterator + it = m_stringvars.begin(); + it != m_stringvars.end(); ++it) { + if (isPrivate(it->first) == false) + n++; + } + return n; } /* NodeMetadataList */ -void NodeMetadataList::serialize(std::ostream &os) const +void NodeMetadataList::serialize(std::ostream &os, u8 blockver, bool disk) const { /* Version 0 is a placeholder for "nothing to see here; go away." @@ -95,7 +128,8 @@ void NodeMetadataList::serialize(std::ostream &os) const return; } - writeU8(os, 1); // version + u8 version = (blockver > 27) ? 2 : 1; + writeU8(os, version); writeU16(os, count); for(std::map<v3s16, NodeMetadata*>::const_iterator @@ -110,7 +144,7 @@ void NodeMetadataList::serialize(std::ostream &os) const u16 p16 = p.Z * MAP_BLOCKSIZE * MAP_BLOCKSIZE + p.Y * MAP_BLOCKSIZE + p.X; writeU16(os, p16); - data->serialize(os); + data->serialize(os, version, disk); } } @@ -125,7 +159,7 @@ void NodeMetadataList::deSerialize(std::istream &is, IItemDefManager *item_def_m return; } - if (version != 1) { + if (version > 2) { std::string err_str = std::string(FUNCTION_NAME) + ": version " + itos(version) + " not supported"; infostream << err_str << std::endl; @@ -134,7 +168,7 @@ void NodeMetadataList::deSerialize(std::istream &is, IItemDefManager *item_def_m u16 count = readU16(is); - for (u16 i=0; i < count; i++) { + for (u16 i = 0; i < count; i++) { u16 p16 = readU16(is); v3s16 p; @@ -145,15 +179,14 @@ void NodeMetadataList::deSerialize(std::istream &is, IItemDefManager *item_def_m p.X = p16; if (m_data.find(p) != m_data.end()) { - warningstream<<"NodeMetadataList::deSerialize(): " - <<"already set data at position" - <<"("<<p.X<<","<<p.Y<<","<<p.Z<<"): Ignoring." - <<std::endl; + warningstream << "NodeMetadataList::deSerialize(): " + << "already set data at position " << PP(p) + << ": Ignoring." << std::endl; continue; } NodeMetadata *data = new NodeMetadata(item_def_mgr); - data->deSerialize(is); + data->deSerialize(is, version); m_data[p] = data; } } @@ -216,35 +249,3 @@ int NodeMetadataList::countNonEmpty() const } return n; } - -std::string NodeMetadata::getString(const std::string &name, - unsigned short recursion) const -{ - StringMap::const_iterator it = m_stringvars.find(name); - if (it == m_stringvars.end()) - return ""; - - return resolveString(it->second, recursion); -} - -void NodeMetadata::setString(const std::string &name, const std::string &var) -{ - if (var.empty()) { - m_stringvars.erase(name); - } else { - m_stringvars[name] = var; - } -} - -std::string NodeMetadata::resolveString(const std::string &str, - unsigned short recursion) const -{ - if (recursion > 1) { - return str; - } - if (str.substr(0, 2) == "${" && str[str.length() - 1] == '}') { - return getString(str.substr(2, str.length() - 3), recursion + 1); - } - return str; -} - diff --git a/src/nodemetadata.h b/src/nodemetadata.h index da1bf595d..0d72485bc 100644 --- a/src/nodemetadata.h +++ b/src/nodemetadata.h @@ -20,10 +20,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef NODEMETADATA_HEADER #define NODEMETADATA_HEADER -#include "irr_v3d.h" -#include <iostream> -#include <vector> -#include "util/string.h" +#include "metadata.h" +#include "util/cpp11_container.h" /* NodeMetadata stores arbitary amounts of data for special blocks. @@ -37,37 +35,35 @@ with this program; if not, write to the Free Software Foundation, Inc., class Inventory; class IItemDefManager; -class NodeMetadata +class NodeMetadata : public Metadata { public: NodeMetadata(IItemDefManager *item_def_mgr); ~NodeMetadata(); - void serialize(std::ostream &os) const; - void deSerialize(std::istream &is); + void serialize(std::ostream &os, u8 version, bool disk=true) const; + void deSerialize(std::istream &is, u8 version); void clear(); bool empty() const; - // Generic key/value store - std::string getString(const std::string &name, unsigned short recursion = 0) const; - void setString(const std::string &name, const std::string &var); - // Support variable names in values - std::string resolveString(const std::string &str, unsigned short recursion = 0) const; - StringMap getStrings() const - { - return m_stringvars; - } - // The inventory Inventory *getInventory() { return m_inventory; } + inline bool isPrivate(const std::string &name) const + { + return m_privatevars.count(name) != 0; + } + void markPrivate(const std::string &name, bool set); + private: - StringMap m_stringvars; + int countNonPrivate() const; + Inventory *m_inventory; + UNORDERED_SET<std::string> m_privatevars; }; @@ -80,7 +76,7 @@ class NodeMetadataList public: ~NodeMetadataList(); - void serialize(std::ostream &os) const; + void serialize(std::ostream &os, u8 blockver, bool disk=true) const; void deSerialize(std::istream &is, IItemDefManager *item_def_mgr); // Add all keys in this list to the vector keys @@ -101,4 +97,3 @@ private: }; #endif - diff --git a/src/object_properties.cpp b/src/object_properties.cpp index 89ca26274..a77368151 100644 --- a/src/object_properties.cpp +++ b/src/object_properties.cpp @@ -21,11 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_bloated.h" #include "exceptions.h" #include "util/serialize.h" +#include "util/basic_macros.h" #include <sstream> -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" -#define PP2(x) "("<<(x).X<<","<<(x).Y<<")" - ObjectProperties::ObjectProperties(): hp_max(1), physical(false), @@ -119,6 +117,7 @@ void ObjectProperties::serialize(std::ostream &os) const writeARGB8(os, nametag_color); writeF1000(os, automatic_face_movement_max_rotation_per_sec); os << serializeString(infotext); + os << serializeString(wield_item); // Add stuff only at the bottom. // Never remove anything, because we don't want new versions of this @@ -161,6 +160,7 @@ void ObjectProperties::deSerialize(std::istream &is) nametag_color = readARGB8(is); automatic_face_movement_max_rotation_per_sec = readF1000(is); infotext = deSerializeString(is); + wield_item = deSerializeString(is); }catch(SerializationError &e){} } else diff --git a/src/object_properties.h b/src/object_properties.h index 082d9a529..908757a64 100644 --- a/src/object_properties.h +++ b/src/object_properties.h @@ -52,6 +52,8 @@ struct ObjectProperties video::SColor nametag_color; f32 automatic_face_movement_max_rotation_per_sec; std::string infotext; + //! For dropped items, this contains item information. + std::string wield_item; ObjectProperties(); std::string dump(); diff --git a/src/particles.cpp b/src/particles.cpp index acf9cc815..e89e182e6 100644 --- a/src/particles.cpp +++ b/src/particles.cpp @@ -18,11 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "particles.h" -#include "constants.h" -#include "debug.h" -#include "settings.h" -#include "client/tile.h" -#include "gamedef.h" +#include "client.h" #include "collision.h" #include <stdlib.h> #include "util/numeric.h" @@ -31,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "clientmap.h" #include "mapnode.h" #include "client.h" +#include "settings.h" /* Utility @@ -58,7 +55,10 @@ Particle::Particle( bool vertical, video::ITexture *texture, v2f texpos, - v2f texsize + v2f texsize, + const struct TileAnimationParams &anim, + u8 glow, + video::SColor color ): scene::ISceneNode(smgr->getRootSceneNode(), smgr) { @@ -75,7 +75,13 @@ Particle::Particle( m_material.setTexture(0, texture); m_texpos = texpos; m_texsize = texsize; + m_animation = anim; + m_animation_frame = 0; + m_animation_time = 0.0; + // Color + m_base_color = color; + m_color = color; // Particle related m_pos = pos; @@ -88,6 +94,7 @@ Particle::Particle( m_collisiondetection = collisiondetection; m_collision_removal = collision_removal; m_vertical = vertical; + m_glow = glow; // Irrlicht stuff m_collisionbox = aabb3f @@ -146,6 +153,18 @@ void Particle::step(float dtime) m_velocity += m_acceleration * dtime; m_pos += m_velocity * dtime; } + if (m_animation.type != TAT_NONE) { + m_animation_time += dtime; + int frame_length_i, frame_count; + m_animation.determineParams( + m_material.getTexture(0)->getSize(), + &frame_count, &frame_length_i, NULL); + float frame_length = frame_length_i / 1000.0; + while (m_animation_time > frame_length) { + m_animation_frame++; + m_animation_time -= frame_length; + } + } // Update lighting updateLight(); @@ -170,25 +189,44 @@ void Particle::updateLight() else light = blend_light(m_env->getDayNightRatio(), LIGHT_SUN, 0); - m_light = decode_light(light); + u8 m_light = decode_light(light + m_glow); + m_color.set(255, + m_light * m_base_color.getRed() / 255, + m_light * m_base_color.getGreen() / 255, + m_light * m_base_color.getBlue() / 255); } void Particle::updateVertices() { - video::SColor c(255, m_light, m_light, m_light); - f32 tx0 = m_texpos.X; - f32 tx1 = m_texpos.X + m_texsize.X; - f32 ty0 = m_texpos.Y; - f32 ty1 = m_texpos.Y + m_texsize.Y; - - m_vertices[0] = video::S3DVertex(-m_size/2,-m_size/2,0, 0,0,0, - c, tx0, ty1); - m_vertices[1] = video::S3DVertex(m_size/2,-m_size/2,0, 0,0,0, - c, tx1, ty1); - m_vertices[2] = video::S3DVertex(m_size/2,m_size/2,0, 0,0,0, - c, tx1, ty0); - m_vertices[3] = video::S3DVertex(-m_size/2,m_size/2,0, 0,0,0, - c, tx0, ty0); + f32 tx0, tx1, ty0, ty1; + + if (m_animation.type != TAT_NONE) { + const v2u32 texsize = m_material.getTexture(0)->getSize(); + v2f texcoord, framesize_f; + v2u32 framesize; + texcoord = m_animation.getTextureCoords(texsize, m_animation_frame); + m_animation.determineParams(texsize, NULL, NULL, &framesize); + framesize_f = v2f(framesize.X / (float) texsize.X, framesize.Y / (float) texsize.Y); + + tx0 = m_texpos.X + texcoord.X; + tx1 = m_texpos.X + texcoord.X + framesize_f.X * m_texsize.X; + ty0 = m_texpos.Y + texcoord.Y; + ty1 = m_texpos.Y + texcoord.Y + framesize_f.Y * m_texsize.Y; + } else { + tx0 = m_texpos.X; + tx1 = m_texpos.X + m_texsize.X; + ty0 = m_texpos.Y; + ty1 = m_texpos.Y + m_texsize.Y; + } + + m_vertices[0] = video::S3DVertex(-m_size / 2, -m_size / 2, + 0, 0, 0, 0, m_color, tx0, ty1); + m_vertices[1] = video::S3DVertex(m_size / 2, -m_size / 2, + 0, 0, 0, 0, m_color, tx1, ty1); + m_vertices[2] = video::S3DVertex(m_size / 2, m_size / 2, + 0, 0, 0, 0, m_color, tx1, ty0); + m_vertices[3] = video::S3DVertex(-m_size / 2, m_size / 2, + 0, 0, 0, 0, m_color, tx0, ty0); v3s16 camera_offset = m_env->getCameraOffset(); for(u16 i=0; i<4; i++) @@ -214,7 +252,9 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr, v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, float minexptime, float maxexptime, float minsize, float maxsize, bool collisiondetection, bool collision_removal, u16 attached_id, bool vertical, - video::ITexture *texture, u32 id, ParticleManager *p_manager) : + video::ITexture *texture, u32 id, const struct TileAnimationParams &anim, + u8 glow, + ParticleManager *p_manager) : m_particlemanager(p_manager) { m_gamedef = gamedef; @@ -238,6 +278,8 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr, m_vertical = vertical; m_texture = texture; m_time = 0; + m_animation = anim; + m_glow = glow; for (u16 i = 0; i<=m_amount; i++) { @@ -252,6 +294,9 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env) { m_time += dtime; + static const float radius = + g_settings->getS16("max_block_send_distance") * MAP_BLOCKSIZE; + bool unloaded = false; bool is_attached = false; v3f attached_pos = v3f(0,0,0); @@ -275,11 +320,74 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env) { m_amount--; - // Pretend to, but don't actually spawn a - // particle if it is attached to an unloaded - // object. + // Pretend to, but don't actually spawn a particle if it is + // attached to an unloaded object or distant from player. if (!unloaded) { + v3f ppos = m_player->getPosition() / BS; v3f pos = random_v3f(m_minpos, m_maxpos); + + if (pos.getDistanceFrom(ppos) <= radius) { + v3f vel = random_v3f(m_minvel, m_maxvel); + v3f acc = random_v3f(m_minacc, m_maxacc); + + if (is_attached) { + // Apply attachment yaw and position + pos.rotateXZBy(attached_yaw); + pos += attached_pos; + vel.rotateXZBy(attached_yaw); + acc.rotateXZBy(attached_yaw); + } + + float exptime = rand()/(float)RAND_MAX + *(m_maxexptime-m_minexptime) + +m_minexptime; + float size = rand()/(float)RAND_MAX + *(m_maxsize-m_minsize) + +m_minsize; + + Particle* toadd = new Particle( + m_gamedef, + m_smgr, + m_player, + env, + pos, + vel, + acc, + exptime, + size, + m_collisiondetection, + m_collision_removal, + m_vertical, + m_texture, + v2f(0.0, 0.0), + v2f(1.0, 1.0), + m_animation, + m_glow); + m_particlemanager->addParticle(toadd); + } + } + i = m_spawntimes.erase(i); + } + else + { + ++i; + } + } + } + else // Spawner exists for an infinity timespan, spawn on a per-second base + { + // Skip this step if attached to an unloaded object + if (unloaded) + return; + for (int i = 0; i <= m_amount; i++) + { + if (rand()/(float)RAND_MAX < dtime) + { + // Do not spawn particle if distant from player + v3f ppos = m_player->getPosition() / BS; + v3f pos = random_v3f(m_minpos, m_maxpos); + + if (pos.getDistanceFrom(ppos) <= radius) { v3f vel = random_v3f(m_minvel, m_maxvel); v3f acc = random_v3f(m_minacc, m_maxacc); @@ -313,62 +421,11 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env) m_vertical, m_texture, v2f(0.0, 0.0), - v2f(1.0, 1.0)); + v2f(1.0, 1.0), + m_animation, + m_glow); m_particlemanager->addParticle(toadd); } - i = m_spawntimes.erase(i); - } - else - { - ++i; - } - } - } - else // Spawner exists for an infinity timespan, spawn on a per-second base - { - // Skip this step if attached to an unloaded object - if (unloaded) - return; - for (int i = 0; i <= m_amount; i++) - { - if (rand()/(float)RAND_MAX < dtime) - { - v3f pos = random_v3f(m_minpos, m_maxpos); - v3f vel = random_v3f(m_minvel, m_maxvel); - v3f acc = random_v3f(m_minacc, m_maxacc); - - if (is_attached) { - // Apply attachment yaw and position - pos.rotateXZBy(attached_yaw); - pos += attached_pos; - vel.rotateXZBy(attached_yaw); - acc.rotateXZBy(attached_yaw); - } - - float exptime = rand()/(float)RAND_MAX - *(m_maxexptime-m_minexptime) - +m_minexptime; - float size = rand()/(float)RAND_MAX - *(m_maxsize-m_minsize) - +m_minsize; - - Particle* toadd = new Particle( - m_gamedef, - m_smgr, - m_player, - env, - pos, - vel, - acc, - exptime, - size, - m_collisiondetection, - m_collision_removal, - m_vertical, - m_texture, - v2f(0.0, 0.0), - v2f(1.0, 1.0)); - m_particlemanager->addParticle(toadd); } } } @@ -452,7 +509,7 @@ void ParticleManager::clearAll () } } -void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef, +void ParticleManager::handleParticleEvent(ClientEvent *event, Client *client, scene::ISceneManager* smgr, LocalPlayer *player) { switch (event->type) { @@ -477,9 +534,9 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef, } video::ITexture *texture = - gamedef->tsrc()->getTextureForMesh(*(event->add_particlespawner.texture)); + client->tsrc()->getTextureForMesh(*(event->add_particlespawner.texture)); - ParticleSpawner* toadd = new ParticleSpawner(gamedef, smgr, player, + ParticleSpawner* toadd = new ParticleSpawner(client, smgr, player, event->add_particlespawner.amount, event->add_particlespawner.spawntime, *event->add_particlespawner.minpos, @@ -498,6 +555,8 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef, event->add_particlespawner.vertical, texture, event->add_particlespawner.id, + event->add_particlespawner.animation, + event->add_particlespawner.glow, this); /* delete allocated content of event */ @@ -520,9 +579,9 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef, } case CE_SPAWN_PARTICLE: { video::ITexture *texture = - gamedef->tsrc()->getTextureForMesh(*(event->spawn_particle.texture)); + client->tsrc()->getTextureForMesh(*(event->spawn_particle.texture)); - Particle* toadd = new Particle(gamedef, smgr, player, m_env, + Particle* toadd = new Particle(client, smgr, player, m_env, *event->spawn_particle.pos, *event->spawn_particle.vel, *event->spawn_particle.acc, @@ -533,13 +592,16 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef, event->spawn_particle.vertical, texture, v2f(0.0, 0.0), - v2f(1.0, 1.0)); + v2f(1.0, 1.0), + event->spawn_particle.animation, + event->spawn_particle.glow); addParticle(toadd); delete event->spawn_particle.pos; delete event->spawn_particle.vel; delete event->spawn_particle.acc; + delete event->spawn_particle.texture; break; } @@ -547,39 +609,46 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef, } } -void ParticleManager::addDiggingParticles(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]) +void ParticleManager::addDiggingParticles(IGameDef* gamedef, + scene::ISceneManager* smgr, LocalPlayer *player, v3s16 pos, + const MapNode &n, const ContentFeatures &f) { for (u16 j = 0; j < 32; j++) // set the amount of particles here { - addNodeParticle(gamedef, smgr, player, pos, tiles); + addNodeParticle(gamedef, smgr, player, pos, n, f); } } -void ParticleManager::addPunchingParticles(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]) +void ParticleManager::addPunchingParticles(IGameDef* gamedef, + scene::ISceneManager* smgr, LocalPlayer *player, v3s16 pos, + const MapNode &n, const ContentFeatures &f) { - addNodeParticle(gamedef, smgr, player, pos, tiles); + addNodeParticle(gamedef, smgr, player, pos, n, f); } -void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]) +void ParticleManager::addNodeParticle(IGameDef* gamedef, + scene::ISceneManager* smgr, LocalPlayer *player, v3s16 pos, + const MapNode &n, const ContentFeatures &f) { // Texture u8 texid = myrand_range(0, 5); - video::ITexture *texture = tiles[texid].texture; + const TileLayer &tile = f.tiles[texid].layers[0]; + video::ITexture *texture; + struct TileAnimationParams anim; + anim.type = TAT_NONE; // Only use first frame of animated texture - f32 ymax = 1; - if(tiles[texid].material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) - ymax /= tiles[texid].animation_frame_count; + if (tile.material_flags & MATERIAL_FLAG_ANIMATION) + texture = tile.frames[0].texture; + else + texture = tile.texture; float size = rand() % 64 / 512.; float visual_size = BS * size; - v2f texsize(size * 2, ymax * size * 2); + v2f texsize(size * 2, size * 2); v2f texpos; texpos.X = ((rand() % 64) / 64. - texsize.X); - texpos.Y = ymax * ((rand() % 64) / 64. - texsize.Y); + texpos.Y = ((rand() % 64) / 64. - texsize.Y); // Physics v3f velocity((rand() % 100 / 50. - 1) / 1.5, @@ -593,6 +662,12 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* s (f32) pos.Z + rand() %100 /200. - 0.25 ); + video::SColor color; + if (tile.has_color) + color = tile.color; + else + n.getColor(f, &color); + Particle* toadd = new Particle( gamedef, smgr, @@ -608,7 +683,10 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* s false, texture, texpos, - texsize); + texsize, + anim, + 0, + color); addParticle(toadd); } diff --git a/src/particles.h b/src/particles.h index eb8c6665d..eaec1f0fa 100644 --- a/src/particles.h +++ b/src/particles.h @@ -20,17 +20,18 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef PARTICLES_HEADER #define PARTICLES_HEADER -#define DIGGING_PARTICLES_AMOUNT 10 - #include <iostream> #include "irrlichttypes_extrabloated.h" #include "client/tile.h" #include "localplayer.h" #include "environment.h" +#include "tileanimation.h" struct ClientEvent; class ParticleManager; class ClientEnvironment; +struct MapNode; +struct ContentFeatures; class Particle : public scene::ISceneNode { @@ -50,7 +51,10 @@ class Particle : public scene::ISceneNode bool vertical, video::ITexture *texture, v2f texpos, - v2f texsize + v2f texsize, + const struct TileAnimationParams &anim, + u8 glow, + video::SColor color = video::SColor(0xFFFFFFFF) ); ~Particle(); @@ -97,11 +101,18 @@ private: v3f m_acceleration; LocalPlayer *m_player; float m_size; - u8 m_light; + //! Color without lighting + video::SColor m_base_color; + //! Final rendered color + video::SColor m_color; bool m_collisiondetection; bool m_collision_removal; bool m_vertical; v3s16 m_camera_offset; + struct TileAnimationParams m_animation; + float m_animation_time; + int m_animation_frame; + u8 m_glow; }; class ParticleSpawner @@ -123,6 +134,7 @@ class ParticleSpawner bool vertical, video::ITexture *texture, u32 id, + const struct TileAnimationParams &anim, u8 glow, ParticleManager* p_manager); ~ParticleSpawner(); @@ -156,6 +168,8 @@ class ParticleSpawner bool m_collision_removal; bool m_vertical; u16 m_attached_id; + struct TileAnimationParams m_animation; + u8 m_glow; }; /** @@ -170,17 +184,20 @@ public: void step (float dtime); - void handleParticleEvent(ClientEvent *event,IGameDef *gamedef, + void handleParticleEvent(ClientEvent *event, Client *client, scene::ISceneManager* smgr, LocalPlayer *player); void addDiggingParticles(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]); + LocalPlayer *player, v3s16 pos, const MapNode &n, + const ContentFeatures &f); void addPunchingParticles(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]); + LocalPlayer *player, v3s16 pos, const MapNode &n, + const ContentFeatures &f); void addNodeParticle(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]); + LocalPlayer *player, v3s16 pos, const MapNode &n, + const ContentFeatures &f); protected: void addParticle(Particle* toadd); diff --git a/src/pathfinder.cpp b/src/pathfinder.cpp index 57a008ead..16c5678ee 100644 --- a/src/pathfinder.cpp +++ b/src/pathfinder.cpp @@ -23,12 +23,9 @@ with this program; if not, write to the Free Software Foundation, Inc., /******************************************************************************/ #include "pathfinder.h" -#include "environment.h" -#include "gamedef.h" +#include "serverenvironment.h" +#include "server.h" #include "nodedef.h" -#include "map.h" -#include "log.h" -#include "irr_aabb3d.h" //#define PATHFINDER_DEBUG //#define PATHFINDER_CALC_TIME @@ -47,9 +44,6 @@ with this program; if not, write to the Free Software Foundation, Inc., /* Typedefs and macros */ /******************************************************************************/ -/** shortcut to print a 3d pos */ -#define PPOS(pos) "(" << pos.X << "," << pos.Y << "," << pos.Z << ")" - #define LVL "(" << level << ")" << #ifdef PATHFINDER_DEBUG @@ -61,7 +55,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define DEBUG_OUT(a) while(0) #define INFO_TARGET infostream << "Pathfinder: " #define VERBOSE_TARGET verbosestream << "Pathfinder: " -#define ERROR_TARGET errorstream << "Pathfinder: " +#define ERROR_TARGET warningstream << "Pathfinder: " #endif /******************************************************************************/ @@ -117,7 +111,7 @@ public: * @param dir direction to set cost for * @cost cost to set */ - void setCost(v3s16 dir, PathCost cost); + void setCost(v3s16 dir, const PathCost &cost); bool valid; /**< node is on surface */ bool target; /**< node is target position */ @@ -502,7 +496,7 @@ PathCost PathGridnode::getCost(v3s16 dir) } /******************************************************************************/ -void PathGridnode::setCost(v3s16 dir, PathCost cost) +void PathGridnode::setCost(v3s16 dir, const PathCost &cost) { if (dir.X > 0) { directions[DIR_XP] = cost; @@ -531,25 +525,25 @@ void GridNodeContainer::initNode(v3s16 ipos, PathGridnode *p_node) if ((current.param0 == CONTENT_IGNORE) || (below.param0 == CONTENT_IGNORE)) { - DEBUG_OUT("Pathfinder: " << PPOS(realpos) << + DEBUG_OUT("Pathfinder: " << PP(realpos) << " current or below is invalid element" << std::endl); if (current.param0 == CONTENT_IGNORE) { elem.type = 'i'; - DEBUG_OUT(PPOS(ipos) << ": " << 'i' << std::endl); + DEBUG_OUT(PP(ipos) << ": " << 'i' << std::endl); } return; } //don't add anything if it isn't an air node if (ndef->get(current).walkable || !ndef->get(below).walkable) { - DEBUG_OUT("Pathfinder: " << PPOS(realpos) + DEBUG_OUT("Pathfinder: " << PP(realpos) << " not on surface" << std::endl); if (ndef->get(current).walkable) { elem.type = 's'; - DEBUG_OUT(PPOS(ipos) << ": " << 's' << std::endl); + DEBUG_OUT(PP(ipos) << ": " << 's' << std::endl); } else { elem.type = '-'; - DEBUG_OUT(PPOS(ipos) << ": " << '-' << std::endl); + DEBUG_OUT(PP(ipos) << ": " << '-' << std::endl); } return; } @@ -557,7 +551,7 @@ void GridNodeContainer::initNode(v3s16 ipos, PathGridnode *p_node) elem.valid = true; elem.pos = realpos; elem.type = 'g'; - DEBUG_OUT(PPOS(ipos) << ": " << 'a' << std::endl); + DEBUG_OUT(PP(ipos) << ": " << 'a' << std::endl); if (m_pathf->m_prefetch) { elem.directions[DIR_XP] = m_pathf->calcCost(realpos, v3s16( 1, 0, 0)); @@ -686,14 +680,14 @@ std::vector<v3s16> Pathfinder::getPath(ServerEnvironment *env, if (!startpos.valid) { VERBOSE_TARGET << "invalid startpos" << - "Index: " << PPOS(StartIndex) << - "Realpos: " << PPOS(getRealPos(StartIndex)) << std::endl; + "Index: " << PP(StartIndex) << + "Realpos: " << PP(getRealPos(StartIndex)) << std::endl; return retval; } if (!endpos.valid) { VERBOSE_TARGET << "invalid stoppos" << - "Index: " << PPOS(EndIndex) << - "Realpos: " << PPOS(getRealPos(EndIndex)) << std::endl; + "Index: " << PP(EndIndex) << + "Realpos: " << PP(getRealPos(EndIndex)) << std::endl; return retval; } @@ -809,7 +803,7 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir) //check limits if (!m_limits.isPointInside(pos2)) { - DEBUG_OUT("Pathfinder: " << PPOS(pos2) << + DEBUG_OUT("Pathfinder: " << PP(pos2) << " no cost -> out of limits" << std::endl); return retval; } @@ -819,7 +813,7 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir) //did we get information about node? if (node_at_pos2.param0 == CONTENT_IGNORE ) { VERBOSE_TARGET << "Pathfinder: (1) area at pos: " - << PPOS(pos2) << " not loaded"; + << PP(pos2) << " not loaded"; return retval; } @@ -830,7 +824,7 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir) //did we get information about node? if (node_below_pos2.param0 == CONTENT_IGNORE ) { VERBOSE_TARGET << "Pathfinder: (2) area at pos: " - << PPOS((pos2 + v3s16(0, -1, 0))) << " not loaded"; + << PP((pos2 + v3s16(0, -1, 0))) << " not loaded"; return retval; } @@ -838,7 +832,7 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir) retval.valid = true; retval.value = 1; retval.direction = 0; - DEBUG_OUT("Pathfinder: "<< PPOS(pos) + DEBUG_OUT("Pathfinder: "<< PP(pos) << " cost same height found" << std::endl); } else { @@ -991,8 +985,8 @@ bool Pathfinder::updateAllCosts(v3s16 ipos, v3s16 ipos2 = ipos + directions[i]; if (!isValidIndex(ipos2)) { - DEBUG_OUT(LVL " Pathfinder: " << PPOS(ipos2) << - " out of range, max=" << PPOS(m_limits.MaxEdge) << std::endl); + DEBUG_OUT(LVL " Pathfinder: " << PP(ipos2) << + " out of range, max=" << PP(m_limits.MaxEdge) << std::endl); continue; } @@ -1000,7 +994,7 @@ bool Pathfinder::updateAllCosts(v3s16 ipos, if (!g_pos2.valid) { VERBOSE_TARGET << LVL "Pathfinder: no data for new position: " - << PPOS(ipos2) << std::endl; + << PP(ipos2) << std::endl; continue; } @@ -1017,7 +1011,7 @@ bool Pathfinder::updateAllCosts(v3s16 ipos, if ((g_pos2.totalcost < 0) || (g_pos2.totalcost > new_cost)) { DEBUG_OUT(LVL "Pathfinder: updating path at: "<< - PPOS(ipos2) << " from: " << g_pos2.totalcost << " to "<< + PP(ipos2) << " from: " << g_pos2.totalcost << " to "<< new_cost << std::endl); if (updateAllCosts(ipos2, invert(directions[i]), new_cost, level)) { @@ -1027,13 +1021,13 @@ bool Pathfinder::updateAllCosts(v3s16 ipos, else { DEBUG_OUT(LVL "Pathfinder:" " already found shorter path to: " - << PPOS(ipos2) << std::endl); + << PP(ipos2) << std::endl); } } else { DEBUG_OUT(LVL "Pathfinder:" " not moving to invalid direction: " - << PPOS(directions[i]) << std::endl); + << PP(directions[i]) << std::endl); } } } @@ -1147,8 +1141,8 @@ bool Pathfinder::updateCostHeuristic( v3s16 ipos, v3s16 ipos2 = ipos + direction; if (!isValidIndex(ipos2)) { - DEBUG_OUT(LVL " Pathfinder: " << PPOS(ipos2) << - " out of range, max=" << PPOS(m_limits.MaxEdge) << std::endl); + DEBUG_OUT(LVL " Pathfinder: " << PP(ipos2) << + " out of range, max=" << PP(m_limits.MaxEdge) << std::endl); direction = getDirHeuristic(directions, g_pos); continue; } @@ -1157,7 +1151,7 @@ bool Pathfinder::updateCostHeuristic( v3s16 ipos, if (!g_pos2.valid) { VERBOSE_TARGET << LVL "Pathfinder: no data for new position: " - << PPOS(ipos2) << std::endl; + << PP(ipos2) << std::endl; direction = getDirHeuristic(directions, g_pos); continue; } @@ -1171,16 +1165,16 @@ bool Pathfinder::updateCostHeuristic( v3s16 ipos, (m_min_target_distance < new_cost)) { DEBUG_OUT(LVL "Pathfinder:" " already longer than best already found path " - << PPOS(ipos2) << std::endl); + << PP(ipos2) << std::endl); return false; } if ((g_pos2.totalcost < 0) || (g_pos2.totalcost > new_cost)) { DEBUG_OUT(LVL "Pathfinder: updating path at: "<< - PPOS(ipos2) << " from: " << g_pos2.totalcost << " to "<< + PP(ipos2) << " from: " << g_pos2.totalcost << " to "<< new_cost << " srcdir=" << - PPOS(invert(direction))<< std::endl); + PP(invert(direction))<< std::endl); if (updateCostHeuristic(ipos2, invert(direction), new_cost, level)) { retval = true; @@ -1189,19 +1183,19 @@ bool Pathfinder::updateCostHeuristic( v3s16 ipos, else { DEBUG_OUT(LVL "Pathfinder:" " already found shorter path to: " - << PPOS(ipos2) << std::endl); + << PP(ipos2) << std::endl); } } else { DEBUG_OUT(LVL "Pathfinder:" " not moving to invalid direction: " - << PPOS(direction) << std::endl); + << PP(direction) << std::endl); } } else { DEBUG_OUT(LVL "Pathfinder:" " skipping srcdir: " - << PPOS(direction) << std::endl); + << PP(direction) << std::endl); } direction = getDirHeuristic(directions, g_pos); } @@ -1409,7 +1403,7 @@ void Pathfinder::printPath(std::vector<v3s16> path) unsigned int current = 0; for (std::vector<v3s16>::iterator i = path.begin(); i != path.end(); ++i) { - std::cout << std::setw(3) << current << ":" << PPOS((*i)) << std::endl; + std::cout << std::setw(3) << current << ":" << PP((*i)) << std::endl; current++; } } diff --git a/src/player.h b/src/player.h index 5f9bb7ec9..3432069c0 100644 --- a/src/player.h +++ b/src/player.h @@ -22,7 +22,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_bloated.h" #include "inventory.h" -#include "constants.h" // BS #include "threading/mutex.h" #include <list> diff --git a/src/porting.cpp b/src/porting.cpp index 023f0cca7..10b6fc940 100644 --- a/src/porting.cpp +++ b/src/porting.cpp @@ -408,7 +408,7 @@ bool setSystemPaths() #endif for (std::list<std::string>::const_iterator - i = trylist.begin(); i != trylist.end(); i++) { + i = trylist.begin(); i != trylist.end(); ++i) { const std::string &trypath = *i; if (!fs::PathExists(trypath) || !fs::PathExists(trypath + DIR_DELIM + "builtin")) { @@ -611,9 +611,9 @@ void setXorgClassHint(const video::SExposedVideoData &video_data, #endif } -bool setXorgWindowIcon(IrrlichtDevice *device) +bool setWindowIcon(IrrlichtDevice *device) { -#ifdef XORG_USED +#if defined(XORG_USED) # if RUN_IN_PLACE return setXorgWindowIconFromPath(device, path_share + "/misc/" PROJECT_NAME "-xorg-icon-128.png"); @@ -627,6 +627,36 @@ bool setXorgWindowIcon(IrrlichtDevice *device) setXorgWindowIconFromPath(device, path_share + "/misc/" PROJECT_NAME "-xorg-icon-128.png"); # endif +#elif defined(_WIN32) + const video::SExposedVideoData exposedData = device->getVideoDriver()->getExposedVideoData(); + HWND hWnd; // Window handle + + switch (device->getVideoDriver()->getDriverType()) { + case video::EDT_DIRECT3D8: + hWnd = reinterpret_cast<HWND>(exposedData.D3D8.HWnd); + break; + case video::EDT_DIRECT3D9: + hWnd = reinterpret_cast<HWND>(exposedData.D3D9.HWnd); + break; + case video::EDT_OPENGL: + hWnd = reinterpret_cast<HWND>(exposedData.OpenGLWin32.HWnd); + break; + default: + return false; + } + + // Load the ICON from resource file + const HICON hicon = LoadIcon( + GetModuleHandle(NULL), + MAKEINTRESOURCE(130) // The ID of the ICON defined in winresource.rc + ); + + if (hicon) { + SendMessage(hWnd, WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(hicon)); + SendMessage(hWnd, WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(hicon)); + return true; + } + return false; #else return false; #endif @@ -899,4 +929,31 @@ bool secure_rand_fill_buf(void *buf, size_t len) #endif +void attachOrCreateConsole(void) +{ +#ifdef _WIN32 + static bool consoleAllocated = false; + const bool redirected = (_fileno(stdout) == -2 || _fileno(stdout) == -1); // If output is redirected to e.g a file + if (!consoleAllocated && redirected && (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole())) { + freopen("CONOUT$", "w", stdout); + freopen("CONOUT$", "w", stderr); + consoleAllocated = true; + } +#endif +} + +// Load performance counter frequency only once at startup +#ifdef _WIN32 + +inline double get_perf_freq() +{ + LARGE_INTEGER freq; + QueryPerformanceFrequency(&freq); + return freq.QuadPart; +} + +double perf_freq = get_perf_freq(); + +#endif + } //namespace porting diff --git a/src/porting.h b/src/porting.h index f5c7efcb2..7034d956b 100644 --- a/src/porting.h +++ b/src/porting.h @@ -181,124 +181,99 @@ std::string get_sysinfo(); void initIrrlicht(irr::IrrlichtDevice * ); -/* - Resolution is 10-20ms. - Remember to check for overflows. - Overflow can occur at any value higher than 10000000. -*/ -#ifdef _WIN32 // Windows - inline u32 getTimeS() - { - return GetTickCount() / 1000; - } +// Monotonic counter getters. - inline u32 getTimeMs() - { - return GetTickCount(); - } +#ifdef _WIN32 // Windows - inline u32 getTimeUs() - { - LARGE_INTEGER freq, t; - QueryPerformanceFrequency(&freq); - QueryPerformanceCounter(&t); - return (double)(t.QuadPart) / ((double)(freq.QuadPart) / 1000000.0); - } +extern double perf_freq; - inline u32 getTimeNs() - { - LARGE_INTEGER freq, t; - QueryPerformanceFrequency(&freq); - QueryPerformanceCounter(&t); - return (double)(t.QuadPart) / ((double)(freq.QuadPart) / 1000000000.0); - } +inline u64 os_get_time(double mult) +{ + LARGE_INTEGER t; + QueryPerformanceCounter(&t); + return static_cast<double>(t.QuadPart) / (perf_freq / mult); +} + +// Resolution is <1us. +inline u64 getTimeS() { return os_get_time(1); } +inline u64 getTimeMs() { return os_get_time(1000); } +inline u64 getTimeUs() { return os_get_time(1000*1000); } +inline u64 getTimeNs() { return os_get_time(1000*1000*1000); } #else // Posix - inline void _os_get_clock(struct timespec *ts) - { + +inline void os_get_clock(struct timespec *ts) +{ #if defined(__MACH__) && defined(__APPLE__) - // from http://stackoverflow.com/questions/5167269/clock-gettime-alternative-in-mac-os-x - // OS X does not have clock_gettime, use clock_get_time - clock_serv_t cclock; - mach_timespec_t mts; - host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); - clock_get_time(cclock, &mts); - mach_port_deallocate(mach_task_self(), cclock); - ts->tv_sec = mts.tv_sec; - ts->tv_nsec = mts.tv_nsec; +// From http://stackoverflow.com/questions/5167269/clock-gettime-alternative-in-mac-os-x +// OS X does not have clock_gettime, use clock_get_time + clock_serv_t cclock; + mach_timespec_t mts; + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); + clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + ts->tv_sec = mts.tv_sec; + ts->tv_nsec = mts.tv_nsec; #elif defined(CLOCK_MONOTONIC_RAW) - clock_gettime(CLOCK_MONOTONIC_RAW, ts); + clock_gettime(CLOCK_MONOTONIC_RAW, ts); #elif defined(_POSIX_MONOTONIC_CLOCK) - clock_gettime(CLOCK_MONOTONIC, ts); + clock_gettime(CLOCK_MONOTONIC, ts); #else - struct timeval tv; - gettimeofday(&tv, NULL); - TIMEVAL_TO_TIMESPEC(&tv, ts); -#endif // defined(__MACH__) && defined(__APPLE__) - } + struct timeval tv; + gettimeofday(&tv, NULL); + TIMEVAL_TO_TIMESPEC(&tv, ts); +#endif +} - // Note: these clock functions do not return wall time, but - // generally a clock that starts at 0 when the process starts. - inline u32 getTimeS() - { - struct timespec ts; - _os_get_clock(&ts); - return ts.tv_sec; - } +inline u64 getTimeS() +{ + struct timespec ts; + os_get_clock(&ts); + return ts.tv_sec; +} - inline u32 getTimeMs() - { - struct timespec ts; - _os_get_clock(&ts); - return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; - } +inline u64 getTimeMs() +{ + struct timespec ts; + os_get_clock(&ts); + return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; +} - inline u32 getTimeUs() - { - struct timespec ts; - _os_get_clock(&ts); - return ts.tv_sec * 1000000 + ts.tv_nsec / 1000; - } +inline u64 getTimeUs() +{ + struct timespec ts; + os_get_clock(&ts); + return ts.tv_sec * 1000000 + ts.tv_nsec / 1000; +} - inline u32 getTimeNs() - { - struct timespec ts; - _os_get_clock(&ts); - return ts.tv_sec * 1000000000 + ts.tv_nsec; - } +inline u64 getTimeNs() +{ + struct timespec ts; + os_get_clock(&ts); + return ts.tv_sec * 1000000000 + ts.tv_nsec; +} - /*#include <sys/timeb.h> - inline u32 getTimeMs() - { - struct timeb tb; - ftime(&tb); - return tb.time * 1000 + tb.millitm; - }*/ #endif -inline u32 getTime(TimePrecision prec) +inline u64 getTime(TimePrecision prec) { switch (prec) { - case PRECISION_SECONDS: - return getTimeS(); - case PRECISION_MILLI: - return getTimeMs(); - case PRECISION_MICRO: - return getTimeUs(); - case PRECISION_NANO: - return getTimeNs(); + case PRECISION_SECONDS: return getTimeS(); + case PRECISION_MILLI: return getTimeMs(); + case PRECISION_MICRO: return getTimeUs(); + case PRECISION_NANO: return getTimeNs(); } - return 0; + FATAL_ERROR("Called getTime with invalid time precision"); } /** - * Delta calculation function taking two 32bit arguments. - * @param old_time_ms old time for delta calculation (order is relevant!) - * @param new_time_ms new time for delta calculation (order is relevant!) - * @return positive 32bit delta value + * Delta calculation function arguments. + * @param old_time_ms old time for delta calculation + * @param new_time_ms new time for delta calculation + * @return positive delta value */ -inline u32 getDeltaMs(u32 old_time_ms, u32 new_time_ms) +inline u64 getDeltaMs(u64 old_time_ms, u64 new_time_ms) { if (new_time_ms >= old_time_ms) { return (new_time_ms - old_time_ms); @@ -367,7 +342,7 @@ inline const char *getPlatformName() void setXorgClassHint(const video::SExposedVideoData &video_data, const std::string &name); -bool setXorgWindowIcon(IrrlichtDevice *device); +bool setWindowIcon(IrrlichtDevice *device); bool setXorgWindowIconFromPath(IrrlichtDevice *device, const std::string &icon_file); @@ -377,6 +352,9 @@ bool setXorgWindowIconFromPath(IrrlichtDevice *device, void setWin32ExceptionHandler(); bool secure_rand_fill_buf(void *buf, size_t len); + +// This attaches to the parents process console, or creates a new one if it doesnt exist. +void attachOrCreateConsole(void); } // namespace porting #ifdef __ANDROID__ diff --git a/src/profiler.cpp b/src/profiler.cpp index 197e094f6..8e997442c 100644 --- a/src/profiler.cpp +++ b/src/profiler.cpp @@ -21,3 +21,33 @@ with this program; if not, write to the Free Software Foundation, Inc., static Profiler main_profiler; Profiler *g_profiler = &main_profiler; +ScopeProfiler::ScopeProfiler( + Profiler *profiler, const std::string &name, ScopeProfilerType type) + : m_profiler(profiler), m_name(name), m_timer(NULL), m_type(type) +{ + if (m_profiler) + m_timer = new TimeTaker(m_name); +} + +ScopeProfiler::~ScopeProfiler() +{ + if (!m_timer) + return; + + float duration_ms = m_timer->stop(true); + float duration = duration_ms / 1000.0; + if (m_profiler) { + switch (m_type) { + case SPT_ADD: + m_profiler->add(m_name, duration); + break; + case SPT_AVG: + m_profiler->avg(m_name, duration); + break; + case SPT_GRAPH_ADD: + m_profiler->graphAdd(m_name, duration); + break; + } + } + delete m_timer; +} diff --git a/src/profiler.h b/src/profiler.h index e8eac86b1..ce60c6262 100644 --- a/src/profiler.h +++ b/src/profiler.h @@ -119,39 +119,34 @@ public: u32 minindex, maxindex; paging(m_data.size(), page, pagecount, minindex, maxindex); - for(std::map<std::string, float>::iterator - i = m_data.begin(); - i != m_data.end(); ++i) - { - if(maxindex == 0) + for (std::map<std::string, float>::const_iterator i = m_data.begin(); + i != m_data.end(); ++i) { + if (maxindex == 0) break; maxindex--; - if(minindex != 0) - { + if (minindex != 0) { minindex--; continue; } - std::string name = i->first; int avgcount = 1; - std::map<std::string, int>::iterator n = m_avgcounts.find(name); - if(n != m_avgcounts.end()){ + std::map<std::string, int>::const_iterator n = m_avgcounts.find(i->first); + if (n != m_avgcounts.end()) { if(n->second >= 1) avgcount = n->second; } - o<<" "<<name<<": "; + o << " " << i->first << ": "; s32 clampsize = 40; - s32 space = clampsize - name.size(); - for(s32 j=0; j<space; j++) - { - if(j%2 == 0 && j < space - 1) - o<<"-"; + s32 space = clampsize - i->first.size(); + for(s32 j = 0; j < space; j++) { + if (j % 2 == 0 && j < space - 1) + o << "-"; else - o<<" "; + o << " "; } - o<<(i->second / avgcount); - o<<std::endl; + o << (i->second / avgcount); + o << std::endl; } } @@ -198,48 +193,8 @@ class ScopeProfiler { public: ScopeProfiler(Profiler *profiler, const std::string &name, - enum ScopeProfilerType type = SPT_ADD): - m_profiler(profiler), - m_name(name), - m_timer(NULL), - m_type(type) - { - if(m_profiler) - m_timer = new TimeTaker(m_name.c_str()); - } - // name is copied - ScopeProfiler(Profiler *profiler, const char *name, - enum ScopeProfilerType type = SPT_ADD): - m_profiler(profiler), - m_name(name), - m_timer(NULL), - m_type(type) - { - if(m_profiler) - m_timer = new TimeTaker(m_name.c_str()); - } - ~ScopeProfiler() - { - if(m_timer) - { - float duration_ms = m_timer->stop(true); - float duration = duration_ms / 1000.0; - if(m_profiler){ - switch(m_type){ - case SPT_ADD: - m_profiler->add(m_name, duration); - break; - case SPT_AVG: - m_profiler->avg(m_name, duration); - break; - case SPT_GRAPH_ADD: - m_profiler->graphAdd(m_name, duration); - break; - } - } - delete m_timer; - } - } + ScopeProfilerType type = SPT_ADD); + ~ScopeProfiler(); private: Profiler *m_profiler; std::string m_name; diff --git a/src/raycast.cpp b/src/raycast.cpp new file mode 100644 index 000000000..58102c993 --- /dev/null +++ b/src/raycast.cpp @@ -0,0 +1,89 @@ +/* +Minetest +Copyright (C) 2016 juhdanad, Daniel Juhasz <juhdanad@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "irr_v3d.h" +#include "irr_aabb3d.h" + +bool boxLineCollision(const aabb3f &box, const v3f &start, + const v3f &dir, v3f *collision_point, v3s16 *collision_normal) { + if (box.isPointInside(start)) { + *collision_point = start; + collision_normal->set(0, 0, 0); + return true; + } + float m = 0; + + // Test X collision + if (dir.X != 0) { + if (dir.X > 0) + m = (box.MinEdge.X - start.X) / dir.X; + else + m = (box.MaxEdge.X - start.X) / dir.X; + + if (m >= 0 && m <= 1) { + *collision_point = start + dir * m; + if ((collision_point->Y >= box.MinEdge.Y) + && (collision_point->Y <= box.MaxEdge.Y) + && (collision_point->Z >= box.MinEdge.Z) + && (collision_point->Z <= box.MaxEdge.Z)) { + collision_normal->set((dir.X > 0) ? -1 : 1, 0, 0); + return true; + } + } + } + + // Test Y collision + if (dir.Y != 0) { + if (dir.Y > 0) + m = (box.MinEdge.Y - start.Y) / dir.Y; + else + m = (box.MaxEdge.Y - start.Y) / dir.Y; + + if (m >= 0 && m <= 1) { + *collision_point = start + dir * m; + if ((collision_point->X >= box.MinEdge.X) + && (collision_point->X <= box.MaxEdge.X) + && (collision_point->Z >= box.MinEdge.Z) + && (collision_point->Z <= box.MaxEdge.Z)) { + collision_normal->set(0, (dir.Y > 0) ? -1 : 1, 0); + return true; + } + } + } + + // Test Z collision + if (dir.Z != 0) { + if (dir.Z > 0) + m = (box.MinEdge.Z - start.Z) / dir.Z; + else + m = (box.MaxEdge.Z - start.Z) / dir.Z; + + if (m >= 0 && m <= 1) { + *collision_point = start + dir * m; + if ((collision_point->X >= box.MinEdge.X) + && (collision_point->X <= box.MaxEdge.X) + && (collision_point->Y >= box.MinEdge.Y) + && (collision_point->Y <= box.MaxEdge.Y)) { + collision_normal->set(0, 0, (dir.Z > 0) ? -1 : 1); + return true; + } + } + } + return false; +} diff --git a/src/raycast.h b/src/raycast.h new file mode 100644 index 000000000..d7ec8c843 --- /dev/null +++ b/src/raycast.h @@ -0,0 +1,38 @@ +/* +Minetest +Copyright (C) 2016 juhdanad, Daniel Juhasz <juhdanad@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef SRC_RAYCAST_H_ +#define SRC_RAYCAST_H_ + + +/*! + * Checks if a line and a box intersects. + * @param[in] box box to test collision + * @param[in] start starting point of the line + * @param[in] dir direction and length of the line + * @param[out] collision_point first point of the collision + * @param[out] collision_normal normal vector at the collision, points + * outwards of the surface. If start is in the box, zero vector. + * @returns true if a collision point was found + */ +bool boxLineCollision(const aabb3f &box, const v3f &start, const v3f &dir, + v3f *collision_point, v3s16 *collision_normal); + + +#endif /* SRC_RAYCAST_H_ */ diff --git a/src/reflowscan.cpp b/src/reflowscan.cpp index 49b9406d7..eec371022 100644 --- a/src/reflowscan.cpp +++ b/src/reflowscan.cpp @@ -22,12 +22,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapblock.h" #include "nodedef.h" #include "util/timetaker.h" +#include "util/cpp11.h" ReflowScan::ReflowScan(Map *map, INodeDefManager *ndef) : m_map(map), m_ndef(ndef), - m_liquid_queue(NULL) + m_liquid_queue(nullptr) { } @@ -41,7 +42,7 @@ void ReflowScan::scan(MapBlock *block, UniqueQueue<v3s16> *liquid_queue) // scanned block. Blocks are only added to the lookup if they are really // needed. The lookup is indexed manually to use the same index in a // bit-array (of uint32 type) which stores for unloaded blocks that they - // were already fetched from Map but were actually NULL. + // were already fetched from Map but were actually nullptr. memset(m_lookup, 0, sizeof(m_lookup)); int block_idx = 1 + (1 * 9) + (1 * 3); m_lookup[block_idx] = block; diff --git a/src/remoteplayer.cpp b/src/remoteplayer.cpp index 67ab89113..540132978 100644 --- a/src/remoteplayer.cpp +++ b/src/remoteplayer.cpp @@ -19,13 +19,14 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "remoteplayer.h" +#include <json/json.h> #include "content_sao.h" #include "filesys.h" #include "gamedef.h" #include "porting.h" // strlcpy +#include "server.h" #include "settings.h" - /* RemotePlayer */ @@ -64,57 +65,31 @@ RemotePlayer::RemotePlayer(const char *name, IItemDefManager *idef): movement_liquid_fluidity_smooth = g_settings->getFloat("movement_liquid_fluidity_smooth") * BS; movement_liquid_sink = g_settings->getFloat("movement_liquid_sink") * BS; movement_gravity = g_settings->getFloat("movement_gravity") * BS; + + // copy defaults + m_cloud_params.density = 0.4f; + m_cloud_params.color_bright = video::SColor(229, 240, 240, 255); + m_cloud_params.color_ambient = video::SColor(255, 0, 0, 0); + m_cloud_params.height = 120.0f; + m_cloud_params.thickness = 16.0f; + m_cloud_params.speed = v2f(0.0f, -2.0f); } -void RemotePlayer::save(std::string savedir, IGameDef *gamedef) +void RemotePlayer::serializeExtraAttributes(std::string &output) { - /* - * We have to open all possible player files in the players directory - * and check their player names because some file systems are not - * case-sensitive and player names are case-sensitive. - */ - - // A player to deserialize files into to check their names - RemotePlayer testplayer("", gamedef->idef()); - - savedir += DIR_DELIM; - std::string path = savedir + m_name; - for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) { - if (!fs::PathExists(path)) { - // Open file and serialize - std::ostringstream ss(std::ios_base::binary); - serialize(ss); - if (!fs::safeWriteToFile(path, ss.str())) { - infostream << "Failed to write " << path << std::endl; - } - setModified(false); - return; - } - // Open file and deserialize - std::ifstream is(path.c_str(), std::ios_base::binary); - if (!is.good()) { - infostream << "Failed to open " << path << std::endl; - return; - } - testplayer.deSerialize(is, path, NULL); - is.close(); - if (strcmp(testplayer.getName(), m_name) == 0) { - // Open file and serialize - std::ostringstream ss(std::ios_base::binary); - serialize(ss); - if (!fs::safeWriteToFile(path, ss.str())) { - infostream << "Failed to write " << path << std::endl; - } - setModified(false); - return; - } - path = savedir + m_name + itos(i); + assert(m_sao); + Json::Value json_root; + const PlayerAttributes &attrs = m_sao->getExtendedAttributes(); + for (PlayerAttributes::const_iterator it = attrs.begin(); it != attrs.end(); ++it) { + json_root[(*it).first] = (*it).second; } - infostream << "Didn't find free file for player " << m_name << std::endl; - return; + Json::FastWriter writer; + output = writer.write(json_root); + m_sao->setExtendedAttributeModified(false); } + void RemotePlayer::deSerialize(std::istream &is, const std::string &playername, PlayerSAO *sao) { @@ -126,7 +101,7 @@ void RemotePlayer::deSerialize(std::istream &is, const std::string &playername, m_dirty = true; //args.getS32("version"); // Version field value not used - std::string name = args.get("name"); + const std::string &name = args.get("name"); strlcpy(m_name, name.c_str(), PLAYERNAME_SIZE); if (sao) { @@ -148,7 +123,21 @@ void RemotePlayer::deSerialize(std::istream &is, const std::string &playername, } catch (SettingNotFoundException &e) {} try { - sao->setBreath(args.getS32("breath")); + sao->setBreath(args.getS32("breath"), false); + } catch (SettingNotFoundException &e) {} + + try { + const std::string &extended_attributes = args.get("extended_attributes"); + Json::Reader reader; + Json::Value attr_root; + reader.parse(extended_attributes, attr_root); + + const Json::Value::Members attr_list = attr_root.getMemberNames(); + for (Json::Value::Members::const_iterator it = attr_list.begin(); + it != attr_list.end(); ++it) { + Json::Value attr_value = attr_root[*it]; + sao->setExtendedAttribute(*it, attr_value.asString()); + } } catch (SettingNotFoundException &e) {} } @@ -175,7 +164,6 @@ void RemotePlayer::serialize(std::ostream &os) Settings args; args.setS32("version", 1); args.set("name", m_name); - //args.set("password", m_password); // This should not happen assert(m_sao); @@ -185,6 +173,10 @@ void RemotePlayer::serialize(std::ostream &os) args.setFloat("yaw", m_sao->getYaw()); args.setS32("breath", m_sao->getBreath()); + std::string extended_attrs = ""; + serializeExtraAttributes(extended_attrs); + args.set("extended_attributes", extended_attrs); + args.writeLines(os); os<<"PlayerArgsEnd\n"; diff --git a/src/remoteplayer.h b/src/remoteplayer.h index 61b5a23de..ee0d625b6 100644 --- a/src/remoteplayer.h +++ b/src/remoteplayer.h @@ -22,24 +22,28 @@ with this program; if not, write to the Free Software Foundation, Inc., #define REMOTEPLAYER_HEADER #include "player.h" +#include "cloudparams.h" class PlayerSAO; -enum RemotePlayerChatResult { +enum RemotePlayerChatResult +{ RPLAYER_CHATRESULT_OK, RPLAYER_CHATRESULT_FLOODING, RPLAYER_CHATRESULT_KICK, }; + /* Player on the server */ class RemotePlayer : public Player { + friend class PlayerDatabaseFiles; + public: RemotePlayer(const char *name, IItemDefManager *idef); virtual ~RemotePlayer() {} - void save(std::string savedir, IGameDef *gamedef); void deSerialize(std::istream &is, const std::string &playername, PlayerSAO *sao); PlayerSAO *getPlayerSAO() { return m_sao; } @@ -66,15 +70,9 @@ public: *ratio = m_day_night_ratio; } - void setHotbarImage(const std::string &name) - { - hud_hotbar_image = name; - } + void setHotbarImage(const std::string &name) { hud_hotbar_image = name; } - std::string getHotbarImage() const - { - return hud_hotbar_image; - } + std::string getHotbarImage() const { return hud_hotbar_image; } void setHotbarSelectedImage(const std::string &name) { @@ -87,21 +85,30 @@ public: } void setSky(const video::SColor &bgcolor, const std::string &type, - const std::vector<std::string> ¶ms) + const std::vector<std::string> ¶ms, bool &clouds) { m_sky_bgcolor = bgcolor; m_sky_type = type; m_sky_params = params; + m_sky_clouds = clouds; } void getSky(video::SColor *bgcolor, std::string *type, - std::vector<std::string> *params) + std::vector<std::string> *params, bool *clouds) { *bgcolor = m_sky_bgcolor; *type = m_sky_type; *params = m_sky_params; + *clouds = m_sky_clouds; } + void setCloudParams(const CloudParams &cloud_params) + { + m_cloud_params = cloud_params; + } + + const CloudParams &getCloudParams() const { return m_cloud_params; } + bool checkModified() const { return m_dirty || inventory.checkModified(); } void setModified(const bool x) @@ -128,6 +135,7 @@ public: void setDirty(bool dirty) { m_dirty = true; } u16 protocol_version; + private: /* serialize() writes a bunch of text that can contain @@ -135,6 +143,7 @@ private: deSerialize stops reading exactly at the right point. */ void serialize(std::ostream &os); + void serializeExtraAttributes(std::string &output); PlayerSAO *m_sao; bool m_dirty; @@ -155,6 +164,9 @@ private: std::string m_sky_type; video::SColor m_sky_bgcolor; std::vector<std::string> m_sky_params; + bool m_sky_clouds; + + CloudParams m_cloud_params; }; #endif diff --git a/src/rollback_interface.cpp b/src/rollback_interface.cpp index bffe0a82c..d02d1cb3e 100644 --- a/src/rollback_interface.cpp +++ b/src/rollback_interface.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/serialize.h" #include "util/string.h" #include "util/numeric.h" +#include "util/basic_macros.h" #include "map.h" #include "gamedef.h" #include "nodedef.h" @@ -32,8 +33,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "inventory.h" #include "mapblock.h" -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - RollbackNode::RollbackNode(Map *map, v3s16 p, IGameDef *gamedef) { @@ -45,7 +44,7 @@ RollbackNode::RollbackNode(Map *map, v3s16 p, IGameDef *gamedef) NodeMetadata *metap = map->getNodeMetadata(p); if (metap) { std::ostringstream os(std::ios::binary); - metap->serialize(os); + metap->serialize(os, 1); // FIXME: version bump?? meta = os.str(); } } @@ -166,7 +165,7 @@ bool RollbackAction::applyRevert(Map *map, InventoryManager *imgr, IGameDef *gam } } std::istringstream is(n_old.meta, std::ios::binary); - meta->deSerialize(is); + meta->deSerialize(is, 1); // FIXME: version bump?? } // Inform other things that the meta data has changed v3s16 blockpos = getContainerPos(p, MAP_BLOCKSIZE); @@ -191,7 +190,6 @@ bool RollbackAction::applyRevert(Map *map, InventoryManager *imgr, IGameDef *gam case TYPE_MODIFY_INVENTORY_STACK: { InventoryLocation loc; loc.deSerialize(inventory_location); - std::string real_name = gamedef->idef()->getAlias(inventory_stack.name); Inventory *inv = imgr->getInventory(loc); if (!inv) { infostream << "RollbackAction::applyRevert(): Could not get " @@ -212,10 +210,12 @@ bool RollbackAction::applyRevert(Map *map, InventoryManager *imgr, IGameDef *gam << inventory_location << std::endl; return false; } + // If item was added, take away item, otherwise add removed item if (inventory_add) { // Silently ignore different current item - if (list->getItem(inventory_index).name != real_name) + if (list->getItem(inventory_index).name != + gamedef->idef()->getAlias(inventory_stack.name)) return false; list->takeItem(inventory_index, inventory_stack.count); } else { diff --git a/src/script/CMakeLists.txt b/src/script/CMakeLists.txt index 5ef672ca9..bebe2f037 100644 --- a/src/script/CMakeLists.txt +++ b/src/script/CMakeLists.txt @@ -3,16 +3,17 @@ add_subdirectory(cpp_api) add_subdirectory(lua_api) # Used by server and client -set(common_SCRIPT_SRCS - ${CMAKE_CURRENT_SOURCE_DIR}/scripting_game.cpp +set(common_SCRIPT_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/scripting_server.cpp ${common_SCRIPT_COMMON_SRCS} ${common_SCRIPT_CPP_API_SRCS} ${common_SCRIPT_LUA_API_SRCS} PARENT_SCOPE) # Used by client only -set(client_SCRIPT_SRCS +set(client_SCRIPT_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/scripting_mainmenu.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/scripting_client.cpp ${client_SCRIPT_COMMON_SRCS} ${client_SCRIPT_CPP_API_SRCS} ${client_SCRIPT_LUA_API_SRCS} diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 541744895..c0e29abf0 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -20,7 +20,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "common/c_converter.h" #include "common/c_types.h" #include "nodedef.h" -#include "itemdef.h" #include "object_properties.h" #include "cpp_api/s_node.h" #include "lua_api/l_object.h" @@ -33,31 +32,37 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" #include "mg_schematic.h" #include "noise.h" +#include "util/pointedthing.h" +#include "debug.h" // For FATAL_ERROR #include <json/json.h> struct EnumString es_TileAnimationType[] = { {TAT_NONE, "none"}, {TAT_VERTICAL_FRAMES, "vertical_frames"}, + {TAT_SHEET_2D, "sheet_2d"}, {0, NULL}, }; /******************************************************************************/ -ItemDefinition read_item_definition(lua_State* L,int index, - ItemDefinition default_def) +void read_item_definition(lua_State* L, int index, + const ItemDefinition &default_def, ItemDefinition &def) { - if(index < 0) + if (index < 0) index = lua_gettop(L) + 1 + index; - // Read the item definition - ItemDefinition def = default_def; - def.type = (ItemType)getenumfield(L, index, "type", es_ItemType, ITEM_NONE); getstringfield(L, index, "name", def.name); getstringfield(L, index, "description", def.description); getstringfield(L, index, "inventory_image", def.inventory_image); getstringfield(L, index, "wield_image", def.wield_image); + getstringfield(L, index, "palette", def.palette_image); + + // Read item color. + lua_getfield(L, index, "color"); + read_color(L, -1, &def.color); + lua_pop(L, 1); lua_getfield(L, index, "wield_scale"); if(lua_istable(L, -1)){ @@ -112,13 +117,66 @@ ItemDefinition read_item_definition(lua_State* L,int index, // "" = no prediction getstringfield(L, index, "node_placement_prediction", def.node_placement_prediction); +} + +/******************************************************************************/ +void push_item_definition(lua_State *L, const ItemDefinition &i) +{ + lua_newtable(L); + lua_pushstring(L, i.name.c_str()); + lua_setfield(L, -2, "name"); + lua_pushstring(L, i.description.c_str()); + lua_setfield(L, -2, "description"); +} - return def; +void push_item_definition_full(lua_State *L, const ItemDefinition &i) +{ + std::string type(es_ItemType[(int)i.type].str); + + lua_newtable(L); + lua_pushstring(L, i.name.c_str()); + lua_setfield(L, -2, "name"); + lua_pushstring(L, i.description.c_str()); + lua_setfield(L, -2, "description"); + lua_pushstring(L, type.c_str()); + lua_setfield(L, -2, "type"); + lua_pushstring(L, i.inventory_image.c_str()); + lua_setfield(L, -2, "inventory_image"); + lua_pushstring(L, i.wield_image.c_str()); + lua_setfield(L, -2, "wield_image"); + lua_pushstring(L, i.palette_image.c_str()); + lua_setfield(L, -2, "palette_image"); + push_ARGB8(L, i.color); + lua_setfield(L, -2, "color"); + push_v3f(L, i.wield_scale); + lua_setfield(L, -2, "wield_scale"); + lua_pushinteger(L, i.stack_max); + lua_setfield(L, -2, "stack_max"); + lua_pushboolean(L, i.usable); + lua_setfield(L, -2, "usable"); + lua_pushboolean(L, i.liquids_pointable); + lua_setfield(L, -2, "liquids_pointable"); + if (i.type == ITEM_TOOL) { + push_tool_capabilities(L, ToolCapabilities( + i.tool_capabilities->full_punch_interval, + i.tool_capabilities->max_drop_level, + i.tool_capabilities->groupcaps, + i.tool_capabilities->damageGroups)); + lua_setfield(L, -2, "tool_capabilities"); + } + push_groups(L, i.groups); + lua_setfield(L, -2, "groups"); + push_soundspec(L, i.sound_place); + lua_setfield(L, -2, "sound_place"); + push_soundspec(L, i.sound_place_failed); + lua_setfield(L, -2, "sound_place_failed"); + lua_pushstring(L, i.node_placement_prediction.c_str()); + lua_setfield(L, -2, "node_placement_prediction"); } /******************************************************************************/ void read_object_properties(lua_State *L, int index, - ObjectProperties *prop) + ObjectProperties *prop, IItemDefManager *idef) { if(index < 0) index = lua_gettop(L) + 1 + index; @@ -216,6 +274,10 @@ void read_object_properties(lua_State *L, int index, } lua_pop(L, 1); getstringfield(L, -1, "infotext", prop->infotext); + lua_getfield(L, -1, "wield_item"); + if (!lua_isnil(L, -1)) + prop->wield_item = read_item(L, -1, idef).getItemString(); + lua_pop(L, 1); } /******************************************************************************/ @@ -284,6 +346,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop) lua_setfield(L, -2, "automatic_face_movement_max_rotation_per_sec"); lua_pushlstring(L, prop->infotext.c_str(), prop->infotext.size()); lua_setfield(L, -2, "infotext"); + lua_pushlstring(L, prop->wield_item.c_str(), prop->wield_item.size()); + lua_setfield(L, -2, "wield_item"); } /******************************************************************************/ @@ -321,7 +385,7 @@ TileDef read_tiledef(lua_State *L, int index, u8 drawtype) } else if(lua_istable(L, index)) { - // {name="default_lava.png", animation={}} + // name="default_lava.png" tiledef.name = ""; getstringfield(L, index, "name", tiledef.name); getstringfield(L, index, "image", tiledef.name); // MaterialSpec compat. @@ -331,20 +395,13 @@ TileDef read_tiledef(lua_State *L, int index, u8 drawtype) L, index, "tileable_horizontal", default_tiling); tiledef.tileable_vertical = getboolfield_default( L, index, "tileable_vertical", default_tiling); + // color = ... + lua_getfield(L, index, "color"); + tiledef.has_color = read_color(L, -1, &tiledef.color); + lua_pop(L, 1); // animation = {} lua_getfield(L, index, "animation"); - if(lua_istable(L, -1)){ - // {type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} - tiledef.animation.type = (TileAnimationType) - getenumfield(L, -1, "type", es_TileAnimationType, - TAT_NONE); - tiledef.animation.aspect_w = - getintfield_default(L, -1, "aspect_w", 16); - tiledef.animation.aspect_h = - getintfield_default(L, -1, "aspect_h", 16); - tiledef.animation.length = - getfloatfield_default(L, -1, "length", 1.0); - } + tiledef.animation = read_animation_definition(L, -1); lua_pop(L, 1); } @@ -426,6 +483,34 @@ ContentFeatures read_content_features(lua_State *L, int index) } lua_pop(L, 1); + // overlay_tiles = {} + lua_getfield(L, index, "overlay_tiles"); + if (lua_istable(L, -1)) { + int table = lua_gettop(L); + lua_pushnil(L); + int i = 0; + while (lua_next(L, table) != 0) { + // Read tiledef from value + f.tiledef_overlay[i] = read_tiledef(L, -1, f.drawtype); + // removes value, keeps key for next iteration + lua_pop(L, 1); + i++; + if (i == 6) { + lua_pop(L, 1); + break; + } + } + // Copy last value to all remaining textures + if (i >= 1) { + TileDef lasttile = f.tiledef_overlay[i - 1]; + while (i < 6) { + f.tiledef_overlay[i] = lasttile; + i++; + } + } + } + lua_pop(L, 1); + // special_tiles = {} lua_getfield(L, index, "special_tiles"); // If nil, try the deprecated name "special_materials" instead @@ -460,6 +545,13 @@ ContentFeatures read_content_features(lua_State *L, int index) if (usealpha) f.alpha = 0; + // Read node color. + lua_getfield(L, index, "color"); + read_color(L, -1, &f.color); + lua_pop(L, 1); + + getstringfield(L, index, "palette", f.palette_name); + /* Other stuff */ lua_getfield(L, index, "post_effect_color"); @@ -471,6 +563,13 @@ ContentFeatures read_content_features(lua_State *L, int index) f.param_type_2 = (ContentParamType2)getenumfield(L, index, "paramtype2", ScriptApiNode::es_ContentParamType2, CPT2_NONE); + if (f.palette_name != "" && + !(f.param_type_2 == CPT2_COLOR || + f.param_type_2 == CPT2_COLORED_FACEDIR || + f.param_type_2 == CPT2_COLORED_WALLMOUNTED)) + warningstream << "Node " << f.name.c_str() + << " has a palette, but not a suitable paramtype2." << std::endl; + // Warn about some deprecated fields warn_if_field_exists(L, index, "wall_mounted", "Deprecated; use paramtype2 = 'wallmounted'"); @@ -616,6 +715,204 @@ ContentFeatures read_content_features(lua_State *L, int index) return f; } +void push_content_features(lua_State *L, const ContentFeatures &c) +{ + std::string paramtype(ScriptApiNode::es_ContentParamType[(int)c.param_type].str); + std::string paramtype2(ScriptApiNode::es_ContentParamType2[(int)c.param_type_2].str); + std::string drawtype(ScriptApiNode::es_DrawType[(int)c.drawtype].str); + std::string liquid_type(ScriptApiNode::es_LiquidType[(int)c.liquid_type].str); + + /* Missing "tiles" because I don't see a usecase (at least not yet). */ + + lua_newtable(L); + lua_pushboolean(L, c.has_on_construct); + lua_setfield(L, -2, "has_on_construct"); + lua_pushboolean(L, c.has_on_destruct); + lua_setfield(L, -2, "has_on_destruct"); + lua_pushboolean(L, c.has_after_destruct); + lua_setfield(L, -2, "has_after_destruct"); + lua_pushstring(L, c.name.c_str()); + lua_setfield(L, -2, "name"); + push_groups(L, c.groups); + lua_setfield(L, -2, "groups"); + lua_pushstring(L, paramtype.c_str()); + lua_setfield(L, -2, "paramtype"); + lua_pushstring(L, paramtype2.c_str()); + lua_setfield(L, -2, "paramtype2"); + lua_pushstring(L, drawtype.c_str()); + lua_setfield(L, -2, "drawtype"); + if (!c.mesh.empty()) { + lua_pushstring(L, c.mesh.c_str()); + lua_setfield(L, -2, "mesh"); + } +#ifndef SERVER + push_ARGB8(L, c.minimap_color); // I know this is not set-able w/ register_node, + lua_setfield(L, -2, "minimap_color"); // but the people need to know! +#endif + lua_pushnumber(L, c.visual_scale); + lua_setfield(L, -2, "visual_scale"); + lua_pushnumber(L, c.alpha); + lua_setfield(L, -2, "alpha"); + if (!c.palette_name.empty()) { + push_ARGB8(L, c.color); + lua_setfield(L, -2, "color"); + + lua_pushstring(L, c.palette_name.c_str()); + lua_setfield(L, -2, "palette_name"); + + push_palette(L, c.palette); + lua_setfield(L, -2, "palette"); + } + lua_pushnumber(L, c.waving); + lua_setfield(L, -2, "waving"); + lua_pushnumber(L, c.connect_sides); + lua_setfield(L, -2, "connect_sides"); + + lua_newtable(L); + u16 i = 1; + for (std::vector<std::string>::const_iterator it = c.connects_to.begin(); + it != c.connects_to.end(); ++it) { + lua_pushlstring(L, it->c_str(), it->size()); + lua_rawseti(L, -2, i); + } + lua_setfield(L, -2, "connects_to"); + + push_ARGB8(L, c.post_effect_color); + lua_setfield(L, -2, "post_effect_color"); + lua_pushnumber(L, c.leveled); + lua_setfield(L, -2, "leveled"); + lua_pushboolean(L, c.sunlight_propagates); + lua_setfield(L, -2, "sunlight_propagates"); + lua_pushnumber(L, c.light_source); + lua_setfield(L, -2, "light_source"); + lua_pushboolean(L, c.is_ground_content); + lua_setfield(L, -2, "is_ground_content"); + lua_pushboolean(L, c.walkable); + lua_setfield(L, -2, "walkable"); + lua_pushboolean(L, c.pointable); + lua_setfield(L, -2, "pointable"); + lua_pushboolean(L, c.diggable); + lua_setfield(L, -2, "diggable"); + lua_pushboolean(L, c.climbable); + lua_setfield(L, -2, "climbable"); + lua_pushboolean(L, c.buildable_to); + lua_setfield(L, -2, "buildable_to"); + lua_pushboolean(L, c.rightclickable); + lua_setfield(L, -2, "rightclickable"); + lua_pushnumber(L, c.damage_per_second); + lua_setfield(L, -2, "damage_per_second"); + if (c.isLiquid()) { + lua_pushstring(L, liquid_type.c_str()); + lua_setfield(L, -2, "liquid_type"); + lua_pushstring(L, c.liquid_alternative_flowing.c_str()); + lua_setfield(L, -2, "liquid_alternative_flowing"); + lua_pushstring(L, c.liquid_alternative_source.c_str()); + lua_setfield(L, -2, "liquid_alternative_source"); + lua_pushnumber(L, c.liquid_viscosity); + lua_setfield(L, -2, "liquid_viscosity"); + lua_pushboolean(L, c.liquid_renewable); + lua_setfield(L, -2, "liquid_renewable"); + lua_pushnumber(L, c.liquid_range); + lua_setfield(L, -2, "liquid_range"); + } + lua_pushnumber(L, c.drowning); + lua_setfield(L, -2, "drowning"); + lua_pushboolean(L, c.floodable); + lua_setfield(L, -2, "floodable"); + push_nodebox(L, c.node_box); + lua_setfield(L, -2, "node_box"); + push_nodebox(L, c.selection_box); + lua_setfield(L, -2, "selection_box"); + push_nodebox(L, c.collision_box); + lua_setfield(L, -2, "collision_box"); + lua_newtable(L); + push_soundspec(L, c.sound_footstep); + lua_setfield(L, -2, "sound_footstep"); + push_soundspec(L, c.sound_dig); + lua_setfield(L, -2, "sound_dig"); + push_soundspec(L, c.sound_dug); + lua_setfield(L, -2, "sound_dug"); + lua_setfield(L, -2, "sounds"); + lua_pushboolean(L, c.legacy_facedir_simple); + lua_setfield(L, -2, "legacy_facedir_simple"); + lua_pushboolean(L, c.legacy_wallmounted); + lua_setfield(L, -2, "legacy_wallmounted"); +} + +/******************************************************************************/ +void push_nodebox(lua_State *L, const NodeBox &box) +{ + lua_newtable(L); + switch (box.type) + { + case NODEBOX_REGULAR: + lua_pushstring(L, "regular"); + lua_setfield(L, -2, "type"); + break; + case NODEBOX_LEVELED: + case NODEBOX_FIXED: + lua_pushstring(L, "fixed"); + lua_setfield(L, -2, "type"); + push_box(L, box.fixed); + lua_setfield(L, -2, "fixed"); + break; + case NODEBOX_WALLMOUNTED: + lua_pushstring(L, "wallmounted"); + lua_setfield(L, -2, "type"); + push_aabb3f(L, box.wall_top); + lua_setfield(L, -2, "wall_top"); + push_aabb3f(L, box.wall_bottom); + lua_setfield(L, -2, "wall_bottom"); + push_aabb3f(L, box.wall_side); + lua_setfield(L, -2, "wall_side"); + break; + case NODEBOX_CONNECTED: + lua_pushstring(L, "connected"); + lua_setfield(L, -2, "type"); + push_box(L, box.connect_top); + lua_setfield(L, -2, "connect_top"); + push_box(L, box.connect_bottom); + lua_setfield(L, -2, "connect_bottom"); + push_box(L, box.connect_front); + lua_setfield(L, -2, "connect_front"); + push_box(L, box.connect_back); + lua_setfield(L, -2, "connect_back"); + push_box(L, box.connect_left); + lua_setfield(L, -2, "connect_left"); + push_box(L, box.connect_right); + lua_setfield(L, -2, "connect_right"); + break; + default: + FATAL_ERROR("Invalid box.type"); + break; + } +} + +void push_box(lua_State *L, const std::vector<aabb3f> &box) +{ + lua_newtable(L); + u8 i = 1; + for (std::vector<aabb3f>::const_iterator it = box.begin(); + it != box.end(); ++it) { + push_aabb3f(L, (*it)); + lua_rawseti(L, -2, i); + } +} + +/******************************************************************************/ +void push_palette(lua_State *L, const std::vector<video::SColor> *palette) +{ + lua_createtable(L, palette->size(), 0); + int newTable = lua_gettop(L); + int index = 1; + std::vector<video::SColor>::const_iterator iter; + for (iter = palette->begin(); iter != palette->end(); ++iter) { + push_ARGB8(L, (*iter)); + lua_rawseti(L, newTable, index); + index++; + } +} + /******************************************************************************/ void read_server_sound_params(lua_State *L, int index, ServerSoundParams ¶ms) @@ -627,6 +924,7 @@ void read_server_sound_params(lua_State *L, int index, if(lua_istable(L, index)){ getfloatfield(L, index, "gain", params.gain); getstringfield(L, index, "to_player", params.to_player); + getfloatfield(L, index, "fade", params.fade); lua_getfield(L, index, "pos"); if(!lua_isnil(L, -1)){ v3f p = read_v3f(L, -1)*BS; @@ -659,11 +957,23 @@ void read_soundspec(lua_State *L, int index, SimpleSoundSpec &spec) } else if(lua_istable(L, index)){ getstringfield(L, index, "name", spec.name); getfloatfield(L, index, "gain", spec.gain); + getfloatfield(L, index, "fade", spec.fade); } else if(lua_isstring(L, index)){ spec.name = lua_tostring(L, index); } } +void push_soundspec(lua_State *L, const SimpleSoundSpec &spec) +{ + lua_newtable(L); + lua_pushstring(L, spec.name.c_str()); + lua_setfield(L, -2, "name"); + lua_pushnumber(L, spec.gain); + lua_setfield(L, -2, "gain"); + lua_pushnumber(L, spec.fade); + lua_setfield(L, -2, "fade"); +} + /******************************************************************************/ NodeBox read_nodebox(lua_State *L, int index) { @@ -776,7 +1086,7 @@ bool string_to_enum(const EnumString *spec, int &result, } /******************************************************************************/ -ItemStack read_item(lua_State* L, int index,Server* srv) +ItemStack read_item(lua_State* L, int index, IItemDefManager *idef) { if(index < 0) index = lua_gettop(L) + 1 + index; @@ -795,7 +1105,6 @@ ItemStack read_item(lua_State* L, int index,Server* srv) { // Convert from itemstring std::string itemstring = lua_tostring(L, index); - IItemDefManager *idef = srv->idef(); try { ItemStack item; @@ -812,15 +1121,34 @@ ItemStack read_item(lua_State* L, int index,Server* srv) else if(lua_istable(L, index)) { // Convert from table - IItemDefManager *idef = srv->idef(); std::string name = getstringfield_default(L, index, "name", ""); int count = getintfield_default(L, index, "count", 1); int wear = getintfield_default(L, index, "wear", 0); - std::string metadata = getstringfield_default(L, index, "metadata", ""); - return ItemStack(name, count, wear, metadata, idef); - } - else - { + + ItemStack istack(name, count, wear, idef); + + // BACKWARDS COMPATIBLITY + std::string value = getstringfield_default(L, index, "metadata", ""); + istack.metadata.setString("", value); + + // Get meta + lua_getfield(L, index, "meta"); + int fieldstable = lua_gettop(L); + if (lua_istable(L, fieldstable)) { + lua_pushnil(L); + while (lua_next(L, fieldstable) != 0) { + // key at index -2 and value at index -1 + std::string key = lua_tostring(L, -2); + size_t value_len; + const char *value_cs = lua_tolstring(L, -1, &value_len); + std::string value(value_cs, value_len); + istack.metadata.setString(key, value); + lua_pop(L, 1); // removes value, keeps key for next iteration + } + } + + return istack; + } else { throw LuaError("Expecting itemstack, itemstring, table or nil"); } } @@ -836,7 +1164,7 @@ void push_tool_capabilities(lua_State *L, lua_newtable(L); // For each groupcap for (ToolGCMap::const_iterator i = toolcap.groupcaps.begin(); - i != toolcap.groupcaps.end(); i++) { + i != toolcap.groupcaps.end(); ++i) { // Create groupcap table lua_newtable(L); const std::string &name = i->first; @@ -844,7 +1172,7 @@ void push_tool_capabilities(lua_State *L, // Create subtable "times" lua_newtable(L); for (UNORDERED_MAP<int, float>::const_iterator - i = groupcap.times.begin(); i != groupcap.times.end(); i++) { + i = groupcap.times.begin(); i != groupcap.times.end(); ++i) { lua_pushinteger(L, i->first); lua_pushnumber(L, i->second); lua_settable(L, -3); @@ -863,7 +1191,7 @@ void push_tool_capabilities(lua_State *L, lua_newtable(L); // For each damage group for (DamageGroup::const_iterator i = toolcap.damageGroups.begin(); - i != toolcap.damageGroups.end(); i++) { + i != toolcap.damageGroups.end(); ++i) { // Create damage group table lua_pushinteger(L, i->second); lua_setfield(L, -2, i->first.c_str()); @@ -902,7 +1230,7 @@ void read_inventory_list(lua_State *L, int tableindex, InventoryList *invlist = inv->addList(name, listsize); int index = 0; for(std::vector<ItemStack>::const_iterator - i = items.begin(); i != items.end(); i++){ + i = items.begin(); i != items.end(); ++i){ if(forcesize != -1 && index == forcesize) break; invlist->changeItem(index, *i); @@ -915,6 +1243,41 @@ void read_inventory_list(lua_State *L, int tableindex, } /******************************************************************************/ +struct TileAnimationParams read_animation_definition(lua_State *L, int index) +{ + if(index < 0) + index = lua_gettop(L) + 1 + index; + + struct TileAnimationParams anim; + anim.type = TAT_NONE; + if (!lua_istable(L, index)) + return anim; + + anim.type = (TileAnimationType) + getenumfield(L, index, "type", es_TileAnimationType, + TAT_NONE); + if (anim.type == TAT_VERTICAL_FRAMES) { + // {type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} + anim.vertical_frames.aspect_w = + getintfield_default(L, index, "aspect_w", 16); + anim.vertical_frames.aspect_h = + getintfield_default(L, index, "aspect_h", 16); + anim.vertical_frames.length = + getfloatfield_default(L, index, "length", 1.0); + } else if (anim.type == TAT_SHEET_2D) { + // {type="sheet_2d", frames_w=5, frames_h=3, frame_length=0.5} + getintfield(L, index, "frames_w", + anim.sheet_2d.frames_w); + getintfield(L, index, "frames_h", + anim.sheet_2d.frames_h); + getfloatfield(L, index, "frame_length", + anim.sheet_2d.frame_length); + } + + return anim; +} + +/******************************************************************************/ ToolCapabilities read_tool_capabilities( lua_State *L, int table) { @@ -1124,7 +1487,7 @@ std::vector<ItemStack> read_items(lua_State *L, int index, Server *srv) if (items.size() < (u32) key) { items.resize(key); } - items[key - 1] = read_item(L, -1, srv); + items[key - 1] = read_item(L, -1, srv->idef()); lua_pop(L, 1); } return items; @@ -1332,3 +1695,42 @@ void read_json_value(lua_State *L, Json::Value &root, int index, u8 recursion) } lua_pop(L, 1); // Pop value } + +void push_pointed_thing(lua_State *L, const PointedThing &pointed, bool csm) +{ + lua_newtable(L); + if (pointed.type == POINTEDTHING_NODE) { + lua_pushstring(L, "node"); + lua_setfield(L, -2, "type"); + push_v3s16(L, pointed.node_undersurface); + lua_setfield(L, -2, "under"); + push_v3s16(L, pointed.node_abovesurface); + lua_setfield(L, -2, "above"); + } else if (pointed.type == POINTEDTHING_OBJECT) { + lua_pushstring(L, "object"); + lua_setfield(L, -2, "type"); + + if (csm) { + lua_pushinteger(L, pointed.object_id); + lua_setfield(L, -2, "id"); + } else { + push_objectRef(L, pointed.object_id); + lua_setfield(L, -2, "ref"); + } + } else { + lua_pushstring(L, "nothing"); + lua_setfield(L, -2, "type"); + } +} + +void push_objectRef(lua_State *L, const u16 id) +{ + // Get core.object_refs[i] + lua_getglobal(L, "core"); + lua_getfield(L, -1, "object_refs"); + luaL_checktype(L, -1, LUA_TTABLE); + lua_pushnumber(L, id); + lua_gettable(L, -2); + lua_remove(L, -2); // object_refs + lua_remove(L, -2); // core +} diff --git a/src/script/common/c_content.h b/src/script/common/c_content.h index 2a2228b6d..9b8796297 100644 --- a/src/script/common/c_content.h +++ b/src/script/common/c_content.h @@ -38,6 +38,8 @@ extern "C" { #include "irrlichttypes_bloated.h" #include "util/string.h" #include "itemgroup.h" +#include "itemdef.h" +#include "c_types.h" namespace Json { class Value; } @@ -63,8 +65,20 @@ class Schematic; ContentFeatures read_content_features (lua_State *L, int index); +void push_content_features (lua_State *L, + const ContentFeatures &c); + +void push_nodebox (lua_State *L, + const NodeBox &box); +void push_box (lua_State *L, + const std::vector<aabb3f> &box); + +void push_palette (lua_State *L, + const std::vector<video::SColor> *palette); + TileDef read_tiledef (lua_State *L, int index, u8 drawtype); + void read_soundspec (lua_State *L, int index, SimpleSoundSpec &spec); NodeBox read_nodebox (lua_State *L, int index); @@ -77,17 +91,24 @@ void push_dig_params (lua_State *L, void push_hit_params (lua_State *L, const HitParams ¶ms); -ItemStack read_item (lua_State *L, int index, Server *srv); +ItemStack read_item (lua_State *L, int index, IItemDefManager *idef); +struct TileAnimationParams read_animation_definition(lua_State *L, int index); ToolCapabilities read_tool_capabilities (lua_State *L, int table); void push_tool_capabilities (lua_State *L, const ToolCapabilities &prop); -ItemDefinition read_item_definition (lua_State *L, int index, - ItemDefinition default_def); +void read_item_definition (lua_State *L, int index, const ItemDefinition &default_def, + ItemDefinition &def); +void push_item_definition (lua_State *L, + const ItemDefinition &i); +void push_item_definition_full (lua_State *L, + const ItemDefinition &i); + void read_object_properties (lua_State *L, int index, - ObjectProperties *prop); + ObjectProperties *prop, + IItemDefManager *idef); void push_object_properties (lua_State *L, ObjectProperties *prop); @@ -142,6 +163,8 @@ std::vector<ItemStack> read_items (lua_State *L, void read_soundspec (lua_State *L, int index, SimpleSoundSpec &spec); +void push_soundspec (lua_State *L, + const SimpleSoundSpec &spec); bool string_to_enum (const EnumString *spec, int &result, @@ -159,6 +182,10 @@ bool push_json_value (lua_State *L, void read_json_value (lua_State *L, Json::Value &root, int index, u8 recursion = 0); +void push_pointed_thing (lua_State *L, const PointedThing &pointed, bool csm = false); + +void push_objectRef (lua_State *L, const u16 id); + extern struct EnumString es_TileAnimationType[]; #endif /* C_CONTENT_H_ */ diff --git a/src/script/common/c_converter.cpp b/src/script/common/c_converter.cpp index f36298915..fc516d56a 100644 --- a/src/script/common/c_converter.cpp +++ b/src/script/common/c_converter.cpp @@ -26,15 +26,17 @@ extern "C" { #include "util/serialize.h" #include "util/string.h" #include "common/c_converter.h" +#include "common/c_internal.h" #include "constants.h" #define CHECK_TYPE(index, name, type) do { \ int t = lua_type(L, (index)); \ if (t != (type)) { \ + std::string traceback = script_get_backtrace(L); \ throw LuaError(std::string("Invalid ") + (name) + \ " (expected " + lua_typename(L, (type)) + \ - " got " + lua_typename(L, t) + ")."); \ + " got " + lua_typename(L, t) + ").\n" + traceback); \ } \ } while(0) #define CHECK_POS_COORD(name) CHECK_TYPE(-1, "position coordinate '" name "'", LUA_TNUMBER) diff --git a/src/script/common/c_converter.h b/src/script/common/c_converter.h index a5fbee765..b0f61a8ca 100644 --- a/src/script/common/c_converter.h +++ b/src/script/common/c_converter.h @@ -77,6 +77,8 @@ void setfloatfield(lua_State *L, int table, const char *fieldname, float value); void setboolfield(lua_State *L, int table, const char *fieldname, bool value); +void setstringfield(lua_State *L, int table, + const char *fieldname, const char *value); v3f checkFloatPos (lua_State *L, int index); v2f check_v2f (lua_State *L, int index); diff --git a/src/script/cpp_api/CMakeLists.txt b/src/script/cpp_api/CMakeLists.txt index be4d0131e..4b13356a8 100644 --- a/src/script/cpp_api/CMakeLists.txt +++ b/src/script/cpp_api/CMakeLists.txt @@ -13,6 +13,7 @@ set(common_SCRIPT_CPP_API_SRCS PARENT_SCOPE) set(client_SCRIPT_CPP_API_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/s_client.cpp ${CMAKE_CURRENT_SOURCE_DIR}/s_mainmenu.cpp PARENT_SCOPE) diff --git a/src/script/cpp_api/s_async.cpp b/src/script/cpp_api/s_async.cpp index 1fb84fab6..722359066 100644 --- a/src/script/cpp_api/s_async.cpp +++ b/src/script/cpp_api/s_async.cpp @@ -46,26 +46,26 @@ AsyncEngine::~AsyncEngine() // Request all threads to stop for (std::vector<AsyncWorkerThread *>::iterator it = workerThreads.begin(); - it != workerThreads.end(); it++) { + it != workerThreads.end(); ++it) { (*it)->stop(); } // Wake up all threads for (std::vector<AsyncWorkerThread *>::iterator it = workerThreads.begin(); - it != workerThreads.end(); it++) { + it != workerThreads.end(); ++it) { jobQueueCounter.post(); } // Wait for threads to finish for (std::vector<AsyncWorkerThread *>::iterator it = workerThreads.begin(); - it != workerThreads.end(); it++) { + it != workerThreads.end(); ++it) { (*it)->wait(); } // Force kill all threads for (std::vector<AsyncWorkerThread *>::iterator it = workerThreads.begin(); - it != workerThreads.end(); it++) { + it != workerThreads.end(); ++it) { delete *it; } @@ -76,14 +76,9 @@ AsyncEngine::~AsyncEngine() } /******************************************************************************/ -bool AsyncEngine::registerFunction(const char* name, lua_CFunction func) +void AsyncEngine::registerStateInitializer(StateInitializer func) { - if (initDone) { - return false; - } - - functionList[name] = func; - return true; + stateInitializers.push_back(func); } /******************************************************************************/ @@ -100,7 +95,8 @@ void AsyncEngine::initialize(unsigned int numEngines) } /******************************************************************************/ -unsigned int AsyncEngine::queueAsyncJob(std::string func, std::string params) +unsigned int AsyncEngine::queueAsyncJob(const std::string &func, + const std::string ¶ms) { jobQueueMutex.lock(); LuaJobInfo toAdd; @@ -124,7 +120,6 @@ LuaJobInfo AsyncEngine::getJob() jobQueueMutex.lock(); LuaJobInfo retval; - retval.valid = false; if (!jobQueue.empty()) { retval = jobQueue.front(); @@ -137,7 +132,7 @@ LuaJobInfo AsyncEngine::getJob() } /******************************************************************************/ -void AsyncEngine::putJobResult(LuaJobInfo result) +void AsyncEngine::putJobResult(const LuaJobInfo &result) { resultQueueMutex.lock(); resultQueue.push_back(result); @@ -204,11 +199,9 @@ void AsyncEngine::pushFinishedJobs(lua_State* L) { /******************************************************************************/ void AsyncEngine::prepareEnvironment(lua_State* L, int top) { - for (UNORDERED_MAP<std::string, lua_CFunction>::iterator it = functionList.begin(); - it != functionList.end(); it++) { - lua_pushstring(L, it->first.c_str()); - lua_pushcfunction(L, it->second); - lua_settable(L, top); + for (std::vector<StateInitializer>::iterator it = stateInitializers.begin(); + it != stateInitializers.end(); it++) { + (*it)(L, top); } } @@ -264,7 +257,7 @@ void* AsyncWorkerThread::run() // Wait for job LuaJobInfo toProcess = jobDispatcher->getJob(); - if (toProcess.valid == false || stopRequested()) { + if (!toProcess.valid || stopRequested()) { continue; } diff --git a/src/script/cpp_api/s_async.h b/src/script/cpp_api/s_async.h index 016381e5f..dbe0654e2 100644 --- a/src/script/cpp_api/s_async.h +++ b/src/script/cpp_api/s_async.h @@ -38,7 +38,16 @@ class AsyncEngine; // Declarations // Data required to queue a job -struct LuaJobInfo { +struct LuaJobInfo +{ + LuaJobInfo() : + serializedFunction(""), + serializedParams(""), + serializedResult(""), + id(0), + valid(false) + {} + // Function to be called in async environment std::string serializedFunction; // Parameter to be passed to function @@ -66,16 +75,16 @@ private: // Asynchornous thread and job management class AsyncEngine { friend class AsyncWorkerThread; + typedef void (*StateInitializer)(lua_State *L, int top); public: AsyncEngine(); ~AsyncEngine(); /** - * Register function to be used within engine - * @param name Function name to be used within Lua environment + * Register function to be called on new states * @param func C function to be called */ - bool registerFunction(const char* name, lua_CFunction func); + void registerStateInitializer(StateInitializer func); /** * Create async engine tasks and lock function registration @@ -89,7 +98,7 @@ public: * @param params Serialized parameters * @return jobid The job is queued */ - unsigned int queueAsyncJob(std::string func, std::string params); + unsigned int queueAsyncJob(const std::string &func, const std::string ¶ms); /** * Engine step to process finished jobs @@ -116,7 +125,7 @@ protected: * Put a Job result back to result queue * @param result result of completed job */ - void putJobResult(LuaJobInfo result); + void putJobResult(const LuaJobInfo &result); /** * Initialize environment with current registred functions @@ -131,8 +140,8 @@ private: // Variable locking the engine against further modification bool initDone; - // Internal store for registred functions - UNORDERED_MAP<std::string, lua_CFunction> functionList; + // Internal store for registred state initializers + std::vector<StateInitializer> stateInitializers; // Internal counter to create job IDs unsigned int jobIdCounter; diff --git a/src/script/cpp_api/s_base.cpp b/src/script/cpp_api/s_base.cpp index 679a517ee..4d7461c5b 100644 --- a/src/script/cpp_api/s_base.cpp +++ b/src/script/cpp_api/s_base.cpp @@ -23,12 +23,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_object.h" #include "common/c_converter.h" #include "serverobject.h" -#include "debug.h" #include "filesys.h" -#include "log.h" #include "mods.h" #include "porting.h" #include "util/string.h" +#include "server.h" +#ifndef SERVER +#include "client.h" +#endif extern "C" { @@ -40,6 +42,8 @@ extern "C" { #include <stdio.h> #include <cstdarg> +#include "script/common/c_content.h" +#include <sstream> class ModNameStorer @@ -68,7 +72,8 @@ public: */ ScriptApiBase::ScriptApiBase() : - m_luastackmutex() + m_luastackmutex(), + m_gamedef(NULL) { #ifdef SCRIPTAPI_LOCK_DEBUG m_lock_recursion_count = 0; @@ -77,6 +82,8 @@ ScriptApiBase::ScriptApiBase() : m_luastack = luaL_newstate(); FATAL_ERROR_IF(!m_luastack, "luaL_newstate() failed"); + lua_atpanic(m_luastack, &luaPanic); + luaL_openlibs(m_luastack); // Make the ScriptApiBase* accessible to ModApiBase @@ -110,7 +117,6 @@ ScriptApiBase::ScriptApiBase() : // Default to false otherwise m_secure = false; - m_server = NULL; m_environment = NULL; m_guiengine = NULL; } @@ -120,6 +126,16 @@ ScriptApiBase::~ScriptApiBase() lua_close(m_luastack); } +int ScriptApiBase::luaPanic(lua_State *L) +{ + std::ostringstream oss; + oss << "LUA PANIC: unprotected error in call to Lua API (" + << lua_tostring(L, -1) << ")"; + FATAL_ERROR(oss.str().c_str()); + // NOTREACHED + return 0; +} + void ScriptApiBase::loadMod(const std::string &script_path, const std::string &mod_name) { @@ -224,7 +240,7 @@ void ScriptApiBase::stackDump(std::ostream &o) break; case LUA_TNUMBER: /* numbers */ { char buf[10]; - snprintf(buf, 10, "%g", lua_tonumber(m_luastack, i)); + snprintf(buf, 10, "%lf", lua_tonumber(m_luastack, i)); o << buf; break; } @@ -305,18 +321,17 @@ void ScriptApiBase::objectrefGetOrCreate(lua_State *L, if (cobj == NULL || cobj->getId() == 0) { ObjectRef::create(L, cobj); } else { - objectrefGet(L, cobj->getId()); + push_objectRef(L, cobj->getId()); } } -void ScriptApiBase::objectrefGet(lua_State *L, u16 id) +Server* ScriptApiBase::getServer() { - // Get core.object_refs[i] - lua_getglobal(L, "core"); - lua_getfield(L, -1, "object_refs"); - luaL_checktype(L, -1, LUA_TTABLE); - lua_pushnumber(L, id); - lua_gettable(L, -2); - lua_remove(L, -2); // object_refs - lua_remove(L, -2); // core + return dynamic_cast<Server *>(m_gamedef); } +#ifndef SERVER +Client* ScriptApiBase::getClient() +{ + return dynamic_cast<Client *>(m_gamedef); +} +#endif diff --git a/src/script/cpp_api/s_base.h b/src/script/cpp_api/s_base.h index f52474f00..5b047a081 100644 --- a/src/script/cpp_api/s_base.h +++ b/src/script/cpp_api/s_base.h @@ -55,6 +55,10 @@ extern "C" { setOriginFromTableRaw(index, __FUNCTION__) class Server; +#ifndef SERVER +class Client; +#endif +class IGameDef; class Environment; class GUIEngine; class ServerActiveObject; @@ -75,7 +79,11 @@ public: void addObjectReference(ServerActiveObject *cobj); void removeObjectReference(ServerActiveObject *cobj); - Server* getServer() { return m_server; } + IGameDef *getGameDef() { return m_gamedef; } + Server* getServer(); +#ifndef SERVER + Client* getClient(); +#endif std::string getOrigin() { return m_last_run_mod; } void setOriginDirect(const char *origin); @@ -98,7 +106,7 @@ protected: void scriptError(int result, const char *fxn); void stackDump(std::ostream &o); - void setServer(Server* server) { m_server = server; } + void setGameDef(IGameDef* gamedef) { m_gamedef = gamedef; } Environment* getEnv() { return m_environment; } void setEnv(Environment* env) { m_environment = env; } @@ -107,7 +115,6 @@ protected: void setGuiEngine(GUIEngine* guiengine) { m_guiengine = guiengine; } void objectrefGetOrCreate(lua_State *L, ServerActiveObject *cobj); - void objectrefGet(lua_State *L, u16 id); RecursiveMutex m_luastackmutex; std::string m_last_run_mod; @@ -118,9 +125,11 @@ protected: #endif private: + static int luaPanic(lua_State *L); + lua_State* m_luastack; - Server* m_server; + IGameDef* m_gamedef; Environment* m_environment; GUIEngine* m_guiengine; }; diff --git a/src/script/cpp_api/s_client.cpp b/src/script/cpp_api/s_client.cpp new file mode 100644 index 000000000..55d309fda --- /dev/null +++ b/src/script/cpp_api/s_client.cpp @@ -0,0 +1,230 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "s_client.h" +#include "s_internal.h" +#include "client.h" +#include "common/c_converter.h" +#include "common/c_content.h" +#include "s_item.h" + +void ScriptApiClient::on_shutdown() +{ + SCRIPTAPI_PRECHECKHEADER + + // Get registered shutdown hooks + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_shutdown"); + // Call callbacks + runCallbacks(0, RUN_CALLBACKS_MODE_FIRST); +} + +void ScriptApiClient::on_connect() +{ + SCRIPTAPI_PRECHECKHEADER + + // get registered connect hooks + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_connect"); + // Call callback + runCallbacks(0, RUN_CALLBACKS_MODE_FIRST); +} + +bool ScriptApiClient::on_sending_message(const std::string &message) +{ + SCRIPTAPI_PRECHECKHEADER + + // Get core.registered_on_chat_messages + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_sending_chat_messages"); + // Call callbacks + lua_pushstring(L, message.c_str()); + runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); + bool ate = lua_toboolean(L, -1); + return ate; +} + +bool ScriptApiClient::on_receiving_message(const std::string &message) +{ + SCRIPTAPI_PRECHECKHEADER + + // Get core.registered_on_chat_messages + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_receiving_chat_messages"); + // Call callbacks + lua_pushstring(L, message.c_str()); + runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); + bool ate = lua_toboolean(L, -1); + return ate; +} + +void ScriptApiClient::on_damage_taken(int32_t damage_amount) +{ + SCRIPTAPI_PRECHECKHEADER + + // Get core.registered_on_chat_messages + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_damage_taken"); + // Call callbacks + lua_pushinteger(L, damage_amount); + runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); +} + +void ScriptApiClient::on_hp_modification(int32_t newhp) +{ + SCRIPTAPI_PRECHECKHEADER + + // Get core.registered_on_chat_messages + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_hp_modification"); + // Call callbacks + lua_pushinteger(L, newhp); + runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); +} + +void ScriptApiClient::on_death() +{ + SCRIPTAPI_PRECHECKHEADER + + // Get registered shutdown hooks + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_death"); + // Call callbacks + runCallbacks(0, RUN_CALLBACKS_MODE_FIRST); +} + +void ScriptApiClient::environment_step(float dtime) +{ + SCRIPTAPI_PRECHECKHEADER + + // Get core.registered_globalsteps + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_globalsteps"); + // Call callbacks + lua_pushnumber(L, dtime); + try { + runCallbacks(1, RUN_CALLBACKS_MODE_FIRST); + } catch (LuaError &e) { + getClient()->setFatalError(std::string("Client environment_step: ") + e.what() + "\n" + + script_get_backtrace(L)); + } +} + +void ScriptApiClient::on_formspec_input(const std::string &formname, + const StringMap &fields) +{ + SCRIPTAPI_PRECHECKHEADER + + // Get core.registered_on_chat_messages + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_formspec_input"); + // Call callbacks + // param 1 + lua_pushstring(L, formname.c_str()); + // param 2 + lua_newtable(L); + StringMap::const_iterator it; + for (it = fields.begin(); it != fields.end(); ++it) { + const std::string &name = it->first; + const std::string &value = it->second; + lua_pushstring(L, name.c_str()); + lua_pushlstring(L, value.c_str(), value.size()); + lua_settable(L, -3); + } + runCallbacks(2, RUN_CALLBACKS_MODE_OR_SC); +} + +bool ScriptApiClient::on_dignode(v3s16 p, MapNode node) +{ + SCRIPTAPI_PRECHECKHEADER + + INodeDefManager *ndef = getClient()->ndef(); + + // Get core.registered_on_dignode + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_dignode"); + + // Push data + push_v3s16(L, p); + pushnode(L, node, ndef); + + // Call functions + runCallbacks(2, RUN_CALLBACKS_MODE_OR); + return lua_toboolean(L, -1); +} + +bool ScriptApiClient::on_punchnode(v3s16 p, MapNode node) +{ + SCRIPTAPI_PRECHECKHEADER + + INodeDefManager *ndef = getClient()->ndef(); + + // Get core.registered_on_punchgnode + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_punchnode"); + + // Push data + push_v3s16(L, p); + pushnode(L, node, ndef); + + // Call functions + runCallbacks(2, RUN_CALLBACKS_MODE_OR); + bool blocked = lua_toboolean(L, -1); + return blocked; +} + +bool ScriptApiClient::on_placenode(const PointedThing &pointed, const ItemDefinition &item) +{ + SCRIPTAPI_PRECHECKHEADER + + // Get core.registered_on_placenode + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_placenode"); + + // Push data + push_pointed_thing(L, pointed, true); + push_item_definition(L, item); + + // Call functions + runCallbacks(2, RUN_CALLBACKS_MODE_OR); + return lua_toboolean(L, -1); +} + +bool ScriptApiClient::on_item_use(const ItemStack &item, const PointedThing &pointed) +{ + SCRIPTAPI_PRECHECKHEADER + + // Get core.registered_on_item_use + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_item_use"); + + // Push data + LuaItemStack::create(L, item); + push_pointed_thing(L, pointed, true); + + // Call functions + runCallbacks(2, RUN_CALLBACKS_MODE_OR); + return lua_toboolean(L, -1); +} + +void ScriptApiClient::setEnv(ClientEnvironment *env) +{ + ScriptApiBase::setEnv(env); +} diff --git a/src/script/cpp_api/s_client.h b/src/script/cpp_api/s_client.h new file mode 100644 index 000000000..9133637a6 --- /dev/null +++ b/src/script/cpp_api/s_client.h @@ -0,0 +1,63 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef S_CLIENT_H_ +#define S_CLIENT_H_ + +#include "util/pointedthing.h" +#include "cpp_api/s_base.h" +#include "mapnode.h" +#include "itemdef.h" +#include "util/string.h" +#include "util/pointedthing.h" +#include "lua_api/l_item.h" + +#ifdef _CRT_MSVCP_CURRENT +#include <cstdint> +#endif + +class ClientEnvironment; + +class ScriptApiClient : virtual public ScriptApiBase +{ +public: + // Calls on_shutdown handlers + void on_shutdown(); + + void on_connect(); + + // Chat message handlers + bool on_sending_message(const std::string &message); + bool on_receiving_message(const std::string &message); + + void on_damage_taken(int32_t damage_amount); + void on_hp_modification(int32_t newhp); + void on_death(); + void environment_step(float dtime); + void on_formspec_input(const std::string &formname, const StringMap &fields); + + bool on_dignode(v3s16 p, MapNode node); + bool on_punchnode(v3s16 p, MapNode node); + bool on_placenode(const PointedThing &pointed, const ItemDefinition &item); + bool on_item_use(const ItemStack &item, const PointedThing &pointed); + + void setEnv(ClientEnvironment *env); +}; +#endif diff --git a/src/script/cpp_api/s_entity.cpp b/src/script/cpp_api/s_entity.cpp index 378a6bf09..4c1e296d4 100644 --- a/src/script/cpp_api/s_entity.cpp +++ b/src/script/cpp_api/s_entity.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "object_properties.h" #include "common/c_converter.h" #include "common/c_content.h" +#include "server.h" bool ScriptApiEntity::luaentity_Add(u16 id, const char *name) { @@ -56,7 +57,7 @@ bool ScriptApiEntity::luaentity_Add(u16 id, const char *name) // Add object reference // This should be userdata with metatable ObjectRef - objectrefGet(L, id); + push_objectRef(L, id); luaL_checktype(L, -1, LUA_TUSERDATA); if (!luaL_checkudata(L, -1, "ObjectRef")) luaL_typerror(L, -1, "ObjectRef"); @@ -187,11 +188,11 @@ void ScriptApiEntity::luaentity_GetProperties(u16 id, getstringfield(L, -1, "mesh", prop->mesh); // Deprecated: read object properties directly - read_object_properties(L, -1, prop); + read_object_properties(L, -1, prop, getServer()->idef()); // Read initial_properties lua_getfield(L, -1, "initial_properties"); - read_object_properties(L, -1, prop); + read_object_properties(L, -1, prop, getServer()->idef()); lua_pop(L, 1); } @@ -224,10 +225,10 @@ void ScriptApiEntity::luaentity_Step(u16 id, float dtime) } // Calls entity:on_punch(ObjectRef puncher, time_from_last_punch, -// tool_capabilities, direction) -void ScriptApiEntity::luaentity_Punch(u16 id, +// tool_capabilities, direction, damage) +bool ScriptApiEntity::luaentity_Punch(u16 id, ServerActiveObject *puncher, float time_from_last_punch, - const ToolCapabilities *toolcap, v3f dir) + const ToolCapabilities *toolcap, v3f dir, s16 damage) { SCRIPTAPI_PRECHECKHEADER @@ -242,8 +243,8 @@ void ScriptApiEntity::luaentity_Punch(u16 id, // Get function lua_getfield(L, -1, "on_punch"); if (lua_isnil(L, -1)) { - lua_pop(L, 2); // Pop on_punch and entitu - return; + lua_pop(L, 2); // Pop on_punch and entity + return false; } luaL_checktype(L, -1, LUA_TFUNCTION); lua_pushvalue(L, object); // self @@ -251,11 +252,14 @@ void ScriptApiEntity::luaentity_Punch(u16 id, lua_pushnumber(L, time_from_last_punch); push_tool_capabilities(L, *toolcap); push_v3f(L, dir); + lua_pushnumber(L, damage); setOriginFromTable(object); - PCALL_RES(lua_pcall(L, 5, 0, error_handler)); + PCALL_RES(lua_pcall(L, 6, 1, error_handler)); + bool retval = lua_toboolean(L, -1); lua_pop(L, 2); // Pop object and error handler + return retval; } // Calls entity:on_rightclick(ObjectRef clicker) diff --git a/src/script/cpp_api/s_entity.h b/src/script/cpp_api/s_entity.h index 8df9d7f00..4e2a056bb 100644 --- a/src/script/cpp_api/s_entity.h +++ b/src/script/cpp_api/s_entity.h @@ -38,9 +38,9 @@ public: void luaentity_GetProperties(u16 id, ObjectProperties *prop); void luaentity_Step(u16 id, float dtime); - void luaentity_Punch(u16 id, + bool luaentity_Punch(u16 id, ServerActiveObject *puncher, float time_from_last_punch, - const ToolCapabilities *toolcap, v3f dir); + const ToolCapabilities *toolcap, v3f dir, s16 damage); void luaentity_Rightclick(u16 id, ServerActiveObject *clicker); }; diff --git a/src/script/cpp_api/s_env.cpp b/src/script/cpp_api/s_env.cpp index 913d8539d..b1404bf22 100644 --- a/src/script/cpp_api/s_env.cpp +++ b/src/script/cpp_api/s_env.cpp @@ -54,7 +54,9 @@ void ScriptApiEnv::environment_Step(float dtime) try { runCallbacks(1, RUN_CALLBACKS_MODE_FIRST); } catch (LuaError &e) { - getServer()->setAsyncFatalError(e.what()); + getServer()->setAsyncFatalError( + std::string("environment_Step: ") + e.what() + "\n" + + script_get_backtrace(L)); } } @@ -75,7 +77,9 @@ void ScriptApiEnv::player_event(ServerActiveObject *player, const std::string &t try { runCallbacks(2, RUN_CALLBACKS_MODE_FIRST); } catch (LuaError &e) { - getServer()->setAsyncFatalError(e.what()); + getServer()->setAsyncFatalError( + std::string("player_event: ") + e.what() + "\n" + + script_get_backtrace(L) ); } } @@ -237,7 +241,9 @@ void ScriptApiEnv::on_emerge_area_completion( try { PCALL_RES(lua_pcall(L, 4, 0, error_handler)); } catch (LuaError &e) { - server->setAsyncFatalError(e.what()); + server->setAsyncFatalError( + std::string("on_emerge_area_completion: ") + e.what() + "\n" + + script_get_backtrace(L)); } lua_pop(L, 1); // Pop error handler diff --git a/src/script/cpp_api/s_item.cpp b/src/script/cpp_api/s_item.cpp index 3c84fb8cf..032018f2f 100644 --- a/src/script/cpp_api/s_item.cpp +++ b/src/script/cpp_api/s_item.cpp @@ -47,7 +47,7 @@ bool ScriptApiItem::item_OnDrop(ItemStack &item, PCALL_RES(lua_pcall(L, 3, 1, error_handler)); if (!lua_isnil(L, -1)) { try { - item = read_item(L,-1, getServer()); + item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { throw LuaError(std::string(e.what()) + ". item=" + item.name); } @@ -74,7 +74,7 @@ bool ScriptApiItem::item_OnPlace(ItemStack &item, PCALL_RES(lua_pcall(L, 3, 1, error_handler)); if (!lua_isnil(L, -1)) { try { - item = read_item(L,-1, getServer()); + item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { throw LuaError(std::string(e.what()) + ". item=" + item.name); } @@ -101,7 +101,7 @@ bool ScriptApiItem::item_OnUse(ItemStack &item, PCALL_RES(lua_pcall(L, 3, 1, error_handler)); if(!lua_isnil(L, -1)) { try { - item = read_item(L,-1, getServer()); + item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { throw LuaError(std::string(e.what()) + ". item=" + item.name); } @@ -127,7 +127,7 @@ bool ScriptApiItem::item_OnSecondaryUse(ItemStack &item, ServerActiveObject *use PCALL_RES(lua_pcall(L, 3, 1, error_handler)); if (!lua_isnil(L, -1)) { try { - item = read_item(L, -1, getServer()); + item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { throw LuaError(std::string(e.what()) + ". item=" + item.name); } @@ -159,7 +159,7 @@ bool ScriptApiItem::item_OnCraft(ItemStack &item, ServerActiveObject *user, PCALL_RES(lua_pcall(L, 4, 1, error_handler)); if (!lua_isnil(L, -1)) { try { - item = read_item(L,-1, getServer()); + item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { throw LuaError(std::string(e.what()) + ". item=" + item.name); } @@ -191,7 +191,7 @@ bool ScriptApiItem::item_CraftPredict(ItemStack &item, ServerActiveObject *user, PCALL_RES(lua_pcall(L, 4, 1, error_handler)); if (!lua_isnil(L, -1)) { try { - item = read_item(L,-1, getServer()); + item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { throw LuaError(std::string(e.what()) + ". item=" + item.name); } @@ -249,27 +249,6 @@ void ScriptApiItem::pushPointedThing(const PointedThing& pointed) { lua_State* L = getStack(); - lua_newtable(L); - if(pointed.type == POINTEDTHING_NODE) - { - lua_pushstring(L, "node"); - lua_setfield(L, -2, "type"); - push_v3s16(L, pointed.node_undersurface); - lua_setfield(L, -2, "under"); - push_v3s16(L, pointed.node_abovesurface); - lua_setfield(L, -2, "above"); - } - else if(pointed.type == POINTEDTHING_OBJECT) - { - lua_pushstring(L, "object"); - lua_setfield(L, -2, "type"); - objectrefGet(L, pointed.object_id); - lua_setfield(L, -2, "ref"); - } - else - { - lua_pushstring(L, "nothing"); - lua_setfield(L, -2, "type"); - } + push_pointed_thing(L, pointed); } diff --git a/src/script/cpp_api/s_mainmenu.cpp b/src/script/cpp_api/s_mainmenu.cpp index e9a7a13b9..1e9ba3a41 100644 --- a/src/script/cpp_api/s_mainmenu.cpp +++ b/src/script/cpp_api/s_mainmenu.cpp @@ -34,8 +34,7 @@ void ScriptApiMainMenu::setMainMenuData(MainMenuDataForScript *data) lua_pushnil(L); } lua_settable(L, gamedata_idx); - setboolfield(L, gamedata_idx, "reconnect_requested", - data->reconnect_requested); + setboolfield(L, gamedata_idx, "reconnect_requested", data->reconnect_requested); lua_pop(L, 1); } @@ -58,7 +57,7 @@ void ScriptApiMainMenu::handleMainMenuEvent(std::string text) // Call it lua_pushstring(L, text.c_str()); PCALL_RES(lua_pcall(L, 1, 0, error_handler)); - lua_pop(L, 1); // Pop error handler + lua_pop(L, 1); // Pop error handler } void ScriptApiMainMenu::handleMainMenuButtons(const StringMap &fields) @@ -90,6 +89,5 @@ void ScriptApiMainMenu::handleMainMenuButtons(const StringMap &fields) // Call it PCALL_RES(lua_pcall(L, 1, 0, error_handler)); - lua_pop(L, 1); // Pop error handler + lua_pop(L, 1); // Pop error handler } - diff --git a/src/script/cpp_api/s_node.cpp b/src/script/cpp_api/s_node.cpp index 379ed773f..1ae8f58a5 100644 --- a/src/script/cpp_api/s_node.cpp +++ b/src/script/cpp_api/s_node.cpp @@ -59,6 +59,10 @@ struct EnumString ScriptApiNode::es_ContentParamType2[] = {CPT2_LEVELED, "leveled"}, {CPT2_DEGROTATE, "degrotate"}, {CPT2_MESHOPTIONS, "meshoptions"}, + {CPT2_COLOR, "color"}, + {CPT2_COLORED_FACEDIR, "colorfacedir"}, + {CPT2_COLORED_WALLMOUNTED, "colorwallmounted"}, + {CPT2_GLASSLIKE_LIQUID_LEVEL, "glasslikeliquidlevel"}, {0, NULL}, }; @@ -174,6 +178,27 @@ void ScriptApiNode::node_on_destruct(v3s16 p, MapNode node) lua_pop(L, 1); // Pop error handler } +bool ScriptApiNode::node_on_flood(v3s16 p, MapNode node, MapNode newnode) +{ + SCRIPTAPI_PRECHECKHEADER + + int error_handler = PUSH_ERROR_HANDLER(L); + + INodeDefManager *ndef = getServer()->ndef(); + + // Push callback function on stack + if (!getItemCallback(ndef->get(node).name.c_str(), "on_flood")) + return false; + + // Call function + push_v3s16(L, p); + pushnode(L, node, ndef); + pushnode(L, newnode, ndef); + PCALL_RES(lua_pcall(L, 3, 1, error_handler)); + lua_remove(L, error_handler); + return (bool) lua_isboolean(L, -1) && (bool) lua_toboolean(L, -1) == true; +} + void ScriptApiNode::node_after_destruct(v3s16 p, MapNode node) { SCRIPTAPI_PRECHECKHEADER @@ -238,7 +263,7 @@ void ScriptApiNode::node_on_receive_fields(v3s16 p, lua_pushstring(L, formname.c_str()); // formname lua_newtable(L); // fields StringMap::const_iterator it; - for (it = fields.begin(); it != fields.end(); it++) { + for (it = fields.begin(); it != fields.end(); ++it) { const std::string &name = it->first; const std::string &value = it->second; lua_pushstring(L, name.c_str()); diff --git a/src/script/cpp_api/s_node.h b/src/script/cpp_api/s_node.h index fe1180cb3..eb127909d 100644 --- a/src/script/cpp_api/s_node.h +++ b/src/script/cpp_api/s_node.h @@ -42,6 +42,7 @@ public: ServerActiveObject *digger); void node_on_construct(v3s16 p, MapNode node); void node_on_destruct(v3s16 p, MapNode node); + bool node_on_flood(v3s16 p, MapNode node, MapNode newnode); void node_after_destruct(v3s16 p, MapNode node); bool node_on_timer(v3s16 p, MapNode node, f32 dtime); void node_on_receive_fields(v3s16 p, diff --git a/src/script/cpp_api/s_player.h b/src/script/cpp_api/s_player.h index 86ee1b024..9b4611f9e 100644 --- a/src/script/cpp_api/s_player.h +++ b/src/script/cpp_api/s_player.h @@ -26,8 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., struct ToolCapabilities; -class ScriptApiPlayer - : virtual public ScriptApiBase +class ScriptApiPlayer : virtual public ScriptApiBase { public: virtual ~ScriptApiPlayer(); @@ -36,17 +35,16 @@ public: void on_dieplayer(ServerActiveObject *player); bool on_respawnplayer(ServerActiveObject *player); bool on_prejoinplayer(const std::string &name, const std::string &ip, - std::string *reason); + std::string *reason); void on_joinplayer(ServerActiveObject *player); void on_leaveplayer(ServerActiveObject *player, bool timeout); void on_cheat(ServerActiveObject *player, const std::string &cheat_type); - bool on_punchplayer(ServerActiveObject *player, - ServerActiveObject *hitter, float time_from_last_punch, - const ToolCapabilities *toolcap, v3f dir, s16 damage); + bool on_punchplayer(ServerActiveObject *player, ServerActiveObject *hitter, + float time_from_last_punch, const ToolCapabilities *toolcap, + v3f dir, s16 damage); s16 on_player_hpchange(ServerActiveObject *player, s16 hp_change); void on_playerReceiveFields(ServerActiveObject *player, - const std::string &formname, const StringMap &fields); + const std::string &formname, const StringMap &fields); }; - #endif /* S_PLAYER_H_ */ diff --git a/src/script/cpp_api/s_security.cpp b/src/script/cpp_api/s_security.cpp index 1b1f148cd..5ad7947d5 100644 --- a/src/script/cpp_api/s_security.cpp +++ b/src/script/cpp_api/s_security.cpp @@ -99,7 +99,6 @@ void ScriptApiSecurity::initializeSecurity() "clock", "date", "difftime", - "exit", "getenv", "setlocale", "time", @@ -124,6 +123,7 @@ void ScriptApiSecurity::initializeSecurity() "path", "searchpath", }; +#if USE_LUAJIT static const char *jit_whitelist[] = { "arch", "flush", @@ -135,37 +135,13 @@ void ScriptApiSecurity::initializeSecurity() "version", "version_num", }; - +#endif m_secure = true; lua_State *L = getStack(); - // Backup globals to the registry - lua_getglobal(L, "_G"); - lua_rawseti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_GLOBALS_BACKUP); - - // Replace the global environment with an empty one -#if LUA_VERSION_NUM <= 501 - int is_main = lua_pushthread(L); // Push the main thread - FATAL_ERROR_IF(!is_main, "Security: ScriptApi's Lua state " - "isn't the main Lua thread!"); -#endif - lua_newtable(L); // Create new environment - lua_pushvalue(L, -1); - lua_setfield(L, -2, "_G"); // Set _G of new environment -#if LUA_VERSION_NUM >= 502 // Lua >= 5.2 - // Set the global environment - lua_rawseti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS); -#else // Lua <= 5.1 - // Set the environment of the main thread - FATAL_ERROR_IF(!lua_setfenv(L, -2), "Security: Unable to set " - "environment of the main Lua thread!"); - lua_pop(L, 1); // Pop thread -#endif - // Get old globals - lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_GLOBALS_BACKUP); - int old_globals = lua_gettop(L); + int old_globals = backupGlobals(L); // Copy safe base functions @@ -224,7 +200,113 @@ void ScriptApiSecurity::initializeSecurity() lua_setglobal(L, "package"); lua_pop(L, 1); // Pop old package +#if USE_LUAJIT + // Copy safe jit functions, if they exist + lua_getfield(L, -1, "jit"); + if (!lua_isnil(L, -1)) { + lua_newtable(L); + copy_safe(L, jit_whitelist, sizeof(jit_whitelist)); + lua_setglobal(L, "jit"); + } + lua_pop(L, 1); // Pop old jit +#endif + + lua_pop(L, 1); // Pop globals_backup +} + +void ScriptApiSecurity::initializeSecurityClient() +{ + static const char *whitelist[] = { + "assert", + "core", + "collectgarbage", + "DIR_DELIM", + "error", + "getfenv", + "ipairs", + "next", + "pairs", + "pcall", + "print", + "rawequal", + "rawget", + "rawset", + "select", + "setfenv", + "setmetatable", + "tonumber", + "tostring", + "type", + "unpack", + "_VERSION", + "xpcall", + // Completely safe libraries + "coroutine", + "string", + "table", + "math", + }; + static const char *os_whitelist[] = { + "clock", + "date", + "difftime", + "time", + "setlocale", + }; + static const char *debug_whitelist[] = { + "getinfo", + }; + +#if USE_LUAJIT + static const char *jit_whitelist[] = { + "arch", + "flush", + "off", + "on", + "opt", + "os", + "status", + "version", + "version_num", + }; +#endif + + m_secure = true; + + lua_State *L = getStack(); + + + int old_globals = backupGlobals(L); + + + // Copy safe base functions + lua_getglobal(L, "_G"); + copy_safe(L, whitelist, sizeof(whitelist)); + + // And replace unsafe ones + SECURE_API(g, dofile); + SECURE_API(g, loadstring); + SECURE_API(g, require); + lua_pop(L, 1); + + + + // Copy safe OS functions + lua_getfield(L, old_globals, "os"); + lua_newtable(L); + copy_safe(L, os_whitelist, sizeof(os_whitelist)); + lua_setglobal(L, "os"); + lua_pop(L, 1); // Pop old OS + + + // Copy safe debug functions + lua_getfield(L, old_globals, "debug"); + lua_newtable(L); + copy_safe(L, debug_whitelist, sizeof(debug_whitelist)); + lua_setglobal(L, "debug"); + lua_pop(L, 1); // Pop old debug +#if USE_LUAJIT // Copy safe jit functions, if they exist lua_getfield(L, -1, "jit"); if (!lua_isnil(L, -1)) { @@ -233,10 +315,40 @@ void ScriptApiSecurity::initializeSecurity() lua_setglobal(L, "jit"); } lua_pop(L, 1); // Pop old jit +#endif lua_pop(L, 1); // Pop globals_backup } +int ScriptApiSecurity::backupGlobals(lua_State *L) +{ + // Backup globals to the registry + lua_getglobal(L, "_G"); + lua_rawseti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_GLOBALS_BACKUP); + + // Replace the global environment with an empty one +#if LUA_VERSION_NUM <= 501 + int is_main = lua_pushthread(L); // Push the main thread + FATAL_ERROR_IF(!is_main, "Security: ScriptApi's Lua state " + "isn't the main Lua thread!"); +#endif + lua_newtable(L); // Create new environment + lua_pushvalue(L, -1); + lua_setfield(L, -2, "_G"); // Set _G of new environment +#if LUA_VERSION_NUM >= 502 // Lua >= 5.2 + // Set the global environment + lua_rawseti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS); +#else // Lua <= 5.1 + // Set the environment of the main thread + FATAL_ERROR_IF(!lua_setfenv(L, -2), "Security: Unable to set " + "environment of the main Lua thread!"); + lua_pop(L, 1); // Pop thread +#endif + + // Get old globals + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_GLOBALS_BACKUP); + return lua_gettop(L); +} bool ScriptApiSecurity::isSecure(lua_State *L) { @@ -294,7 +406,14 @@ bool ScriptApiSecurity::safeLoadFile(lua_State *L, const char *path) // Read the file int ret = std::fseek(fp, 0, SEEK_END); - CHECK_FILE_ERR(ret, fp); + if (ret) { + lua_pushfstring(L, "%s: %s", path, strerror(errno)); + std::fclose(fp); + if (path) { + delete [] chunk_name; + } + return false; + } size_t size = std::ftell(fp) - start; char *code = new char[size]; @@ -383,9 +502,9 @@ bool ScriptApiSecurity::checkPath(lua_State *L, const char *path, lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_SCRIPTAPI); ScriptApiBase *script = (ScriptApiBase *) lua_touserdata(L, -1); lua_pop(L, 1); - const Server *server = script->getServer(); - - if (!server) return false; + const IGameDef *gamedef = script->getGameDef(); + if (!gamedef) + return false; // Get mod name lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); @@ -401,7 +520,7 @@ bool ScriptApiSecurity::checkPath(lua_State *L, const char *path, // Allow paths in mod path // Don't bother if write access isn't important, since it will be handled later if (write_required || write_allowed != NULL) { - const ModSpec *mod = server->getModSpec(mod_name); + const ModSpec *mod = gamedef->getModSpec(mod_name); if (mod) { str = fs::AbsolutePath(mod->path); if (!str.empty() && fs::PathStartsWith(abs_path, str)) { @@ -415,7 +534,7 @@ bool ScriptApiSecurity::checkPath(lua_State *L, const char *path, // Allow read-only access to all mod directories if (!write_required) { - const std::vector<ModSpec> mods = server->getMods(); + const std::vector<ModSpec> mods = gamedef->getMods(); for (size_t i = 0; i < mods.size(); ++i) { str = fs::AbsolutePath(mods[i].path); if (!str.empty() && fs::PathStartsWith(abs_path, str)) { @@ -424,7 +543,7 @@ bool ScriptApiSecurity::checkPath(lua_State *L, const char *path, } } - str = fs::AbsolutePath(server->getWorldPath()); + str = fs::AbsolutePath(gamedef->getWorldPath()); if (!str.empty()) { // Don't allow access to other paths in the world mod/game path. // These have to be blocked so you can't override a trusted mod diff --git a/src/script/cpp_api/s_security.h b/src/script/cpp_api/s_security.h index 6876108e8..f0eef00bb 100644 --- a/src/script/cpp_api/s_security.h +++ b/src/script/cpp_api/s_security.h @@ -41,8 +41,10 @@ with this program; if not, write to the Free Software Foundation, Inc., class ScriptApiSecurity : virtual public ScriptApiBase { public: + int backupGlobals(lua_State *L); // Sets up security on the ScriptApi's Lua state void initializeSecurity(); + void initializeSecurityClient(); // Checks if the Lua state has been secured static bool isSecure(lua_State *L); // Loads a file as Lua code safely (doesn't allow bytecode). diff --git a/src/script/lua_api/CMakeLists.txt b/src/script/lua_api/CMakeLists.txt index d507dcf70..1a78580e6 100644 --- a/src/script/lua_api/CMakeLists.txt +++ b/src/script/lua_api/CMakeLists.txt @@ -5,7 +5,9 @@ set(common_SCRIPT_LUA_API_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/l_env.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_inventory.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_item.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_itemstackmeta.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_mapgen.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_metadata.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_nodemeta.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_nodetimer.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_noise.cpp @@ -13,6 +15,7 @@ set(common_SCRIPT_LUA_API_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/l_particles.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_rollback.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_server.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_storage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_util.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_vmanip.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_settings.cpp @@ -20,6 +23,11 @@ set(common_SCRIPT_LUA_API_SRCS PARENT_SCOPE) set(client_SCRIPT_LUA_API_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/l_client.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_mainmenu.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_minimap.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_storage.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_sound.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_localplayer.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_camera.cpp PARENT_SCOPE) - diff --git a/src/script/lua_api/l_areastore.cpp b/src/script/lua_api/l_areastore.cpp index 09a5c78f9..b81985a7f 100644 --- a/src/script/lua_api/l_areastore.cpp +++ b/src/script/lua_api/l_areastore.cpp @@ -74,7 +74,7 @@ static inline void push_areas(lua_State *L, const std::vector<Area *> &areas, static int deserialization_helper(lua_State *L, AreaStore *as, std::istream &is) { - try { + try { as->deserialize(is); } catch (const SerializationError &e) { lua_pushboolean(L, false); @@ -380,7 +380,7 @@ void LuaAreaStore::Register(lua_State *L) } const char LuaAreaStore::className[] = "AreaStore"; -const luaL_reg LuaAreaStore::methods[] = { +const luaL_Reg LuaAreaStore::methods[] = { luamethod(LuaAreaStore, get_area), luamethod(LuaAreaStore, get_areas_for_pos), luamethod(LuaAreaStore, get_areas_in_area), diff --git a/src/script/lua_api/l_areastore.h b/src/script/lua_api/l_areastore.h index 4bd94cebe..8292e7712 100644 --- a/src/script/lua_api/l_areastore.h +++ b/src/script/lua_api/l_areastore.h @@ -22,14 +22,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_base.h" - class AreaStore; -class LuaAreaStore : public ModApiBase { +class LuaAreaStore : public ModApiBase +{ private: - static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; static int gc_object(lua_State *L); diff --git a/src/script/lua_api/l_base.cpp b/src/script/lua_api/l_base.cpp index 515a7d933..5d7ba9640 100644 --- a/src/script/lua_api/l_base.cpp +++ b/src/script/lua_api/l_base.cpp @@ -37,6 +37,18 @@ Server *ModApiBase::getServer(lua_State *L) return getScriptApiBase(L)->getServer(); } +#ifndef SERVER +Client *ModApiBase::getClient(lua_State *L) +{ + return getScriptApiBase(L)->getClient(); +} +#endif + +IGameDef *ModApiBase::getGameDef(lua_State *L) +{ + return getScriptApiBase(L)->getGameDef(); +} + Environment *ModApiBase::getEnv(lua_State *L) { return getScriptApiBase(L)->getEnv(); @@ -62,17 +74,13 @@ std::string ModApiBase::getCurrentModPath(lua_State *L) } -bool ModApiBase::registerFunction( - lua_State *L, - const char *name, - lua_CFunction fct, - int top) +bool ModApiBase::registerFunction(lua_State *L, const char *name, + lua_CFunction func, int top) { - //TODO check presence first! + // TODO: Check presence first! - lua_pushstring(L,name); - lua_pushcfunction(L,fct); - lua_settable(L, top); + lua_pushcfunction(L, func); + lua_setfield(L, top, name); return true; } diff --git a/src/script/lua_api/l_base.h b/src/script/lua_api/l_base.h index 641013dfd..af89afd93 100644 --- a/src/script/lua_api/l_base.h +++ b/src/script/lua_api/l_base.h @@ -22,12 +22,17 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "common/c_types.h" #include "common/c_internal.h" +#include "gamedef.h" extern "C" { #include <lua.h> #include <lauxlib.h> } +#ifndef SERVER +#include "client.h" +#endif + class ScriptApiBase; class Server; class Environment; @@ -38,6 +43,12 @@ class ModApiBase { public: static ScriptApiBase* getScriptApiBase(lua_State *L); static Server* getServer(lua_State *L); + #ifndef SERVER + static Client* getClient(lua_State *L); + #endif // !SERVER + + static IGameDef* getGameDef(lua_State *L); + static Environment* getEnv(lua_State *L); static GUIEngine* getGuiEngine(lua_State *L); // When we are not loading the mod, this function returns "." @@ -57,9 +68,8 @@ public: static bool registerFunction(lua_State *L, const char* name, - lua_CFunction fct, - int top - ); + lua_CFunction func, + int top); }; #endif /* L_BASE_H_ */ diff --git a/src/script/lua_api/l_camera.cpp b/src/script/lua_api/l_camera.cpp new file mode 100644 index 000000000..862384198 --- /dev/null +++ b/src/script/lua_api/l_camera.cpp @@ -0,0 +1,202 @@ +#include "script/common/c_converter.h" +#include "l_camera.h" +#include "l_internal.h" +#include "content_cao.h" +#include "camera.h" + +LuaCamera::LuaCamera(Camera *m) +{ + m_camera = m; +} + +void LuaCamera::create(lua_State *L, Camera *m) +{ + LuaCamera *o = new LuaCamera(m); + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); + + int camera_object = lua_gettop(L); + + lua_getglobal(L, "core"); + luaL_checktype(L, -1, LUA_TTABLE); + int coretable = lua_gettop(L); + + lua_pushvalue(L, camera_object); + lua_setfield(L, coretable, "camera"); +} + +int LuaCamera::l_set_camera_mode(lua_State *L) +{ + Camera *camera = getobject(L, 1); + GenericCAO *playercao = getClient(L)->getEnv().getLocalPlayer()->getCAO(); + if (!camera) + return 0; + sanity_check(playercao); + if (!lua_isnumber(L, 2)) + return 0; + + camera->setCameraMode((CameraMode)((int)lua_tonumber(L, 2))); + playercao->setVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); + playercao->setChildrenVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); + return 0; +} + +int LuaCamera::l_get_camera_mode(lua_State *L) +{ + Camera *camera = getobject(L, 1); + if (!camera) + return 0; + + lua_pushnumber(L, (int)camera->getCameraMode()); + + return 1; +} + +int LuaCamera::l_get_fov(lua_State *L) +{ + Camera *camera = getobject(L, 1); + if (!camera) + return 0; + + lua_newtable(L); + lua_pushnumber(L, camera->getFovX() * core::DEGTORAD); + lua_setfield(L, -2, "x"); + lua_pushnumber(L, camera->getFovY() * core::DEGTORAD); + lua_setfield(L, -2, "y"); + lua_pushnumber(L, camera->getCameraNode()->getFOV() * core::RADTODEG); + lua_setfield(L, -2, "actual"); + lua_pushnumber(L, camera->getFovMax() * core::RADTODEG); + lua_setfield(L, -2, "max"); + return 1; +} + +int LuaCamera::l_get_pos(lua_State *L) +{ + Camera *camera = getobject(L, 1); + if (!camera) + return 0; + + push_v3f(L, camera->getPosition()); + return 1; +} + +int LuaCamera::l_get_offset(lua_State *L) +{ + Camera *camera = getobject(L, 1); + if (!camera) + return 0; + + push_v3s16(L, camera->getOffset()); + return 1; +} + +int LuaCamera::l_get_look_dir(lua_State *L) +{ + LocalPlayer *player = getClient(L)->getEnv().getLocalPlayer(); + sanity_check(player); + + float pitch = -1.0 * player->getPitch() * core::DEGTORAD; + float yaw = (player->getYaw() + 90.) * core::DEGTORAD; + v3f v(cos(pitch) * cos(yaw), sin(pitch), cos(pitch) * sin(yaw)); + + push_v3f(L, v); + return 1; +} + +int LuaCamera::l_get_look_horizontal(lua_State *L) +{ + LocalPlayer *player = getClient(L)->getEnv().getLocalPlayer(); + sanity_check(player); + + lua_pushnumber(L, (player->getYaw() + 90.) * core::DEGTORAD); + return 1; +} + +int LuaCamera::l_get_look_vertical(lua_State *L) +{ + LocalPlayer *player = getClient(L)->getEnv().getLocalPlayer(); + sanity_check(player); + + lua_pushnumber(L, -1.0 * player->getPitch() * core::DEGTORAD); + return 1; +} + +int LuaCamera::l_get_aspect_ratio(lua_State *L) +{ + Camera *camera = getobject(L, 1); + if (!camera) + return 0; + + lua_pushnumber(L, camera->getCameraNode()->getAspectRatio()); + return 1; +} + +LuaCamera *LuaCamera::checkobject(lua_State *L, int narg) +{ + luaL_checktype(L, narg, LUA_TUSERDATA); + + void *ud = luaL_checkudata(L, narg, className); + if (!ud) + luaL_typerror(L, narg, className); + + return *(LuaCamera **)ud; +} + +Camera *LuaCamera::getobject(LuaCamera *ref) +{ + return ref->m_camera; +} + +Camera *LuaCamera::getobject(lua_State *L, int narg) +{ + LuaCamera *ref = checkobject(L, narg); + assert(ref); + Camera *camera = getobject(ref); + if (!camera) + return NULL; + return camera; +} + +int LuaCamera::gc_object(lua_State *L) +{ + LuaCamera *o = *(LuaCamera **)(lua_touserdata(L, 1)); + delete o; + return 0; +} + +void LuaCamera::Register(lua_State *L) +{ + lua_newtable(L); + int methodtable = lua_gettop(L); + luaL_newmetatable(L, className); + int metatable = lua_gettop(L); + + lua_pushliteral(L, "__metatable"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); + + lua_pushliteral(L, "__index"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); + + lua_pushliteral(L, "__gc"); + lua_pushcfunction(L, gc_object); + lua_settable(L, metatable); + + lua_pop(L, 1); + + luaL_openlib(L, 0, methods, 0); + lua_pop(L, 1); +} + +const char LuaCamera::className[] = "Camera"; +const luaL_Reg LuaCamera::methods[] = {luamethod(LuaCamera, set_camera_mode), + luamethod(LuaCamera, get_camera_mode), luamethod(LuaCamera, get_fov), + luamethod(LuaCamera, get_pos), luamethod(LuaCamera, get_offset), + luamethod(LuaCamera, get_look_dir), + luamethod(LuaCamera, get_look_vertical), + luamethod(LuaCamera, get_look_horizontal), + luamethod(LuaCamera, get_aspect_ratio), + + {0, 0}}; diff --git a/src/script/lua_api/l_camera.h b/src/script/lua_api/l_camera.h new file mode 100644 index 000000000..04921ad03 --- /dev/null +++ b/src/script/lua_api/l_camera.h @@ -0,0 +1,44 @@ +#ifndef L_CAMERA_H +#define L_CAMERA_H + +#include "l_base.h" + +class Camera; + +class LuaCamera : public ModApiBase +{ +private: + static const char className[]; + static const luaL_Reg methods[]; + + // garbage collector + static int gc_object(lua_State *L); + + static int l_set_camera_mode(lua_State *L); + static int l_get_camera_mode(lua_State *L); + + static int l_get_fov(lua_State *L); + + static int l_get_pos(lua_State *L); + static int l_get_offset(lua_State *L); + static int l_get_look_dir(lua_State *L); + static int l_get_look_vertical(lua_State *L); + static int l_get_look_horizontal(lua_State *L); + static int l_get_aspect_ratio(lua_State *L); + + Camera *m_camera; + +public: + LuaCamera(Camera *m); + ~LuaCamera() {} + + static void create(lua_State *L, Camera *m); + + static LuaCamera *checkobject(lua_State *L, int narg); + static Camera *getobject(LuaCamera *ref); + static Camera *getobject(lua_State *L, int narg); + + static void Register(lua_State *L); +}; + +#endif // L_CAMERA_H diff --git a/src/script/lua_api/l_client.cpp b/src/script/lua_api/l_client.cpp new file mode 100644 index 000000000..3c2955bcd --- /dev/null +++ b/src/script/lua_api/l_client.cpp @@ -0,0 +1,356 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "l_client.h" +#include "clientenvironment.h" +#include "common/c_content.h" +#include "common/c_converter.h" +#include "cpp_api/s_base.h" +#include "gettext.h" +#include "l_internal.h" +#include "lua_api/l_item.h" +#include "lua_api/l_nodemeta.h" +#include "mainmenumanager.h" +#include "map.h" +#include "util/string.h" +#include "nodedef.h" + +extern MainGameCallback *g_gamecallback; + +int ModApiClient::l_get_current_modname(lua_State *L) +{ + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); + return 1; +} + +// get_last_run_mod() +int ModApiClient::l_get_last_run_mod(lua_State *L) +{ + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); + const char *current_mod = lua_tostring(L, -1); + if (current_mod == NULL || current_mod[0] == '\0') { + lua_pop(L, 1); + lua_pushstring(L, getScriptApiBase(L)->getOrigin().c_str()); + } + return 1; +} + +// set_last_run_mod(modname) +int ModApiClient::l_set_last_run_mod(lua_State *L) +{ + if (!lua_isstring(L, 1)) + return 0; + + const char *mod = lua_tostring(L, 1); + getScriptApiBase(L)->setOriginDirect(mod); + lua_pushboolean(L, true); + return 1; +} + +// print(text) +int ModApiClient::l_print(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + std::string text = luaL_checkstring(L, 1); + rawstream << text << std::endl; + return 0; +} + +// display_chat_message(message) +int ModApiClient::l_display_chat_message(lua_State *L) +{ + if (!lua_isstring(L, 1)) + return 0; + + std::string message = luaL_checkstring(L, 1); + getClient(L)->pushToChatQueue(utf8_to_wide(message)); + lua_pushboolean(L, true); + return 1; +} + +// send_chat_message(message) +int ModApiClient::l_send_chat_message(lua_State *L) +{ + if (!lua_isstring(L, 1)) + return 0; + std::string message = luaL_checkstring(L, 1); + getClient(L)->sendChatMessage(utf8_to_wide(message)); + return 0; +} + +// clear_out_chat_queue() +int ModApiClient::l_clear_out_chat_queue(lua_State *L) +{ + getClient(L)->clearOutChatQueue(); + return 0; +} + +// get_player_names() +int ModApiClient::l_get_player_names(lua_State *L) +{ + const std::list<std::string> &plist = getClient(L)->getConnectedPlayerNames(); + lua_createtable(L, plist.size(), 0); + int newTable = lua_gettop(L); + int index = 1; + std::list<std::string>::const_iterator iter; + for (iter = plist.begin(); iter != plist.end(); ++iter) { + lua_pushstring(L, (*iter).c_str()); + lua_rawseti(L, newTable, index); + index++; + } + return 1; +} + +// show_formspec(formspec) +int ModApiClient::l_show_formspec(lua_State *L) +{ + if (!lua_isstring(L, 1) || !lua_isstring(L, 2)) + return 0; + + ClientEvent event; + event.type = CE_SHOW_LOCAL_FORMSPEC; + event.show_formspec.formname = new std::string(luaL_checkstring(L, 1)); + event.show_formspec.formspec = new std::string(luaL_checkstring(L, 2)); + getClient(L)->pushToEventQueue(event); + lua_pushboolean(L, true); + return 1; +} + +// send_respawn() +int ModApiClient::l_send_respawn(lua_State *L) +{ + getClient(L)->sendRespawn(); + return 0; +} + +// disconnect() +int ModApiClient::l_disconnect(lua_State *L) +{ + // Stops badly written Lua code form causing boot loops + if (getClient(L)->isShutdown()) { + lua_pushboolean(L, false); + return 1; + } + + g_gamecallback->disconnect(); + lua_pushboolean(L, true); + return 1; +} + +// gettext(text) +int ModApiClient::l_gettext(lua_State *L) +{ + std::string text = strgettext(std::string(luaL_checkstring(L, 1))); + lua_pushstring(L, text.c_str()); + + return 1; +} + +// get_node(pos) +// pos = {x=num, y=num, z=num} +int ModApiClient::l_get_node(lua_State *L) +{ + // pos + v3s16 pos = read_v3s16(L, 1); + // Do it + bool pos_ok; + MapNode n = getClient(L)->getNode(pos, &pos_ok); + // Return node + pushnode(L, n, getClient(L)->ndef()); + return 1; +} + +// get_node_or_nil(pos) +// pos = {x=num, y=num, z=num} +int ModApiClient::l_get_node_or_nil(lua_State *L) +{ + // pos + v3s16 pos = read_v3s16(L, 1); + // Do it + bool pos_ok; + MapNode n = getClient(L)->getNode(pos, &pos_ok); + if (pos_ok) { + // Return node + pushnode(L, n, getClient(L)->ndef()); + } else { + lua_pushnil(L); + } + return 1; +} + +int ModApiClient::l_get_wielded_item(lua_State *L) +{ + Client *client = getClient(L); + + Inventory local_inventory(client->idef()); + client->getLocalInventory(local_inventory); + + InventoryList *mlist = local_inventory.getList("main"); + + if (mlist && client->getPlayerItem() < mlist->getSize()) { + LuaItemStack::create(L, mlist->getItem(client->getPlayerItem())); + } else { + LuaItemStack::create(L, ItemStack()); + } + return 1; +} + +// get_meta(pos) +int ModApiClient::l_get_meta(lua_State *L) +{ + v3s16 p = read_v3s16(L, 1); + NodeMetadata *meta = getClient(L)->getEnv().getMap().getNodeMetadata(p); + NodeMetaRef::createClient(L, meta); + return 1; +} + +int ModApiClient::l_sound_play(lua_State *L) +{ + ISoundManager *sound = getClient(L)->getSoundManager(); + + SimpleSoundSpec spec; + read_soundspec(L, 1, spec); + float gain = 1.0; + bool looped = false; + s32 handle; + + if (lua_istable(L, 2)) { + getfloatfield(L, 2, "gain", gain); + getboolfield(L, 2, "loop", looped); + + lua_getfield(L, 2, "pos"); + if (!lua_isnil(L, -1)) { + v3f pos = read_v3f(L, -1) * BS; + lua_pop(L, 1); + handle = sound->playSoundAt( + spec.name, looped, gain * spec.gain, pos); + lua_pushinteger(L, handle); + return 1; + } + } + + handle = sound->playSound(spec.name, looped, gain * spec.gain); + lua_pushinteger(L, handle); + + return 1; +} + +int ModApiClient::l_sound_stop(lua_State *L) +{ + u32 handle = luaL_checkinteger(L, 1); + + getClient(L)->getSoundManager()->stopSound(handle); + + return 0; +} + +// get_server_info() +int ModApiClient::l_get_server_info(lua_State *L) +{ + Client *client = getClient(L); + Address serverAddress = client->getServerAddress(); + lua_newtable(L); + lua_pushstring(L, client->getAddressName().c_str()); + lua_setfield(L, -2, "address"); + lua_pushstring(L, serverAddress.serializeString().c_str()); + lua_setfield(L, -2, "ip"); + lua_pushinteger(L, serverAddress.getPort()); + lua_setfield(L, -2, "port"); + lua_pushinteger(L, client->getProtoVersion()); + lua_setfield(L, -2, "protocol_version"); + return 1; +} + +// get_item_def(itemstring) +int ModApiClient::l_get_item_def(lua_State *L) +{ + IGameDef *gdef = getGameDef(L); + assert(gdef); + + IItemDefManager *idef = gdef->idef(); + assert(idef); + + if (!lua_isstring(L, 1)) + return 0; + + const std::string &name(lua_tostring(L, 1)); + if (!idef->isKnown(name)) + return 0; + const ItemDefinition &def = idef->get(name); + + push_item_definition_full(L, def); + + return 1; +} + +// get_node_def(nodename) +int ModApiClient::l_get_node_def(lua_State *L) +{ + IGameDef *gdef = getGameDef(L); + assert(gdef); + + INodeDefManager *ndef = gdef->ndef(); + assert(ndef); + + if (!lua_isstring(L, 1)) + return 0; + + const std::string &name = lua_tostring(L, 1); + const ContentFeatures &cf = ndef->get(ndef->getId(name)); + if (cf.name != name) // Unknown node. | name = <whatever>, cf.name = ignore + return 0; + + push_content_features(L, cf); + + return 1; +} + +int ModApiClient::l_take_screenshot(lua_State *L) +{ + Client *client = getClient(L); + client->makeScreenshot(client->getDevice()); + return 0; +} + +void ModApiClient::Initialize(lua_State *L, int top) +{ + API_FCT(get_current_modname); + API_FCT(print); + API_FCT(display_chat_message); + API_FCT(send_chat_message); + API_FCT(clear_out_chat_queue); + API_FCT(get_player_names); + API_FCT(set_last_run_mod); + API_FCT(get_last_run_mod); + API_FCT(show_formspec); + API_FCT(send_respawn); + API_FCT(gettext); + API_FCT(get_node); + API_FCT(get_node_or_nil); + API_FCT(get_wielded_item); + API_FCT(disconnect); + API_FCT(get_meta); + API_FCT(sound_play); + API_FCT(sound_stop); + API_FCT(get_server_info); + API_FCT(get_item_def); + API_FCT(get_node_def); + API_FCT(take_screenshot); +} diff --git a/src/script/lua_api/l_client.h b/src/script/lua_api/l_client.h new file mode 100644 index 000000000..fe5780fb1 --- /dev/null +++ b/src/script/lua_api/l_client.h @@ -0,0 +1,98 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef L_CLIENT_H_ +#define L_CLIENT_H_ + +#include "lua_api/l_base.h" +#include "itemdef.h" +#include "tool.h" + +class ModApiClient : public ModApiBase +{ +private: + // get_current_modname() + static int l_get_current_modname(lua_State *L); + + // print(text) + static int l_print(lua_State *L); + + // display_chat_message(message) + static int l_display_chat_message(lua_State *L); + + // send_chat_message(message) + static int l_send_chat_message(lua_State *L); + + // clear_out_chat_queue() + static int l_clear_out_chat_queue(lua_State *L); + + // get_player_names() + static int l_get_player_names(lua_State *L); + + // show_formspec(name, formspec) + static int l_show_formspec(lua_State *L); + + // send_respawn() + static int l_send_respawn(lua_State *L); + + // disconnect() + static int l_disconnect(lua_State *L); + + // gettext(text) + static int l_gettext(lua_State *L); + + // get_last_run_mod(n) + static int l_get_last_run_mod(lua_State *L); + + // set_last_run_mod(modname) + static int l_set_last_run_mod(lua_State *L); + + // get_node(pos) + static int l_get_node(lua_State *L); + + // get_node_or_nil(pos) + static int l_get_node_or_nil(lua_State *L); + + // get_wielded_item() + static int l_get_wielded_item(lua_State *L); + + // get_meta(pos) + static int l_get_meta(lua_State *L); + + static int l_sound_play(lua_State *L); + + static int l_sound_stop(lua_State *L); + + // get_server_info() + static int l_get_server_info(lua_State *L); + + // get_item_def(itemstring) + static int l_get_item_def(lua_State *L); + + // get_node_def(nodename) + static int l_get_node_def(lua_State *L); + + static int l_take_screenshot(lua_State *L); + +public: + static void Initialize(lua_State *L, int top); +}; + +#endif diff --git a/src/script/lua_api/l_craft.cpp b/src/script/lua_api/l_craft.cpp index 2236566de..315391856 100644 --- a/src/script/lua_api/l_craft.cpp +++ b/src/script/lua_api/l_craft.cpp @@ -414,7 +414,7 @@ static void push_craft_recipe(lua_State *L, IGameDef *gdef, lua_newtable(L); // items std::vector<ItemStack>::const_iterator iter = input.items.begin(); - for (u16 j = 1; iter != input.items.end(); iter++, j++) { + for (u16 j = 1; iter != input.items.end(); ++iter, j++) { if (iter->empty()) continue; lua_pushstring(L, iter->name.c_str()); diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 68d10308c..b8b6bc5ba 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_vmanip.h" #include "common/c_converter.h" #include "common/c_content.h" -#include "scripting_game.h" +#include "scripting_server.h" #include "environment.h" #include "server.h" #include "nodedef.h" @@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "treegen.h" #include "emerge.h" #include "pathfinder.h" +#include "face_position_cache.h" struct EnumString ModApiEnvMod::es_ClearObjectsMode[] = { @@ -49,7 +50,7 @@ struct EnumString ModApiEnvMod::es_ClearObjectsMode[] = void LuaABM::trigger(ServerEnvironment *env, v3s16 p, MapNode n, u32 active_object_count, u32 active_object_count_wider) { - GameScripting *scriptIface = env->getScriptIface(); + ServerScripting *scriptIface = env->getScriptIface(); scriptIface->realityCheck(); lua_State *L = scriptIface->getStack(); @@ -92,7 +93,7 @@ void LuaABM::trigger(ServerEnvironment *env, v3s16 p, MapNode n, void LuaLBM::trigger(ServerEnvironment *env, v3s16 p, MapNode n) { - GameScripting *scriptIface = env->getScriptIface(); + ServerScripting *scriptIface = env->getScriptIface(); scriptIface->realityCheck(); lua_State *L = scriptIface->getStack(); @@ -284,7 +285,7 @@ int ModApiEnvMod::l_place_node(lua_State *L) return 1; } // Create item to place - ItemStack item(ndef->get(n).name, 1, 0, "", idef); + ItemStack item(ndef->get(n).name, 1, 0, idef); // Make pointed position PointedThing pointed; pointed.type = POINTEDTHING_NODE; @@ -347,7 +348,10 @@ int ModApiEnvMod::l_punch_node(lua_State *L) // pos = {x=num, y=num, z=num} int ModApiEnvMod::l_get_node_max_level(lua_State *L) { - GET_ENV_PTR; + Environment *env = getEnv(L); + if (!env) { + return 0; + } v3s16 pos = read_v3s16(L, 1); MapNode n = env->getMap().getNodeNoEx(pos); @@ -359,7 +363,10 @@ int ModApiEnvMod::l_get_node_max_level(lua_State *L) // pos = {x=num, y=num, z=num} int ModApiEnvMod::l_get_node_level(lua_State *L) { - GET_ENV_PTR; + Environment *env = getEnv(L); + if (!env) { + return 0; + } v3s16 pos = read_v3s16(L, 1); MapNode n = env->getMap().getNodeNoEx(pos); @@ -440,7 +447,7 @@ int ModApiEnvMod::l_get_node_timer(lua_State *L) return 1; } -// add_entity(pos, entityname) -> ObjectRef or nil +// add_entity(pos, entityname, [staticdata]) -> ObjectRef or nil // pos = {x=num, y=num, z=num} int ModApiEnvMod::l_add_entity(lua_State *L) { @@ -450,8 +457,10 @@ int ModApiEnvMod::l_add_entity(lua_State *L) v3f pos = checkFloatPos(L, 1); // content const char *name = luaL_checkstring(L, 2); + // staticdata + const char *staticdata = luaL_optstring(L, 3, ""); // Do it - ServerActiveObject *obj = new LuaEntitySAO(env, pos, name, ""); + ServerActiveObject *obj = new LuaEntitySAO(env, pos, name, staticdata); int objectid = env->addActiveObject(obj); // If failed to add, return nothing (reads as nil) if(objectid == 0) @@ -470,7 +479,7 @@ int ModApiEnvMod::l_add_item(lua_State *L) // pos //v3f pos = checkFloatPos(L, 1); // item - ItemStack item = read_item(L, 2,getServer(L)); + ItemStack item = read_item(L, 2,getServer(L)->idef()); if(item.empty() || !item.isKnown(getServer(L)->idef())) return 0; @@ -526,7 +535,7 @@ int ModApiEnvMod::l_get_objects_inside_radius(lua_State *L) ScriptApiBase *script = getScriptApiBase(L); lua_createtable(L, ids.size(), 0); std::vector<u16>::const_iterator iter = ids.begin(); - for(u32 i = 0; iter != ids.end(); iter++) { + for(u32 i = 0; iter != ids.end(); ++iter) { ServerActiveObject *obj = env->getActiveObject(*iter); // Insert object reference into table script->objectrefGetOrCreate(L, obj); @@ -556,11 +565,14 @@ int ModApiEnvMod::l_set_timeofday(lua_State *L) // get_timeofday() -> 0...1 int ModApiEnvMod::l_get_timeofday(lua_State *L) { - GET_ENV_PTR; + Environment *env = getEnv(L); + if (!env) { + return 0; + } // Do it int timeofday_mh = env->getTimeOfDay(); - float timeofday_f = (float)timeofday_mh / 24000.0; + float timeofday_f = (float)timeofday_mh / 24000.0f; lua_pushnumber(L, timeofday_f); return 1; } @@ -568,7 +580,10 @@ int ModApiEnvMod::l_get_timeofday(lua_State *L) // get_day_count() -> int int ModApiEnvMod::l_get_day_count(lua_State *L) { - GET_ENV_PTR; + Environment *env = getEnv(L); + if (!env) { + return 0; + } lua_pushnumber(L, env->getDayCount()); return 1; @@ -585,37 +600,40 @@ int ModApiEnvMod::l_get_gametime(lua_State *L) } -// find_node_near(pos, radius, nodenames) -> pos or nil +// find_node_near(pos, radius, nodenames, search_center) -> pos or nil // nodenames: eg. {"ignore", "group:tree"} or "default:dirt" int ModApiEnvMod::l_find_node_near(lua_State *L) { - GET_ENV_PTR; + Environment *env = getEnv(L); + if (!env) { + return 0; + } - INodeDefManager *ndef = getServer(L)->ndef(); + INodeDefManager *ndef = getGameDef(L)->ndef(); v3s16 pos = read_v3s16(L, 1); int radius = luaL_checkinteger(L, 2); std::set<content_t> filter; - if(lua_istable(L, 3)){ - int table = 3; + if (lua_istable(L, 3)) { lua_pushnil(L); - while(lua_next(L, table) != 0){ + while (lua_next(L, 3) != 0) { // key at index -2 and value at index -1 luaL_checktype(L, -1, LUA_TSTRING); ndef->getIds(lua_tostring(L, -1), filter); // removes value, keeps key for next iteration lua_pop(L, 1); } - } else if(lua_isstring(L, 3)){ + } else if (lua_isstring(L, 3)) { ndef->getIds(lua_tostring(L, 3), filter); } - for(int d=1; d<=radius; d++){ + int start_radius = (lua_toboolean(L, 4)) ? 0 : 1; + for (int d = start_radius; d <= radius; d++) { std::vector<v3s16> list = FacePositionCache::getFacePositions(d); - for(std::vector<v3s16>::iterator i = list.begin(); - i != list.end(); ++i){ + for (std::vector<v3s16>::iterator i = list.begin(); + i != list.end(); ++i) { v3s16 p = pos + (*i); content_t c = env->getMap().getNodeNoEx(p).getContent(); - if(filter.count(c) != 0){ + if (filter.count(c) != 0) { push_v3s16(L, p); return 1; } @@ -830,6 +848,36 @@ int ModApiEnvMod::l_line_of_sight(lua_State *L) return 1; } +// fix_light(p1, p2) +int ModApiEnvMod::l_fix_light(lua_State *L) +{ + GET_ENV_PTR; + + v3s16 blockpos1 = getContainerPos(read_v3s16(L, 1), MAP_BLOCKSIZE); + v3s16 blockpos2 = getContainerPos(read_v3s16(L, 2), MAP_BLOCKSIZE); + ServerMap &map = env->getServerMap(); + std::map<v3s16, MapBlock *> modified_blocks; + bool success = true; + v3s16 blockpos; + for (blockpos.X = blockpos1.X; blockpos.X <= blockpos2.X; blockpos.X++) + for (blockpos.Y = blockpos1.Y; blockpos.Y <= blockpos2.Y; blockpos.Y++) + for (blockpos.Z = blockpos1.Z; blockpos.Z <= blockpos2.Z; blockpos.Z++) { + success = success & map.repairBlockLight(blockpos, &modified_blocks); + } + if (modified_blocks.size() > 0) { + MapEditEvent event; + event.type = MEET_OTHER; + for (std::map<v3s16, MapBlock *>::iterator it = modified_blocks.begin(); + it != modified_blocks.end(); ++it) + event.modified_blocks.insert(it->first); + + map.dispatchEvent(&event); + } + lua_pushboolean(L, success); + + return 1; +} + // emerge_area(p1, p2, [callback, context]) // emerge mapblocks in area p1..p2, calls callback with context upon completion int ModApiEnvMod::l_emerge_area(lua_State *L) @@ -938,8 +986,7 @@ int ModApiEnvMod::l_find_path(lua_State *L) lua_newtable(L); int top = lua_gettop(L); unsigned int index = 1; - for (std::vector<v3s16>::iterator i = path.begin(); i != path.end();i++) - { + for (std::vector<v3s16>::iterator i = path.begin(); i != path.end(); ++i) { lua_pushnumber(L,index); push_v3s16(L, *i); lua_settable(L, top); @@ -1072,6 +1119,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top) API_FCT(find_node_near); API_FCT(find_nodes_in_area); API_FCT(find_nodes_in_area_under_air); + API_FCT(fix_light); API_FCT(emerge_area); API_FCT(delete_area); API_FCT(get_perlin); @@ -1085,3 +1133,12 @@ void ModApiEnvMod::Initialize(lua_State *L, int top) API_FCT(forceload_block); API_FCT(forceload_free_block); } + +void ModApiEnvMod::InitializeClient(lua_State *L, int top) +{ + API_FCT(get_timeofday); + API_FCT(get_day_count); + API_FCT(get_node_max_level); + API_FCT(get_node_level); + API_FCT(find_node_near); +} diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index 89dd7978f..7ce19b085 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -21,7 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define L_ENV_H_ #include "lua_api/l_base.h" -#include "environment.h" +#include "serverenvironment.h" class ModApiEnvMod : public ModApiBase { private: @@ -116,7 +116,7 @@ private: // get_day_count() -> int static int l_get_day_count(lua_State *L); - // find_node_near(pos, radius, nodenames) -> pos or nil + // find_node_near(pos, radius, nodenames, search_center) -> pos or nil // nodenames: eg. {"ignore", "group:tree"} or "default:dirt" static int l_find_node_near(lua_State *L); @@ -128,6 +128,9 @@ private: // nodenames: eg. {"ignore", "group:tree"} or "default:dirt" static int l_find_nodes_in_area_under_air(lua_State *L); + // fix_light(p1, p2) -> true/false + static int l_fix_light(lua_State *L); + // emerge_area(p1, p2) static int l_emerge_area(lua_State *L); @@ -173,6 +176,7 @@ private: public: static void Initialize(lua_State *L, int top); + static void InitializeClient(lua_State *L, int top); static struct EnumString es_ClearObjectsMode[]; }; @@ -199,11 +203,11 @@ public: m_simple_catch_up(simple_catch_up) { } - virtual std::set<std::string> getTriggerContents() + virtual const std::set<std::string> &getTriggerContents() const { return m_trigger_contents; } - virtual std::set<std::string> getRequiredNeighbors() + virtual const std::set<std::string> &getRequiredNeighbors() const { return m_required_neighbors; } @@ -242,7 +246,7 @@ public: }; struct ScriptCallbackState { - GameScripting *script; + ServerScripting *script; int callback_ref; int args_ref; unsigned int refcount; diff --git a/src/script/lua_api/l_internal.h b/src/script/lua_api/l_internal.h index 456c8fcce..e9b689931 100644 --- a/src/script/lua_api/l_internal.h +++ b/src/script/lua_api/l_internal.h @@ -30,22 +30,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "common/c_internal.h" #define luamethod(class, name) {#name, class::l_##name} -#define API_FCT(name) registerFunction(L, #name, l_##name,top) -#define ASYNC_API_FCT(name) engine.registerFunction(#name, l_##name) +#define luamethod_aliased(class, name, alias) {#name, class::l_##name}, {#alias, class::l_##name} +#define API_FCT(name) registerFunction(L, #name, l_##name, top) #define MAP_LOCK_REQUIRED #define NO_MAP_LOCK_REQUIRED -/* -#if (defined(WIN32) || defined(_WIN32_WCE)) - #define NO_MAP_LOCK_REQUIRED -#else - #include "profiler.h" - #define NO_MAP_LOCK_REQUIRED \ - ScopeProfiler nolocktime(g_profiler,"Scriptapi: unlockable time",SPT_ADD) -#endif -*/ - #define GET_ENV_PTR_NO_MAP_LOCK \ ServerEnvironment *env = (ServerEnvironment *)getEnv(L); \ if (env == NULL) \ diff --git a/src/script/lua_api/l_inventory.cpp b/src/script/lua_api/l_inventory.cpp index 38eade609..f5e76a7b6 100644 --- a/src/script/lua_api/l_inventory.cpp +++ b/src/script/lua_api/l_inventory.cpp @@ -194,7 +194,7 @@ int InvRef::l_set_stack(lua_State *L) InvRef *ref = checkobject(L, 1); const char *listname = luaL_checkstring(L, 2); int i = luaL_checknumber(L, 3) - 1; - ItemStack newitem = read_item(L, 4, getServer(L)); + ItemStack newitem = read_item(L, 4, getServer(L)->idef()); InventoryList *list = getlist(L, ref, listname); if(list != NULL && i >= 0 && i < (int) list->getSize()){ list->changeItem(i, newitem); @@ -295,7 +295,7 @@ int InvRef::l_add_item(lua_State *L) NO_MAP_LOCK_REQUIRED; InvRef *ref = checkobject(L, 1); const char *listname = luaL_checkstring(L, 2); - ItemStack item = read_item(L, 3, getServer(L)); + ItemStack item = read_item(L, 3, getServer(L)->idef()); InventoryList *list = getlist(L, ref, listname); if(list){ ItemStack leftover = list->addItem(item); @@ -315,7 +315,7 @@ int InvRef::l_room_for_item(lua_State *L) NO_MAP_LOCK_REQUIRED; InvRef *ref = checkobject(L, 1); const char *listname = luaL_checkstring(L, 2); - ItemStack item = read_item(L, 3, getServer(L)); + ItemStack item = read_item(L, 3, getServer(L)->idef()); InventoryList *list = getlist(L, ref, listname); if(list){ lua_pushboolean(L, list->roomForItem(item)); @@ -332,7 +332,7 @@ int InvRef::l_contains_item(lua_State *L) NO_MAP_LOCK_REQUIRED; InvRef *ref = checkobject(L, 1); const char *listname = luaL_checkstring(L, 2); - ItemStack item = read_item(L, 3, getServer(L)); + ItemStack item = read_item(L, 3, getServer(L)->idef()); InventoryList *list = getlist(L, ref, listname); if(list){ lua_pushboolean(L, list->containsItem(item)); @@ -349,7 +349,7 @@ int InvRef::l_remove_item(lua_State *L) NO_MAP_LOCK_REQUIRED; InvRef *ref = checkobject(L, 1); const char *listname = luaL_checkstring(L, 2); - ItemStack item = read_item(L, 3, getServer(L)); + ItemStack item = read_item(L, 3, getServer(L)->idef()); InventoryList *list = getlist(L, ref, listname); if(list){ ItemStack removed = list->removeItem(item); @@ -463,7 +463,7 @@ void InvRef::Register(lua_State *L) } const char InvRef::className[] = "InvRef"; -const luaL_reg InvRef::methods[] = { +const luaL_Reg InvRef::methods[] = { luamethod(InvRef, is_empty), luamethod(InvRef, get_size), luamethod(InvRef, set_size), diff --git a/src/script/lua_api/l_inventory.h b/src/script/lua_api/l_inventory.h index cc5333965..91d41c0d0 100644 --- a/src/script/lua_api/l_inventory.h +++ b/src/script/lua_api/l_inventory.h @@ -36,7 +36,7 @@ private: InventoryLocation m_loc; static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; static InvRef *checkobject(lua_State *L, int narg); diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp index ff0baea14..0e4fc4ef0 100644 --- a/src/script/lua_api/l_item.cpp +++ b/src/script/lua_api/l_item.cpp @@ -18,6 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "lua_api/l_item.h" +#include "lua_api/l_itemstackmeta.h" #include "lua_api/l_internal.h" #include "common/c_converter.h" #include "common/c_content.h" @@ -137,16 +138,28 @@ int LuaItemStack::l_set_wear(lua_State *L) return 1; } +// get_meta(self) -> string +int LuaItemStack::l_get_meta(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + LuaItemStack *o = checkobject(L, 1); + ItemStackMetaRef::create(L, &o->m_stack); + return 1; +} + +// DEPRECATED // get_metadata(self) -> string int LuaItemStack::l_get_metadata(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaItemStack *o = checkobject(L, 1); ItemStack &item = o->m_stack; - lua_pushlstring(L, item.metadata.c_str(), item.metadata.size()); + const std::string &value = item.metadata.getString(""); + lua_pushlstring(L, value.c_str(), value.size()); return 1; } +// DEPRECATED // set_metadata(self, string) int LuaItemStack::l_set_metadata(lua_State *L) { @@ -156,7 +169,7 @@ int LuaItemStack::l_set_metadata(lua_State *L) size_t len = 0; const char *ptr = luaL_checklstring(L, 2, &len); - item.metadata.assign(ptr, len); + item.metadata.setString("", std::string(ptr, len)); lua_pushboolean(L, true); return 1; @@ -177,7 +190,7 @@ int LuaItemStack::l_replace(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaItemStack *o = checkobject(L, 1); - o->m_stack = read_item(L,2,getServer(L)); + o->m_stack = read_item(L, 2, getGameDef(L)->idef()); lua_pushboolean(L, true); return 1; } @@ -211,8 +224,24 @@ int LuaItemStack::l_to_table(lua_State *L) lua_setfield(L, -2, "count"); lua_pushinteger(L, item.wear); lua_setfield(L, -2, "wear"); - lua_pushlstring(L, item.metadata.c_str(), item.metadata.size()); + + const std::string &metadata_str = item.metadata.getString(""); + lua_pushlstring(L, metadata_str.c_str(), metadata_str.size()); lua_setfield(L, -2, "metadata"); + + lua_newtable(L); + const StringMap &fields = item.metadata.getStrings(); + for (StringMap::const_iterator it = fields.begin(); + it != fields.end(); ++it) { + const std::string &name = it->first; + if (name.empty()) + continue; + const std::string &value = it->second; + lua_pushlstring(L, name.c_str(), name.size()); + lua_pushlstring(L, value.c_str(), value.size()); + lua_settable(L, -3); + } + lua_setfield(L, -2, "meta"); } return 1; } @@ -223,7 +252,7 @@ int LuaItemStack::l_get_stack_max(lua_State *L) NO_MAP_LOCK_REQUIRED; LuaItemStack *o = checkobject(L, 1); ItemStack &item = o->m_stack; - lua_pushinteger(L, item.getStackMax(getServer(L)->idef())); + lua_pushinteger(L, item.getStackMax(getGameDef(L)->idef())); return 1; } @@ -233,7 +262,7 @@ int LuaItemStack::l_get_free_space(lua_State *L) NO_MAP_LOCK_REQUIRED; LuaItemStack *o = checkobject(L, 1); ItemStack &item = o->m_stack; - lua_pushinteger(L, item.freeSpace(getServer(L)->idef())); + lua_pushinteger(L, item.freeSpace(getGameDef(L)->idef())); return 1; } @@ -244,7 +273,7 @@ int LuaItemStack::l_is_known(lua_State *L) NO_MAP_LOCK_REQUIRED; LuaItemStack *o = checkobject(L, 1); ItemStack &item = o->m_stack; - bool is_known = item.isKnown(getServer(L)->idef()); + bool is_known = item.isKnown(getGameDef(L)->idef()); lua_pushboolean(L, is_known); return 1; } @@ -280,7 +309,7 @@ int LuaItemStack::l_get_tool_capabilities(lua_State *L) LuaItemStack *o = checkobject(L, 1); ItemStack &item = o->m_stack; const ToolCapabilities &prop = - item.getToolCapabilities(getServer(L)->idef()); + item.getToolCapabilities(getGameDef(L)->idef()); push_tool_capabilities(L, prop); return 1; } @@ -295,7 +324,7 @@ int LuaItemStack::l_add_wear(lua_State *L) LuaItemStack *o = checkobject(L, 1); ItemStack &item = o->m_stack; int amount = lua_tointeger(L, 2); - bool result = item.addWear(amount, getServer(L)->idef()); + bool result = item.addWear(amount, getGameDef(L)->idef()); lua_pushboolean(L, result); return 1; } @@ -307,8 +336,8 @@ int LuaItemStack::l_add_item(lua_State *L) NO_MAP_LOCK_REQUIRED; LuaItemStack *o = checkobject(L, 1); ItemStack &item = o->m_stack; - ItemStack newitem = read_item(L,-1, getServer(L)); - ItemStack leftover = item.addItem(newitem, getServer(L)->idef()); + ItemStack newitem = read_item(L, -1, getGameDef(L)->idef()); + ItemStack leftover = item.addItem(newitem, getGameDef(L)->idef()); create(L, leftover); return 1; } @@ -321,9 +350,9 @@ int LuaItemStack::l_item_fits(lua_State *L) NO_MAP_LOCK_REQUIRED; LuaItemStack *o = checkobject(L, 1); ItemStack &item = o->m_stack; - ItemStack newitem = read_item(L, 2, getServer(L)); + ItemStack newitem = read_item(L, 2, getGameDef(L)->idef()); ItemStack restitem; - bool fits = item.itemFits(newitem, &restitem, getServer(L)->idef()); + bool fits = item.itemFits(newitem, &restitem, getGameDef(L)->idef()); lua_pushboolean(L, fits); // first return value create(L, restitem); // second return value return 2; @@ -380,7 +409,7 @@ ItemStack& LuaItemStack::getItem() int LuaItemStack::create_object(lua_State *L) { NO_MAP_LOCK_REQUIRED; - ItemStack item = read_item(L, 1, getServer(L)); + ItemStack item = read_item(L, 1, getGameDef(L)->idef()); LuaItemStack *o = new LuaItemStack(item); *(void **)(lua_newuserdata(L, sizeof(void *))) = o; luaL_getmetatable(L, className); @@ -435,7 +464,7 @@ void LuaItemStack::Register(lua_State *L) } const char LuaItemStack::className[] = "ItemStack"; -const luaL_reg LuaItemStack::methods[] = { +const luaL_Reg LuaItemStack::methods[] = { luamethod(LuaItemStack, is_empty), luamethod(LuaItemStack, get_name), luamethod(LuaItemStack, set_name), @@ -443,6 +472,7 @@ const luaL_reg LuaItemStack::methods[] = { luamethod(LuaItemStack, set_count), luamethod(LuaItemStack, get_wear), luamethod(LuaItemStack, set_wear), + luamethod(LuaItemStack, get_meta), luamethod(LuaItemStack, get_metadata), luamethod(LuaItemStack, set_metadata), luamethod(LuaItemStack, clear), @@ -496,7 +526,7 @@ int ModApiItemMod::l_register_item_raw(lua_State *L) def.node_placement_prediction = "__default"; // Read the item definition - def = read_item_definition(L, table, def); + read_item_definition(L, table, def, def); // Default to having client-side placement prediction for nodes // ("" in item definition sets it off) @@ -568,7 +598,7 @@ int ModApiItemMod::l_get_content_id(lua_State *L) NO_MAP_LOCK_REQUIRED; std::string name = luaL_checkstring(L, 1); - INodeDefManager *ndef = getServer(L)->getNodeDefManager(); + INodeDefManager *ndef = getGameDef(L)->getNodeDefManager(); content_t c = ndef->getId(name); lua_pushinteger(L, c); @@ -581,7 +611,7 @@ int ModApiItemMod::l_get_name_from_content_id(lua_State *L) NO_MAP_LOCK_REQUIRED; content_t c = luaL_checkint(L, 1); - INodeDefManager *ndef = getServer(L)->getNodeDefManager(); + INodeDefManager *ndef = getGameDef(L)->getNodeDefManager(); const char *name = ndef->get(c).name.c_str(); lua_pushstring(L, name); diff --git a/src/script/lua_api/l_item.h b/src/script/lua_api/l_item.h index be919b701..b4efaefc8 100644 --- a/src/script/lua_api/l_item.h +++ b/src/script/lua_api/l_item.h @@ -28,7 +28,7 @@ private: ItemStack m_stack; static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; // Exported functions @@ -56,9 +56,14 @@ private: // set_wear(self, number) static int l_set_wear(lua_State *L); + // get_meta(self) -> string + static int l_get_meta(lua_State *L); + + // DEPRECATED // get_metadata(self) -> string static int l_get_metadata(lua_State *L); + // DEPRECATED // set_metadata(self, string) static int l_set_metadata(lua_State *L); diff --git a/src/script/lua_api/l_itemstackmeta.cpp b/src/script/lua_api/l_itemstackmeta.cpp new file mode 100644 index 000000000..c37a82116 --- /dev/null +++ b/src/script/lua_api/l_itemstackmeta.cpp @@ -0,0 +1,120 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "lua_api/l_itemstackmeta.h" +#include "lua_api/l_internal.h" +#include "common/c_content.h" + +/* + NodeMetaRef +*/ +ItemStackMetaRef* ItemStackMetaRef::checkobject(lua_State *L, int narg) +{ + luaL_checktype(L, narg, LUA_TUSERDATA); + void *ud = luaL_checkudata(L, narg, className); + if (!ud) + luaL_typerror(L, narg, className); + + return *(ItemStackMetaRef**)ud; // unbox pointer +} + +Metadata* ItemStackMetaRef::getmeta(bool auto_create) +{ + return &istack->metadata; +} + +void ItemStackMetaRef::clearMeta() +{ + istack->metadata.clear(); +} + +void ItemStackMetaRef::reportMetadataChange() +{ + // TODO +} + +// Exported functions + +// garbage collector +int ItemStackMetaRef::gc_object(lua_State *L) { + ItemStackMetaRef *o = *(ItemStackMetaRef **)(lua_touserdata(L, 1)); + delete o; + return 0; +} + +// Creates an NodeMetaRef and leaves it on top of stack +// Not callable from Lua; all references are created on the C side. +void ItemStackMetaRef::create(lua_State *L, ItemStack *istack) +{ + ItemStackMetaRef *o = new ItemStackMetaRef(istack); + //infostream<<"NodeMetaRef::create: o="<<o<<std::endl; + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); +} + +void ItemStackMetaRef::Register(lua_State *L) +{ + lua_newtable(L); + int methodtable = lua_gettop(L); + luaL_newmetatable(L, className); + int metatable = lua_gettop(L); + + lua_pushliteral(L, "__metatable"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); // hide metatable from Lua getmetatable() + + lua_pushliteral(L, "metadata_class"); + lua_pushlstring(L, className, strlen(className)); + lua_settable(L, metatable); + + lua_pushliteral(L, "__index"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); + + lua_pushliteral(L, "__gc"); + lua_pushcfunction(L, gc_object); + lua_settable(L, metatable); + + lua_pushliteral(L, "__eq"); + lua_pushcfunction(L, l_equals); + lua_settable(L, metatable); + + lua_pop(L, 1); // drop metatable + + luaL_openlib(L, 0, methods, 0); // fill methodtable + lua_pop(L, 1); // drop methodtable + + // Cannot be created from Lua + //lua_register(L, className, create_object); +} + +const char ItemStackMetaRef::className[] = "ItemStackMetaRef"; +const luaL_Reg ItemStackMetaRef::methods[] = { + luamethod(MetaDataRef, get_string), + luamethod(MetaDataRef, set_string), + luamethod(MetaDataRef, get_int), + luamethod(MetaDataRef, set_int), + luamethod(MetaDataRef, get_float), + luamethod(MetaDataRef, set_float), + luamethod(MetaDataRef, to_table), + luamethod(MetaDataRef, from_table), + luamethod(MetaDataRef, equals), + {0,0} +}; diff --git a/src/script/lua_api/l_itemstackmeta.h b/src/script/lua_api/l_itemstackmeta.h new file mode 100644 index 000000000..4ef64a91e --- /dev/null +++ b/src/script/lua_api/l_itemstackmeta.h @@ -0,0 +1,59 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef L_ITEMSTACKMETA_H_ +#define L_ITEMSTACKMETA_H_ + +#include "lua_api/l_base.h" +#include "lua_api/l_metadata.h" +#include "irrlichttypes_bloated.h" +#include "inventory.h" + +class ItemStackMetaRef : public MetaDataRef +{ +private: + ItemStack *istack; + + static const char className[]; + static const luaL_Reg methods[]; + + static ItemStackMetaRef *checkobject(lua_State *L, int narg); + + virtual Metadata* getmeta(bool auto_create); + + virtual void clearMeta(); + + virtual void reportMetadataChange(); + + // Exported functions + + // garbage collector + static int gc_object(lua_State *L); +public: + ItemStackMetaRef(ItemStack *istack): istack(istack) {} + ~ItemStackMetaRef() {} + + // Creates an ItemStackMetaRef and leaves it on top of stack + // Not callable from Lua; all references are created on the C side. + static void create(lua_State *L, ItemStack *istack); + + static void Register(lua_State *L); +}; + +#endif diff --git a/src/script/lua_api/l_localplayer.cpp b/src/script/lua_api/l_localplayer.cpp new file mode 100644 index 000000000..7ec4eaa62 --- /dev/null +++ b/src/script/lua_api/l_localplayer.cpp @@ -0,0 +1,358 @@ +/* +Minetest +Copyright (C) 2017 Dumbeldor, Vincent Glize <vincent.glize@live.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "l_localplayer.h" +#include "l_internal.h" +#include "script/common/c_converter.h" + +LuaLocalPlayer::LuaLocalPlayer(LocalPlayer *m) +{ + m_localplayer = m; +} + +void LuaLocalPlayer::create(lua_State *L, LocalPlayer *m) +{ + LuaLocalPlayer *o = new LuaLocalPlayer(m); + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); + + // Keep localplayer object stack id + int localplayer_object = lua_gettop(L); + + lua_getglobal(L, "core"); + luaL_checktype(L, -1, LUA_TTABLE); + int coretable = lua_gettop(L); + + lua_pushvalue(L, localplayer_object); + lua_setfield(L, coretable, "localplayer"); +} + +int LuaLocalPlayer::l_get_velocity(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + push_v3f(L, player->getSpeed() / BS); + return 1; +} + +int LuaLocalPlayer::l_get_hp(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushinteger(L, player->hp); + return 1; +} + +int LuaLocalPlayer::l_get_name(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushstring(L, player->getName()); + return 1; +} + +int LuaLocalPlayer::l_is_attached(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushboolean(L, player->isAttached); + return 1; +} + +int LuaLocalPlayer::l_is_touching_ground(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushboolean(L, player->touching_ground); + return 1; +} + +int LuaLocalPlayer::l_is_in_liquid(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushboolean(L, player->in_liquid); + return 1; +} + +int LuaLocalPlayer::l_is_in_liquid_stable(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushboolean(L, player->in_liquid_stable); + return 1; +} + +int LuaLocalPlayer::l_get_liquid_viscosity(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushinteger(L, player->liquid_viscosity); + return 1; +} + +int LuaLocalPlayer::l_is_climbing(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushboolean(L, player->is_climbing); + return 1; +} + +int LuaLocalPlayer::l_swimming_vertical(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushboolean(L, player->swimming_vertical); + return 1; +} + +int LuaLocalPlayer::l_get_physics_override(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_newtable(L); + lua_pushnumber(L, player->physics_override_speed); + lua_setfield(L, -2, "speed"); + + lua_pushnumber(L, player->physics_override_jump); + lua_setfield(L, -2, "jump"); + + lua_pushnumber(L, player->physics_override_gravity); + lua_setfield(L, -2, "gravity"); + + lua_pushboolean(L, player->physics_override_sneak); + lua_setfield(L, -2, "sneak"); + + lua_pushboolean(L, player->physics_override_sneak_glitch); + lua_setfield(L, -2, "sneak_glitch"); + + return 1; +} + +int LuaLocalPlayer::l_get_override_pos(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + push_v3f(L, player->overridePosition); + return 1; +} + +int LuaLocalPlayer::l_get_last_pos(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + push_v3f(L, player->last_position / BS); + return 1; +} + +int LuaLocalPlayer::l_get_last_velocity(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + push_v3f(L, player->last_speed); + return 1; +} + +int LuaLocalPlayer::l_get_last_look_vertical(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushnumber(L, -1.0 * player->last_pitch * core::DEGTORAD); + return 1; +} + +int LuaLocalPlayer::l_get_last_look_horizontal(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushnumber(L, (player->last_yaw + 90.) * core::DEGTORAD); + return 1; +} + +int LuaLocalPlayer::l_get_key_pressed(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushinteger(L, player->last_keyPressed); + return 1; +} + +int LuaLocalPlayer::l_get_breath(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_pushinteger(L, player->getBreath()); + return 1; +} + +int LuaLocalPlayer::l_get_pos(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + push_v3f(L, player->getPosition() / BS); + return 1; +} + +int LuaLocalPlayer::l_get_movement_acceleration(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_newtable(L); + lua_pushnumber(L, player->movement_acceleration_default); + lua_setfield(L, -2, "default"); + + lua_pushnumber(L, player->movement_acceleration_air); + lua_setfield(L, -2, "air"); + + lua_pushnumber(L, player->movement_acceleration_fast); + lua_setfield(L, -2, "fast"); + + return 1; +} + +int LuaLocalPlayer::l_get_movement_speed(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_newtable(L); + lua_pushnumber(L, player->movement_speed_walk); + lua_setfield(L, -2, "walk"); + + lua_pushnumber(L, player->movement_speed_crouch); + lua_setfield(L, -2, "crouch"); + + lua_pushnumber(L, player->movement_speed_fast); + lua_setfield(L, -2, "fast"); + + lua_pushnumber(L, player->movement_speed_climb); + lua_setfield(L, -2, "climb"); + + lua_pushnumber(L, player->movement_speed_jump); + lua_setfield(L, -2, "jump"); + + return 1; +} + +int LuaLocalPlayer::l_get_movement(lua_State *L) +{ + LocalPlayer *player = getobject(L, 1); + + lua_newtable(L); + + lua_pushnumber(L, player->movement_liquid_fluidity); + lua_setfield(L, -2, "liquid_fluidity"); + + lua_pushnumber(L, player->movement_liquid_fluidity_smooth); + lua_setfield(L, -2, "liquid_fluidity_smooth"); + + lua_pushnumber(L, player->movement_liquid_sink); + lua_setfield(L, -2, "liquid_sink"); + + lua_pushnumber(L, player->movement_gravity); + lua_setfield(L, -2, "gravity"); + + return 1; +} + +LuaLocalPlayer *LuaLocalPlayer::checkobject(lua_State *L, int narg) +{ + luaL_checktype(L, narg, LUA_TUSERDATA); + + void *ud = luaL_checkudata(L, narg, className); + if (!ud) + luaL_typerror(L, narg, className); + + return *(LuaLocalPlayer **)ud; +} + +LocalPlayer *LuaLocalPlayer::getobject(LuaLocalPlayer *ref) +{ + return ref->m_localplayer; +} + +LocalPlayer *LuaLocalPlayer::getobject(lua_State *L, int narg) +{ + LuaLocalPlayer *ref = checkobject(L, narg); + assert(ref); + LocalPlayer *player = getobject(ref); + assert(player); + return player; +} + +int LuaLocalPlayer::gc_object(lua_State *L) +{ + LuaLocalPlayer *o = *(LuaLocalPlayer **)(lua_touserdata(L, 1)); + delete o; + return 0; +} + +void LuaLocalPlayer::Register(lua_State *L) +{ + lua_newtable(L); + int methodtable = lua_gettop(L); + luaL_newmetatable(L, className); + int metatable = lua_gettop(L); + + lua_pushliteral(L, "__metatable"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); // hide metatable from lua getmetatable() + + lua_pushliteral(L, "__index"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); + + lua_pushliteral(L, "__gc"); + lua_pushcfunction(L, gc_object); + lua_settable(L, metatable); + + lua_pop(L, 1); // Drop metatable + + luaL_openlib(L, 0, methods, 0); // fill methodtable + lua_pop(L, 1); // Drop methodtable +} + +const char LuaLocalPlayer::className[] = "LocalPlayer"; +const luaL_Reg LuaLocalPlayer::methods[] = { + luamethod(LuaLocalPlayer, get_velocity), + luamethod(LuaLocalPlayer, get_hp), + luamethod(LuaLocalPlayer, get_name), + luamethod(LuaLocalPlayer, is_attached), + luamethod(LuaLocalPlayer, is_touching_ground), + luamethod(LuaLocalPlayer, is_in_liquid), + luamethod(LuaLocalPlayer, is_in_liquid_stable), + luamethod(LuaLocalPlayer, get_liquid_viscosity), + luamethod(LuaLocalPlayer, is_climbing), + luamethod(LuaLocalPlayer, swimming_vertical), + luamethod(LuaLocalPlayer, get_physics_override), + luamethod(LuaLocalPlayer, get_override_pos), + luamethod(LuaLocalPlayer, get_last_pos), + luamethod(LuaLocalPlayer, get_last_velocity), + luamethod(LuaLocalPlayer, get_last_look_horizontal), + luamethod(LuaLocalPlayer, get_last_look_vertical), + luamethod(LuaLocalPlayer, get_key_pressed), + luamethod(LuaLocalPlayer, get_breath), + luamethod(LuaLocalPlayer, get_pos), + luamethod(LuaLocalPlayer, get_movement_acceleration), + luamethod(LuaLocalPlayer, get_movement_speed), + luamethod(LuaLocalPlayer, get_movement), + + {0, 0} +}; diff --git a/src/script/lua_api/l_localplayer.h b/src/script/lua_api/l_localplayer.h new file mode 100644 index 000000000..e56ec808f --- /dev/null +++ b/src/script/lua_api/l_localplayer.h @@ -0,0 +1,85 @@ +/* +Minetest +Copyright (C) 2017 Dumbeldor, Vincent Glize <vincent.glize@live.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MINETEST_L_LOCALPLAYER_H +#define MINETEST_L_LOCALPLAYER_H + +#include "l_base.h" + +class LocalPlayer; + +class LuaLocalPlayer : public ModApiBase +{ +private: + static const char className[]; + static const luaL_Reg methods[]; + + // garbage collector + static int gc_object(lua_State *L); + + static int l_get_velocity(lua_State *L); + + static int l_get_hp(lua_State *L); + + static int l_get_name(lua_State *L); + + static int l_is_attached(lua_State *L); + static int l_is_touching_ground(lua_State *L); + static int l_is_in_liquid(lua_State *L); + static int l_is_in_liquid_stable(lua_State *L); + static int l_get_liquid_viscosity(lua_State *L); + static int l_is_climbing(lua_State *L); + static int l_swimming_vertical(lua_State *L); + + static int l_get_physics_override(lua_State *L); + + static int l_get_override_pos(lua_State *L); + + static int l_get_last_pos(lua_State *L); + static int l_get_last_velocity(lua_State *L); + static int l_get_last_look_vertical(lua_State *L); + static int l_get_last_look_horizontal(lua_State *L); + static int l_get_key_pressed(lua_State *L); + + static int l_get_breath(lua_State *L); + + static int l_get_pos(lua_State *L); + + static int l_get_movement_acceleration(lua_State *L); + + static int l_get_movement_speed(lua_State *L); + + static int l_get_movement(lua_State *L); + + LocalPlayer *m_localplayer; + +public: + LuaLocalPlayer(LocalPlayer *m); + ~LuaLocalPlayer() {} + + static void create(lua_State *L, LocalPlayer *m); + + static LuaLocalPlayer *checkobject(lua_State *L, int narg); + static LocalPlayer *getobject(LuaLocalPlayer *ref); + static LocalPlayer *getobject(lua_State *L, int narg); + + static void Register(lua_State *L); +}; + +#endif // MINETEST_L_LOCALPLAYER_H diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp index 4a2484613..dc8654960 100644 --- a/src/script/lua_api/l_mainmenu.cpp +++ b/src/script/lua_api/l_mainmenu.cpp @@ -32,14 +32,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "convert_json.h" #include "serverlist.h" #include "mapgen.h" -#include "sound.h" #include "settings.h" -#include "log.h" #include "EDriverTypes.h" #include <IFileArchive.h> #include <IFileSystem.h> + /******************************************************************************/ std::string ModApiMainMenu::getTextData(lua_State *L, std::string name) { @@ -299,7 +298,7 @@ int ModApiMainMenu::l_get_games(lua_State *L) int table2 = lua_gettop(L); int internal_index=1; for (std::set<std::string>::iterator iter = games[i].addon_mods_paths.begin(); - iter != games[i].addon_mods_paths.end(); iter++) { + iter != games[i].addon_mods_paths.end(); ++iter) { lua_pushnumber(L,internal_index); lua_pushstring(L,(*iter).c_str()); lua_settable(L, table2); @@ -577,6 +576,13 @@ int ModApiMainMenu::l_get_favorites(lua_State *L) lua_settable(L, top_lvl2); } + if (servers[i].isMember("ping")) { + float ping = servers[i]["ping"].asFloat(); + lua_pushstring(L, "ping"); + lua_pushnumber(L, ping); + lua_settable(L, top_lvl2); + } + lua_settable(L, top); index++; } @@ -956,33 +962,6 @@ int ModApiMainMenu::l_show_file_open_dialog(lua_State *L) } /******************************************************************************/ -int ModApiMainMenu::l_sound_play(lua_State *L) -{ - GUIEngine* engine = getGuiEngine(L); - - SimpleSoundSpec spec; - read_soundspec(L, 1, spec); - bool looped = lua_toboolean(L, 2); - - u32 handle = engine->playSound(spec, looped); - - lua_pushinteger(L, handle); - - return 1; -} - -/******************************************************************************/ -int ModApiMainMenu::l_sound_stop(lua_State *L) -{ - GUIEngine* engine = getGuiEngine(L); - - u32 handle = luaL_checkinteger(L, 1); - engine->stopSound(handle); - - return 1; -} - -/******************************************************************************/ int ModApiMainMenu::l_download_file(lua_State *L) { const char *url = luaL_checkstring(L, 1); @@ -1153,8 +1132,6 @@ void ModApiMainMenu::Initialize(lua_State *L, int top) API_FCT(download_file); API_FCT(get_modstore_details); API_FCT(get_modstore_list); - API_FCT(sound_play); - API_FCT(sound_stop); API_FCT(gettext); API_FCT(get_video_drivers); API_FCT(get_video_modes); @@ -1165,23 +1142,24 @@ void ModApiMainMenu::Initialize(lua_State *L, int top) } /******************************************************************************/ -void ModApiMainMenu::InitializeAsync(AsyncEngine& engine) +void ModApiMainMenu::InitializeAsync(lua_State *L, int top) { - ASYNC_API_FCT(get_worlds); - ASYNC_API_FCT(get_games); - ASYNC_API_FCT(get_favorites); - ASYNC_API_FCT(get_mapgen_names); - ASYNC_API_FCT(get_modpath); - ASYNC_API_FCT(get_gamepath); - ASYNC_API_FCT(get_texturepath); - ASYNC_API_FCT(get_texturepath_share); - ASYNC_API_FCT(create_dir); - ASYNC_API_FCT(delete_dir); - ASYNC_API_FCT(copy_dir); - //ASYNC_API_FCT(extract_zip); //TODO remove dependency to GuiEngine - ASYNC_API_FCT(download_file); - ASYNC_API_FCT(get_modstore_details); - ASYNC_API_FCT(get_modstore_list); - //ASYNC_API_FCT(gettext); (gettext lib isn't threadsafe) + API_FCT(get_worlds); + API_FCT(get_games); + API_FCT(get_favorites); + API_FCT(get_mapgen_names); + API_FCT(get_modpath); + API_FCT(get_gamepath); + API_FCT(get_texturepath); + API_FCT(get_texturepath_share); + API_FCT(create_dir); + API_FCT(delete_dir); + API_FCT(copy_dir); + //API_FCT(extract_zip); //TODO remove dependency to GuiEngine + API_FCT(download_file); + API_FCT(get_modstore_details); + API_FCT(get_modstore_list); + //API_FCT(gettext); (gettext lib isn't threadsafe) } + diff --git a/src/script/lua_api/l_mainmenu.h b/src/script/lua_api/l_mainmenu.h index ad5155ac6..d4946bab1 100644 --- a/src/script/lua_api/l_mainmenu.h +++ b/src/script/lua_api/l_mainmenu.h @@ -25,7 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc., class AsyncEngine; /** Implementation of lua api support for mainmenu */ -class ModApiMainMenu : public ModApiBase { +class ModApiMainMenu: public ModApiBase +{ private: /** @@ -79,10 +80,6 @@ private: static int l_delete_favorite(lua_State *L); - static int l_sound_play(lua_State *L); - - static int l_sound_stop(lua_State *L); - static int l_gettext(lua_State *L); //gui @@ -145,6 +142,7 @@ private: static int l_do_async_callback(lua_State *L); public: + /** * initialize this API module * @param L lua stack to initialize @@ -152,7 +150,7 @@ public: */ static void Initialize(lua_State *L, int top); - static void InitializeAsync(AsyncEngine& engine); + static void InitializeAsync(lua_State *L, int top); }; diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp index bc1c32f03..32eb7af84 100644 --- a/src/script/lua_api/l_mapgen.cpp +++ b/src/script/lua_api/l_mapgen.cpp @@ -325,14 +325,22 @@ void read_schematic_replacements(lua_State *L, int index, StringMap *replace_nam if (lua_istable(L, -1)) { // Old {{"x", "y"}, ...} format lua_rawgeti(L, -1, 1); + if (!lua_isstring(L, -1)) + throw LuaError("schematics: replace_from field is not a string"); replace_from = lua_tostring(L, -1); lua_pop(L, 1); lua_rawgeti(L, -1, 2); + if (!lua_isstring(L, -1)) + throw LuaError("schematics: replace_to field is not a string"); replace_to = lua_tostring(L, -1); lua_pop(L, 1); } else { // New {x = "y", ...} format + if (!lua_isstring(L, -2)) + throw LuaError("schematics: replace_from field is not a string"); replace_from = lua_tostring(L, -2); + if (!lua_isstring(L, -1)) + throw LuaError("schematics: replace_to field is not a string"); replace_to = lua_tostring(L, -1); } @@ -419,7 +427,7 @@ size_t get_biome_list(lua_State *L, int index, if (is_single) { Biome *biome = get_or_load_biome(L, index, biomemgr); if (!biome) { - errorstream << "get_biome_list: failed to get biome '" + infostream << "get_biome_list: failed to get biome '" << (lua_isstring(L, index) ? lua_tostring(L, index) : "") << "'." << std::endl; return 1; @@ -438,7 +446,7 @@ size_t get_biome_list(lua_State *L, int index, Biome *biome = get_or_load_biome(L, -1, biomemgr); if (!biome) { fail_count++; - errorstream << "get_biome_list: failed to get biome '" + infostream << "get_biome_list: failed to get biome '" << (lua_isstring(L, -1) ? lua_tostring(L, -1) : "") << "'" << std::endl; continue; @@ -927,7 +935,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L) //// Get biomes associated with this decoration (if any) lua_getfield(L, index, "biomes"); if (get_biome_list(L, -1, biomemgr, &deco->biomes)) - errorstream << "register_decoration: couldn't get all biomes " << std::endl; + infostream << "register_decoration: couldn't get all biomes " << std::endl; lua_pop(L, 1); //// Get node name(s) to 'spawn by' @@ -1092,7 +1100,7 @@ int ModApiMapgen::l_register_ore(lua_State *L) //// Get biomes associated with this decoration (if any) lua_getfield(L, index, "biomes"); if (get_biome_list(L, -1, bmgr, &ore->biomes)) - errorstream << "register_ore: couldn't get all biomes " << std::endl; + infostream << "register_ore: couldn't get all biomes " << std::endl; lua_pop(L, 1); //// Get noise parameters if needed @@ -1357,7 +1365,9 @@ int ModApiMapgen::l_place_schematic(lua_State *L) { MAP_LOCK_REQUIRED; - Map *map = &(getEnv(L)->getMap()); + GET_ENV_PTR; + + ServerMap *map = &(env->getServerMap()); SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr; //// Read position diff --git a/src/script/lua_api/l_mapgen.h b/src/script/lua_api/l_mapgen.h index bb94575c7..a26c8b950 100644 --- a/src/script/lua_api/l_mapgen.h +++ b/src/script/lua_api/l_mapgen.h @@ -22,7 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_base.h" -class ModApiMapgen : public ModApiBase { +class ModApiMapgen : public ModApiBase +{ private: // get_biome_id(biomename) // returns the biome id used in biomemap diff --git a/src/script/lua_api/l_metadata.cpp b/src/script/lua_api/l_metadata.cpp new file mode 100644 index 000000000..5f4e984cb --- /dev/null +++ b/src/script/lua_api/l_metadata.cpp @@ -0,0 +1,266 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "lua_api/l_metadata.h" +#include "lua_api/l_internal.h" +#include "common/c_content.h" +#include "serverenvironment.h" +#include "map.h" +#include "server.h" + +// LUALIB_API +void *luaL_checkudata_is_metadataref(lua_State *L, int ud) { + void *p = lua_touserdata(L, ud); + if (p != NULL && // value is a userdata? + lua_getmetatable(L, ud)) { // does it have a metatable? + lua_getfield(L, -1, "metadata_class"); + if (lua_type(L, -1) == LUA_TSTRING) { // does it have a metadata_class field? + return p; + } + } + luaL_typerror(L, ud, "MetaDataRef"); + return NULL; +} + +MetaDataRef* MetaDataRef::checkobject(lua_State *L, int narg) +{ + luaL_checktype(L, narg, LUA_TUSERDATA); + void *ud = luaL_checkudata_is_metadataref(L, narg); + if (!ud) + luaL_typerror(L, narg, "MetaDataRef"); + + return *(MetaDataRef**)ud; // unbox pointer +} + +// Exported functions + +// get_string(self, name) +int MetaDataRef::l_get_string(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = luaL_checkstring(L, 2); + + Metadata *meta = ref->getmeta(false); + if (meta == NULL) { + lua_pushlstring(L, "", 0); + return 1; + } + + const std::string &str = meta->getString(name); + lua_pushlstring(L, str.c_str(), str.size()); + return 1; +} + +// set_string(self, name, var) +int MetaDataRef::l_set_string(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = luaL_checkstring(L, 2); + size_t len = 0; + const char *s = lua_tolstring(L, 3, &len); + std::string str(s, len); + + Metadata *meta = ref->getmeta(!str.empty()); + if (meta == NULL || str == meta->getString(name)) + return 0; + + meta->setString(name, str); + ref->reportMetadataChange(); + return 0; +} + +// get_int(self, name) +int MetaDataRef::l_get_int(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = lua_tostring(L, 2); + + Metadata *meta = ref->getmeta(false); + if (meta == NULL) { + lua_pushnumber(L, 0); + return 1; + } + + const std::string &str = meta->getString(name); + lua_pushnumber(L, stoi(str)); + return 1; +} + +// set_int(self, name, var) +int MetaDataRef::l_set_int(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = lua_tostring(L, 2); + int a = lua_tointeger(L, 3); + std::string str = itos(a); + + Metadata *meta = ref->getmeta(true); + if (meta == NULL || str == meta->getString(name)) + return 0; + + meta->setString(name, str); + ref->reportMetadataChange(); + return 0; +} + +// get_float(self, name) +int MetaDataRef::l_get_float(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = lua_tostring(L, 2); + + Metadata *meta = ref->getmeta(false); + if (meta == NULL) { + lua_pushnumber(L, 0); + return 1; + } + + const std::string &str = meta->getString(name); + lua_pushnumber(L, stof(str)); + return 1; +} + +// set_float(self, name, var) +int MetaDataRef::l_set_float(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = lua_tostring(L, 2); + float a = lua_tonumber(L, 3); + std::string str = ftos(a); + + Metadata *meta = ref->getmeta(true); + if (meta == NULL || str == meta->getString(name)) + return 0; + + meta->setString(name, str); + ref->reportMetadataChange(); + return 0; +} + +// to_table(self) +int MetaDataRef::l_to_table(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + + Metadata *meta = ref->getmeta(true); + if (meta == NULL) { + lua_pushnil(L); + return 1; + } + lua_newtable(L); + + ref->handleToTable(L, meta); + + return 1; +} + +// from_table(self, table) +int MetaDataRef::l_from_table(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + int base = 2; + + ref->clearMeta(); + + if (!lua_istable(L, base)) { + // No metadata + lua_pushboolean(L, true); + return 1; + } + + // Create new metadata + Metadata *meta = ref->getmeta(true); + if (meta == NULL) { + lua_pushboolean(L, false); + return 1; + } + + bool was_successful = ref->handleFromTable(L, base, meta); + ref->reportMetadataChange(); + lua_pushboolean(L, was_successful); + return 1; +} + +void MetaDataRef::handleToTable(lua_State *L, Metadata *meta) +{ + lua_newtable(L); + { + const StringMap &fields = meta->getStrings(); + for (StringMap::const_iterator + it = fields.begin(); it != fields.end(); ++it) { + const std::string &name = it->first; + const std::string &value = it->second; + lua_pushlstring(L, name.c_str(), name.size()); + lua_pushlstring(L, value.c_str(), value.size()); + lua_settable(L, -3); + } + } + lua_setfield(L, -2, "fields"); +} + +bool MetaDataRef::handleFromTable(lua_State *L, int table, Metadata *meta) +{ + // Set fields + lua_getfield(L, table, "fields"); + if (lua_istable(L, -1)) { + int fieldstable = lua_gettop(L); + lua_pushnil(L); + while (lua_next(L, fieldstable) != 0) { + // key at index -2 and value at index -1 + std::string name = lua_tostring(L, -2); + size_t cl; + const char *cs = lua_tolstring(L, -1, &cl); + meta->setString(name, std::string(cs, cl)); + lua_pop(L, 1); // Remove value, keep key for next iteration + } + lua_pop(L, 1); + } + + return true; +} + +// equals(self, other) +int MetaDataRef::l_equals(lua_State *L) +{ + MetaDataRef *ref1 = checkobject(L, 1); + Metadata *data1 = ref1->getmeta(false); + MetaDataRef *ref2 = checkobject(L, 2); + Metadata *data2 = ref2->getmeta(false); + if (data1 == NULL || data2 == NULL) + lua_pushboolean(L, data1 == data2); + else + lua_pushboolean(L, *data1 == *data2); + return 1; +} diff --git a/src/script/lua_api/l_metadata.h b/src/script/lua_api/l_metadata.h new file mode 100644 index 000000000..a4d8214d3 --- /dev/null +++ b/src/script/lua_api/l_metadata.h @@ -0,0 +1,75 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ +#ifndef L_METADATA_H_ +#define L_METADATA_H_ + +#include "irrlichttypes_bloated.h" +#include "lua_api/l_base.h" + +class Metadata; + +/* + NodeMetaRef +*/ + +class MetaDataRef : public ModApiBase +{ +public: + virtual ~MetaDataRef() {} +protected: + static MetaDataRef *checkobject(lua_State *L, int narg); + + virtual void reportMetadataChange() {} + virtual Metadata *getmeta(bool auto_create) = 0; + virtual void clearMeta() = 0; + + virtual void handleToTable(lua_State *L, Metadata *meta); + virtual bool handleFromTable(lua_State *L, int table, Metadata *meta); + + // Exported functions + + // get_string(self, name) + static int l_get_string(lua_State *L); + + // set_string(self, name, var) + static int l_set_string(lua_State *L); + + // get_int(self, name) + static int l_get_int(lua_State *L); + + // set_int(self, name, var) + static int l_set_int(lua_State *L); + + // get_float(self, name) + static int l_get_float(lua_State *L); + + // set_float(self, name, var) + static int l_set_float(lua_State *L); + + // to_table(self) + static int l_to_table(lua_State *L); + + // from_table(self, table) + static int l_from_table(lua_State *L); + + // equals(self, other) + static int l_equals(lua_State *L); +}; + +#endif /* L_NODEMETA_H_ */ diff --git a/src/script/lua_api/l_minimap.cpp b/src/script/lua_api/l_minimap.cpp new file mode 100644 index 000000000..afb3766fb --- /dev/null +++ b/src/script/lua_api/l_minimap.cpp @@ -0,0 +1,227 @@ +/* +Minetest +Copyright (C) 2017 Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + + +#include "lua_api/l_minimap.h" +#include "lua_api/l_internal.h" +#include "common/c_converter.h" +#include "minimap.h" +#include "settings.h" + +LuaMinimap::LuaMinimap(Minimap *m) +{ + m_minimap = m; +} + +void LuaMinimap::create(lua_State *L, Minimap *m) +{ + LuaMinimap *o = new LuaMinimap(m); + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); + + // Keep minimap object stack id + int minimap_object = lua_gettop(L); + + lua_getglobal(L, "core"); + lua_getfield(L, -1, "ui"); + luaL_checktype(L, -1, LUA_TTABLE); + int uitable = lua_gettop(L); + + lua_pushvalue(L, minimap_object); // Copy object to top of stack + lua_setfield(L, uitable, "minimap"); +} + +int LuaMinimap::l_get_pos(lua_State *L) +{ + LuaMinimap *ref = checkobject(L, 1); + Minimap *m = getobject(ref); + + push_v3s16(L, m->getPos()); + return 1; +} + +int LuaMinimap::l_set_pos(lua_State *L) +{ + LuaMinimap *ref = checkobject(L, 1); + Minimap *m = getobject(ref); + + m->setPos(read_v3s16(L, 2)); + return 1; +} + +int LuaMinimap::l_get_angle(lua_State *L) +{ + LuaMinimap *ref = checkobject(L, 1); + Minimap *m = getobject(ref); + + lua_pushinteger(L, m->getAngle()); + return 1; +} + +int LuaMinimap::l_set_angle(lua_State *L) +{ + LuaMinimap *ref = checkobject(L, 1); + Minimap *m = getobject(ref); + + m->setAngle(lua_tointeger(L, 2)); + return 1; +} + +int LuaMinimap::l_get_mode(lua_State *L) +{ + LuaMinimap *ref = checkobject(L, 1); + Minimap *m = getobject(ref); + + lua_pushinteger(L, m->getMinimapMode()); + return 1; +} + +int LuaMinimap::l_set_mode(lua_State *L) +{ + LuaMinimap *ref = checkobject(L, 1); + Minimap *m = getobject(ref); + + s32 mode = lua_tointeger(L, 2); + if (mode < MINIMAP_MODE_OFF || + mode >= MINIMAP_MODE_COUNT) { + return 0; + } + + m->setMinimapMode((MinimapMode) mode); + return 1; +} + +int LuaMinimap::l_set_shape(lua_State *L) +{ + LuaMinimap *ref = checkobject(L, 1); + Minimap *m = getobject(ref); + if (!lua_isnumber(L, 2)) + return 0; + + m->setMinimapShape((MinimapShape)((int)lua_tonumber(L, 2))); + return 0; +} + +int LuaMinimap::l_get_shape(lua_State *L) +{ + LuaMinimap *ref = checkobject(L, 1); + Minimap *m = getobject(ref); + + lua_pushnumber(L, (int)m->getMinimapShape()); + return 1; +} + +int LuaMinimap::l_show(lua_State *L) +{ + // If minimap is disabled by config, don't show it. + if (!g_settings->getBool("enable_minimap")) + return 1; + + Client *client = getClient(L); + assert(client); + + LuaMinimap *ref = checkobject(L, 1); + Minimap *m = getobject(ref); + + if (m->getMinimapMode() == MINIMAP_MODE_OFF) + m->setMinimapMode(MINIMAP_MODE_SURFACEx1); + + client->showMinimap(true); + return 1; +} + +int LuaMinimap::l_hide(lua_State *L) +{ + Client *client = getClient(L); + assert(client); + + LuaMinimap *ref = checkobject(L, 1); + Minimap *m = getobject(ref); + + if (m->getMinimapMode() != MINIMAP_MODE_OFF) + m->setMinimapMode(MINIMAP_MODE_OFF); + + client->showMinimap(false); + return 1; +} + +LuaMinimap *LuaMinimap::checkobject(lua_State *L, int narg) +{ + NO_MAP_LOCK_REQUIRED; + + luaL_checktype(L, narg, LUA_TUSERDATA); + + void *ud = luaL_checkudata(L, narg, className); + if (!ud) + luaL_typerror(L, narg, className); + + return *(LuaMinimap **)ud; // unbox pointer +} + +Minimap* LuaMinimap::getobject(LuaMinimap *ref) +{ + return ref->m_minimap; +} + +int LuaMinimap::gc_object(lua_State *L) { + LuaMinimap *o = *(LuaMinimap **)(lua_touserdata(L, 1)); + delete o; + return 0; +} + +void LuaMinimap::Register(lua_State *L) +{ + lua_newtable(L); + int methodtable = lua_gettop(L); + luaL_newmetatable(L, className); + int metatable = lua_gettop(L); + + lua_pushliteral(L, "__metatable"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); // hide metatable from Lua getmetatable() + + lua_pushliteral(L, "__index"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); + + lua_pushliteral(L, "__gc"); + lua_pushcfunction(L, gc_object); + lua_settable(L, metatable); + + lua_pop(L, 1); // drop metatable + + luaL_openlib(L, 0, methods, 0); // fill methodtable + lua_pop(L, 1); // drop methodtable +} + +const char LuaMinimap::className[] = "Minimap"; +const luaL_Reg LuaMinimap::methods[] = { + luamethod(LuaMinimap, show), + luamethod(LuaMinimap, hide), + luamethod(LuaMinimap, get_pos), + luamethod(LuaMinimap, set_pos), + luamethod(LuaMinimap, get_angle), + luamethod(LuaMinimap, set_angle), + luamethod(LuaMinimap, get_mode), + luamethod(LuaMinimap, set_mode), + luamethod(LuaMinimap, set_shape), + luamethod(LuaMinimap, get_shape), + {0,0} +}; diff --git a/src/script/lua_api/l_minimap.h b/src/script/lua_api/l_minimap.h new file mode 100644 index 000000000..ba702b0b1 --- /dev/null +++ b/src/script/lua_api/l_minimap.h @@ -0,0 +1,65 @@ +/* +Minetest +Copyright (C) 2017 Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef L_MINIMAP_H_ +#define L_MINIMAP_H_ + +#include "l_base.h" + +class Minimap; + +class LuaMinimap : public ModApiBase +{ +private: + static const char className[]; + static const luaL_Reg methods[]; + + // garbage collector + static int gc_object(lua_State *L); + + static int l_get_pos(lua_State *L); + static int l_set_pos(lua_State *L); + + static int l_get_angle(lua_State *L); + static int l_set_angle(lua_State *L); + + static int l_get_mode(lua_State *L); + static int l_set_mode(lua_State *L); + + static int l_show(lua_State *L); + static int l_hide(lua_State *L); + + static int l_set_shape(lua_State *L); + static int l_get_shape(lua_State *L); + + Minimap *m_minimap; + +public: + LuaMinimap(Minimap *m); + ~LuaMinimap() {} + + static void create(lua_State *L, Minimap *object); + + static LuaMinimap *checkobject(lua_State *L, int narg); + static Minimap *getobject(LuaMinimap *ref); + + static void Register(lua_State *L); +}; + +#endif // L_MINIMAP_H_ diff --git a/src/script/lua_api/l_nodemeta.cpp b/src/script/lua_api/l_nodemeta.cpp index c8bc7d558..5dfa6d52e 100644 --- a/src/script/lua_api/l_nodemeta.cpp +++ b/src/script/lua_api/l_nodemeta.cpp @@ -20,14 +20,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_nodemeta.h" #include "lua_api/l_internal.h" #include "lua_api/l_inventory.h" -#include "common/c_converter.h" #include "common/c_content.h" -#include "environment.h" +#include "serverenvironment.h" #include "map.h" -#include "gamedef.h" -#include "nodemetadata.h" - - +#include "server.h" /* NodeMetaRef @@ -40,12 +36,15 @@ NodeMetaRef* NodeMetaRef::checkobject(lua_State *L, int narg) return *(NodeMetaRef**)ud; // unbox pointer } -NodeMetadata* NodeMetaRef::getmeta(NodeMetaRef *ref, bool auto_create) +Metadata* NodeMetaRef::getmeta(bool auto_create) { - NodeMetadata *meta = ref->m_env->getMap().getNodeMetadata(ref->m_p); - if(meta == NULL && auto_create) { - meta = new NodeMetadata(ref->m_env->getGameDef()->idef()); - if(!ref->m_env->getMap().setNodeMetadata(ref->m_p, meta)) { + if (m_is_local) + return m_meta; + + NodeMetadata *meta = m_env->getMap().getNodeMetadata(m_p); + if (meta == NULL && auto_create) { + meta = new NodeMetadata(m_env->getGameDef()->idef()); + if (!m_env->getMap().setNodeMetadata(m_p, meta)) { delete meta; return NULL; } @@ -53,17 +52,22 @@ NodeMetadata* NodeMetaRef::getmeta(NodeMetaRef *ref, bool auto_create) return meta; } -void NodeMetaRef::reportMetadataChange(NodeMetaRef *ref) +void NodeMetaRef::clearMeta() +{ + m_env->getMap().removeNodeMetadata(m_p); +} + +void NodeMetaRef::reportMetadataChange() { // NOTE: This same code is in rollback_interface.cpp // Inform other things that the metadata has changed - v3s16 blockpos = getNodeBlockPos(ref->m_p); + v3s16 blockpos = getNodeBlockPos(m_p); MapEditEvent event; event.type = MEET_BLOCK_NODE_METADATA_CHANGED; event.p = blockpos; - ref->m_env->getMap().dispatchEvent(&event); + m_env->getMap().dispatchEvent(&event); // Set the block to be saved - MapBlock *block = ref->m_env->getMap().getBlockNoCreateNoEx(blockpos); + MapBlock *block = m_env->getMap().getBlockNoCreateNoEx(blockpos); if (block) { block->raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_REPORT_META_CHANGE); @@ -79,154 +83,49 @@ int NodeMetaRef::gc_object(lua_State *L) { return 0; } -// get_string(self, name) -int NodeMetaRef::l_get_string(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = luaL_checkstring(L, 2); - - NodeMetadata *meta = getmeta(ref, false); - if(meta == NULL){ - lua_pushlstring(L, "", 0); - return 1; - } - std::string str = meta->getString(name); - lua_pushlstring(L, str.c_str(), str.size()); - return 1; -} - -// set_string(self, name, var) -int NodeMetaRef::l_set_string(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = luaL_checkstring(L, 2); - size_t len = 0; - const char *s = lua_tolstring(L, 3, &len); - std::string str(s, len); - - NodeMetadata *meta = getmeta(ref, !str.empty()); - if(meta == NULL || str == meta->getString(name)) - return 0; - meta->setString(name, str); - reportMetadataChange(ref); - return 0; -} - -// get_int(self, name) -int NodeMetaRef::l_get_int(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = lua_tostring(L, 2); - - NodeMetadata *meta = getmeta(ref, false); - if(meta == NULL){ - lua_pushnumber(L, 0); - return 1; - } - std::string str = meta->getString(name); - lua_pushnumber(L, stoi(str)); - return 1; -} - -// set_int(self, name, var) -int NodeMetaRef::l_set_int(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = lua_tostring(L, 2); - int a = lua_tointeger(L, 3); - std::string str = itos(a); - - NodeMetadata *meta = getmeta(ref, true); - if(meta == NULL || str == meta->getString(name)) - return 0; - meta->setString(name, str); - reportMetadataChange(ref); - return 0; -} - -// get_float(self, name) -int NodeMetaRef::l_get_float(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = lua_tostring(L, 2); - - NodeMetadata *meta = getmeta(ref, false); - if(meta == NULL){ - lua_pushnumber(L, 0); - return 1; - } - std::string str = meta->getString(name); - lua_pushnumber(L, stof(str)); - return 1; -} - -// set_float(self, name, var) -int NodeMetaRef::l_set_float(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = lua_tostring(L, 2); - float a = lua_tonumber(L, 3); - std::string str = ftos(a); - - NodeMetadata *meta = getmeta(ref, true); - if(meta == NULL || str == meta->getString(name)) - return 0; - meta->setString(name, str); - reportMetadataChange(ref); - return 0; -} - // get_inventory(self) int NodeMetaRef::l_get_inventory(lua_State *L) { MAP_LOCK_REQUIRED; NodeMetaRef *ref = checkobject(L, 1); - getmeta(ref, true); // try to ensure the metadata exists + ref->getmeta(true); // try to ensure the metadata exists InvRef::createNodeMeta(L, ref->m_p); return 1; } -// to_table(self) -int NodeMetaRef::l_to_table(lua_State *L) +// mark_as_private(self, <string> or {<string>, <string>, ...}) +int NodeMetaRef::l_mark_as_private(lua_State *L) { MAP_LOCK_REQUIRED; NodeMetaRef *ref = checkobject(L, 1); + NodeMetadata *meta = dynamic_cast<NodeMetadata*>(ref->getmeta(true)); + assert(meta); - NodeMetadata *meta = getmeta(ref, true); - if (meta == NULL) { + if (lua_istable(L, 2)) { lua_pushnil(L); - return 1; + while (lua_next(L, 2) != 0) { + // key at index -2 and value at index -1 + luaL_checktype(L, -1, LUA_TSTRING); + meta->markPrivate(lua_tostring(L, -1), true); + // removes value, keeps key for next iteration + lua_pop(L, 1); + } + } else if (lua_isstring(L, 2)) { + meta->markPrivate(lua_tostring(L, 2), true); } - lua_newtable(L); + ref->reportMetadataChange(); + return 0; +} + +void NodeMetaRef::handleToTable(lua_State *L, Metadata *_meta) +{ // fields - lua_newtable(L); - { - StringMap fields = meta->getStrings(); - for (StringMap::const_iterator - it = fields.begin(); it != fields.end(); ++it) { - const std::string &name = it->first; - const std::string &value = it->second; - lua_pushlstring(L, name.c_str(), name.size()); - lua_pushlstring(L, value.c_str(), value.size()); - lua_settable(L, -3); - } - } - lua_setfield(L, -2, "fields"); + MetaDataRef::handleToTable(L, _meta); + + NodeMetadata *meta = (NodeMetadata*) _meta; // inventory lua_newtable(L); @@ -234,71 +133,52 @@ int NodeMetaRef::l_to_table(lua_State *L) if (inv) { std::vector<const InventoryList *> lists = inv->getLists(); for(std::vector<const InventoryList *>::const_iterator - i = lists.begin(); i != lists.end(); i++) { + i = lists.begin(); i != lists.end(); ++i) { push_inventory_list(L, inv, (*i)->getName().c_str()); lua_setfield(L, -2, (*i)->getName().c_str()); } } lua_setfield(L, -2, "inventory"); - return 1; } // from_table(self, table) -int NodeMetaRef::l_from_table(lua_State *L) +bool NodeMetaRef::handleFromTable(lua_State *L, int table, Metadata *_meta) { - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - int base = 2; - - // clear old metadata first - ref->m_env->getMap().removeNodeMetadata(ref->m_p); + // fields + if (!MetaDataRef::handleFromTable(L, table, _meta)) + return false; - if(lua_isnil(L, base)){ - // No metadata - lua_pushboolean(L, true); - return 1; - } + NodeMetadata *meta = (NodeMetadata*) _meta; - // Create new metadata - NodeMetadata *meta = getmeta(ref, true); - if(meta == NULL){ - lua_pushboolean(L, false); - return 1; - } - // Set fields - lua_getfield(L, base, "fields"); - int fieldstable = lua_gettop(L); - lua_pushnil(L); - while(lua_next(L, fieldstable) != 0){ - // key at index -2 and value at index -1 - std::string name = lua_tostring(L, -2); - size_t cl; - const char *cs = lua_tolstring(L, -1, &cl); - std::string value(cs, cl); - meta->setString(name, value); - lua_pop(L, 1); // removes value, keeps key for next iteration - } - // Set inventory + // inventory Inventory *inv = meta->getInventory(); - lua_getfield(L, base, "inventory"); - int inventorytable = lua_gettop(L); - lua_pushnil(L); - while(lua_next(L, inventorytable) != 0){ - // key at index -2 and value at index -1 - std::string name = lua_tostring(L, -2); - read_inventory_list(L, -1, inv, name.c_str(), getServer(L)); - lua_pop(L, 1); // removes value, keeps key for next iteration + lua_getfield(L, table, "inventory"); + if (lua_istable(L, -1)) { + int inventorytable = lua_gettop(L); + lua_pushnil(L); + while (lua_next(L, inventorytable) != 0) { + // key at index -2 and value at index -1 + std::string name = lua_tostring(L, -2); + read_inventory_list(L, -1, inv, name.c_str(), getServer(L)); + lua_pop(L, 1); // Remove value, keep key for next iteration + } + lua_pop(L, 1); } - reportMetadataChange(ref); - lua_pushboolean(L, true); - return 1; + + return true; } NodeMetaRef::NodeMetaRef(v3s16 p, ServerEnvironment *env): m_p(p), - m_env(env) + m_env(env), + m_is_local(false) +{ +} + +NodeMetaRef::NodeMetaRef(Metadata *meta): + m_meta(meta), + m_is_local(true) { } @@ -317,7 +197,17 @@ void NodeMetaRef::create(lua_State *L, v3s16 p, ServerEnvironment *env) lua_setmetatable(L, -2); } -void NodeMetaRef::Register(lua_State *L) +// Client-sided version of the above +void NodeMetaRef::createClient(lua_State *L, Metadata *meta) +{ + NodeMetaRef *o = new NodeMetaRef(meta); + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); +} + +const char NodeMetaRef::className[] = "NodeMetaRef"; +void NodeMetaRef::RegisterCommon(lua_State *L) { lua_newtable(L); int methodtable = lua_gettop(L); @@ -328,6 +218,10 @@ void NodeMetaRef::Register(lua_State *L) lua_pushvalue(L, methodtable); lua_settable(L, metatable); // hide metatable from Lua getmetatable() + lua_pushliteral(L, "metadata_class"); + lua_pushlstring(L, className, strlen(className)); + lua_settable(L, metatable); + lua_pushliteral(L, "__index"); lua_pushvalue(L, methodtable); lua_settable(L, metatable); @@ -336,25 +230,49 @@ void NodeMetaRef::Register(lua_State *L) lua_pushcfunction(L, gc_object); lua_settable(L, metatable); + lua_pushliteral(L, "__eq"); + lua_pushcfunction(L, l_equals); + lua_settable(L, metatable); + lua_pop(L, 1); // drop metatable +} - luaL_openlib(L, 0, methods, 0); // fill methodtable +void NodeMetaRef::Register(lua_State *L) +{ + RegisterCommon(L); + luaL_openlib(L, 0, methodsServer, 0); // fill methodtable lua_pop(L, 1); // drop methodtable - - // Cannot be created from Lua - //lua_register(L, className, create_object); } -const char NodeMetaRef::className[] = "NodeMetaRef"; -const luaL_reg NodeMetaRef::methods[] = { - luamethod(NodeMetaRef, get_string), - luamethod(NodeMetaRef, set_string), - luamethod(NodeMetaRef, get_int), - luamethod(NodeMetaRef, set_int), - luamethod(NodeMetaRef, get_float), - luamethod(NodeMetaRef, set_float), + +const luaL_Reg NodeMetaRef::methodsServer[] = { + luamethod(MetaDataRef, get_string), + luamethod(MetaDataRef, set_string), + luamethod(MetaDataRef, get_int), + luamethod(MetaDataRef, set_int), + luamethod(MetaDataRef, get_float), + luamethod(MetaDataRef, set_float), + luamethod(MetaDataRef, to_table), + luamethod(MetaDataRef, from_table), luamethod(NodeMetaRef, get_inventory), - luamethod(NodeMetaRef, to_table), - luamethod(NodeMetaRef, from_table), + luamethod(NodeMetaRef, mark_as_private), + luamethod(MetaDataRef, equals), + {0,0} +}; + + +void NodeMetaRef::RegisterClient(lua_State *L) +{ + RegisterCommon(L); + luaL_openlib(L, 0, methodsClient, 0); // fill methodtable + lua_pop(L, 1); // drop methodtable +} + + +const luaL_Reg NodeMetaRef::methodsClient[] = { + luamethod(MetaDataRef, get_string), + luamethod(MetaDataRef, get_int), + luamethod(MetaDataRef, get_float), + luamethod(MetaDataRef, to_table), {0,0} }; diff --git a/src/script/lua_api/l_nodemeta.h b/src/script/lua_api/l_nodemeta.h index e39ac3931..dd4260ff9 100644 --- a/src/script/lua_api/l_nodemeta.h +++ b/src/script/lua_api/l_nodemeta.h @@ -20,7 +20,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #define L_NODEMETA_H_ #include "lua_api/l_base.h" +#include "lua_api/l_metadata.h" #include "irrlichttypes_bloated.h" +#include "nodemetadata.h" class ServerEnvironment; class NodeMetadata; @@ -29,13 +31,16 @@ class NodeMetadata; NodeMetaRef */ -class NodeMetaRef : public ModApiBase { +class NodeMetaRef : public MetaDataRef { private: v3s16 m_p; ServerEnvironment *m_env; + Metadata *m_meta; + bool m_is_local; static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methodsServer[]; + static const luaL_Reg methodsClient[]; static NodeMetaRef *checkobject(lua_State *L, int narg); @@ -52,44 +57,28 @@ private: * @param auto_create when true, try to create metadata information for the node if it has none. * @return pointer to a @c NodeMetadata object or @c NULL in case of error. */ - static NodeMetadata* getmeta(NodeMetaRef *ref, bool auto_create); + virtual Metadata* getmeta(bool auto_create); + virtual void clearMeta(); - static void reportMetadataChange(NodeMetaRef *ref); + virtual void reportMetadataChange(); + + virtual void handleToTable(lua_State *L, Metadata *_meta); + virtual bool handleFromTable(lua_State *L, int table, Metadata *_meta); // Exported functions // garbage collector static int gc_object(lua_State *L); - // get_string(self, name) - static int l_get_string(lua_State *L); - - // set_string(self, name, var) - static int l_set_string(lua_State *L); - - // get_int(self, name) - static int l_get_int(lua_State *L); - - // set_int(self, name, var) - static int l_set_int(lua_State *L); - - // get_float(self, name) - static int l_get_float(lua_State *L); - - // set_float(self, name, var) - static int l_set_float(lua_State *L); - // get_inventory(self) static int l_get_inventory(lua_State *L); - // to_table(self) - static int l_to_table(lua_State *L); - - // from_table(self, table) - static int l_from_table(lua_State *L); + // mark_as_private(self, <string> or {<string>, <string>, ...}) + static int l_mark_as_private(lua_State *L); public: NodeMetaRef(v3s16 p, ServerEnvironment *env); + NodeMetaRef(Metadata *meta); ~NodeMetaRef(); @@ -97,7 +86,12 @@ public: // Not callable from Lua; all references are created on the C side. static void create(lua_State *L, v3s16 p, ServerEnvironment *env); + // Client-sided version of the above + static void createClient(lua_State *L, Metadata *meta); + + static void RegisterCommon(lua_State *L); static void Register(lua_State *L); + static void RegisterClient(lua_State *L); }; #endif /* L_NODEMETA_H_ */ diff --git a/src/script/lua_api/l_nodetimer.cpp b/src/script/lua_api/l_nodetimer.cpp index 3242d6ea5..17b275c46 100644 --- a/src/script/lua_api/l_nodetimer.cpp +++ b/src/script/lua_api/l_nodetimer.cpp @@ -19,7 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_nodetimer.h" #include "lua_api/l_internal.h" -#include "environment.h" +#include "serverenvironment.h" #include "map.h" @@ -162,7 +162,7 @@ void NodeTimerRef::Register(lua_State *L) } const char NodeTimerRef::className[] = "NodeTimerRef"; -const luaL_reg NodeTimerRef::methods[] = { +const luaL_Reg NodeTimerRef::methods[] = { luamethod(NodeTimerRef, start), luamethod(NodeTimerRef, set), luamethod(NodeTimerRef, stop), diff --git a/src/script/lua_api/l_nodetimer.h b/src/script/lua_api/l_nodetimer.h index 9f8dd21c8..ae362d8b3 100644 --- a/src/script/lua_api/l_nodetimer.h +++ b/src/script/lua_api/l_nodetimer.h @@ -20,18 +20,19 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef L_NODETIMER_H_ #define L_NODETIMER_H_ -#include "lua_api/l_base.h" #include "irr_v3d.h" +#include "lua_api/l_base.h" class ServerEnvironment; -class NodeTimerRef : public ModApiBase { +class NodeTimerRef : public ModApiBase +{ private: v3s16 m_p; ServerEnvironment *m_env; static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; static int gc_object(lua_State *L); @@ -62,6 +63,4 @@ public: static void Register(lua_State *L); }; - - #endif /* L_NODETIMER_H_ */ diff --git a/src/script/lua_api/l_noise.cpp b/src/script/lua_api/l_noise.cpp index e0039371f..e3e76191f 100644 --- a/src/script/lua_api/l_noise.cpp +++ b/src/script/lua_api/l_noise.cpp @@ -135,7 +135,7 @@ void LuaPerlinNoise::Register(lua_State *L) const char LuaPerlinNoise::className[] = "PerlinNoise"; -const luaL_reg LuaPerlinNoise::methods[] = { +const luaL_Reg LuaPerlinNoise::methods[] = { luamethod(LuaPerlinNoise, get2d), luamethod(LuaPerlinNoise, get3d), {0,0} @@ -393,7 +393,7 @@ void LuaPerlinNoiseMap::Register(lua_State *L) const char LuaPerlinNoiseMap::className[] = "PerlinNoiseMap"; -const luaL_reg LuaPerlinNoiseMap::methods[] = { +const luaL_Reg LuaPerlinNoiseMap::methods[] = { luamethod(LuaPerlinNoiseMap, get2dMap), luamethod(LuaPerlinNoiseMap, get2dMap_flat), luamethod(LuaPerlinNoiseMap, calc2dMap), @@ -498,7 +498,7 @@ void LuaPseudoRandom::Register(lua_State *L) const char LuaPseudoRandom::className[] = "PseudoRandom"; -const luaL_reg LuaPseudoRandom::methods[] = { +const luaL_Reg LuaPseudoRandom::methods[] = { luamethod(LuaPseudoRandom, next), {0,0} }; @@ -597,7 +597,7 @@ void LuaPcgRandom::Register(lua_State *L) const char LuaPcgRandom::className[] = "PcgRandom"; -const luaL_reg LuaPcgRandom::methods[] = { +const luaL_Reg LuaPcgRandom::methods[] = { luamethod(LuaPcgRandom, next), luamethod(LuaPcgRandom, rand_normal_dist), {0,0} @@ -711,7 +711,7 @@ void LuaSecureRandom::Register(lua_State *L) } const char LuaSecureRandom::className[] = "SecureRandom"; -const luaL_reg LuaSecureRandom::methods[] = { +const luaL_Reg LuaSecureRandom::methods[] = { luamethod(LuaSecureRandom, next_bytes), {0,0} }; diff --git a/src/script/lua_api/l_noise.h b/src/script/lua_api/l_noise.h index 40bfd1315..f252b5ba2 100644 --- a/src/script/lua_api/l_noise.h +++ b/src/script/lua_api/l_noise.h @@ -20,18 +20,19 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef L_NOISE_H_ #define L_NOISE_H_ -#include "lua_api/l_base.h" #include "irr_v3d.h" +#include "lua_api/l_base.h" #include "noise.h" /* LuaPerlinNoise */ -class LuaPerlinNoise : public ModApiBase { +class LuaPerlinNoise : public ModApiBase +{ private: NoiseParams np; static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; // Exported functions @@ -57,12 +58,13 @@ public: /* LuaPerlinNoiseMap */ -class LuaPerlinNoiseMap : public ModApiBase { +class LuaPerlinNoiseMap : public ModApiBase +{ NoiseParams np; Noise *noise; bool m_is3d; static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; // Exported functions @@ -95,12 +97,13 @@ public: /* LuaPseudoRandom */ -class LuaPseudoRandom : public ModApiBase { +class LuaPseudoRandom : public ModApiBase +{ private: PseudoRandom m_pseudo; static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; // Exported functions @@ -111,8 +114,7 @@ private: static int l_next(lua_State *L); public: - LuaPseudoRandom(s32 seed) : - m_pseudo(seed) {} + LuaPseudoRandom(s32 seed) : m_pseudo(seed) {} // LuaPseudoRandom(seed) // Creates an LuaPseudoRandom and leaves it on top of stack @@ -126,12 +128,13 @@ public: /* LuaPcgRandom */ -class LuaPcgRandom : public ModApiBase { +class LuaPcgRandom : public ModApiBase +{ private: PcgRandom m_rnd; static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; // Exported functions @@ -146,10 +149,8 @@ private: static int l_rand_normal_dist(lua_State *L); public: - LuaPcgRandom(u64 seed) : - m_rnd(seed) {} - LuaPcgRandom(u64 seed, u64 seq) : - m_rnd(seed, seq) {} + LuaPcgRandom(u64 seed) : m_rnd(seed) {} + LuaPcgRandom(u64 seed, u64 seq) : m_rnd(seed, seq) {} // LuaPcgRandom(seed) // Creates an LuaPcgRandom and leaves it on top of stack @@ -160,15 +161,15 @@ public: static void Register(lua_State *L); }; - /* LuaSecureRandom */ -class LuaSecureRandom : public ModApiBase { +class LuaSecureRandom : public ModApiBase +{ private: static const size_t RAND_BUF_SIZE = 2048; static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; u32 m_rand_idx; char m_rand_buf[RAND_BUF_SIZE]; diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 2a8b8a64e..aaab0d98e 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -29,7 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_sao.h" #include "server.h" #include "hud.h" -#include "scripting_game.h" +#include "scripting_server.h" struct EnumString es_HudElementType[] = { @@ -137,8 +137,8 @@ int ObjectRef::l_remove(lua_State *L) if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) return 0; - UNORDERED_SET<int> child_ids = co->getAttachmentChildIds(); - UNORDERED_SET<int>::iterator it; + const UNORDERED_SET<int> &child_ids = co->getAttachmentChildIds(); + UNORDERED_SET<int>::const_iterator it; for (it = child_ids.begin(); it != child_ids.end(); ++it) { // Child can be NULL if it was deleted earlier if (ServerActiveObject *child = env->getActiveObject(*it)) @@ -150,9 +150,9 @@ int ObjectRef::l_remove(lua_State *L) return 0; } -// getpos(self) +// get_pos(self) // returns: {x=num, y=num, z=num} -int ObjectRef::l_getpos(lua_State *L) +int ObjectRef::l_get_pos(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -169,8 +169,8 @@ int ObjectRef::l_getpos(lua_State *L) return 1; } -// setpos(self, pos) -int ObjectRef::l_setpos(lua_State *L) +// set_pos(self, pos) +int ObjectRef::l_set_pos(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -184,8 +184,8 @@ int ObjectRef::l_setpos(lua_State *L) return 0; } -// moveto(self, pos, continuous=false) -int ObjectRef::l_moveto(lua_State *L) +// move_to(self, pos, continuous=false) +int ObjectRef::l_move_to(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -364,7 +364,7 @@ int ObjectRef::l_set_wielded_item(lua_State *L) ServerActiveObject *co = getobject(ref); if (co == NULL) return 0; // Do it - ItemStack item = read_item(L, 2, getServer(L)); + ItemStack item = read_item(L, 2, getServer(L)->idef()); bool success = co->setWieldedItem(item); if (success && co->getType() == ACTIVEOBJECT_TYPE_PLAYER) { getServer(L)->SendInventory(((PlayerSAO*)co)); @@ -396,13 +396,12 @@ int ObjectRef::l_get_armor_groups(lua_State *L) if (co == NULL) return 0; // Do it - ItemGroupList groups = co->getArmorGroups(); - push_groups(L, groups); + push_groups(L, co->getArmorGroups()); return 1; } // set_physics_override(self, physics_override_speed, physics_override_jump, -// physics_override_gravity, sneak, sneak_glitch) +// physics_override_gravity, sneak, sneak_glitch, new_move) int ObjectRef::l_set_physics_override(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -411,11 +410,18 @@ int ObjectRef::l_set_physics_override(lua_State *L) if (co == NULL) return 0; // Do it if (lua_istable(L, 2)) { - co->m_physics_override_speed = getfloatfield_default(L, 2, "speed", co->m_physics_override_speed); - co->m_physics_override_jump = getfloatfield_default(L, 2, "jump", co->m_physics_override_jump); - co->m_physics_override_gravity = getfloatfield_default(L, 2, "gravity", co->m_physics_override_gravity); - co->m_physics_override_sneak = getboolfield_default(L, 2, "sneak", co->m_physics_override_sneak); - co->m_physics_override_sneak_glitch = getboolfield_default(L, 2, "sneak_glitch", co->m_physics_override_sneak_glitch); + co->m_physics_override_speed = getfloatfield_default( + L, 2, "speed", co->m_physics_override_speed); + co->m_physics_override_jump = getfloatfield_default( + L, 2, "jump", co->m_physics_override_jump); + co->m_physics_override_gravity = getfloatfield_default( + L, 2, "gravity", co->m_physics_override_gravity); + co->m_physics_override_sneak = getboolfield_default( + L, 2, "sneak", co->m_physics_override_sneak); + co->m_physics_override_sneak_glitch = getboolfield_default( + L, 2, "sneak_glitch", co->m_physics_override_sneak_glitch); + co->m_physics_override_new_move = getboolfield_default( + L, 2, "new_move", co->m_physics_override_new_move); co->m_physics_override_sent = false; } else { // old, non-table format @@ -455,6 +461,8 @@ int ObjectRef::l_get_physics_override(lua_State *L) lua_setfield(L, -2, "sneak"); lua_pushboolean(L, co->m_physics_override_sneak_glitch); lua_setfield(L, -2, "sneak_glitch"); + lua_pushboolean(L, co->m_physics_override_new_move); + lua_setfield(L, -2, "new_move"); return 1; } @@ -718,11 +726,13 @@ int ObjectRef::l_set_detach(lua_State *L) v3f rotation; co->getAttachment(&parent_id, &bone, &position, &rotation); ServerActiveObject *parent = NULL; - if (parent_id) + if (parent_id) { parent = env->getActiveObject(parent_id); - + co->setAttachment(0, "", position, rotation); + } else { + co->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0)); + } // Do it - co->setAttachment(0, "", v3f(0,0,0), v3f(0,0,0)); if (parent != NULL) parent->removeAttachmentChild(co->getId()); return 0; @@ -738,7 +748,7 @@ int ObjectRef::l_set_properties(lua_State *L) ObjectProperties *prop = co->accessObjectProperties(); if (!prop) return 0; - read_object_properties(L, 2, prop); + read_object_properties(L, 2, prop, getServer(L)->idef()); co->notifyObjectPropertiesModified(); return 0; } @@ -790,8 +800,7 @@ int ObjectRef::l_set_nametag_attributes(lua_State *L) lua_pop(L, 1); std::string nametag = getstringfield_default(L, 2, "text", ""); - if (nametag != "") - prop->nametag = nametag; + prop->nametag = nametag; co->notifyObjectPropertiesModified(); lua_pushboolean(L, true); @@ -823,8 +832,8 @@ int ObjectRef::l_get_nametag_attributes(lua_State *L) /* LuaEntitySAO-only */ -// setvelocity(self, {x=num, y=num, z=num}) -int ObjectRef::l_setvelocity(lua_State *L) +// set_velocity(self, {x=num, y=num, z=num}) +int ObjectRef::l_set_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -836,8 +845,8 @@ int ObjectRef::l_setvelocity(lua_State *L) return 0; } -// getvelocity(self) -int ObjectRef::l_getvelocity(lua_State *L) +// get_velocity(self) +int ObjectRef::l_get_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -849,8 +858,8 @@ int ObjectRef::l_getvelocity(lua_State *L) return 1; } -// setacceleration(self, {x=num, y=num, z=num}) -int ObjectRef::l_setacceleration(lua_State *L) +// set_acceleration(self, {x=num, y=num, z=num}) +int ObjectRef::l_set_acceleration(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -863,8 +872,8 @@ int ObjectRef::l_setacceleration(lua_State *L) return 0; } -// getacceleration(self) -int ObjectRef::l_getacceleration(lua_State *L) +// get_acceleration(self) +int ObjectRef::l_get_acceleration(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -876,8 +885,8 @@ int ObjectRef::l_getacceleration(lua_State *L) return 1; } -// setyaw(self, radians) -int ObjectRef::l_setyaw(lua_State *L) +// set_yaw(self, radians) +int ObjectRef::l_set_yaw(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -889,8 +898,8 @@ int ObjectRef::l_setyaw(lua_State *L) return 0; } -// getyaw(self) -int ObjectRef::l_getyaw(lua_State *L) +// get_yaw(self) +int ObjectRef::l_get_yaw(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -902,8 +911,8 @@ int ObjectRef::l_getyaw(lua_State *L) return 1; } -// settexturemod(self, mod) -int ObjectRef::l_settexturemod(lua_State *L) +// set_texture_mod(self, mod) +int ObjectRef::l_set_texture_mod(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -915,9 +924,22 @@ int ObjectRef::l_settexturemod(lua_State *L) return 0; } -// setsprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, +// get_texture_mod(self) +int ObjectRef::l_get_texture_mod(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + LuaEntitySAO *co = getluaobject(ref); + if (co == NULL) return 0; + // Do it + std::string mod = co->getTextureMod(); + lua_pushstring(L, mod.c_str()); + return 1; +} + +// set_sprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, // select_horiz_by_yawpitch=false) -int ObjectRef::l_setsprite(lua_State *L) +int ObjectRef::l_set_sprite(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -1152,13 +1174,8 @@ int ObjectRef::l_set_breath(lua_State *L) PlayerSAO* co = getplayersao(ref); if (co == NULL) return 0; u16 breath = luaL_checknumber(L, 2); - // Do it co->setBreath(breath); - // If the object is a player sent the breath to client - if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) - getServer(L)->SendPlayerBreath(((PlayerSAO*)co)->getPeerID()); - return 0; } @@ -1175,6 +1192,46 @@ int ObjectRef::l_get_breath(lua_State *L) return 1; } +// set_attribute(self, attribute, value) +int ObjectRef::l_set_attribute(lua_State *L) +{ + ObjectRef *ref = checkobject(L, 1); + PlayerSAO* co = getplayersao(ref); + if (co == NULL) { + return 0; + } + + std::string attr = luaL_checkstring(L, 2); + if (lua_isnil(L, 3)) { + co->removeExtendedAttribute(attr); + } else { + std::string value = luaL_checkstring(L, 3); + co->setExtendedAttribute(attr, value); + } + return 1; +} + +// get_attribute(self, attribute) +int ObjectRef::l_get_attribute(lua_State *L) +{ + ObjectRef *ref = checkobject(L, 1); + PlayerSAO* co = getplayersao(ref); + if (co == NULL) { + return 0; + } + + std::string attr = luaL_checkstring(L, 2); + + std::string value = ""; + if (co->getExtendedAttribute(attr, &value)) { + lua_pushstring(L, value.c_str()); + return 1; + } + + return 0; +} + + // set_inventory_formspec(self, formspec) int ObjectRef::l_set_inventory_formspec(lua_State *L) { @@ -1606,7 +1663,7 @@ int ObjectRef::l_hud_get_hotbar_selected_image(lua_State *L) return 1; } -// set_sky(self, bgcolor, type, list) +// set_sky(self, bgcolor, type, list, clouds = true) int ObjectRef::l_set_sky(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -1622,9 +1679,8 @@ int ObjectRef::l_set_sky(lua_State *L) std::vector<std::string> params; if (lua_istable(L, 4)) { - int table = lua_gettop(L); lua_pushnil(L); - while (lua_next(L, table) != 0) { + while (lua_next(L, 4) != 0) { // key at index -2 and value at index -1 if (lua_isstring(L, -1)) params.push_back(lua_tostring(L, -1)); @@ -1638,7 +1694,11 @@ int ObjectRef::l_set_sky(lua_State *L) if (type == "skybox" && params.size() != 6) throw LuaError("skybox expects 6 textures"); - if (!getServer(L)->setSky(player, bgcolor, type, params)) + bool clouds = true; + if (lua_isboolean(L, 5)) + clouds = lua_toboolean(L, 5); + + if (!getServer(L)->setSky(player, bgcolor, type, params, clouds)) return 0; lua_pushboolean(L, true); @@ -1656,8 +1716,9 @@ int ObjectRef::l_get_sky(lua_State *L) video::SColor bgcolor(255, 255, 255, 255); std::string type; std::vector<std::string> params; + bool clouds; - player->getSky(&bgcolor, &type, ¶ms); + player->getSky(&bgcolor, &type, ¶ms, &clouds); type = type == "" ? "regular" : type; push_ARGB8(L, bgcolor); @@ -1670,9 +1731,89 @@ int ObjectRef::l_get_sky(lua_State *L) lua_rawseti(L, -2, i); i++; } - return 3; + lua_pushboolean(L, clouds); + return 4; } +// set_clouds(self, {density=, color=, ambient=, height=, thickness=, speed=}) +int ObjectRef::l_set_clouds(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + RemotePlayer *player = getplayer(ref); + if (!player) + return 0; + if (!lua_istable(L, 2)) + return 0; + + CloudParams cloud_params = player->getCloudParams(); + + cloud_params.density = getfloatfield_default(L, 2, "density", cloud_params.density); + + lua_getfield(L, 2, "color"); + if (!lua_isnil(L, -1)) + read_color(L, -1, &cloud_params.color_bright); + lua_pop(L, 1); + lua_getfield(L, 2, "ambient"); + if (!lua_isnil(L, -1)) + read_color(L, -1, &cloud_params.color_ambient); + lua_pop(L, 1); + + cloud_params.height = getfloatfield_default(L, 2, "height", cloud_params.height ); + cloud_params.thickness = getfloatfield_default(L, 2, "thickness", cloud_params.thickness); + + lua_getfield(L, 2, "speed"); + if (lua_istable(L, -1)) { + v2f new_speed; + new_speed.X = getfloatfield_default(L, -1, "x", 0); + new_speed.Y = getfloatfield_default(L, -1, "y", 0); + cloud_params.speed = new_speed; + } + lua_pop(L, 1); + + if (!getServer(L)->setClouds(player, cloud_params.density, + cloud_params.color_bright, cloud_params.color_ambient, + cloud_params.height, cloud_params.thickness, + cloud_params.speed)) + return 0; + + player->setCloudParams(cloud_params); + + lua_pushboolean(L, true); + return 1; +} + +int ObjectRef::l_get_clouds(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + RemotePlayer *player = getplayer(ref); + if (!player) + return 0; + const CloudParams &cloud_params = player->getCloudParams(); + + lua_newtable(L); + lua_pushnumber(L, cloud_params.density); + lua_setfield(L, -2, "density"); + push_ARGB8(L, cloud_params.color_bright); + lua_setfield(L, -2, "color"); + push_ARGB8(L, cloud_params.color_ambient); + lua_setfield(L, -2, "ambient"); + lua_pushnumber(L, cloud_params.height); + lua_setfield(L, -2, "height"); + lua_pushnumber(L, cloud_params.thickness); + lua_setfield(L, -2, "thickness"); + lua_newtable(L); + lua_pushnumber(L, cloud_params.speed.X); + lua_setfield(L, -2, "x"); + lua_pushnumber(L, cloud_params.speed.Y); + lua_setfield(L, -2, "y"); + lua_setfield(L, -2, "speed"); + + return 1; +} + + // override_day_night_ratio(self, brightness=0...1) int ObjectRef::l_override_day_night_ratio(lua_State *L) { @@ -1778,12 +1919,12 @@ void ObjectRef::Register(lua_State *L) } const char ObjectRef::className[] = "ObjectRef"; -const luaL_reg ObjectRef::methods[] = { +const luaL_Reg ObjectRef::methods[] = { // ServerActiveObject luamethod(ObjectRef, remove), - luamethod(ObjectRef, getpos), - luamethod(ObjectRef, setpos), - luamethod(ObjectRef, moveto), + luamethod_aliased(ObjectRef, get_pos, getpos), + luamethod_aliased(ObjectRef, set_pos, setpos), + luamethod_aliased(ObjectRef, move_to, moveto), luamethod(ObjectRef, punch), luamethod(ObjectRef, right_click), luamethod(ObjectRef, set_hp), @@ -1807,14 +1948,14 @@ const luaL_reg ObjectRef::methods[] = { luamethod(ObjectRef, set_nametag_attributes), luamethod(ObjectRef, get_nametag_attributes), // LuaEntitySAO-only - luamethod(ObjectRef, setvelocity), - luamethod(ObjectRef, getvelocity), - luamethod(ObjectRef, setacceleration), - luamethod(ObjectRef, getacceleration), - luamethod(ObjectRef, setyaw), - luamethod(ObjectRef, getyaw), - luamethod(ObjectRef, settexturemod), - luamethod(ObjectRef, setsprite), + luamethod_aliased(ObjectRef, set_velocity, setvelocity), + luamethod_aliased(ObjectRef, get_velocity, getvelocity), + luamethod_aliased(ObjectRef, set_acceleration, setacceleration), + luamethod_aliased(ObjectRef, get_acceleration, getacceleration), + luamethod_aliased(ObjectRef, set_yaw, setyaw), + luamethod_aliased(ObjectRef, get_yaw, getyaw), + luamethod_aliased(ObjectRef, set_texture_mod, settexturemod), + luamethod_aliased(ObjectRef, set_sprite, setsprite), luamethod(ObjectRef, get_entity_name), luamethod(ObjectRef, get_luaentity), // Player-only @@ -1833,6 +1974,8 @@ const luaL_reg ObjectRef::methods[] = { luamethod(ObjectRef, set_look_pitch), luamethod(ObjectRef, get_breath), luamethod(ObjectRef, set_breath), + luamethod(ObjectRef, get_attribute), + luamethod(ObjectRef, set_attribute), luamethod(ObjectRef, set_inventory_formspec), luamethod(ObjectRef, get_inventory_formspec), luamethod(ObjectRef, get_player_control), @@ -1853,6 +1996,8 @@ const luaL_reg ObjectRef::methods[] = { luamethod(ObjectRef, hud_get_hotbar_selected_image), luamethod(ObjectRef, set_sky), luamethod(ObjectRef, get_sky), + luamethod(ObjectRef, set_clouds), + luamethod(ObjectRef, get_clouds), luamethod(ObjectRef, override_day_night_ratio), luamethod(ObjectRef, get_day_night_ratio), luamethod(ObjectRef, set_local_animation), diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index 09f10e417..9801ce02b 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -37,7 +37,7 @@ private: ServerActiveObject *m_object; static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; public: static ObjectRef *checkobject(lua_State *L, int narg); @@ -57,15 +57,15 @@ private: // remove(self) static int l_remove(lua_State *L); - // getpos(self) + // get_pos(self) // returns: {x=num, y=num, z=num} - static int l_getpos(lua_State *L); + static int l_get_pos(lua_State *L); - // setpos(self, pos) - static int l_setpos(lua_State *L); + // set_pos(self, pos) + static int l_set_pos(lua_State *L); - // moveto(self, pos, continuous=false) - static int l_moveto(lua_State *L); + // move_to(self, pos, continuous=false) + static int l_move_to(lua_State *L); // punch(self, puncher, time_from_last_punch, tool_capabilities, dir) static int l_punch(lua_State *L); @@ -105,7 +105,7 @@ private: static int l_get_armor_groups(lua_State *L); // set_physics_override(self, physics_override_speed, physics_override_jump, - // physics_override_gravity, sneak, sneak_glitch) + // physics_override_gravity, sneak, sneak_glitch, new_move) static int l_set_physics_override(lua_State *L); // get_physics_override(self) @@ -143,30 +143,33 @@ private: /* LuaEntitySAO-only */ - // setvelocity(self, {x=num, y=num, z=num}) - static int l_setvelocity(lua_State *L); + // set_velocity(self, {x=num, y=num, z=num}) + static int l_set_velocity(lua_State *L); - // getvelocity(self) - static int l_getvelocity(lua_State *L); + // get_velocity(self) + static int l_get_velocity(lua_State *L); - // setacceleration(self, {x=num, y=num, z=num}) - static int l_setacceleration(lua_State *L); + // set_acceleration(self, {x=num, y=num, z=num}) + static int l_set_acceleration(lua_State *L); - // getacceleration(self) - static int l_getacceleration(lua_State *L); + // get_acceleration(self) + static int l_get_acceleration(lua_State *L); - // setyaw(self, radians) - static int l_setyaw(lua_State *L); + // set_yaw(self, radians) + static int l_set_yaw(lua_State *L); - // getyaw(self) - static int l_getyaw(lua_State *L); + // get_yaw(self) + static int l_get_yaw(lua_State *L); - // settexturemod(self, mod) - static int l_settexturemod(lua_State *L); + // set_texture_mod(self, mod) + static int l_set_texture_mod(lua_State *L); - // setsprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, + // l_get_texture_mod(self) + static int l_get_texture_mod(lua_State *L); + + // set_sprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, // select_horiz_by_yawpitch=false) - static int l_setsprite(lua_State *L); + static int l_set_sprite(lua_State *L); // DEPRECATED // get_entity_name(self) @@ -223,6 +226,12 @@ private: // get_breath(self, breath) static int l_get_breath(lua_State *L); + // set_attribute(self, attribute, value) + static int l_set_attribute(lua_State *L); + + // get_attribute(self, attribute) + static int l_get_attribute(lua_State *L); + // set_inventory_formspec(self, formspec) static int l_set_inventory_formspec(lua_State *L); @@ -274,12 +283,18 @@ private: // hud_get_hotbar_selected_image(self) static int l_hud_get_hotbar_selected_image(lua_State *L); - // set_sky(self, type, list) + // set_sky(self, bgcolor, type, list, clouds = true) static int l_set_sky(lua_State *L); - // get_sky(self, type, list) + // get_sky(self) static int l_get_sky(lua_State *L); + // set_clouds(self, {density=, color=, ambient=, height=, thickness=, speed=}) + static int l_set_clouds(lua_State *L); + + // get_clouds(self) + static int l_get_clouds(lua_State *L); + // override_day_night_ratio(self, type) static int l_override_day_night_ratio(lua_State *L); diff --git a/src/script/lua_api/l_particles.cpp b/src/script/lua_api/l_particles.cpp index 667ac7272..2f3e9a58d 100644 --- a/src/script/lua_api/l_particles.cpp +++ b/src/script/lua_api/l_particles.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_object.h" #include "lua_api/l_internal.h" #include "common/c_converter.h" +#include "common/c_content.h" #include "server.h" #include "particles.h" @@ -34,6 +35,8 @@ with this program; if not, write to the Free Software Foundation, Inc., // collision_removal = bool // vertical = bool // texture = e.g."default_wood.png" +// animation = TileAnimation definition +// glow = num int ModApiParticles::l_add_particle(lua_State *L) { MAP_LOCK_REQUIRED; @@ -47,10 +50,14 @@ int ModApiParticles::l_add_particle(lua_State *L) bool collisiondetection, vertical, collision_removal; collisiondetection = vertical = collision_removal = false; + struct TileAnimationParams animation; + animation.type = TAT_NONE; std::string texture = ""; std::string playername = ""; + u8 glow = 0; + if (lua_gettop(L) > 1) // deprecated { log_deprecated(L, "Deprecated add_particle call with individual parameters instead of definition"); @@ -101,11 +108,18 @@ int ModApiParticles::l_add_particle(lua_State *L) collision_removal = getboolfield_default(L, 1, "collision_removal", collision_removal); vertical = getboolfield_default(L, 1, "vertical", vertical); + + lua_getfield(L, 1, "animation"); + animation = read_animation_definition(L, -1); + lua_pop(L, 1); + texture = getstringfield_default(L, 1, "texture", ""); playername = getstringfield_default(L, 1, "playername", ""); + + glow = getintfield_default(L, 1, "glow", 0); } getServer(L)->spawnParticle(playername, pos, vel, acc, expirationtime, size, - collisiondetection, collision_removal, vertical, texture); + collisiondetection, collision_removal, vertical, texture, animation, glow); return 1; } @@ -127,6 +141,8 @@ int ModApiParticles::l_add_particle(lua_State *L) // collision_removal = bool // vertical = bool // texture = e.g."default_wood.png" +// animation = TileAnimation definition +// glow = num int ModApiParticles::l_add_particlespawner(lua_State *L) { MAP_LOCK_REQUIRED; @@ -139,9 +155,12 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) time= minexptime= maxexptime= minsize= maxsize= 1; bool collisiondetection, vertical, collision_removal; collisiondetection = vertical = collision_removal = false; + struct TileAnimationParams animation; + animation.type = TAT_NONE; ServerActiveObject *attached = NULL; std::string texture = ""; std::string playername = ""; + u8 glow = 0; if (lua_gettop(L) > 1) //deprecated { @@ -201,6 +220,10 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) collision_removal = getboolfield_default(L, 1, "collision_removal", collision_removal); + lua_getfield(L, 1, "animation"); + animation = read_animation_definition(L, -1); + lua_pop(L, 1); + lua_getfield(L, 1, "attached"); if (!lua_isnil(L, -1)) { ObjectRef *ref = ObjectRef::checkobject(L, -1); @@ -211,6 +234,7 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) vertical = getboolfield_default(L, 1, "vertical", vertical); texture = getstringfield_default(L, 1, "texture", ""); playername = getstringfield_default(L, 1, "playername", ""); + glow = getintfield_default(L, 1, "glow", 0); } u32 id = getServer(L)->addParticleSpawner(amount, time, @@ -223,7 +247,8 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) collision_removal, attached, vertical, - texture, playername); + texture, playername, + animation, glow); lua_pushnumber(L, id); return 1; diff --git a/src/script/lua_api/l_server.cpp b/src/script/lua_api/l_server.cpp index b6d44e0ff..a0e475dec 100644 --- a/src/script/lua_api/l_server.cpp +++ b/src/script/lua_api/l_server.cpp @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "environment.h" #include "player.h" #include "log.h" +#include <algorithm> // request_shutdown() int ModApiServer::l_request_shutdown(lua_State *L) @@ -33,7 +34,8 @@ int ModApiServer::l_request_shutdown(lua_State *L) NO_MAP_LOCK_REQUIRED; const char *msg = lua_tolstring(L, 1, NULL); bool reconnect = lua_toboolean(L, 2); - getServer(L)->requestShutdown(msg ? msg : "", reconnect); + float seconds_before_shutdown = lua_tonumber(L, 3); + getServer(L)->requestShutdown(msg ? msg : "", reconnect, seconds_before_shutdown); return 0; } @@ -102,7 +104,7 @@ int ModApiServer::l_get_player_privs(lua_State *L) int table = lua_gettop(L); std::set<std::string> privs_s = server->getPlayerEffectivePrivs(name); for(std::set<std::string>::const_iterator - i = privs_s.begin(); i != privs_s.end(); i++){ + i = privs_s.begin(); i != privs_s.end(); ++i){ lua_pushboolean(L, true); lua_setfield(L, table, i->c_str()); } @@ -136,7 +138,7 @@ int ModApiServer::l_get_player_ip(lua_State *L) } } -// get_player_information() +// get_player_information(name) int ModApiServer::l_get_player_information(lua_State *L) { @@ -230,15 +232,15 @@ int ModApiServer::l_get_player_information(lua_State *L) lua_pushnumber(L, uptime); lua_settable(L, table); + lua_pushstring(L,"protocol_version"); + lua_pushnumber(L, prot_vers); + lua_settable(L, table); + #ifndef NDEBUG lua_pushstring(L,"serialization_version"); lua_pushnumber(L, ser_vers); lua_settable(L, table); - lua_pushstring(L,"protocol_version"); - lua_pushnumber(L, prot_vers); - lua_settable(L, table); - lua_pushstring(L,"major"); lua_pushnumber(L, major); lua_settable(L, table); @@ -333,6 +335,22 @@ int ModApiServer::l_kick_player(lua_State *L) return 1; } +int ModApiServer::l_remove_player(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + std::string name = luaL_checkstring(L, 1); + ServerEnvironment *s_env = dynamic_cast<ServerEnvironment *>(getEnv(L)); + assert(s_env); + + RemotePlayer *player = s_env->getPlayer(name.c_str()); + if (!player) + lua_pushinteger(L, s_env->removePlayerFromDatabase(name) ? 0 : 1); + else + lua_pushinteger(L, 2); + + return 1; +} + // unban_player_or_ip() int ModApiServer::l_unban_player_or_ip(lua_State *L) { @@ -400,7 +418,7 @@ int ModApiServer::l_get_modnames(lua_State *L) // Package them up for Lua lua_createtable(L, modlist.size(), 0); std::vector<std::string>::iterator iter = modlist.begin(); - for (u16 i = 0; iter != modlist.end(); iter++) { + for (u16 i = 0; iter != modlist.end(); ++iter) { lua_pushstring(L, iter->c_str()); lua_rawseti(L, -2, ++i); } @@ -438,6 +456,16 @@ int ModApiServer::l_sound_stop(lua_State *L) return 0; } +int ModApiServer::l_sound_fade(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + s32 handle = luaL_checkinteger(L, 1); + float step = luaL_checknumber(L, 2); + float gain = luaL_checknumber(L, 3); + getServer(L)->fadeSound(handle, step, gain); + return 0; +} + // is_singleplayer() int ModApiServer::l_is_singleplayer(lua_State *L) { @@ -482,36 +510,6 @@ int ModApiServer::l_set_last_run_mod(lua_State *L) return 0; } -#ifndef NDEBUG -// cause_error(type_of_error) -int ModApiServer::l_cause_error(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - std::string type_of_error = "none"; - if(lua_isstring(L, 1)) - type_of_error = lua_tostring(L, 1); - - errorstream << "Error handler test called, errortype=" << type_of_error << std::endl; - - if(type_of_error == "segv") { - volatile int* some_pointer = 0; - errorstream << "Cause a sigsegv now: " << (*some_pointer) << std::endl; - - } else if (type_of_error == "zerodivision") { - - unsigned int some_number = porting::getTimeS(); - unsigned int zerovalue = 0; - unsigned int result = some_number / zerovalue; - errorstream << "Well this shouldn't ever be shown: " << result << std::endl; - - } else if (type_of_error == "exception") { - throw BaseException("Errorhandler test fct called"); - } - - return 0; -} -#endif - void ModApiServer::Initialize(lua_State *L, int top) { API_FCT(request_shutdown); @@ -531,6 +529,7 @@ void ModApiServer::Initialize(lua_State *L, int top) API_FCT(show_formspec); API_FCT(sound_play); API_FCT(sound_stop); + API_FCT(sound_fade); API_FCT(get_player_information); API_FCT(get_player_privs); @@ -539,12 +538,10 @@ void ModApiServer::Initialize(lua_State *L, int top) API_FCT(get_ban_description); API_FCT(ban_player); API_FCT(kick_player); + API_FCT(remove_player); API_FCT(unban_player_or_ip); API_FCT(notify_authentication_modified); API_FCT(get_last_run_mod); API_FCT(set_last_run_mod); -#ifndef NDEBUG - API_FCT(cause_error); -#endif } diff --git a/src/script/lua_api/l_server.h b/src/script/lua_api/l_server.h index 1ad46d440..251a0ce89 100644 --- a/src/script/lua_api/l_server.h +++ b/src/script/lua_api/l_server.h @@ -22,7 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_base.h" -class ModApiServer : public ModApiBase { +class ModApiServer : public ModApiBase +{ private: // request_shutdown([message], [reconnect]) static int l_request_shutdown(lua_State *L); @@ -67,13 +68,16 @@ private: // sound_stop(handle) static int l_sound_stop(lua_State *L); + // sound_fade(handle, step, gain) + static int l_sound_fade(lua_State *L); + // get_player_privs(name, text) static int l_get_player_privs(lua_State *L); // get_player_ip() static int l_get_player_ip(lua_State *L); - // get_player_information() + // get_player_information(name) static int l_get_player_information(lua_State *L); // get_ban_list() @@ -91,6 +95,9 @@ private: // kick_player(name, [message]) -> success static int l_kick_player(lua_State *L); + // remove_player(name) + static int l_remove_player(lua_State *L); + // notify_authentication_modified(name) static int l_notify_authentication_modified(lua_State *L); @@ -100,14 +107,8 @@ private: // set_last_run_mod(modname) static int l_set_last_run_mod(lua_State *L); -#ifndef NDEBUG - // cause_error(type_of_error) - static int l_cause_error(lua_State *L); -#endif - public: static void Initialize(lua_State *L, int top); - }; #endif /* L_SERVER_H_ */ diff --git a/src/script/lua_api/l_settings.cpp b/src/script/lua_api/l_settings.cpp index d3fe03005..70807f3d2 100644 --- a/src/script/lua_api/l_settings.cpp +++ b/src/script/lua_api/l_settings.cpp @@ -23,6 +23,47 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "log.h" + +#define SET_SECURITY_CHECK(L, name) \ + if (o->m_settings == g_settings && ScriptApiSecurity::isSecure(L) && \ + name.compare(0, 7, "secure.") == 0) { \ + throw LuaError("Attempt to set secure setting."); \ + } + +LuaSettings::LuaSettings(Settings *settings, const std::string &filename) : + m_settings(settings), + m_filename(filename), + m_is_own_settings(false), + m_write_allowed(true) +{ +} + +LuaSettings::LuaSettings(const std::string &filename, bool write_allowed) : + m_filename(filename), + m_is_own_settings(true), + m_write_allowed(write_allowed) +{ + m_settings = new Settings(); + m_settings->readConfigFile(filename.c_str()); +} + +LuaSettings::~LuaSettings() +{ + if (m_is_own_settings) + delete m_settings; +} + + +void LuaSettings::create(lua_State *L, Settings *settings, + const std::string &filename) +{ + LuaSettings *o = new LuaSettings(settings, filename); + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); +} + + // garbage collector int LuaSettings::gc_object(lua_State* L) { @@ -31,6 +72,7 @@ int LuaSettings::gc_object(lua_State* L) return 0; } + // get(self, key) -> value int LuaSettings::l_get(lua_State* L) { @@ -74,12 +116,30 @@ int LuaSettings::l_set(lua_State* L) std::string key = std::string(luaL_checkstring(L, 2)); const char* value = luaL_checkstring(L, 3); + SET_SECURITY_CHECK(L, key); + if (!o->m_settings->set(key, value)) throw LuaError("Invalid sequence found in setting parameters"); return 0; } +// set_bool(self, key, value) +int LuaSettings::l_set_bool(lua_State* L) +{ + NO_MAP_LOCK_REQUIRED; + LuaSettings* o = checkobject(L, 1); + + std::string key = std::string(luaL_checkstring(L, 2)); + bool value = lua_toboolean(L, 3); + + SET_SECURITY_CHECK(L, key); + + o->m_settings->setBool(key, value); + + return 1; +} + // remove(self, key) -> success int LuaSettings::l_remove(lua_State* L) { @@ -88,6 +148,8 @@ int LuaSettings::l_remove(lua_State* L) std::string key = std::string(luaL_checkstring(L, 2)); + SET_SECURITY_CHECK(L, key); + bool success = o->m_settings->remove(key); lua_pushboolean(L, success); @@ -147,19 +209,6 @@ int LuaSettings::l_to_table(lua_State* L) return 1; } -LuaSettings::LuaSettings(const char* filename, bool write_allowed) -{ - m_write_allowed = write_allowed; - m_filename = std::string(filename); - - m_settings = new Settings(); - m_settings->readConfigFile(m_filename.c_str()); -} - -LuaSettings::~LuaSettings() -{ - delete m_settings; -} void LuaSettings::Register(lua_State* L) { @@ -190,7 +239,7 @@ void LuaSettings::Register(lua_State* L) } // LuaSettings(filename) -// Creates an LuaSettings and leaves it on top of stack +// Creates a LuaSettings and leaves it on top of the stack int LuaSettings::create_object(lua_State* L) { NO_MAP_LOCK_REQUIRED; @@ -209,15 +258,17 @@ LuaSettings* LuaSettings::checkobject(lua_State* L, int narg) NO_MAP_LOCK_REQUIRED; luaL_checktype(L, narg, LUA_TUSERDATA); void *ud = luaL_checkudata(L, narg, className); - if(!ud) luaL_typerror(L, narg, className); - return *(LuaSettings**)ud; // unbox pointer + if (!ud) + luaL_typerror(L, narg, className); + return *(LuaSettings**) ud; // unbox pointer } const char LuaSettings::className[] = "Settings"; -const luaL_reg LuaSettings::methods[] = { +const luaL_Reg LuaSettings::methods[] = { luamethod(LuaSettings, get), luamethod(LuaSettings, get_bool), luamethod(LuaSettings, set), + luamethod(LuaSettings, set_bool), luamethod(LuaSettings, remove), luamethod(LuaSettings, get_names), luamethod(LuaSettings, write), diff --git a/src/script/lua_api/l_settings.h b/src/script/lua_api/l_settings.h index bca333e31..54b003ab3 100644 --- a/src/script/lua_api/l_settings.h +++ b/src/script/lua_api/l_settings.h @@ -24,51 +24,58 @@ with this program; if not, write to the Free Software Foundation, Inc., class Settings; -class LuaSettings : public ModApiBase { +class LuaSettings : public ModApiBase +{ private: static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; // garbage collector - static int gc_object(lua_State* L); + static int gc_object(lua_State *L); // get(self, key) -> value - static int l_get(lua_State* L); + static int l_get(lua_State *L); // get_bool(self, key) -> boolean - static int l_get_bool(lua_State* L); + static int l_get_bool(lua_State *L); // set(self, key, value) - static int l_set(lua_State* L); + static int l_set(lua_State *L); + + // set_bool(self, key, value) + static int l_set_bool(lua_State *L); // remove(self, key) -> success - static int l_remove(lua_State* L); + static int l_remove(lua_State *L); // get_names(self) -> {key1, ...} - static int l_get_names(lua_State* L); + static int l_get_names(lua_State *L); // write(self) -> success - static int l_write(lua_State* L); + static int l_write(lua_State *L); // to_table(self) -> {[key1]=value1,...} - static int l_to_table(lua_State* L); + static int l_to_table(lua_State *L); - bool m_write_allowed; - Settings* m_settings; + Settings *m_settings; std::string m_filename; + bool m_is_own_settings; + bool m_write_allowed; public: - LuaSettings(const char* filename, bool write_allowed); + LuaSettings(Settings *settings, const std::string &filename); + LuaSettings(const std::string &filename, bool write_allowed); ~LuaSettings(); - // LuaSettings(filename) - // Creates an LuaSettings and leaves it on top of stack - static int create_object(lua_State* L); + static void create(lua_State *L, Settings *settings, const std::string &filename); - static LuaSettings* checkobject(lua_State* L, int narg); + // LuaSettings(filename) + // Creates a LuaSettings and leaves it on top of the stack + static int create_object(lua_State *L); - static void Register(lua_State* L); + static LuaSettings *checkobject(lua_State *L, int narg); + static void Register(lua_State *L); }; #endif diff --git a/src/script/lua_api/l_sound.cpp b/src/script/lua_api/l_sound.cpp new file mode 100644 index 000000000..07ce36daa --- /dev/null +++ b/src/script/lua_api/l_sound.cpp @@ -0,0 +1,53 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "l_sound.h" +#include "l_internal.h" +#include "common/c_content.h" +#include "guiEngine.h" + + +int ModApiSound::l_sound_play(lua_State *L) +{ + SimpleSoundSpec spec; + read_soundspec(L, 1, spec); + bool looped = lua_toboolean(L, 2); + + s32 handle = getGuiEngine(L)->playSound(spec, looped); + + lua_pushinteger(L, handle); + + return 1; +} + +int ModApiSound::l_sound_stop(lua_State *L) +{ + u32 handle = luaL_checkinteger(L, 1); + + getGuiEngine(L)->stopSound(handle); + + return 1; +} + +void ModApiSound::Initialize(lua_State *L, int top) +{ + API_FCT(sound_play); + API_FCT(sound_stop); +} diff --git a/src/script/lua_api/l_sound.h b/src/script/lua_api/l_sound.h new file mode 100644 index 000000000..1f0c1eba1 --- /dev/null +++ b/src/script/lua_api/l_sound.h @@ -0,0 +1,36 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef L_SOUND_H_ +#define L_SOUND_H_ + +#include "lua_api/l_base.h" + +class ModApiSound : public ModApiBase +{ +private: + static int l_sound_play(lua_State *L); + static int l_sound_stop(lua_State *L); + +public: + static void Initialize(lua_State *L, int top); +}; + +#endif diff --git a/src/script/lua_api/l_storage.cpp b/src/script/lua_api/l_storage.cpp new file mode 100644 index 000000000..4c6b2a182 --- /dev/null +++ b/src/script/lua_api/l_storage.cpp @@ -0,0 +1,147 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "lua_api/l_storage.h" +#include "l_internal.h" +#include "mods.h" +#include "server.h" + +int ModApiStorage::l_get_mod_storage(lua_State *L) +{ + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); + if (!lua_isstring(L, -1)) { + return 0; + } + + std::string mod_name = lua_tostring(L, -1); + + ModMetadata *store = new ModMetadata(mod_name); + if (IGameDef *gamedef = getGameDef(L)) { + store->load(gamedef->getModStoragePath()); + gamedef->registerModStorage(store); + } else { + assert(false); // this should not happen + } + + StorageRef::create(L, store); + int object = lua_gettop(L); + + lua_pushvalue(L, object); + return 1; +} + +void ModApiStorage::Initialize(lua_State *L, int top) +{ + API_FCT(get_mod_storage); +} + +StorageRef::StorageRef(ModMetadata *object): + m_object(object) +{ +} + +void StorageRef::create(lua_State *L, ModMetadata *object) +{ + StorageRef *o = new StorageRef(object); + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); +} + +int StorageRef::gc_object(lua_State *L) +{ + StorageRef *o = *(StorageRef **)(lua_touserdata(L, 1)); + // Server side + if (IGameDef *gamedef = getGameDef(L)) + gamedef->unregisterModStorage(getobject(o)->getModName()); + delete o; + return 0; +} + +void StorageRef::Register(lua_State *L) +{ + lua_newtable(L); + int methodtable = lua_gettop(L); + luaL_newmetatable(L, className); + int metatable = lua_gettop(L); + + lua_pushliteral(L, "__metatable"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); // hide metatable from Lua getmetatable() + + lua_pushliteral(L, "metadata_class"); + lua_pushlstring(L, className, strlen(className)); + lua_settable(L, metatable); + + lua_pushliteral(L, "__index"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); + + lua_pushliteral(L, "__gc"); + lua_pushcfunction(L, gc_object); + lua_settable(L, metatable); + + lua_pushliteral(L, "__eq"); + lua_pushcfunction(L, l_equals); + lua_settable(L, metatable); + + lua_pop(L, 1); // drop metatable + + luaL_openlib(L, 0, methods, 0); // fill methodtable + lua_pop(L, 1); // drop methodtable +} + +StorageRef* StorageRef::checkobject(lua_State *L, int narg) +{ + luaL_checktype(L, narg, LUA_TUSERDATA); + void *ud = luaL_checkudata(L, narg, className); + if (!ud) luaL_typerror(L, narg, className); + return *(StorageRef**)ud; // unbox pointer +} + +ModMetadata* StorageRef::getobject(StorageRef *ref) +{ + ModMetadata *co = ref->m_object; + return co; +} + +Metadata* StorageRef::getmeta(bool auto_create) +{ + return m_object; +} + +void StorageRef::clearMeta() +{ + m_object->clear(); +} + +const char StorageRef::className[] = "StorageRef"; +const luaL_Reg StorageRef::methods[] = { + luamethod(MetaDataRef, get_string), + luamethod(MetaDataRef, set_string), + luamethod(MetaDataRef, get_int), + luamethod(MetaDataRef, set_int), + luamethod(MetaDataRef, get_float), + luamethod(MetaDataRef, set_float), + luamethod(MetaDataRef, to_table), + luamethod(MetaDataRef, from_table), + luamethod(MetaDataRef, equals), + {0,0} +}; diff --git a/src/script/lua_api/l_storage.h b/src/script/lua_api/l_storage.h new file mode 100644 index 000000000..ec6f8d941 --- /dev/null +++ b/src/script/lua_api/l_storage.h @@ -0,0 +1,63 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef __L_STORAGE_H__ +#define __L_STORAGE_H__ + +#include "l_metadata.h" +#include "lua_api/l_base.h" + +class ModMetadata; + +class ModApiStorage : public ModApiBase +{ +protected: + static int l_get_mod_storage(lua_State *L); + +public: + static void Initialize(lua_State *L, int top); +}; + +class StorageRef : public MetaDataRef +{ +private: + ModMetadata *m_object; + + static const char className[]; + static const luaL_Reg methods[]; + + virtual Metadata *getmeta(bool auto_create); + virtual void clearMeta(); + + // garbage collector + static int gc_object(lua_State *L); + +public: + StorageRef(ModMetadata *object); + ~StorageRef() {} + + static void Register(lua_State *L); + static void create(lua_State *L, ModMetadata *object); + + static StorageRef *checkobject(lua_State *L, int narg); + static ModMetadata *getobject(StorageRef *ref); +}; + +#endif /* __L_STORAGE_H__ */ diff --git a/src/script/lua_api/l_util.cpp b/src/script/lua_api/l_util.cpp index 26e2b985c..c4a988e07 100644 --- a/src/script/lua_api/l_util.cpp +++ b/src/script/lua_api/l_util.cpp @@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_util.h" #include "lua_api/l_internal.h" +#include "lua_api/l_settings.h" #include "common/c_converter.h" #include "common/c_content.h" #include "cpp_api/s_async.h" @@ -77,71 +78,6 @@ int ModApiUtil::l_get_us_time(lua_State *L) return 1; } -#define CHECK_SECURE_SETTING(L, name) \ - if (ScriptApiSecurity::isSecure(L) && \ - name.compare(0, 7, "secure.") == 0) { \ - throw LuaError("Attempt to set secure setting."); \ - } - -// setting_set(name, value) -int ModApiUtil::l_setting_set(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - std::string name = luaL_checkstring(L, 1); - std::string value = luaL_checkstring(L, 2); - CHECK_SECURE_SETTING(L, name); - g_settings->set(name, value); - return 0; -} - -// setting_get(name) -int ModApiUtil::l_setting_get(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - const char *name = luaL_checkstring(L, 1); - try{ - std::string value = g_settings->get(name); - lua_pushstring(L, value.c_str()); - } catch(SettingNotFoundException &e){ - lua_pushnil(L); - } - return 1; -} - -// setting_setbool(name) -int ModApiUtil::l_setting_setbool(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - std::string name = luaL_checkstring(L, 1); - bool value = lua_toboolean(L, 2); - CHECK_SECURE_SETTING(L, name); - g_settings->setBool(name, value); - return 0; -} - -// setting_getbool(name) -int ModApiUtil::l_setting_getbool(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - const char *name = luaL_checkstring(L, 1); - try{ - bool value = g_settings->getBool(name); - lua_pushboolean(L, value); - } catch(SettingNotFoundException &e){ - lua_pushnil(L); - } - return 1; -} - -// setting_save() -int ModApiUtil::l_setting_save(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - if(g_settings_path != "") - g_settings->updateConfigFile(g_settings_path.c_str()); - return 0; -} - // parse_json(str[, nullvalue]) int ModApiUtil::l_parse_json(lua_State *L) { @@ -398,7 +334,8 @@ int ModApiUtil::l_get_dir_list(lua_State *L) { NO_MAP_LOCK_REQUIRED; const char *path = luaL_checkstring(L, 1); - short is_dir = lua_isboolean(L, 2) ? lua_toboolean(L, 2) : -1; + bool list_all = !lua_isboolean(L, 2); // if its not a boolean list all + bool list_dirs = lua_toboolean(L, 2); // true: list dirs, false: list files CHECK_SECURE_PATH(L, path, false); @@ -408,7 +345,7 @@ int ModApiUtil::l_get_dir_list(lua_State *L) lua_newtable(L); for (size_t i = 0; i < list.size(); i++) { - if (is_dir == -1 || is_dir == list[i].dir) { + if (list_all || list_dirs == list[i].dir) { lua_pushstring(L, list[i].name.c_str()); lua_rawseti(L, -2, ++index); } @@ -492,12 +429,6 @@ void ModApiUtil::Initialize(lua_State *L, int top) API_FCT(get_us_time); - API_FCT(setting_set); - API_FCT(setting_get); - API_FCT(setting_setbool); - API_FCT(setting_getbool); - API_FCT(setting_save); - API_FCT(parse_json); API_FCT(write_json); @@ -523,36 +454,58 @@ void ModApiUtil::Initialize(lua_State *L, int top) API_FCT(decode_base64); API_FCT(get_version); + + LuaSettings::create(L, g_settings, g_settings_path); + lua_setfield(L, top, "settings"); } -void ModApiUtil::InitializeAsync(AsyncEngine& engine) +void ModApiUtil::InitializeClient(lua_State *L, int top) { - ASYNC_API_FCT(log); + API_FCT(log); + + API_FCT(get_us_time); + + API_FCT(parse_json); + API_FCT(write_json); + + API_FCT(is_yes); + + API_FCT(get_builtin_path); + + API_FCT(compress); + API_FCT(decompress); + + API_FCT(encode_base64); + API_FCT(decode_base64); + + API_FCT(get_version); +} - ASYNC_API_FCT(get_us_time); +void ModApiUtil::InitializeAsync(lua_State *L, int top) +{ + API_FCT(log); - //ASYNC_API_FCT(setting_set); - ASYNC_API_FCT(setting_get); - //ASYNC_API_FCT(setting_setbool); - ASYNC_API_FCT(setting_getbool); - //ASYNC_API_FCT(setting_save); + API_FCT(get_us_time); - ASYNC_API_FCT(parse_json); - ASYNC_API_FCT(write_json); + API_FCT(parse_json); + API_FCT(write_json); - ASYNC_API_FCT(is_yes); + API_FCT(is_yes); - ASYNC_API_FCT(get_builtin_path); + API_FCT(get_builtin_path); - ASYNC_API_FCT(compress); - ASYNC_API_FCT(decompress); + API_FCT(compress); + API_FCT(decompress); + + API_FCT(mkdir); + API_FCT(get_dir_list); - ASYNC_API_FCT(mkdir); - ASYNC_API_FCT(get_dir_list); + API_FCT(encode_base64); + API_FCT(decode_base64); - ASYNC_API_FCT(encode_base64); - ASYNC_API_FCT(decode_base64); + API_FCT(get_version); - ASYNC_API_FCT(get_version); + LuaSettings::create(L, g_settings, g_settings_path); + lua_setfield(L, top, "settings"); } diff --git a/src/script/lua_api/l_util.h b/src/script/lua_api/l_util.h index 9910704b3..b75d9db29 100644 --- a/src/script/lua_api/l_util.h +++ b/src/script/lua_api/l_util.h @@ -24,7 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc., class AsyncEngine; -class ModApiUtil : public ModApiBase { +class ModApiUtil : public ModApiBase +{ private: /* NOTE: @@ -44,21 +45,6 @@ private: // get us precision time static int l_get_us_time(lua_State *L); - // setting_set(name, value) - static int l_setting_set(lua_State *L); - - // setting_get(name) - static int l_setting_get(lua_State *L); - - // setting_setbool(name, value) - static int l_setting_setbool(lua_State *L); - - // setting_getbool(name) - static int l_setting_getbool(lua_State *L); - - // setting_save() - static int l_setting_save(lua_State *L); - // parse_json(str[, nullvalue]) static int l_parse_json(lua_State *L); @@ -109,10 +95,10 @@ private: public: static void Initialize(lua_State *L, int top); + static void InitializeAsync(lua_State *L, int top); + static void InitializeClient(lua_State *L, int top); - static void InitializeAsync(AsyncEngine& engine); - + static void InitializeAsync(AsyncEngine &engine); }; #endif /* L_UTIL_H_ */ - diff --git a/src/script/lua_api/l_vmanip.cpp b/src/script/lua_api/l_vmanip.cpp index bdf720f0a..254a7e5a6 100644 --- a/src/script/lua_api/l_vmanip.cpp +++ b/src/script/lua_api/l_vmanip.cpp @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "server.h" #include "mapgen.h" +#include "voxelalgorithms.h" // garbage collector int LuaVoxelManip::gc_object(lua_State *L) @@ -109,10 +110,25 @@ int LuaVoxelManip::l_write_to_map(lua_State *L) MAP_LOCK_REQUIRED; LuaVoxelManip *o = checkobject(L, 1); - MMVManip *vm = o->vm; + bool update_light = lua_isboolean(L, 2) ? lua_toboolean(L, 2) : true; + GET_ENV_PTR; + ServerMap *map = &(env->getServerMap()); + if (o->is_mapgen_vm || !update_light) { + o->vm->blitBackAll(&(o->modified_blocks)); + } else { + voxalgo::blit_back_with_light(map, o->vm, + &(o->modified_blocks)); + } - vm->blitBackAll(&o->modified_blocks); + MapEditEvent event; + event.type = MEET_OTHER; + for (std::map<v3s16, MapBlock *>::iterator it = o->modified_blocks.begin(); + it != o->modified_blocks.end(); ++it) + event.modified_blocks.insert(it->first); + map->dispatchEvent(&event); + + o->modified_blocks.clear(); return 0; } @@ -322,33 +338,6 @@ int LuaVoxelManip::l_set_param2_data(lua_State *L) int LuaVoxelManip::l_update_map(lua_State *L) { - GET_ENV_PTR; - - LuaVoxelManip *o = checkobject(L, 1); - if (o->is_mapgen_vm) - return 0; - - Map *map = &(env->getMap()); - - // TODO: Optimize this by using Mapgen::calcLighting() instead - std::map<v3s16, MapBlock *> lighting_mblocks; - std::map<v3s16, MapBlock *> *mblocks = &o->modified_blocks; - - lighting_mblocks.insert(mblocks->begin(), mblocks->end()); - - map->updateLighting(lighting_mblocks, *mblocks); - - MapEditEvent event; - event.type = MEET_OTHER; - for (std::map<v3s16, MapBlock *>::iterator - it = mblocks->begin(); - it != mblocks->end(); ++it) - event.modified_blocks.insert(it->first); - - map->dispatchEvent(&event); - - mblocks->clear(); - return 0; } @@ -464,7 +453,7 @@ void LuaVoxelManip::Register(lua_State *L) } const char LuaVoxelManip::className[] = "VoxelManip"; -const luaL_reg LuaVoxelManip::methods[] = { +const luaL_Reg LuaVoxelManip::methods[] = { luamethod(LuaVoxelManip, read_from_map), luamethod(LuaVoxelManip, get_data), luamethod(LuaVoxelManip, set_data), diff --git a/src/script/lua_api/l_vmanip.h b/src/script/lua_api/l_vmanip.h index 1adb78c4e..b6a69f36a 100644 --- a/src/script/lua_api/l_vmanip.h +++ b/src/script/lua_api/l_vmanip.h @@ -20,9 +20,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef L_VMANIP_H_ #define L_VMANIP_H_ -#include "lua_api/l_base.h" -#include "irr_v3d.h" #include <map> +#include "irr_v3d.h" +#include "lua_api/l_base.h" class Map; class MapBlock; @@ -31,13 +31,14 @@ class MMVManip; /* VoxelManip */ -class LuaVoxelManip : public ModApiBase { +class LuaVoxelManip : public ModApiBase +{ private: std::map<v3s16, MapBlock *> modified_blocks; bool is_mapgen_vm; static const char className[]; - static const luaL_reg methods[]; + static const luaL_Reg methods[]; static int gc_object(lua_State *L); diff --git a/src/script/scripting_client.cpp b/src/script/scripting_client.cpp new file mode 100644 index 000000000..da289e564 --- /dev/null +++ b/src/script/scripting_client.cpp @@ -0,0 +1,88 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "scripting_client.h" +#include "client.h" +#include "cpp_api/s_internal.h" +#include "lua_api/l_client.h" +#include "lua_api/l_env.h" +#include "lua_api/l_minimap.h" +#include "lua_api/l_storage.h" +#include "lua_api/l_sound.h" +#include "lua_api/l_util.h" +#include "lua_api/l_item.h" +#include "lua_api/l_nodemeta.h" +#include "lua_api/l_localplayer.h" +#include "lua_api/l_camera.h" + +ClientScripting::ClientScripting(Client *client): + ScriptApiBase() +{ + setGameDef(client); + + SCRIPTAPI_PRECHECKHEADER + + // Security is mandatory client side + initializeSecurityClient(); + + lua_getglobal(L, "core"); + int top = lua_gettop(L); + + lua_newtable(L); + lua_setfield(L, -2, "ui"); + + InitializeModApi(L, top); + lua_pop(L, 1); + + if (client->getMinimap()) + LuaMinimap::create(L, client->getMinimap()); + + // Push builtin initialization type + lua_pushstring(L, "client"); + lua_setglobal(L, "INIT"); + + infostream << "SCRIPTAPI: Initialized client game modules" << std::endl; +} + +void ClientScripting::InitializeModApi(lua_State *L, int top) +{ + LuaItemStack::Register(L); + StorageRef::Register(L); + LuaMinimap::Register(L); + NodeMetaRef::RegisterClient(L); + LuaLocalPlayer::Register(L); + LuaCamera::Register(L); + + ModApiUtil::InitializeClient(L, top); + ModApiClient::Initialize(L, top); + ModApiStorage::Initialize(L, top); + ModApiEnvMod::InitializeClient(L, top); +} + +void ClientScripting::on_client_ready(LocalPlayer *localplayer) +{ + lua_State *L = getStack(); + LuaLocalPlayer::create(L, localplayer); +} + +void ClientScripting::on_camera_ready(Camera *camera) +{ + LuaCamera::create(getStack(), camera); +} diff --git a/src/script/scripting_client.h b/src/script/scripting_client.h new file mode 100644 index 000000000..c13fde607 --- /dev/null +++ b/src/script/scripting_client.h @@ -0,0 +1,46 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef CLIENT_SCRIPTING_H_ +#define CLIENT_SCRIPTING_H_ + +#include "cpp_api/s_base.h" +#include "cpp_api/s_client.h" +#include "cpp_api/s_security.h" +#include "util/basic_macros.h" + +class Client; +class LocalPlayer; +class Camera; +class ClientScripting: + virtual public ScriptApiBase, + public ScriptApiSecurity, + public ScriptApiClient +{ +public: + ClientScripting(Client *client); + void on_client_ready(LocalPlayer *localplayer); + void on_camera_ready(Camera *camera); + +private: + virtual void InitializeModApi(lua_State *L, int top); + DISABLE_CLASS_COPY(ClientScripting); +}; +#endif diff --git a/src/script/scripting_mainmenu.cpp b/src/script/scripting_mainmenu.cpp index b1e50c94b..48957b472 100644 --- a/src/script/scripting_mainmenu.cpp +++ b/src/script/scripting_mainmenu.cpp @@ -19,11 +19,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "scripting_mainmenu.h" #include "mods.h" -#include "porting.h" -#include "log.h" #include "cpp_api/s_internal.h" #include "lua_api/l_base.h" #include "lua_api/l_mainmenu.h" +#include "lua_api/l_sound.h" #include "lua_api/l_util.h" #include "lua_api/l_settings.h" @@ -60,16 +59,16 @@ MainMenuScripting::MainMenuScripting(GUIEngine* guiengine) /******************************************************************************/ void MainMenuScripting::initializeModApi(lua_State *L, int top) { + registerLuaClasses(L, top); + // Initialize mod API modules ModApiMainMenu::Initialize(L, top); ModApiUtil::Initialize(L, top); + ModApiSound::Initialize(L, top); - // Register reference classes (userdata) - LuaSettings::Register(L); - - // Register functions to async environment - ModApiMainMenu::InitializeAsync(asyncEngine); - ModApiUtil::InitializeAsync(asyncEngine); + asyncEngine.registerStateInitializer(registerLuaClasses); + asyncEngine.registerStateInitializer(ModApiMainMenu::InitializeAsync); + asyncEngine.registerStateInitializer(ModApiUtil::InitializeAsync); // Initialize async environment //TODO possibly make number of async threads configurable @@ -77,13 +76,21 @@ void MainMenuScripting::initializeModApi(lua_State *L, int top) } /******************************************************************************/ -void MainMenuScripting::step() { +void MainMenuScripting::registerLuaClasses(lua_State *L, int top) +{ + LuaSettings::Register(L); +} + +/******************************************************************************/ +void MainMenuScripting::step() +{ asyncEngine.step(getStack()); } /******************************************************************************/ -unsigned int MainMenuScripting::queueAsync(std::string serialized_func, - std::string serialized_param) { +unsigned int MainMenuScripting::queueAsync(const std::string &serialized_func, + const std::string &serialized_param) +{ return asyncEngine.queueAsyncJob(serialized_func, serialized_param); } diff --git a/src/script/scripting_mainmenu.h b/src/script/scripting_mainmenu.h index 3a0795df4..7b3a6eba8 100644 --- a/src/script/scripting_mainmenu.h +++ b/src/script/scripting_mainmenu.h @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "cpp_api/s_base.h" #include "cpp_api/s_mainmenu.h" #include "cpp_api/s_async.h" +#include "util/basic_macros.h" /*****************************************************************************/ /* Scripting <-> Main Menu Interface */ @@ -39,12 +40,14 @@ public: void step(); // Pass async events from engine to async threads - unsigned int queueAsync(std::string serialized_func, - std::string serialized_params); + unsigned int queueAsync(const std::string &serialized_func, + const std::string &serialized_params); private: void initializeModApi(lua_State *L, int top); + static void registerLuaClasses(lua_State *L, int top); AsyncEngine asyncEngine; + DISABLE_CLASS_COPY(MainMenuScripting); }; diff --git a/src/script/scripting_game.cpp b/src/script/scripting_server.cpp index e313d55f8..cd01b0773 100644 --- a/src/script/scripting_game.cpp +++ b/src/script/scripting_server.cpp @@ -17,7 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "scripting_game.h" +#include "scripting_server.h" #include "server.h" #include "log.h" #include "settings.h" @@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_env.h" #include "lua_api/l_inventory.h" #include "lua_api/l_item.h" +#include "lua_api/l_itemstackmeta.h" #include "lua_api/l_mapgen.h" #include "lua_api/l_nodemeta.h" #include "lua_api/l_nodetimer.h" @@ -40,14 +41,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_vmanip.h" #include "lua_api/l_settings.h" #include "lua_api/l_http.h" +#include "lua_api/l_storage.h" extern "C" { #include "lualib.h" } -GameScripting::GameScripting(Server* server) +ServerScripting::ServerScripting(Server* server) { - setServer(server); + setGameDef(server); // setEnv(env) is called by ScriptApiEnv::initializeEnvironment() // once the environment has been created @@ -78,22 +80,11 @@ GameScripting::GameScripting(Server* server) infostream << "SCRIPTAPI: Initialized game modules" << std::endl; } -void GameScripting::InitializeModApi(lua_State *L, int top) +void ServerScripting::InitializeModApi(lua_State *L, int top) { - // Initialize mod api modules - ModApiCraft::Initialize(L, top); - ModApiEnvMod::Initialize(L, top); - ModApiInventory::Initialize(L, top); - ModApiItemMod::Initialize(L, top); - ModApiMapgen::Initialize(L, top); - ModApiParticles::Initialize(L, top); - ModApiRollback::Initialize(L, top); - ModApiServer::Initialize(L, top); - ModApiUtil::Initialize(L, top); - ModApiHttp::Initialize(L, top); - // Register reference classes (userdata) InvRef::Register(L); + ItemStackMetaRef::Register(L); LuaAreaStore::Register(L); LuaItemStack::Register(L); LuaPerlinNoise::Register(L); @@ -106,6 +97,20 @@ void GameScripting::InitializeModApi(lua_State *L, int top) NodeTimerRef::Register(L); ObjectRef::Register(L); LuaSettings::Register(L); + StorageRef::Register(L); + + // Initialize mod api modules + ModApiCraft::Initialize(L, top); + ModApiEnvMod::Initialize(L, top); + ModApiInventory::Initialize(L, top); + ModApiItemMod::Initialize(L, top); + ModApiMapgen::Initialize(L, top); + ModApiParticles::Initialize(L, top); + ModApiRollback::Initialize(L, top); + ModApiServer::Initialize(L, top); + ModApiUtil::Initialize(L, top); + ModApiHttp::Initialize(L, top); + ModApiStorage::Initialize(L, top); } void log_deprecated(const std::string &message) diff --git a/src/script/scripting_game.h b/src/script/scripting_server.h index 970b3e80d..1b335406e 100644 --- a/src/script/scripting_game.h +++ b/src/script/scripting_server.h @@ -17,8 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef SCRIPTING_GAME_H_ -#define SCRIPTING_GAME_H_ +#ifndef SERVER_SCRIPTING_H_ +#define SERVER_SCRIPTING_H_ #include "cpp_api/s_base.h" #include "cpp_api/s_entity.h" @@ -28,12 +28,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "cpp_api/s_player.h" #include "cpp_api/s_server.h" #include "cpp_api/s_security.h" +#include "util/basic_macros.h" /*****************************************************************************/ -/* Scripting <-> Game Interface */ +/* Scripting <-> Server Game Interface */ /*****************************************************************************/ -class GameScripting : +class ServerScripting: virtual public ScriptApiBase, public ScriptApiDetached, public ScriptApiEntity, @@ -44,12 +45,13 @@ class GameScripting : public ScriptApiSecurity { public: - GameScripting(Server* server); + ServerScripting(Server* server); // use ScriptApiBase::loadMod() to load mods private: void InitializeModApi(lua_State *L, int top); + DISABLE_CLASS_COPY(ServerScripting); }; void log_deprecated(const std::string &message); diff --git a/src/serialization.h b/src/serialization.h index 01d37d363..c91c3241f 100644 --- a/src/serialization.h +++ b/src/serialization.h @@ -62,13 +62,15 @@ with this program; if not, write to the Free Software Foundation, Inc., 24: 16-bit node ids and node timers (never released as stable) 25: Improved node timer format 26: Never written; read the same as 25 + 27: Added light spreading flags to blocks + 28: Added "private" flag to NodeMetadata */ // This represents an uninitialized or invalid format #define SER_FMT_VER_INVALID 255 // Highest supported serialization version -#define SER_FMT_VER_HIGHEST_READ 26 +#define SER_FMT_VER_HIGHEST_READ 28 // Saved on disk version -#define SER_FMT_VER_HIGHEST_WRITE 25 +#define SER_FMT_VER_HIGHEST_WRITE 28 // Lowest supported serialization version #define SER_FMT_VER_LOWEST_READ 0 // Lowest serialization version for writing diff --git a/src/server.cpp b/src/server.cpp index c9d5c7129..1e8e6a5d2 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -38,7 +38,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "profiler.h" #include "log.h" -#include "scripting_game.h" +#include "scripting_server.h" #include "nodedef.h" #include "itemdef.h" #include "craftdef.h" @@ -50,11 +50,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_abm.h" #include "content_sao.h" #include "mods.h" -#include "sound.h" // dummySoundManager #include "event_manager.h" #include "serverlist.h" #include "util/string.h" -#include "util/mathconstants.h" #include "rollback.h" #include "util/serialize.h" #include "util/thread.h" @@ -62,6 +60,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/base64.h" #include "util/sha1.h" #include "util/hex.h" +#include "database.h" class ClientNotFoundException : public BaseException { @@ -108,7 +107,8 @@ void *ServerThread::run() } catch (con::ConnectionBindFailed &e) { m_server->setAsyncFatalError(e.what()); } catch (LuaError &e) { - m_server->setAsyncFatalError("Lua: " + std::string(e.what())); + m_server->setAsyncFatalError( + "ServerThread::run Lua: " + std::string(e.what())); } } @@ -149,11 +149,13 @@ Server::Server( const SubgameSpec &gamespec, bool simple_singleplayer_mode, bool ipv6, + bool dedicated, ChatInterface *iface ): m_path_world(path_world), m_gamespec(gamespec), m_simple_singleplayer_mode(simple_singleplayer_mode), + m_dedicated(dedicated), m_async_fatal_error(""), m_env(NULL), m_con(PROTOCOL_ID, @@ -176,11 +178,12 @@ Server::Server( m_clients(&m_con), m_shutdown_requested(false), m_shutdown_ask_reconnect(false), + m_shutdown_timer(0.0f), m_admin_chat(iface), m_ignore_map_edit_events(false), m_ignore_map_edit_events_peer_id(0), - m_next_sound_id(0) - + m_next_sound_id(0), + m_mod_storage_save_timer(10.0f) { m_liquid_transform_timer = 0.0; m_liquid_transform_every = 1.0; @@ -219,46 +222,12 @@ Server::Server( std::string ban_path = m_path_world + DIR_DELIM "ipban.txt"; m_banmanager = new BanManager(ban_path); - ModConfiguration modconf(m_path_world); + ServerModConfiguration modconf(m_path_world); m_mods = modconf.getMods(); std::vector<ModSpec> unsatisfied_mods = modconf.getUnsatisfiedMods(); // complain about mods with unsatisfied dependencies - if(!modconf.isConsistent()) { - for(std::vector<ModSpec>::iterator it = unsatisfied_mods.begin(); - it != unsatisfied_mods.end(); ++it) { - ModSpec mod = *it; - errorstream << "mod \"" << mod.name << "\" has unsatisfied dependencies: "; - for(std::set<std::string>::iterator dep_it = mod.unsatisfied_depends.begin(); - dep_it != mod.unsatisfied_depends.end(); ++dep_it) - errorstream << " \"" << *dep_it << "\""; - errorstream << std::endl; - } - } - - Settings worldmt_settings; - std::string worldmt = m_path_world + DIR_DELIM + "world.mt"; - worldmt_settings.readConfigFile(worldmt.c_str()); - std::vector<std::string> names = worldmt_settings.getNames(); - std::set<std::string> load_mod_names; - for(std::vector<std::string>::iterator it = names.begin(); - it != names.end(); ++it) { - std::string name = *it; - if(name.compare(0,9,"load_mod_")==0 && worldmt_settings.getBool(name)) - load_mod_names.insert(name.substr(9)); - } - // complain about mods declared to be loaded, but not found - for(std::vector<ModSpec>::iterator it = m_mods.begin(); - it != m_mods.end(); ++it) - load_mod_names.erase((*it).name); - for(std::vector<ModSpec>::iterator it = unsatisfied_mods.begin(); - it != unsatisfied_mods.end(); ++it) - load_mod_names.erase((*it).name); - if(!load_mod_names.empty()) { - errorstream << "The following mods could not be found:"; - for(std::set<std::string>::iterator it = load_mod_names.begin(); - it != load_mod_names.end(); ++it) - errorstream << " \"" << (*it) << "\""; - errorstream << std::endl; + if (!modconf.isConsistent()) { + modconf.printUnsatisfiedModsError(); } //lock environment @@ -270,28 +239,25 @@ Server::Server( // Initialize scripting infostream<<"Server: Initializing Lua"<<std::endl; - m_script = new GameScripting(this); - - std::string script_path = getBuiltinLuaPath() + DIR_DELIM "init.lua"; + m_script = new ServerScripting(this); - m_script->loadMod(script_path, BUILTIN_MOD_NAME); + m_script->loadMod(getBuiltinLuaPath() + DIR_DELIM "init.lua", BUILTIN_MOD_NAME); // Print mods infostream << "Server: Loading mods: "; - for(std::vector<ModSpec>::iterator i = m_mods.begin(); + for (std::vector<ModSpec>::const_iterator i = m_mods.begin(); i != m_mods.end(); ++i) { - const ModSpec &mod = *i; - infostream << mod.name << " "; + infostream << (*i).name << " "; } infostream << std::endl; // Load and run "mod" scripts - for (std::vector<ModSpec>::iterator it = m_mods.begin(); + for (std::vector<ModSpec>::const_iterator it = m_mods.begin(); it != m_mods.end(); ++it) { const ModSpec &mod = *it; if (!string_allowed(mod.name, MODNAME_ALLOWED_CHARS)) { throw ModError("Error loading mod \"" + mod.name + "\": Mod name does not follow naming conventions: " - "Only chararacters [a-z0-9_] are allowed."); + "Only characters [a-z0-9_] are allowed."); } std::string script_path = mod.path + DIR_DELIM + "init.lua"; infostream << " [" << padStringRight(mod.name, 12) << "] [\"" @@ -488,7 +454,7 @@ void Server::step(float dtime) g_settings->get("kick_msg_crash"), g_settings->getBool("ask_reconnect_on_crash")); } - throw ServerError(async_err); + throw ServerError("AsyncErr: " + async_err); } } @@ -608,7 +574,7 @@ void Server::AsyncRunStep(bool initial_step) ScopeProfiler sp(g_profiler, "Server: liquid transform"); std::map<v3s16, MapBlock*> modified_blocks; - m_env->getMap().transformLiquids(modified_blocks); + m_env->getMap().transformLiquids(modified_blocks, m_env); #if 0 /* Update lighting @@ -641,10 +607,10 @@ void Server::AsyncRunStep(bool initial_step) // send masterserver announce { float &counter = m_masterserver_timer; - if(!isSingleplayer() && (!counter || counter >= 300.0) && - g_settings->getBool("server_announce")) - { - ServerList::sendAnnounce(counter ? "update" : "start", + if (!isSingleplayer() && (!counter || counter >= 300.0) && + g_settings->getBool("server_announce")) { + ServerList::sendAnnounce(counter ? ServerList::AA_UPDATE : + ServerList::AA_START, m_bind_addr.getPort(), m_clients.getPlayerNames(), m_uptime.get(), @@ -652,7 +618,8 @@ void Server::AsyncRunStep(bool initial_step) m_lag, m_gamespec.id, Mapgen::getMapgenName(m_emerge->mgparams->mgtype), - m_mods); + m_mods, + m_dedicated); counter = 0.01; } counter += dtime; @@ -789,6 +756,18 @@ void Server::AsyncRunStep(bool initial_step) << "packet size is " << pktSize << std::endl; } m_clients.unlock(); + + m_mod_storage_save_timer -= dtime; + if (m_mod_storage_save_timer <= 0.0f) { + infostream << "Saving registered mod storages." << std::endl; + m_mod_storage_save_timer = g_settings->getFloat("server_map_save_interval"); + for (UNORDERED_MAP<std::string, ModMetadata *>::const_iterator + it = m_mod_storages.begin(); it != m_mod_storages.end(); ++it) { + if (it->second->isModified()) { + it->second->save(getModStoragePath()); + } + } + } } /* @@ -1026,6 +1005,39 @@ void Server::AsyncRunStep(bool initial_step) m_env->saveMeta(); } } + + // Timed shutdown + static const float shutdown_msg_times[] = + { + 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 45, 60, 120, 180, 300, 600, 1200, 1800, 3600 + }; + + if (m_shutdown_timer > 0.0f) { + // Automated messages + if (m_shutdown_timer < shutdown_msg_times[ARRLEN(shutdown_msg_times) - 1]) { + for (u16 i = 0; i < ARRLEN(shutdown_msg_times) - 1; i++) { + // If shutdown timer matches an automessage, shot it + if (m_shutdown_timer > shutdown_msg_times[i] && + m_shutdown_timer - dtime < shutdown_msg_times[i]) { + std::wstringstream ws; + + ws << L"*** Server shutting down in " + << duration_to_string(myround(m_shutdown_timer - dtime)).c_str() + << "."; + + infostream << wide_to_utf8(ws.str()).c_str() << std::endl; + SendChatMessage(PEER_ID_INEXISTENT, ws.str()); + break; + } + } + } + + m_shutdown_timer -= dtime; + if (m_shutdown_timer < 0.0f) { + m_shutdown_timer = 0.0f; + m_shutdown_requested = true; + } + } } void Server::Receive() @@ -1076,8 +1088,7 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id) } m_clients.unlock(); - RemotePlayer *player = - static_cast<RemotePlayer*>(m_env->getPlayer(playername.c_str())); + RemotePlayer *player = m_env->getPlayer(playername.c_str()); // If failed, cancel if ((playersao == NULL) || (player == NULL)) { @@ -1109,18 +1120,17 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id) // Send inventory SendInventory(playersao); - // Send HP - SendPlayerHPOrDie(playersao); - - // Send Breath - SendPlayerBreath(peer_id); - - // Show death screen if necessary + // Send HP or death screen if (playersao->isDead()) SendDeathscreen(peer_id, false, v3f(0,0,0)); + else + SendPlayerHPOrDie(playersao); + + // Send Breath + SendPlayerBreath(playersao); // Note things in chat if not in simple singleplayer mode - if(!m_simple_singleplayer_mode) { + if (!m_simple_singleplayer_mode && g_settings->getBool("show_statusline_on_connect")) { // Send information about server to player in chat SendChatMessage(peer_id, getStatusString()); } @@ -1641,7 +1651,7 @@ void Server::SendChatMessage(u16 peer_id, const std::wstring &message) Send(&pkt); } else { - m_clients.sendToAll(0, &pkt, true); + m_clients.sendToAll(&pkt); } } @@ -1663,12 +1673,40 @@ void Server::SendShowFormspecMessage(u16 peer_id, const std::string &formspec, } // Spawns a particle on peer with peer_id -void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f acceleration, +void Server::SendSpawnParticle(u16 peer_id, u16 protocol_version, + v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, bool collisiondetection, bool collision_removal, - bool vertical, const std::string &texture) + bool vertical, const std::string &texture, + const struct TileAnimationParams &animation, u8 glow) { DSTACK(FUNCTION_NAME); + static const float radius = + g_settings->getS16("max_block_send_distance") * MAP_BLOCKSIZE * BS; + + if (peer_id == PEER_ID_INEXISTENT) { + std::vector<u16> clients = m_clients.getClientIDs(); + + for (std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) { + RemotePlayer *player = m_env->getPlayer(*i); + if (!player) + continue; + + PlayerSAO *sao = player->getPlayerSAO(); + if (!sao) + continue; + + // Do not send to distant clients + if (sao->getBasePosition().getDistanceFrom(pos * BS) > radius) + continue; + + SendSpawnParticle(*i, player->protocol_version, + pos, velocity, acceleration, + expirationtime, size, collisiondetection, + collision_removal, vertical, texture, animation, glow); + } + return; + } NetworkPacket pkt(TOCLIENT_SPAWN_PARTICLE, 0, peer_id); @@ -1677,22 +1715,39 @@ void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f accelerat pkt.putLongString(texture); pkt << vertical; pkt << collision_removal; + // This is horrible but required (why are there two ways to serialize pkts?) + std::ostringstream os(std::ios_base::binary); + animation.serialize(os, protocol_version); + pkt.putRawString(os.str()); + pkt << glow; - if (peer_id != PEER_ID_INEXISTENT) { - Send(&pkt); - } - else { - m_clients.sendToAll(0, &pkt, true); - } + Send(&pkt); } // Adds a ParticleSpawner on peer with peer_id -void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3f minpos, v3f maxpos, +void Server::SendAddParticleSpawner(u16 peer_id, u16 protocol_version, + u16 amount, float spawntime, v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, float minexptime, float maxexptime, float minsize, float maxsize, bool collisiondetection, bool collision_removal, - u16 attached_id, bool vertical, const std::string &texture, u32 id) + u16 attached_id, bool vertical, const std::string &texture, u32 id, + const struct TileAnimationParams &animation, u8 glow) { DSTACK(FUNCTION_NAME); + if (peer_id == PEER_ID_INEXISTENT) { + // This sucks and should be replaced: + std::vector<u16> clients = m_clients.getClientIDs(); + for (std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) { + RemotePlayer *player = m_env->getPlayer(*i); + if (!player) + continue; + SendAddParticleSpawner(*i, player->protocol_version, + amount, spawntime, minpos, maxpos, + minvel, maxvel, minacc, maxacc, minexptime, maxexptime, + minsize, maxsize, collisiondetection, collision_removal, + attached_id, vertical, texture, id, animation, glow); + } + return; + } NetworkPacket pkt(TOCLIENT_ADD_PARTICLESPAWNER, 0, peer_id); @@ -1705,13 +1760,13 @@ void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3 pkt << id << vertical; pkt << collision_removal; pkt << attached_id; + // This is horrible but required + std::ostringstream os(std::ios_base::binary); + animation.serialize(os, protocol_version); + pkt.putRawString(os.str()); + pkt << glow; - if (peer_id != PEER_ID_INEXISTENT) { - Send(&pkt); - } - else { - m_clients.sendToAll(0, &pkt, true); - } + Send(&pkt); } void Server::SendDeleteParticleSpawner(u16 peer_id, u32 id) @@ -1727,7 +1782,7 @@ void Server::SendDeleteParticleSpawner(u16 peer_id, u32 id) Send(&pkt); } else { - m_clients.sendToAll(0, &pkt, true); + m_clients.sendToAll(&pkt); } } @@ -1802,7 +1857,8 @@ void Server::SendHUDSetParam(u16 peer_id, u16 param, const std::string &value) } void Server::SendSetSky(u16 peer_id, const video::SColor &bgcolor, - const std::string &type, const std::vector<std::string> ¶ms) + const std::string &type, const std::vector<std::string> ¶ms, + bool &clouds) { NetworkPacket pkt(TOCLIENT_SET_SKY, 0, peer_id); pkt << bgcolor << type << (u16) params.size(); @@ -1810,6 +1866,22 @@ void Server::SendSetSky(u16 peer_id, const video::SColor &bgcolor, for(size_t i=0; i<params.size(); i++) pkt << params[i]; + pkt << clouds; + + Send(&pkt); +} + +void Server::SendCloudParams(u16 peer_id, float density, + const video::SColor &color_bright, + const video::SColor &color_ambient, + float height, + float thickness, + const v2f &speed) +{ + NetworkPacket pkt(TOCLIENT_CLOUD_PARAMS, 0, peer_id); + pkt << density << color_bright << color_ambient + << height << thickness << speed; + Send(&pkt); } @@ -1832,7 +1904,7 @@ void Server::SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed) pkt << time << time_speed; if (peer_id == PEER_ID_INEXISTENT) { - m_clients.sendToAll(0, &pkt, true); + m_clients.sendToAll(&pkt); } else { Send(&pkt); @@ -1857,14 +1929,13 @@ void Server::SendPlayerHP(u16 peer_id) playersao->m_messages_out.push(aom); } -void Server::SendPlayerBreath(u16 peer_id) +void Server::SendPlayerBreath(PlayerSAO *sao) { DSTACK(FUNCTION_NAME); - PlayerSAO *playersao = getPlayerSAO(peer_id); - assert(playersao); + assert(sao); - m_script->player_event(playersao, "breath_changed"); - SendBreath(peer_id, playersao->getBreath()); + m_script->player_event(sao, "breath_changed"); + SendBreath(sao->getPeerID(), sao->getBreath()); } void Server::SendMovePlayer(u16 peer_id) @@ -2018,15 +2089,23 @@ s32 Server::playSound(const SimpleSoundSpec &spec, m_playing_sounds[id] = ServerPlayingSound(); ServerPlayingSound &psound = m_playing_sounds[id]; psound.params = params; + psound.spec = spec; + float gain = params.gain * spec.gain; NetworkPacket pkt(TOCLIENT_PLAY_SOUND, 0); - pkt << id << spec.name << (float) (spec.gain * params.gain) - << (u8) params.type << pos << params.object << params.loop; + pkt << id << spec.name << gain + << (u8) params.type << pos << params.object + << params.loop << params.fade; + + // Backwards compability + bool play_sound = gain > 0; - for(std::vector<u16>::iterator i = dst_clients.begin(); + for (std::vector<u16>::iterator i = dst_clients.begin(); i != dst_clients.end(); ++i) { - psound.clients.insert(*i); - m_clients.send(*i, 0, &pkt, true); + if (play_sound || m_clients.getProtocolVersion(*i) >= 32) { + psound.clients.insert(*i); + m_clients.send(*i, 0, &pkt, true); + } } return id; } @@ -2050,6 +2129,52 @@ void Server::stopSound(s32 handle) m_playing_sounds.erase(i); } +void Server::fadeSound(s32 handle, float step, float gain) +{ + // Get sound reference + UNORDERED_MAP<s32, ServerPlayingSound>::iterator i = + m_playing_sounds.find(handle); + if (i == m_playing_sounds.end()) + return; + + ServerPlayingSound &psound = i->second; + psound.params.gain = gain; + + NetworkPacket pkt(TOCLIENT_FADE_SOUND, 4); + pkt << handle << step << gain; + + // Backwards compability + bool play_sound = gain > 0; + ServerPlayingSound compat_psound = psound; + compat_psound.clients.clear(); + + NetworkPacket compat_pkt(TOCLIENT_STOP_SOUND, 4); + compat_pkt << handle; + + for (UNORDERED_SET<u16>::iterator it = psound.clients.begin(); + it != psound.clients.end();) { + if (m_clients.getProtocolVersion(*it) >= 32) { + // Send as reliable + m_clients.send(*it, 0, &pkt, true); + ++it; + } else { + compat_psound.clients.insert(*it); + // Stop old sound + m_clients.send(*it, 0, &compat_pkt, true); + psound.clients.erase(it++); + } + } + + // Remove sound reference + if (!play_sound || psound.clients.size() == 0) + m_playing_sounds.erase(i); + + if (play_sound && compat_psound.clients.size() > 0) { + // Play new sound volume on older clients + playSound(compat_psound.spec, compat_psound.params); + } +} + void Server::sendRemoveNode(v3s16 p, u16 ignore_id, std::vector<u16> *far_players, float far_d_nodes) { @@ -2113,14 +2238,6 @@ void Server::sendAddNode(v3s16 p, MapNode n, u16 ignore_id, if (client != 0) { pkt << p << n.param0 << n.param1 << n.param2 << (u8) (remove_metadata ? 0 : 1); - - if (!remove_metadata) { - if (client->net_proto_version <= 21) { - // Old clients always clear metadata; fix it - // by sending the full block again. - client->SetBlockNotSent(getNodeBlockPos(p)); - } - } } m_clients.unlock(); @@ -2154,7 +2271,7 @@ void Server::SendBlockNoLock(u16 peer_id, MapBlock *block, u8 ver, u16 net_proto std::ostringstream os(std::ios_base::binary); block->serialize(os, ver, false); - block->serializeNetworkSpecific(os, net_proto_version); + block->serializeNetworkSpecific(os); std::string s = os.str(); NetworkPacket pkt(TOCLIENT_BLOCKDATA, 2 + 2 + 2 + 2 + s.size(), peer_id); @@ -2494,7 +2611,7 @@ void Server::sendDetachedInventory(const std::string &name, u16 peer_id) const std::string &check = m_detached_inventories_player[name]; if (peer_id == PEER_ID_INEXISTENT) { if (check == "") - return m_clients.sendToAll(0, &pkt, true); + return m_clients.sendToAll(&pkt); RemotePlayer *p = m_env->getPlayer(check.c_str()); if (p) m_clients.send(p->peer_id, 0, &pkt, true); @@ -2557,15 +2674,13 @@ void Server::RespawnPlayer(u16 peer_id) playersao->setHP(PLAYER_MAX_HP); playersao->setBreath(PLAYER_MAX_BREATH); - SendPlayerHP(peer_id); - SendPlayerBreath(peer_id); - bool repositioned = m_script->on_respawnplayer(playersao); - if(!repositioned){ - v3f pos = findSpawnPos(); + if (!repositioned) { // setPos will send the new position to client - playersao->setPos(pos); + playersao->setPos(findSpawnPos()); } + + SendPlayerHP(peer_id); } @@ -2761,59 +2876,49 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna RollbackScopeActor rollback_scope(m_rollback, std::string("player:") + name); - // Line to send - std::wstring line; - // Whether to send line to the player that sent the message, or to all players - bool broadcast_line = true; - - // Run script hook - bool ate = m_script->on_chat_message(name, - wide_to_utf8(wmessage)); - // If script ate the message, don't proceed - if (ate) - return L""; - if (player) { switch (player->canSendChatMessage()) { case RPLAYER_CHATRESULT_FLOODING: { std::wstringstream ws; ws << L"You cannot send more messages. You are limited to " - << g_settings->getFloat("chat_message_limit_per_10sec") - << L" messages per 10 seconds."; + << g_settings->getFloat("chat_message_limit_per_10sec") + << L" messages per 10 seconds."; return ws.str(); } case RPLAYER_CHATRESULT_KICK: - DenyAccess_Legacy(player->peer_id, L"You have been kicked due to message flooding."); + DenyAccess_Legacy(player->peer_id, + L"You have been kicked due to message flooding."); return L""; - case RPLAYER_CHATRESULT_OK: break; - default: FATAL_ERROR("Unhandled chat filtering result found."); + case RPLAYER_CHATRESULT_OK: + break; + default: + FATAL_ERROR("Unhandled chat filtering result found."); } } - if (m_max_chatmessage_length > 0 && wmessage.length() > m_max_chatmessage_length) { + if (m_max_chatmessage_length > 0 + && wmessage.length() > m_max_chatmessage_length) { return L"Your message exceed the maximum chat message limit set on the server. " - L"It was refused. Send a shorter message"; + L"It was refused. Send a shorter message"; } - // Commands are implemented in Lua, so only catch invalid - // commands that were not "eaten" and send an error back - if (wmessage[0] == L'/') { - std::wstring wcmd = wmessage.substr(1); + // Run script hook, exit if script ate the chat message + if (m_script->on_chat_message(name, wide_to_utf8(wmessage))) + return L""; + + // Line to send + std::wstring line; + // Whether to send line to the player that sent the message, or to all players + bool broadcast_line = true; + + if (check_shout_priv && !checkPriv(name, "shout")) { + line += L"-!- You don't have permission to shout."; broadcast_line = false; - if (wcmd.length() == 0) - line += L"-!- Empty command"; - else - line += L"-!- Invalid command: " + str_split(wcmd, L' ')[0]; } else { - if (check_shout_priv && !checkPriv(name, "shout")) { - line += L"-!- You don't have permission to shout."; - broadcast_line = false; - } else { - line += L"<"; - line += wname; - line += L"> "; - line += wmessage; - } + line += L"<"; + line += wname; + line += L"> "; + line += wmessage; } /* @@ -2829,7 +2934,15 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna std::vector<u16> clients = m_clients.getClientIDs(); + /* + Send the message back to the inital sender + if they are using protocol version >= 29 + */ + u16 peer_id_to_avoid_sending = (player ? player->peer_id : PEER_ID_INEXISTENT); + if (player && player->protocol_version >= 29) + peer_id_to_avoid_sending = PEER_ID_INEXISTENT; + for (u16 i = 0; i < clients.size(); i++) { u16 cid = clients[i]; if (cid != peer_id_to_avoid_sending) @@ -3130,13 +3243,30 @@ bool Server::setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third) } bool Server::setSky(RemotePlayer *player, const video::SColor &bgcolor, - const std::string &type, const std::vector<std::string> ¶ms) + const std::string &type, const std::vector<std::string> ¶ms, + bool &clouds) +{ + if (!player) + return false; + + player->setSky(bgcolor, type, params, clouds); + SendSetSky(player->peer_id, bgcolor, type, params, clouds); + return true; +} + +bool Server::setClouds(RemotePlayer *player, float density, + const video::SColor &color_bright, + const video::SColor &color_ambient, + float height, + float thickness, + const v2f &speed) { if (!player) return false; - player->setSky(bgcolor, type, params); - SendSetSky(player->peer_id, bgcolor, type, params); + SendCloudParams(player->peer_id, density, + color_bright, color_ambient, height, + thickness, speed); return true; } @@ -3160,23 +3290,25 @@ void Server::spawnParticle(const std::string &playername, v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, bool collisiondetection, bool collision_removal, - bool vertical, const std::string &texture) + bool vertical, const std::string &texture, + const struct TileAnimationParams &animation, u8 glow) { // m_env will be NULL if the server is initializing if (!m_env) return; - u16 peer_id = PEER_ID_INEXISTENT; + u16 peer_id = PEER_ID_INEXISTENT, proto_ver = 0; if (playername != "") { RemotePlayer *player = m_env->getPlayer(playername.c_str()); if (!player) return; peer_id = player->peer_id; + proto_ver = player->protocol_version; } - SendSpawnParticle(peer_id, pos, velocity, acceleration, + SendSpawnParticle(peer_id, proto_ver, pos, velocity, acceleration, expirationtime, size, collisiondetection, - collision_removal, vertical, texture); + collision_removal, vertical, texture, animation, glow); } u32 Server::addParticleSpawner(u16 amount, float spawntime, @@ -3184,18 +3316,20 @@ u32 Server::addParticleSpawner(u16 amount, float spawntime, float minexptime, float maxexptime, float minsize, float maxsize, bool collisiondetection, bool collision_removal, ServerActiveObject *attached, bool vertical, const std::string &texture, - const std::string &playername) + const std::string &playername, const struct TileAnimationParams &animation, + u8 glow) { // m_env will be NULL if the server is initializing if (!m_env) return -1; - u16 peer_id = PEER_ID_INEXISTENT; + u16 peer_id = PEER_ID_INEXISTENT, proto_ver = 0; if (playername != "") { RemotePlayer *player = m_env->getPlayer(playername.c_str()); if (!player) return -1; peer_id = player->peer_id; + proto_ver = player->protocol_version; } u16 attached_id = attached ? attached->getId() : 0; @@ -3206,11 +3340,11 @@ u32 Server::addParticleSpawner(u16 amount, float spawntime, else id = m_env->addParticleSpawner(spawntime, attached_id); - SendAddParticleSpawner(peer_id, amount, spawntime, + SendAddParticleSpawner(peer_id, proto_ver, amount, spawntime, minpos, maxpos, minvel, maxvel, minacc, maxacc, minexptime, maxexptime, minsize, maxsize, collisiondetection, collision_removal, attached_id, vertical, - texture, id); + texture, id, animation, glow); return id; } @@ -3313,29 +3447,12 @@ ICraftDefManager *Server::getCraftDefManager() { return m_craftdef; } -ITextureSource *Server::getTextureSource() -{ - return NULL; -} -IShaderSource *Server::getShaderSource() -{ - return NULL; -} -scene::ISceneManager *Server::getSceneManager() -{ - return NULL; -} u16 Server::allocateUnknownNodeId(const std::string &name) { return m_nodedef->allocateDummy(name); } -ISoundManager *Server::getSoundManager() -{ - return &dummySoundManager; -} - MtEventManager *Server::getEventManager() { return m_event; @@ -3379,6 +3496,11 @@ std::string Server::getBuiltinLuaPath() return porting::path_share + DIR_DELIM + "builtin"; } +std::string Server::getModStoragePath() const +{ + return m_path_world + DIR_DELIM + "mod_storage"; +} + v3f Server::findSpawnPos() { ServerMap &map = m_env->getServerMap(); @@ -3394,8 +3516,8 @@ v3f Server::findSpawnPos() s32 range = 1 + i; // We're going to try to throw the player to this position v2s16 nodepos2d = v2s16( - -range + (myrand() % (range * 2)), - -range + (myrand() % (range * 2))); + -range + (myrand() % (range * 2)), + -range + (myrand() % (range * 2))); // Get spawn level at point s16 spawn_level = m_emerge->getSpawnLevelAtPoint(nodepos2d); @@ -3429,10 +3551,45 @@ v3f Server::findSpawnPos() return nodeposf; } -PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id, u16 proto_version) +void Server::requestShutdown(const std::string &msg, bool reconnect, float delay) { - bool newplayer = false; + m_shutdown_timer = delay; + m_shutdown_msg = msg; + m_shutdown_ask_reconnect = reconnect; + + if (delay == 0.0f) { + // No delay, shutdown immediately + m_shutdown_requested = true; + // only print to the infostream, a chat message saying + // "Server Shutting Down" is sent when the server destructs. + infostream << "*** Immediate Server shutdown requested." << std::endl; + } else if (delay < 0.0f && m_shutdown_timer > 0.0f) { + // Negative delay, cancel shutdown if requested + m_shutdown_timer = 0.0f; + m_shutdown_msg = ""; + m_shutdown_ask_reconnect = false; + m_shutdown_requested = false; + std::wstringstream ws; + + ws << L"*** Server shutdown canceled."; + + infostream << wide_to_utf8(ws.str()).c_str() << std::endl; + SendChatMessage(PEER_ID_INEXISTENT, ws.str()); + } else if (delay > 0.0f) { + // Positive delay, tell the clients when the server will shut down + std::wstringstream ws; + + ws << L"*** Server shutting down in " + << duration_to_string(myround(m_shutdown_timer)).c_str() + << "."; + + infostream << wide_to_utf8(ws.str()).c_str() << std::endl; + SendChatMessage(PEER_ID_INEXISTENT, ws.str()); + } +} +PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id, u16 proto_version) +{ /* Try to get an existing player */ @@ -3453,44 +3610,18 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id, u16 proto_version return NULL; } - // Create a new player active object - PlayerSAO *playersao = new PlayerSAO(m_env, peer_id, isSingleplayer()); - player = m_env->loadPlayer(name, playersao); - - // Create player if it doesn't exist if (!player) { - newplayer = true; - player = new RemotePlayer(name, this->idef()); - // Set player position - infostream<<"Server: Finding spawn place for player \"" - <<name<<"\""<<std::endl; - playersao->setBasePosition(findSpawnPos()); - - // Make sure the player is saved - player->setModified(true); - - // Add player to environment - m_env->addPlayer(player); - } else { - // If the player exists, ensure that they respawn inside legal bounds - // This fixes an assert crash when the player can't be added - // to the environment - if (objectpos_over_limit(playersao->getBasePosition())) { - actionstream << "Respawn position for player \"" - << name << "\" outside limits, resetting" << std::endl; - playersao->setBasePosition(findSpawnPos()); - } + player = new RemotePlayer(name, idef()); } - playersao->initialize(player, getPlayerEffectivePrivs(player->getName())); - - player->protocol_version = proto_version; + bool newplayer = false; - /* Clean up old HUD elements from previous sessions */ - player->clearHud(); + // Load player + PlayerSAO *playersao = m_env->loadPlayer(player, &newplayer, peer_id, isSingleplayer()); - /* Add object to environment */ - m_env->addActiveObject(playersao); + // Complete init with server parts + playersao->finalize(player, getPlayerEffectivePrivs(player->getName())); + player->protocol_version = proto_version; /* Run scripts */ if (newplayer) { @@ -3500,6 +3631,28 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id, u16 proto_version return playersao; } +bool Server::registerModStorage(ModMetadata *storage) +{ + if (m_mod_storages.find(storage->getModName()) != m_mod_storages.end()) { + errorstream << "Unable to register same mod storage twice. Storage name: " + << storage->getModName() << std::endl; + return false; + } + + m_mod_storages[storage->getModName()] = storage; + return true; +} + +void Server::unregisterModStorage(const std::string &name) +{ + UNORDERED_MAP<std::string, ModMetadata *>::const_iterator it = m_mod_storages.find(name); + if (it != m_mod_storages.end()) { + // Save unconditionaly on unregistration + it->second->save(getModStoragePath()); + m_mod_storages.erase(name); + } +} + void dedicated_server_loop(Server &server, bool &kill) { DSTACK(FUNCTION_NAME); @@ -3521,15 +3674,8 @@ void dedicated_server_loop(Server &server, bool &kill) } server.step(steplen); - if(server.getShutdownRequested() || kill) - { - infostream<<"Dedicated server quitting"<<std::endl; -#if USE_CURL - if(g_settings->getBool("server_announce")) - ServerList::sendAnnounce("delete", server.m_bind_addr.getPort()); -#endif + if (server.getShutdownRequested() || kill) break; - } /* Profiler @@ -3543,4 +3689,11 @@ void dedicated_server_loop(Server &server, bool &kill) } } } + + infostream << "Dedicated server quitting" << std::endl; +#if USE_CURL + if (g_settings->getBool("server_announce")) + ServerList::sendAnnounce(ServerList::AA_DELETE, + server.m_bind_addr.getPort()); +#endif } diff --git a/src/server.h b/src/server.h index 4425d139b..2e735e77c 100644 --- a/src/server.h +++ b/src/server.h @@ -29,9 +29,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mods.h" #include "inventorymanager.h" #include "subgame.h" +#include "tileanimation.h" // struct TileAnimationParams #include "util/numeric.h" #include "util/thread.h" -#include "environment.h" +#include "util/basic_macros.h" +#include "serverenvironment.h" #include "chat_interface.h" #include "clientiface.h" #include "remoteplayer.h" @@ -41,8 +43,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <map> #include <vector> -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - class IWritableItemDefManager; class IWritableNodeDefManager; class IWritableCraftDefManager; @@ -53,7 +53,7 @@ class PlayerSAO; class IRollbackManager; struct RollbackAction; class EmergeManager; -class GameScripting; +class ServerScripting; class ServerEnvironment; struct SimpleSoundSpec; class ServerThread; @@ -115,6 +115,7 @@ struct ServerSoundParams u16 object; float max_hear_distance; bool loop; + float fade; ServerSoundParams(): gain(1.0), @@ -123,7 +124,8 @@ struct ServerSoundParams pos(0,0,0), object(0), max_hear_distance(32*BS), - loop(false) + loop(false), + fade(0) {} v3f getPos(ServerEnvironment *env, bool *pos_exists) const; @@ -132,6 +134,7 @@ struct ServerSoundParams struct ServerPlayingSound { ServerSoundParams params; + SimpleSoundSpec spec; UNORDERED_SET<u16> clients; // peer ids }; @@ -148,6 +151,7 @@ public: const SubgameSpec &gamespec, bool simple_singleplayer_mode, bool ipv6, + bool dedicated, ChatInterface *iface = NULL ); ~Server(); @@ -173,7 +177,6 @@ public: void handleCommand_Init_Legacy(NetworkPacket* pkt); void handleCommand_Init2(NetworkPacket* pkt); void handleCommand_RequestMedia(NetworkPacket* pkt); - void handleCommand_ReceivedMedia(NetworkPacket* pkt); void handleCommand_ClientReady(NetworkPacket* pkt); void handleCommand_GotBlocks(NetworkPacket* pkt); void handleCommand_PlayerPos(NetworkPacket* pkt); @@ -181,7 +184,6 @@ public: void handleCommand_InventoryAction(NetworkPacket* pkt); void handleCommand_ChatMessage(NetworkPacket* pkt); void handleCommand_Damage(NetworkPacket* pkt); - void handleCommand_Breath(NetworkPacket* pkt); void handleCommand_Password(NetworkPacket* pkt); void handleCommand_PlayerItem(NetworkPacket* pkt); void handleCommand_Respawn(NetworkPacket* pkt); @@ -226,17 +228,13 @@ public: inline bool getShutdownRequested() const { return m_shutdown_requested; } // request server to shutdown - void requestShutdown(const std::string &msg, bool reconnect) - { - m_shutdown_requested = true; - m_shutdown_msg = msg; - m_shutdown_ask_reconnect = reconnect; - } + void requestShutdown(const std::string &msg, bool reconnect, float delay = 0.0f); // Returns -1 if failed, sound handle on success // Envlock s32 playSound(const SimpleSoundSpec &spec, const ServerSoundParams ¶ms); void stopSound(s32 handle); + void fadeSound(s32 handle, float step, float gain); // Envlock std::set<std::string> getPlayerEffectivePrivs(const std::string &name); @@ -254,7 +252,8 @@ public: v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, bool collisiondetection, bool collision_removal, - bool vertical, const std::string &texture); + bool vertical, const std::string &texture, + const struct TileAnimationParams &animation, u8 glow); u32 addParticleSpawner(u16 amount, float spawntime, v3f minpos, v3f maxpos, @@ -265,7 +264,8 @@ public: bool collisiondetection, bool collision_removal, ServerActiveObject *attached, bool vertical, const std::string &texture, - const std::string &playername); + const std::string &playername, const struct TileAnimationParams &animation, + u8 glow); void deleteParticleSpawner(const std::string &playername, u32 id); @@ -273,7 +273,7 @@ public: Inventory* createDetachedInventory(const std::string &name, const std::string &player=""); // Envlock and conlock should be locked when using scriptapi - GameScripting *getScriptIface(){ return m_script; } + ServerScripting *getScriptIface(){ return m_script; } // actions: time-reversed list // Return value: success/failure @@ -285,24 +285,21 @@ public: virtual IItemDefManager* getItemDefManager(); virtual INodeDefManager* getNodeDefManager(); virtual ICraftDefManager* getCraftDefManager(); - virtual ITextureSource* getTextureSource(); - virtual IShaderSource* getShaderSource(); virtual u16 allocateUnknownNodeId(const std::string &name); - virtual ISoundManager* getSoundManager(); virtual MtEventManager* getEventManager(); - virtual scene::ISceneManager* getSceneManager(); - virtual IRollbackManager *getRollbackManager() { return m_rollback; } + IRollbackManager *getRollbackManager() { return m_rollback; } virtual EmergeManager *getEmergeManager() { return m_emerge; } IWritableItemDefManager* getWritableItemDefManager(); IWritableNodeDefManager* getWritableNodeDefManager(); IWritableCraftDefManager* getWritableCraftDefManager(); - const std::vector<ModSpec> &getMods() const { return m_mods; } - const ModSpec* getModSpec(const std::string &modname) const; + virtual const std::vector<ModSpec> &getMods() const { return m_mods; } + virtual const ModSpec* getModSpec(const std::string &modname) const; void getModNames(std::vector<std::string> &modlist); std::string getBuiltinLuaPath(); - inline std::string getWorldPath() const { return m_path_world; } + virtual std::string getWorldPath() const { return m_path_world; } + virtual std::string getModStoragePath() const; inline bool isSingleplayer() { return m_simple_singleplayer_mode; } @@ -313,6 +310,7 @@ public: bool showFormspec(const char *name, const std::string &formspec, const std::string &formname); Map & getMap() { return m_env->getMap(); } ServerEnvironment & getEnv() { return *m_env; } + v3f findSpawnPos(); u32 hudAdd(RemotePlayer *player, HudElement *element); bool hudRemove(RemotePlayer *player, u32 id); @@ -337,7 +335,14 @@ public: bool setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third); bool setSky(RemotePlayer *player, const video::SColor &bgcolor, - const std::string &type, const std::vector<std::string> ¶ms); + const std::string &type, const std::vector<std::string> ¶ms, + bool &clouds); + bool setClouds(RemotePlayer *player, float density, + const video::SColor &color_bright, + const video::SColor &color_ambient, + float height, + float thickness, + const v2f &speed); bool overrideDayNightRatio(RemotePlayer *player, bool do_override, float brightness); @@ -359,10 +364,13 @@ public: void printToConsoleOnly(const std::string &text); void SendPlayerHPOrDie(PlayerSAO *player); - void SendPlayerBreath(u16 peer_id); + void SendPlayerBreath(PlayerSAO *sao); void SendInventory(PlayerSAO* playerSAO); void SendMovePlayer(u16 peer_id); + virtual bool registerModStorage(ModMetadata *storage); + virtual void unregisterModStorage(const std::string &name); + // Bind address Address m_bind_addr; @@ -403,7 +411,14 @@ private: void SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask); void SendHUDSetParam(u16 peer_id, u16 param, const std::string &value); void SendSetSky(u16 peer_id, const video::SColor &bgcolor, - const std::string &type, const std::vector<std::string> ¶ms); + const std::string &type, const std::vector<std::string> ¶ms, + bool &clouds); + void SendCloudParams(u16 peer_id, float density, + const video::SColor &color_bright, + const video::SColor &color_ambient, + float height, + float thickness, + const v2f &speed); void SendOverrideDayNightRatio(u16 peer_id, bool do_override, float ratio); /* @@ -434,7 +449,8 @@ private: void sendDetachedInventories(u16 peer_id); // Adds a ParticleSpawner on peer with peer_id (PEER_ID_INEXISTENT == all) - void SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, + void SendAddParticleSpawner(u16 peer_id, u16 protocol_version, + u16 amount, float spawntime, v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, @@ -442,16 +458,18 @@ private: float minsize, float maxsize, bool collisiondetection, bool collision_removal, u16 attached_id, - bool vertical, const std::string &texture, u32 id); + bool vertical, const std::string &texture, u32 id, + const struct TileAnimationParams &animation, u8 glow); void SendDeleteParticleSpawner(u16 peer_id, u32 id); // Spawns particle on peer with peer_id (PEER_ID_INEXISTENT == all) - void SendSpawnParticle(u16 peer_id, + void SendSpawnParticle(u16 peer_id, u16 protocol_version, v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, bool collisiondetection, bool collision_removal, - bool vertical, const std::string &texture); + bool vertical, const std::string &texture, + const struct TileAnimationParams &animation, u8 glow); u32 SendActiveObjectRemoveAdd(u16 peer_id, const std::string &datas); void SendActiveObjectMessages(u16 peer_id, const std::string &datas, bool reliable = true); @@ -473,8 +491,6 @@ private: RemotePlayer *player = NULL); void handleAdminChat(const ChatEventChat *evt); - v3f findSpawnPos(); - // When called, connection mutex should be locked RemoteClient* getClient(u16 peer_id,ClientState state_min=CS_Active); RemoteClient* getClientNoEx(u16 peer_id,ClientState state_min=CS_Active); @@ -506,6 +522,8 @@ private: // functionality bool m_simple_singleplayer_mode; u16 m_max_chatmessage_length; + // For "dedicated" server list flag + bool m_dedicated; // Thread can set; step() will throw as ServerError MutexedVariable<std::string> m_async_fatal_error; @@ -536,7 +554,7 @@ private: // Scripting // Envlock and conlock should be locked when using Lua - GameScripting *m_script; + ServerScripting *m_script; // Item definition manager IWritableItemDefManager *m_itemdef; @@ -576,7 +594,6 @@ private: float m_time_of_day_send_timer; // Uptime of server in seconds MutexedVariable<double> m_uptime; - /* Client interface */ @@ -596,6 +613,7 @@ private: bool m_shutdown_requested; std::string m_shutdown_msg; bool m_shutdown_ask_reconnect; + float m_shutdown_timer; ChatInterface *m_admin_chat; std::string m_admin_nick; @@ -651,6 +669,9 @@ private: // value = "" (visible to all players) or player name std::map<std::string, std::string> m_detached_inventories_player; + UNORDERED_MAP<std::string, ModMetadata *> m_mod_storages; + float m_mod_storage_save_timer; + DISABLE_CLASS_COPY(Server); }; diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp new file mode 100644 index 000000000..cbdc747d1 --- /dev/null +++ b/src/serverenvironment.cpp @@ -0,0 +1,2317 @@ +/* +Minetest +Copyright (C) 2010-2017 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "serverenvironment.h" +#include "content_sao.h" +#include "settings.h" +#include "log.h" +#include "nodedef.h" +#include "nodemetadata.h" +#include "gamedef.h" +#include "map.h" +#include "profiler.h" +#include "raycast.h" +#include "remoteplayer.h" +#include "scripting_server.h" +#include "server.h" +#include "voxelalgorithms.h" +#include "util/serialize.h" +#include "util/basic_macros.h" +#include "util/pointedthing.h" +#include "threading/mutex_auto_lock.h" +#include "filesys.h" +#include "gameparams.h" +#include "database-dummy.h" +#include "database-files.h" +#include "database-sqlite3.h" +#if USE_POSTGRESQL +#include "database-postgresql.h" +#endif + +#define LBM_NAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_:" + +// A number that is much smaller than the timeout for particle spawners should/could ever be +#define PARTICLE_SPAWNER_NO_EXPIRY -1024.f + +/* + ABMWithState +*/ + +ABMWithState::ABMWithState(ActiveBlockModifier *abm_): + abm(abm_), + timer(0) +{ + // Initialize timer to random value to spread processing + float itv = abm->getTriggerInterval(); + itv = MYMAX(0.001, itv); // No less than 1ms + int minval = MYMAX(-0.51*itv, -60); // Clamp to + int maxval = MYMIN(0.51*itv, 60); // +-60 seconds + timer = myrand_range(minval, maxval); +} + +/* + LBMManager +*/ + +void LBMContentMapping::deleteContents() +{ + for (std::vector<LoadingBlockModifierDef *>::iterator it = lbm_list.begin(); + it != lbm_list.end(); ++it) { + delete *it; + } +} + +void LBMContentMapping::addLBM(LoadingBlockModifierDef *lbm_def, IGameDef *gamedef) +{ + // Add the lbm_def to the LBMContentMapping. + // Unknown names get added to the global NameIdMapping. + INodeDefManager *nodedef = gamedef->ndef(); + + lbm_list.push_back(lbm_def); + + for (std::set<std::string>::const_iterator it = lbm_def->trigger_contents.begin(); + it != lbm_def->trigger_contents.end(); ++it) { + std::set<content_t> c_ids; + bool found = nodedef->getIds(*it, c_ids); + if (!found) { + content_t c_id = gamedef->allocateUnknownNodeId(*it); + if (c_id == CONTENT_IGNORE) { + // Seems it can't be allocated. + warningstream << "Could not internalize node name \"" << *it + << "\" while loading LBM \"" << lbm_def->name << "\"." << std::endl; + continue; + } + c_ids.insert(c_id); + } + + for (std::set<content_t>::const_iterator iit = + c_ids.begin(); iit != c_ids.end(); ++iit) { + content_t c_id = *iit; + map[c_id].push_back(lbm_def); + } + } +} + +const std::vector<LoadingBlockModifierDef *> * +LBMContentMapping::lookup(content_t c) const +{ + container_map::const_iterator it = map.find(c); + if (it == map.end()) + return NULL; + // This first dereferences the iterator, returning + // a std::vector<LoadingBlockModifierDef *> + // reference, then we convert it to a pointer. + return &(it->second); +} + +LBMManager::~LBMManager() +{ + for (std::map<std::string, LoadingBlockModifierDef *>::iterator it = + m_lbm_defs.begin(); it != m_lbm_defs.end(); ++it) { + delete it->second; + } + for (lbm_lookup_map::iterator it = m_lbm_lookup.begin(); + it != m_lbm_lookup.end(); ++it) { + (it->second).deleteContents(); + } +} + +void LBMManager::addLBMDef(LoadingBlockModifierDef *lbm_def) +{ + // Precondition, in query mode the map isn't used anymore + FATAL_ERROR_IF(m_query_mode == true, + "attempted to modify LBMManager in query mode"); + + if (!string_allowed(lbm_def->name, LBM_NAME_ALLOWED_CHARS)) { + throw ModError("Error adding LBM \"" + lbm_def->name + + "\": Does not follow naming conventions: " + "Only characters [a-z0-9_:] are allowed."); + } + + m_lbm_defs[lbm_def->name] = lbm_def; +} + +void LBMManager::loadIntroductionTimes(const std::string ×, + IGameDef *gamedef, u32 now) +{ + m_query_mode = true; + + // name -> time map. + // Storing it in a map first instead of + // handling the stuff directly in the loop + // removes all duplicate entries. + // TODO make this std::unordered_map + std::map<std::string, u32> introduction_times; + + /* + The introduction times string consists of name~time entries, + with each entry terminated by a semicolon. The time is decimal. + */ + + size_t idx = 0; + size_t idx_new; + while ((idx_new = times.find(";", idx)) != std::string::npos) { + std::string entry = times.substr(idx, idx_new - idx); + std::vector<std::string> components = str_split(entry, '~'); + if (components.size() != 2) + throw SerializationError("Introduction times entry \"" + + entry + "\" requires exactly one '~'!"); + const std::string &name = components[0]; + u32 time = from_string<u32>(components[1]); + introduction_times[name] = time; + idx = idx_new + 1; + } + + // Put stuff from introduction_times into m_lbm_lookup + for (std::map<std::string, u32>::const_iterator it = introduction_times.begin(); + it != introduction_times.end(); ++it) { + const std::string &name = it->first; + u32 time = it->second; + + std::map<std::string, LoadingBlockModifierDef *>::iterator def_it = + m_lbm_defs.find(name); + if (def_it == m_lbm_defs.end()) { + // This seems to be an LBM entry for + // an LBM we haven't loaded. Discard it. + continue; + } + LoadingBlockModifierDef *lbm_def = def_it->second; + if (lbm_def->run_at_every_load) { + // This seems to be an LBM entry for + // an LBM that runs at every load. + // Don't add it just yet. + continue; + } + + m_lbm_lookup[time].addLBM(lbm_def, gamedef); + + // Erase the entry so that we know later + // what elements didn't get put into m_lbm_lookup + m_lbm_defs.erase(name); + } + + // Now also add the elements from m_lbm_defs to m_lbm_lookup + // that weren't added in the previous step. + // They are introduced first time to this world, + // or are run at every load (introducement time hardcoded to U32_MAX). + + LBMContentMapping &lbms_we_introduce_now = m_lbm_lookup[now]; + LBMContentMapping &lbms_running_always = m_lbm_lookup[U32_MAX]; + + for (std::map<std::string, LoadingBlockModifierDef *>::iterator it = + m_lbm_defs.begin(); it != m_lbm_defs.end(); ++it) { + if (it->second->run_at_every_load) { + lbms_running_always.addLBM(it->second, gamedef); + } else { + lbms_we_introduce_now.addLBM(it->second, gamedef); + } + } + + // Clear the list, so that we don't delete remaining elements + // twice in the destructor + m_lbm_defs.clear(); +} + +std::string LBMManager::createIntroductionTimesString() +{ + // Precondition, we must be in query mode + FATAL_ERROR_IF(m_query_mode == false, + "attempted to query on non fully set up LBMManager"); + + std::ostringstream oss; + for (lbm_lookup_map::iterator it = m_lbm_lookup.begin(); + it != m_lbm_lookup.end(); ++it) { + u32 time = it->first; + std::vector<LoadingBlockModifierDef *> &lbm_list = it->second.lbm_list; + for (std::vector<LoadingBlockModifierDef *>::iterator iit = lbm_list.begin(); + iit != lbm_list.end(); ++iit) { + // Don't add if the LBM runs at every load, + // then introducement time is hardcoded + // and doesn't need to be stored + if ((*iit)->run_at_every_load) + continue; + oss << (*iit)->name << "~" << time << ";"; + } + } + return oss.str(); +} + +void LBMManager::applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp) +{ + // Precondition, we need m_lbm_lookup to be initialized + FATAL_ERROR_IF(m_query_mode == false, + "attempted to query on non fully set up LBMManager"); + v3s16 pos_of_block = block->getPosRelative(); + v3s16 pos; + MapNode n; + content_t c; + lbm_lookup_map::const_iterator it = getLBMsIntroducedAfter(stamp); + for (pos.X = 0; pos.X < MAP_BLOCKSIZE; pos.X++) + for (pos.Y = 0; pos.Y < MAP_BLOCKSIZE; pos.Y++) + for (pos.Z = 0; pos.Z < MAP_BLOCKSIZE; pos.Z++) + { + n = block->getNodeNoEx(pos); + c = n.getContent(); + for (LBMManager::lbm_lookup_map::const_iterator iit = it; + iit != m_lbm_lookup.end(); ++iit) { + const std::vector<LoadingBlockModifierDef *> *lbm_list = + iit->second.lookup(c); + if (!lbm_list) + continue; + for (std::vector<LoadingBlockModifierDef *>::const_iterator iit = + lbm_list->begin(); iit != lbm_list->end(); ++iit) { + (*iit)->trigger(env, pos + pos_of_block, n); + } + } + } +} + +/* + ActiveBlockList +*/ + +void fillRadiusBlock(v3s16 p0, s16 r, std::set<v3s16> &list) +{ + v3s16 p; + for(p.X=p0.X-r; p.X<=p0.X+r; p.X++) + for(p.Y=p0.Y-r; p.Y<=p0.Y+r; p.Y++) + for(p.Z=p0.Z-r; p.Z<=p0.Z+r; p.Z++) + { + // limit to a sphere + if (p.getDistanceFrom(p0) <= r) { + // Set in list + list.insert(p); + } + } +} + +void ActiveBlockList::update(std::vector<v3s16> &active_positions, + s16 radius, + std::set<v3s16> &blocks_removed, + std::set<v3s16> &blocks_added) +{ + /* + Create the new list + */ + std::set<v3s16> newlist = m_forceloaded_list; + for(std::vector<v3s16>::iterator i = active_positions.begin(); + i != active_positions.end(); ++i) + { + fillRadiusBlock(*i, radius, newlist); + } + + /* + Find out which blocks on the old list are not on the new list + */ + // Go through old list + for(std::set<v3s16>::iterator i = m_list.begin(); + i != m_list.end(); ++i) + { + v3s16 p = *i; + // If not on new list, it's been removed + if(newlist.find(p) == newlist.end()) + blocks_removed.insert(p); + } + + /* + Find out which blocks on the new list are not on the old list + */ + // Go through new list + for(std::set<v3s16>::iterator i = newlist.begin(); + i != newlist.end(); ++i) + { + v3s16 p = *i; + // If not on old list, it's been added + if(m_list.find(p) == m_list.end()) + blocks_added.insert(p); + } + + /* + Update m_list + */ + m_list.clear(); + for(std::set<v3s16>::iterator i = newlist.begin(); + i != newlist.end(); ++i) + { + v3s16 p = *i; + m_list.insert(p); + } +} + +/* + ServerEnvironment +*/ + +ServerEnvironment::ServerEnvironment(ServerMap *map, + ServerScripting *scriptIface, Server *server, + const std::string &path_world): + Environment(server), + m_map(map), + m_script(scriptIface), + m_server(server), + m_path_world(path_world), + m_send_recommended_timer(0), + m_active_block_interval_overload_skip(0), + m_game_time(0), + m_game_time_fraction_counter(0), + m_last_clear_objects_time(0), + m_recommended_send_interval(0.1), + m_max_lag_estimate(0.1), + m_player_database(NULL) +{ + // Determine which database backend to use + std::string conf_path = path_world + DIR_DELIM + "world.mt"; + Settings conf; + bool succeeded = conf.readConfigFile(conf_path.c_str()); + if (!succeeded || !conf.exists("player_backend")) { + // fall back to files + conf.set("player_backend", "files"); + warningstream << "/!\\ You are using old player file backend. " + << "This backend is deprecated and will be removed in next release /!\\" + << std::endl << "Switching to SQLite3 or PostgreSQL is advised, " + << "please read http://wiki.minetest.net/Database_backends." << std::endl; + + if (!conf.updateConfigFile(conf_path.c_str())) { + errorstream << "ServerEnvironment::ServerEnvironment(): " + << "Failed to update world.mt!" << std::endl; + } + } + + std::string name = ""; + conf.getNoEx("player_backend", name); + m_player_database = openPlayerDatabase(name, path_world, conf); +} + +ServerEnvironment::~ServerEnvironment() +{ + // Clear active block list. + // This makes the next one delete all active objects. + m_active_blocks.clear(); + + // Convert all objects to static and delete the active objects + deactivateFarObjects(true); + + // Drop/delete map + m_map->drop(); + + // Delete ActiveBlockModifiers + for (std::vector<ABMWithState>::iterator + i = m_abms.begin(); i != m_abms.end(); ++i){ + delete i->abm; + } + + // Deallocate players + for (std::vector<RemotePlayer *>::iterator i = m_players.begin(); + i != m_players.end(); ++i) { + delete (*i); + } + + delete m_player_database; +} + +Map & ServerEnvironment::getMap() +{ + return *m_map; +} + +ServerMap & ServerEnvironment::getServerMap() +{ + return *m_map; +} + +RemotePlayer *ServerEnvironment::getPlayer(const u16 peer_id) +{ + for (std::vector<RemotePlayer *>::iterator i = m_players.begin(); + i != m_players.end(); ++i) { + RemotePlayer *player = *i; + if (player->peer_id == peer_id) + return player; + } + return NULL; +} + +RemotePlayer *ServerEnvironment::getPlayer(const char* name) +{ + for (std::vector<RemotePlayer *>::iterator i = m_players.begin(); + i != m_players.end(); ++i) { + RemotePlayer *player = *i; + if (strcmp(player->getName(), name) == 0) + return player; + } + return NULL; +} + +void ServerEnvironment::addPlayer(RemotePlayer *player) +{ + DSTACK(FUNCTION_NAME); + /* + Check that peer_ids are unique. + Also check that names are unique. + Exception: there can be multiple players with peer_id=0 + */ + // If peer id is non-zero, it has to be unique. + if (player->peer_id != 0) + FATAL_ERROR_IF(getPlayer(player->peer_id) != NULL, "Peer id not unique"); + // Name has to be unique. + FATAL_ERROR_IF(getPlayer(player->getName()) != NULL, "Player name not unique"); + // Add. + m_players.push_back(player); +} + +void ServerEnvironment::removePlayer(RemotePlayer *player) +{ + for (std::vector<RemotePlayer *>::iterator it = m_players.begin(); + it != m_players.end(); ++it) { + if ((*it) == player) { + delete *it; + m_players.erase(it); + return; + } + } +} + +bool ServerEnvironment::removePlayerFromDatabase(const std::string &name) +{ + return m_player_database->removePlayer(name); +} + +bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16 *p) +{ + float distance = pos1.getDistanceFrom(pos2); + + //calculate normalized direction vector + v3f normalized_vector = v3f((pos2.X - pos1.X)/distance, + (pos2.Y - pos1.Y)/distance, + (pos2.Z - pos1.Z)/distance); + + //find out if there's a node on path between pos1 and pos2 + for (float i = 1; i < distance; i += stepsize) { + v3s16 pos = floatToInt(v3f(normalized_vector.X * i, + normalized_vector.Y * i, + normalized_vector.Z * i) +pos1,BS); + + MapNode n = getMap().getNodeNoEx(pos); + + if(n.param0 != CONTENT_AIR) { + if (p) { + *p = pos; + } + return false; + } + } + return true; +} + +void ServerEnvironment::kickAllPlayers(AccessDeniedCode reason, + const std::string &str_reason, bool reconnect) +{ + for (std::vector<RemotePlayer *>::iterator it = m_players.begin(); + it != m_players.end(); ++it) { + RemotePlayer *player = dynamic_cast<RemotePlayer *>(*it); + m_server->DenyAccessVerCompliant(player->peer_id, + player->protocol_version, reason, str_reason, reconnect); + } +} + +void ServerEnvironment::saveLoadedPlayers() +{ + std::string players_path = m_path_world + DIR_DELIM + "players"; + fs::CreateDir(players_path); + + for (std::vector<RemotePlayer *>::iterator it = m_players.begin(); + it != m_players.end(); + ++it) { + if ((*it)->checkModified() || + ((*it)->getPlayerSAO() && (*it)->getPlayerSAO()->extendedAttributesModified())) { + try { + m_player_database->savePlayer(*it); + } catch (DatabaseException &e) { + errorstream << "Failed to save player " << (*it)->getName() << " exception: " + << e.what() << std::endl; + throw; + } + } + } +} + +void ServerEnvironment::savePlayer(RemotePlayer *player) +{ + try { + m_player_database->savePlayer(player); + } catch (DatabaseException &e) { + errorstream << "Failed to save player " << player->getName() << " exception: " + << e.what() << std::endl; + throw; + } +} + +PlayerSAO *ServerEnvironment::loadPlayer(RemotePlayer *player, bool *new_player, + u16 peer_id, bool is_singleplayer) +{ + PlayerSAO *playersao = new PlayerSAO(this, player, peer_id, is_singleplayer); + // Create player if it doesn't exist + if (!m_player_database->loadPlayer(player, playersao)) { + *new_player = true; + // Set player position + infostream << "Server: Finding spawn place for player \"" + << player->getName() << "\"" << std::endl; + playersao->setBasePosition(m_server->findSpawnPos()); + + // Make sure the player is saved + player->setModified(true); + } else { + // If the player exists, ensure that they respawn inside legal bounds + // This fixes an assert crash when the player can't be added + // to the environment + if (objectpos_over_limit(playersao->getBasePosition())) { + actionstream << "Respawn position for player \"" + << player->getName() << "\" outside limits, resetting" << std::endl; + playersao->setBasePosition(m_server->findSpawnPos()); + } + } + + // Add player to environment + addPlayer(player); + + /* Clean up old HUD elements from previous sessions */ + player->clearHud(); + + /* Add object to environment */ + addActiveObject(playersao); + + return playersao; +} + +void ServerEnvironment::saveMeta() +{ + std::string path = m_path_world + DIR_DELIM "env_meta.txt"; + + // Open file and serialize + std::ostringstream ss(std::ios_base::binary); + + Settings args; + args.setU64("game_time", m_game_time); + args.setU64("time_of_day", getTimeOfDay()); + args.setU64("last_clear_objects_time", m_last_clear_objects_time); + args.setU64("lbm_introduction_times_version", 1); + args.set("lbm_introduction_times", + m_lbm_mgr.createIntroductionTimesString()); + args.setU64("day_count", m_day_count); + args.writeLines(ss); + ss<<"EnvArgsEnd\n"; + + if(!fs::safeWriteToFile(path, ss.str())) + { + infostream<<"ServerEnvironment::saveMeta(): Failed to write " + <<path<<std::endl; + throw SerializationError("Couldn't save env meta"); + } +} + +void ServerEnvironment::loadMeta() +{ + std::string path = m_path_world + DIR_DELIM "env_meta.txt"; + + // Open file and deserialize + std::ifstream is(path.c_str(), std::ios_base::binary); + if (!is.good()) { + infostream << "ServerEnvironment::loadMeta(): Failed to open " + << path << std::endl; + throw SerializationError("Couldn't load env meta"); + } + + Settings args; + + if (!args.parseConfigLines(is, "EnvArgsEnd")) { + throw SerializationError("ServerEnvironment::loadMeta(): " + "EnvArgsEnd not found!"); + } + + try { + m_game_time = args.getU64("game_time"); + } catch (SettingNotFoundException &e) { + // Getting this is crucial, otherwise timestamps are useless + throw SerializationError("Couldn't load env meta game_time"); + } + + setTimeOfDay(args.exists("time_of_day") ? + // set day to morning by default + args.getU64("time_of_day") : 9000); + + m_last_clear_objects_time = args.exists("last_clear_objects_time") ? + // If missing, do as if clearObjects was never called + args.getU64("last_clear_objects_time") : 0; + + std::string lbm_introduction_times = ""; + try { + u64 ver = args.getU64("lbm_introduction_times_version"); + if (ver == 1) { + lbm_introduction_times = args.get("lbm_introduction_times"); + } else { + infostream << "ServerEnvironment::loadMeta(): Non-supported" + << " introduction time version " << ver << std::endl; + } + } catch (SettingNotFoundException &e) { + // No problem, this is expected. Just continue with an empty string + } + m_lbm_mgr.loadIntroductionTimes(lbm_introduction_times, m_server, m_game_time); + + m_day_count = args.exists("day_count") ? + args.getU64("day_count") : 0; +} + +void ServerEnvironment::loadDefaultMeta() +{ + m_lbm_mgr.loadIntroductionTimes("", m_server, m_game_time); +} + +struct ActiveABM +{ + ActiveBlockModifier *abm; + int chance; + std::set<content_t> required_neighbors; +}; + +class ABMHandler +{ +private: + ServerEnvironment *m_env; + std::vector<std::vector<ActiveABM> *> m_aabms; +public: + ABMHandler(std::vector<ABMWithState> &abms, + float dtime_s, ServerEnvironment *env, + bool use_timers): + m_env(env) + { + if(dtime_s < 0.001) + return; + INodeDefManager *ndef = env->getGameDef()->ndef(); + for(std::vector<ABMWithState>::iterator + i = abms.begin(); i != abms.end(); ++i) { + ActiveBlockModifier *abm = i->abm; + float trigger_interval = abm->getTriggerInterval(); + if(trigger_interval < 0.001) + trigger_interval = 0.001; + float actual_interval = dtime_s; + if(use_timers){ + i->timer += dtime_s; + if(i->timer < trigger_interval) + continue; + i->timer -= trigger_interval; + actual_interval = trigger_interval; + } + float chance = abm->getTriggerChance(); + if(chance == 0) + chance = 1; + ActiveABM aabm; + aabm.abm = abm; + if (abm->getSimpleCatchUp()) { + float intervals = actual_interval / trigger_interval; + if(intervals == 0) + continue; + aabm.chance = chance / intervals; + if(aabm.chance == 0) + aabm.chance = 1; + } else { + aabm.chance = chance; + } + + // Trigger neighbors + const std::set<std::string> &required_neighbors_s = + abm->getRequiredNeighbors(); + for (std::set<std::string>::iterator rn = required_neighbors_s.begin(); + rn != required_neighbors_s.end(); ++rn) { + ndef->getIds(*rn, aabm.required_neighbors); + } + + // Trigger contents + const std::set<std::string> &contents_s = abm->getTriggerContents(); + for (std::set<std::string>::iterator cs = contents_s.begin(); + cs != contents_s.end(); ++cs) { + std::set<content_t> ids; + ndef->getIds(*cs, ids); + for (std::set<content_t>::const_iterator k = ids.begin(); + k != ids.end(); ++k) { + content_t c = *k; + if (c >= m_aabms.size()) + m_aabms.resize(c + 256, NULL); + if (!m_aabms[c]) + m_aabms[c] = new std::vector<ActiveABM>; + m_aabms[c]->push_back(aabm); + } + } + } + } + + ~ABMHandler() + { + for (size_t i = 0; i < m_aabms.size(); i++) + delete m_aabms[i]; + } + + // Find out how many objects the given block and its neighbours contain. + // Returns the number of objects in the block, and also in 'wider' the + // number of objects in the block and all its neighbours. The latter + // may an estimate if any neighbours are unloaded. + u32 countObjects(MapBlock *block, ServerMap * map, u32 &wider) + { + wider = 0; + u32 wider_unknown_count = 0; + for(s16 x=-1; x<=1; x++) + for(s16 y=-1; y<=1; y++) + for(s16 z=-1; z<=1; z++) + { + MapBlock *block2 = map->getBlockNoCreateNoEx( + block->getPos() + v3s16(x,y,z)); + if(block2==NULL){ + wider_unknown_count++; + continue; + } + wider += block2->m_static_objects.m_active.size() + + block2->m_static_objects.m_stored.size(); + } + // Extrapolate + u32 active_object_count = block->m_static_objects.m_active.size(); + u32 wider_known_count = 3*3*3 - wider_unknown_count; + wider += wider_unknown_count * wider / wider_known_count; + return active_object_count; + + } + void apply(MapBlock *block) + { + if(m_aabms.empty() || block->isDummy()) + return; + + ServerMap *map = &m_env->getServerMap(); + + u32 active_object_count_wider; + u32 active_object_count = this->countObjects(block, map, active_object_count_wider); + m_env->m_added_objects = 0; + + v3s16 p0; + for(p0.X=0; p0.X<MAP_BLOCKSIZE; p0.X++) + for(p0.Y=0; p0.Y<MAP_BLOCKSIZE; p0.Y++) + for(p0.Z=0; p0.Z<MAP_BLOCKSIZE; p0.Z++) + { + const MapNode &n = block->getNodeUnsafe(p0); + content_t c = n.getContent(); + + if (c >= m_aabms.size() || !m_aabms[c]) + continue; + + v3s16 p = p0 + block->getPosRelative(); + for(std::vector<ActiveABM>::iterator + i = m_aabms[c]->begin(); i != m_aabms[c]->end(); ++i) { + if(myrand() % i->chance != 0) + continue; + + // Check neighbors + if(!i->required_neighbors.empty()) + { + v3s16 p1; + for(p1.X = p0.X-1; p1.X <= p0.X+1; p1.X++) + for(p1.Y = p0.Y-1; p1.Y <= p0.Y+1; p1.Y++) + for(p1.Z = p0.Z-1; p1.Z <= p0.Z+1; p1.Z++) + { + if(p1 == p0) + continue; + content_t c; + if (block->isValidPosition(p1)) { + // if the neighbor is found on the same map block + // get it straight from there + const MapNode &n = block->getNodeUnsafe(p1); + c = n.getContent(); + } else { + // otherwise consult the map + MapNode n = map->getNodeNoEx(p1 + block->getPosRelative()); + c = n.getContent(); + } + std::set<content_t>::const_iterator k; + k = i->required_neighbors.find(c); + if(k != i->required_neighbors.end()){ + goto neighbor_found; + } + } + // No required neighbor found + continue; + } + neighbor_found: + + // Call all the trigger variations + i->abm->trigger(m_env, p, n); + i->abm->trigger(m_env, p, n, + active_object_count, active_object_count_wider); + + // Count surrounding objects again if the abms added any + if(m_env->m_added_objects > 0) { + active_object_count = countObjects(block, map, active_object_count_wider); + m_env->m_added_objects = 0; + } + } + } + } +}; + +void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime) +{ + // Reset usage timer immediately, otherwise a block that becomes active + // again at around the same time as it would normally be unloaded will + // get unloaded incorrectly. (I think this still leaves a small possibility + // of a race condition between this and server::AsyncRunStep, which only + // some kind of synchronisation will fix, but it at least reduces the window + // of opportunity for it to break from seconds to nanoseconds) + block->resetUsageTimer(); + + // Get time difference + u32 dtime_s = 0; + u32 stamp = block->getTimestamp(); + if (m_game_time > stamp && stamp != BLOCK_TIMESTAMP_UNDEFINED) + dtime_s = m_game_time - stamp; + dtime_s += additional_dtime; + + /*infostream<<"ServerEnvironment::activateBlock(): block timestamp: " + <<stamp<<", game time: "<<m_game_time<<std::endl;*/ + + // Remove stored static objects if clearObjects was called since block's timestamp + if (stamp == BLOCK_TIMESTAMP_UNDEFINED || stamp < m_last_clear_objects_time) { + block->m_static_objects.m_stored.clear(); + // do not set changed flag to avoid unnecessary mapblock writes + } + + // Set current time as timestamp + block->setTimestampNoChangedFlag(m_game_time); + + /*infostream<<"ServerEnvironment::activateBlock(): block is " + <<dtime_s<<" seconds old."<<std::endl;*/ + + // Activate stored objects + activateObjects(block, dtime_s); + + /* Handle LoadingBlockModifiers */ + m_lbm_mgr.applyLBMs(this, block, stamp); + + // Run node timers + std::vector<NodeTimer> elapsed_timers = + block->m_node_timers.step((float)dtime_s); + if (!elapsed_timers.empty()) { + MapNode n; + for (std::vector<NodeTimer>::iterator + i = elapsed_timers.begin(); + i != elapsed_timers.end(); ++i){ + n = block->getNodeNoEx(i->position); + v3s16 p = i->position + block->getPosRelative(); + if (m_script->node_on_timer(p, n, i->elapsed)) + block->setNodeTimer(NodeTimer(i->timeout, 0, i->position)); + } + } + + /* Handle ActiveBlockModifiers */ + ABMHandler abmhandler(m_abms, dtime_s, this, false); + abmhandler.apply(block); +} + +void ServerEnvironment::addActiveBlockModifier(ActiveBlockModifier *abm) +{ + m_abms.push_back(ABMWithState(abm)); +} + +void ServerEnvironment::addLoadingBlockModifierDef(LoadingBlockModifierDef *lbm) +{ + m_lbm_mgr.addLBMDef(lbm); +} + +bool ServerEnvironment::setNode(v3s16 p, const MapNode &n) +{ + INodeDefManager *ndef = m_server->ndef(); + MapNode n_old = m_map->getNodeNoEx(p); + + // Call destructor + if (ndef->get(n_old).has_on_destruct) + m_script->node_on_destruct(p, n_old); + + // Replace node + if (!m_map->addNodeWithEvent(p, n)) + return false; + + // Update active VoxelManipulator if a mapgen thread + m_map->updateVManip(p); + + // Call post-destructor + if (ndef->get(n_old).has_after_destruct) + m_script->node_after_destruct(p, n_old); + + // Call constructor + if (ndef->get(n).has_on_construct) + m_script->node_on_construct(p, n); + + return true; +} + +bool ServerEnvironment::removeNode(v3s16 p) +{ + INodeDefManager *ndef = m_server->ndef(); + MapNode n_old = m_map->getNodeNoEx(p); + + // Call destructor + if (ndef->get(n_old).has_on_destruct) + m_script->node_on_destruct(p, n_old); + + // Replace with air + // This is slightly optimized compared to addNodeWithEvent(air) + if (!m_map->removeNodeWithEvent(p)) + return false; + + // Update active VoxelManipulator if a mapgen thread + m_map->updateVManip(p); + + // Call post-destructor + if (ndef->get(n_old).has_after_destruct) + m_script->node_after_destruct(p, n_old); + + // Air doesn't require constructor + return true; +} + +bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n) +{ + if (!m_map->addNodeWithEvent(p, n, false)) + return false; + + // Update active VoxelManipulator if a mapgen thread + m_map->updateVManip(p); + + return true; +} + +void ServerEnvironment::getObjectsInsideRadius(std::vector<u16> &objects, v3f pos, float radius) +{ + for (ActiveObjectMap::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + ServerActiveObject* obj = i->second; + u16 id = i->first; + v3f objectpos = obj->getBasePosition(); + if (objectpos.getDistanceFrom(pos) > radius) + continue; + objects.push_back(id); + } +} + +void ServerEnvironment::clearObjects(ClearObjectsMode mode) +{ + infostream << "ServerEnvironment::clearObjects(): " + << "Removing all active objects" << std::endl; + std::vector<u16> objects_to_remove; + for (ActiveObjectMap::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + ServerActiveObject* obj = i->second; + if (obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) + continue; + u16 id = i->first; + // Delete static object if block is loaded + if (obj->m_static_exists) { + MapBlock *block = m_map->getBlockNoCreateNoEx(obj->m_static_block); + if (block) { + block->m_static_objects.remove(id); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_CLEAR_ALL_OBJECTS); + obj->m_static_exists = false; + } + } + // If known by some client, don't delete immediately + if (obj->m_known_by_count > 0) { + obj->m_pending_deactivation = true; + obj->m_removed = true; + continue; + } + + // Tell the object about removal + obj->removingFromEnvironment(); + // Deregister in scripting api + m_script->removeObjectReference(obj); + + // Delete active object + if (obj->environmentDeletes()) + delete obj; + // Id to be removed from m_active_objects + objects_to_remove.push_back(id); + } + + // Remove references from m_active_objects + for (std::vector<u16>::iterator i = objects_to_remove.begin(); + i != objects_to_remove.end(); ++i) { + m_active_objects.erase(*i); + } + + // Get list of loaded blocks + std::vector<v3s16> loaded_blocks; + infostream << "ServerEnvironment::clearObjects(): " + << "Listing all loaded blocks" << std::endl; + m_map->listAllLoadedBlocks(loaded_blocks); + infostream << "ServerEnvironment::clearObjects(): " + << "Done listing all loaded blocks: " + << loaded_blocks.size()<<std::endl; + + // Get list of loadable blocks + std::vector<v3s16> loadable_blocks; + if (mode == CLEAR_OBJECTS_MODE_FULL) { + infostream << "ServerEnvironment::clearObjects(): " + << "Listing all loadable blocks" << std::endl; + m_map->listAllLoadableBlocks(loadable_blocks); + infostream << "ServerEnvironment::clearObjects(): " + << "Done listing all loadable blocks: " + << loadable_blocks.size() << std::endl; + } else { + loadable_blocks = loaded_blocks; + } + + infostream << "ServerEnvironment::clearObjects(): " + << "Now clearing objects in " << loadable_blocks.size() + << " blocks" << std::endl; + + // Grab a reference on each loaded block to avoid unloading it + for (std::vector<v3s16>::iterator i = loaded_blocks.begin(); + i != loaded_blocks.end(); ++i) { + v3s16 p = *i; + MapBlock *block = m_map->getBlockNoCreateNoEx(p); + assert(block != NULL); + block->refGrab(); + } + + // Remove objects in all loadable blocks + u32 unload_interval = U32_MAX; + if (mode == CLEAR_OBJECTS_MODE_FULL) { + unload_interval = g_settings->getS32("max_clearobjects_extra_loaded_blocks"); + unload_interval = MYMAX(unload_interval, 1); + } + u32 report_interval = loadable_blocks.size() / 10; + u32 num_blocks_checked = 0; + u32 num_blocks_cleared = 0; + u32 num_objs_cleared = 0; + for (std::vector<v3s16>::iterator i = loadable_blocks.begin(); + i != loadable_blocks.end(); ++i) { + v3s16 p = *i; + MapBlock *block = m_map->emergeBlock(p, false); + if (!block) { + errorstream << "ServerEnvironment::clearObjects(): " + << "Failed to emerge block " << PP(p) << std::endl; + continue; + } + u32 num_stored = block->m_static_objects.m_stored.size(); + u32 num_active = block->m_static_objects.m_active.size(); + if (num_stored != 0 || num_active != 0) { + block->m_static_objects.m_stored.clear(); + block->m_static_objects.m_active.clear(); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_CLEAR_ALL_OBJECTS); + num_objs_cleared += num_stored + num_active; + num_blocks_cleared++; + } + num_blocks_checked++; + + if (report_interval != 0 && + num_blocks_checked % report_interval == 0) { + float percent = 100.0 * (float)num_blocks_checked / + loadable_blocks.size(); + infostream << "ServerEnvironment::clearObjects(): " + << "Cleared " << num_objs_cleared << " objects" + << " in " << num_blocks_cleared << " blocks (" + << percent << "%)" << std::endl; + } + if (num_blocks_checked % unload_interval == 0) { + m_map->unloadUnreferencedBlocks(); + } + } + m_map->unloadUnreferencedBlocks(); + + // Drop references that were added above + for (std::vector<v3s16>::iterator i = loaded_blocks.begin(); + i != loaded_blocks.end(); ++i) { + v3s16 p = *i; + MapBlock *block = m_map->getBlockNoCreateNoEx(p); + assert(block); + block->refDrop(); + } + + m_last_clear_objects_time = m_game_time; + + infostream << "ServerEnvironment::clearObjects(): " + << "Finished: Cleared " << num_objs_cleared << " objects" + << " in " << num_blocks_cleared << " blocks" << std::endl; +} + +void ServerEnvironment::step(float dtime) +{ + DSTACK(FUNCTION_NAME); + + //TimeTaker timer("ServerEnv step"); + + /* Step time of day */ + stepTimeOfDay(dtime); + + // Update this one + // NOTE: This is kind of funny on a singleplayer game, but doesn't + // really matter that much. + static const float server_step = g_settings->getFloat("dedicated_server_step"); + m_recommended_send_interval = server_step; + + /* + Increment game time + */ + { + m_game_time_fraction_counter += dtime; + u32 inc_i = (u32)m_game_time_fraction_counter; + m_game_time += inc_i; + m_game_time_fraction_counter -= (float)inc_i; + } + + /* + Handle players + */ + { + ScopeProfiler sp(g_profiler, "SEnv: handle players avg", SPT_AVG); + for (std::vector<RemotePlayer *>::iterator i = m_players.begin(); + i != m_players.end(); ++i) { + RemotePlayer *player = dynamic_cast<RemotePlayer *>(*i); + assert(player); + + // Ignore disconnected players + if(player->peer_id == 0) + continue; + + // Move + player->move(dtime, this, 100*BS); + } + } + + /* + Manage active block list + */ + if (m_active_blocks_management_interval.step(dtime, m_cache_active_block_mgmt_interval)) { + ScopeProfiler sp(g_profiler, "SEnv: manage act. block list avg per interval", SPT_AVG); + /* + Get player block positions + */ + std::vector<v3s16> players_blockpos; + for (std::vector<RemotePlayer *>::iterator i = m_players.begin(); + i != m_players.end(); ++i) { + RemotePlayer *player = dynamic_cast<RemotePlayer *>(*i); + assert(player); + + // Ignore disconnected players + if (player->peer_id == 0) + continue; + + PlayerSAO *playersao = player->getPlayerSAO(); + assert(playersao); + + v3s16 blockpos = getNodeBlockPos( + floatToInt(playersao->getBasePosition(), BS)); + players_blockpos.push_back(blockpos); + } + + /* + Update list of active blocks, collecting changes + */ + static const s16 active_block_range = g_settings->getS16("active_block_range"); + std::set<v3s16> blocks_removed; + std::set<v3s16> blocks_added; + m_active_blocks.update(players_blockpos, active_block_range, + blocks_removed, blocks_added); + + /* + Handle removed blocks + */ + + // Convert active objects that are no more in active blocks to static + deactivateFarObjects(false); + + for(std::set<v3s16>::iterator + i = blocks_removed.begin(); + i != blocks_removed.end(); ++i) { + v3s16 p = *i; + + /* infostream<<"Server: Block " << PP(p) + << " became inactive"<<std::endl; */ + + MapBlock *block = m_map->getBlockNoCreateNoEx(p); + if(block==NULL) + continue; + + // Set current time as timestamp (and let it set ChangedFlag) + block->setTimestamp(m_game_time); + } + + /* + Handle added blocks + */ + + for(std::set<v3s16>::iterator + i = blocks_added.begin(); + i != blocks_added.end(); ++i) + { + v3s16 p = *i; + + MapBlock *block = m_map->getBlockOrEmerge(p); + if(block==NULL){ + m_active_blocks.m_list.erase(p); + continue; + } + + activateBlock(block); + /* infostream<<"Server: Block " << PP(p) + << " became active"<<std::endl; */ + } + } + + /* + Mess around in active blocks + */ + if (m_active_blocks_nodemetadata_interval.step(dtime, m_cache_nodetimer_interval)) { + ScopeProfiler sp(g_profiler, "SEnv: mess in act. blocks avg per interval", SPT_AVG); + + float dtime = m_cache_nodetimer_interval; + + for(std::set<v3s16>::iterator + i = m_active_blocks.m_list.begin(); + i != m_active_blocks.m_list.end(); ++i) + { + v3s16 p = *i; + + /*infostream<<"Server: Block ("<<p.X<<","<<p.Y<<","<<p.Z + <<") being handled"<<std::endl;*/ + + MapBlock *block = m_map->getBlockNoCreateNoEx(p); + if(block==NULL) + continue; + + // Reset block usage timer + block->resetUsageTimer(); + + // Set current time as timestamp + block->setTimestampNoChangedFlag(m_game_time); + // If time has changed much from the one on disk, + // set block to be saved when it is unloaded + if(block->getTimestamp() > block->getDiskTimestamp() + 60) + block->raiseModified(MOD_STATE_WRITE_AT_UNLOAD, + MOD_REASON_BLOCK_EXPIRED); + + // Run node timers + std::vector<NodeTimer> elapsed_timers = + block->m_node_timers.step((float)dtime); + if (!elapsed_timers.empty()) { + MapNode n; + for (std::vector<NodeTimer>::iterator i = elapsed_timers.begin(); + i != elapsed_timers.end(); ++i) { + n = block->getNodeNoEx(i->position); + p = i->position + block->getPosRelative(); + if (m_script->node_on_timer(p, n, i->elapsed)) { + block->setNodeTimer(NodeTimer( + i->timeout, 0, i->position)); + } + } + } + } + } + + if (m_active_block_modifier_interval.step(dtime, m_cache_abm_interval)) + do{ // breakable + if(m_active_block_interval_overload_skip > 0){ + ScopeProfiler sp(g_profiler, "SEnv: ABM overload skips"); + m_active_block_interval_overload_skip--; + break; + } + ScopeProfiler sp(g_profiler, "SEnv: modify in blocks avg per interval", SPT_AVG); + TimeTaker timer("modify in active blocks per interval"); + + // Initialize handling of ActiveBlockModifiers + ABMHandler abmhandler(m_abms, m_cache_abm_interval, this, true); + + for(std::set<v3s16>::iterator + i = m_active_blocks.m_list.begin(); + i != m_active_blocks.m_list.end(); ++i) + { + v3s16 p = *i; + + /*infostream<<"Server: Block ("<<p.X<<","<<p.Y<<","<<p.Z + <<") being handled"<<std::endl;*/ + + MapBlock *block = m_map->getBlockNoCreateNoEx(p); + if(block == NULL) + continue; + + // Set current time as timestamp + block->setTimestampNoChangedFlag(m_game_time); + + /* Handle ActiveBlockModifiers */ + abmhandler.apply(block); + } + + u32 time_ms = timer.stop(true); + u32 max_time_ms = 200; + if(time_ms > max_time_ms){ + warningstream<<"active block modifiers took " + <<time_ms<<"ms (longer than " + <<max_time_ms<<"ms)"<<std::endl; + m_active_block_interval_overload_skip = (time_ms / max_time_ms) + 1; + } + }while(0); + + /* + Step script environment (run global on_step()) + */ + m_script->environment_Step(dtime); + + /* + Step active objects + */ + { + ScopeProfiler sp(g_profiler, "SEnv: step act. objs avg", SPT_AVG); + //TimeTaker timer("Step active objects"); + + g_profiler->avg("SEnv: num of objects", m_active_objects.size()); + + // This helps the objects to send data at the same time + bool send_recommended = false; + m_send_recommended_timer += dtime; + if(m_send_recommended_timer > getSendRecommendedInterval()) + { + m_send_recommended_timer -= getSendRecommendedInterval(); + send_recommended = true; + } + + for(ActiveObjectMap::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + ServerActiveObject* obj = i->second; + // Don't step if is to be removed or stored statically + if(obj->m_removed || obj->m_pending_deactivation) + continue; + // Step object + obj->step(dtime, send_recommended); + // Read messages from object + while(!obj->m_messages_out.empty()) + { + m_active_object_messages.push( + obj->m_messages_out.front()); + obj->m_messages_out.pop(); + } + } + } + + /* + Manage active objects + */ + if(m_object_management_interval.step(dtime, 0.5)) + { + ScopeProfiler sp(g_profiler, "SEnv: remove removed objs avg /.5s", SPT_AVG); + /* + Remove objects that satisfy (m_removed && m_known_by_count==0) + */ + removeRemovedObjects(); + } + + /* + Manage particle spawner expiration + */ + if (m_particle_management_interval.step(dtime, 1.0)) { + for (UNORDERED_MAP<u32, float>::iterator i = m_particle_spawners.begin(); + i != m_particle_spawners.end(); ) { + //non expiring spawners + if (i->second == PARTICLE_SPAWNER_NO_EXPIRY) { + ++i; + continue; + } + + i->second -= 1.0f; + if (i->second <= 0.f) + m_particle_spawners.erase(i++); + else + ++i; + } + } +} + +u32 ServerEnvironment::addParticleSpawner(float exptime) +{ + // Timers with lifetime 0 do not expire + float time = exptime > 0.f ? exptime : PARTICLE_SPAWNER_NO_EXPIRY; + + u32 id = 0; + for (;;) { // look for unused particlespawner id + id++; + UNORDERED_MAP<u32, float>::iterator f = m_particle_spawners.find(id); + if (f == m_particle_spawners.end()) { + m_particle_spawners[id] = time; + break; + } + } + return id; +} + +u32 ServerEnvironment::addParticleSpawner(float exptime, u16 attached_id) +{ + u32 id = addParticleSpawner(exptime); + m_particle_spawner_attachments[id] = attached_id; + if (ServerActiveObject *obj = getActiveObject(attached_id)) { + obj->attachParticleSpawner(id); + } + return id; +} + +void ServerEnvironment::deleteParticleSpawner(u32 id, bool remove_from_object) +{ + m_particle_spawners.erase(id); + UNORDERED_MAP<u32, u16>::iterator it = m_particle_spawner_attachments.find(id); + if (it != m_particle_spawner_attachments.end()) { + u16 obj_id = (*it).second; + ServerActiveObject *sao = getActiveObject(obj_id); + if (sao != NULL && remove_from_object) { + sao->detachParticleSpawner(id); + } + m_particle_spawner_attachments.erase(id); + } +} + +ServerActiveObject* ServerEnvironment::getActiveObject(u16 id) +{ + ActiveObjectMap::iterator n = m_active_objects.find(id); + return (n != m_active_objects.end() ? n->second : NULL); +} + +bool isFreeServerActiveObjectId(u16 id, ActiveObjectMap &objects) +{ + if (id == 0) + return false; + + return objects.find(id) == objects.end(); +} + +u16 getFreeServerActiveObjectId(ActiveObjectMap &objects) +{ + //try to reuse id's as late as possible + static u16 last_used_id = 0; + u16 startid = last_used_id; + for(;;) + { + last_used_id ++; + if(isFreeServerActiveObjectId(last_used_id, objects)) + return last_used_id; + + if(last_used_id == startid) + return 0; + } +} + +u16 ServerEnvironment::addActiveObject(ServerActiveObject *object) +{ + assert(object); // Pre-condition + m_added_objects++; + u16 id = addActiveObjectRaw(object, true, 0); + return id; +} + +/* + Finds out what new objects have been added to + inside a radius around a position +*/ +void ServerEnvironment::getAddedActiveObjects(PlayerSAO *playersao, s16 radius, + s16 player_radius, + std::set<u16> ¤t_objects, + std::queue<u16> &added_objects) +{ + f32 radius_f = radius * BS; + f32 player_radius_f = player_radius * BS; + + if (player_radius_f < 0) + player_radius_f = 0; + /* + Go through the object list, + - discard m_removed objects, + - discard objects that are too far away, + - discard objects that are found in current_objects. + - add remaining objects to added_objects + */ + for (ActiveObjectMap::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + u16 id = i->first; + + // Get object + ServerActiveObject *object = i->second; + if (object == NULL) + continue; + + // Discard if removed or deactivating + if(object->m_removed || object->m_pending_deactivation) + continue; + + f32 distance_f = object->getBasePosition(). + getDistanceFrom(playersao->getBasePosition()); + if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + // Discard if too far + if (distance_f > player_radius_f && player_radius_f != 0) + continue; + } else if (distance_f > radius_f) + continue; + + // Discard if already on current_objects + std::set<u16>::iterator n; + n = current_objects.find(id); + if(n != current_objects.end()) + continue; + // Add to added_objects + added_objects.push(id); + } +} + +/* + Finds out what objects have been removed from + inside a radius around a position +*/ +void ServerEnvironment::getRemovedActiveObjects(PlayerSAO *playersao, s16 radius, + s16 player_radius, + std::set<u16> ¤t_objects, + std::queue<u16> &removed_objects) +{ + f32 radius_f = radius * BS; + f32 player_radius_f = player_radius * BS; + + if (player_radius_f < 0) + player_radius_f = 0; + /* + Go through current_objects; object is removed if: + - object is not found in m_active_objects (this is actually an + error condition; objects should be set m_removed=true and removed + only after all clients have been informed about removal), or + - object has m_removed=true, or + - object is too far away + */ + for(std::set<u16>::iterator + i = current_objects.begin(); + i != current_objects.end(); ++i) + { + u16 id = *i; + ServerActiveObject *object = getActiveObject(id); + + if (object == NULL) { + infostream << "ServerEnvironment::getRemovedActiveObjects():" + << " object in current_objects is NULL" << std::endl; + removed_objects.push(id); + continue; + } + + if (object->m_removed || object->m_pending_deactivation) { + removed_objects.push(id); + continue; + } + + f32 distance_f = object->getBasePosition().getDistanceFrom(playersao->getBasePosition()); + if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + if (distance_f <= player_radius_f || player_radius_f == 0) + continue; + } else if (distance_f <= radius_f) + continue; + + // Object is no longer visible + removed_objects.push(id); + } +} + +void ServerEnvironment::setStaticForActiveObjectsInBlock( + v3s16 blockpos, bool static_exists, v3s16 static_block) +{ + MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos); + if (!block) + return; + + for (std::map<u16, StaticObject>::iterator + so_it = block->m_static_objects.m_active.begin(); + so_it != block->m_static_objects.m_active.end(); ++so_it) { + // Get the ServerActiveObject counterpart to this StaticObject + ActiveObjectMap::iterator ao_it = m_active_objects.find(so_it->first); + if (ao_it == m_active_objects.end()) { + // If this ever happens, there must be some kind of nasty bug. + errorstream << "ServerEnvironment::setStaticForObjectsInBlock(): " + "Object from MapBlock::m_static_objects::m_active not found " + "in m_active_objects"; + continue; + } + + ServerActiveObject *sao = ao_it->second; + sao->m_static_exists = static_exists; + sao->m_static_block = static_block; + } +} + +ActiveObjectMessage ServerEnvironment::getActiveObjectMessage() +{ + if(m_active_object_messages.empty()) + return ActiveObjectMessage(0); + + ActiveObjectMessage message = m_active_object_messages.front(); + m_active_object_messages.pop(); + return message; +} + +/* + ************ Private methods ************* +*/ + +u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object, + bool set_changed, u32 dtime_s) +{ + assert(object); // Pre-condition + if(object->getId() == 0){ + u16 new_id = getFreeServerActiveObjectId(m_active_objects); + if(new_id == 0) + { + errorstream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"no free ids available"<<std::endl; + if(object->environmentDeletes()) + delete object; + return 0; + } + object->setId(new_id); + } + else{ + verbosestream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"supplied with id "<<object->getId()<<std::endl; + } + + if(!isFreeServerActiveObjectId(object->getId(), m_active_objects)) { + errorstream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"id is not free ("<<object->getId()<<")"<<std::endl; + if(object->environmentDeletes()) + delete object; + return 0; + } + + if (objectpos_over_limit(object->getBasePosition())) { + v3f p = object->getBasePosition(); + warningstream << "ServerEnvironment::addActiveObjectRaw(): " + << "object position (" << p.X << "," << p.Y << "," << p.Z + << ") outside maximum range" << std::endl; + if (object->environmentDeletes()) + delete object; + return 0; + } + + /*infostream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"added (id="<<object->getId()<<")"<<std::endl;*/ + + m_active_objects[object->getId()] = object; + + verbosestream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"Added id="<<object->getId()<<"; there are now " + <<m_active_objects.size()<<" active objects." + <<std::endl; + + // Register reference in scripting api (must be done before post-init) + m_script->addObjectReference(object); + // Post-initialize object + object->addedToEnvironment(dtime_s); + + // Add static data to block + if(object->isStaticAllowed()) + { + // Add static object to active static list of the block + v3f objectpos = object->getBasePosition(); + std::string staticdata = ""; + object->getStaticData(&staticdata); + StaticObject s_obj(object->getType(), objectpos, staticdata); + // Add to the block where the object is located in + v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); + MapBlock *block = m_map->emergeBlock(blockpos); + if(block){ + block->m_static_objects.m_active[object->getId()] = s_obj; + object->m_static_exists = true; + object->m_static_block = blockpos; + + if(set_changed) + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_ADD_ACTIVE_OBJECT_RAW); + } else { + v3s16 p = floatToInt(objectpos, BS); + errorstream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"could not emerge block for storing id="<<object->getId() + <<" statically (pos="<<PP(p)<<")"<<std::endl; + } + } + + return object->getId(); +} + +/* + Remove objects that satisfy (m_removed && m_known_by_count==0) +*/ +void ServerEnvironment::removeRemovedObjects() +{ + std::vector<u16> objects_to_remove; + for(ActiveObjectMap::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + u16 id = i->first; + ServerActiveObject* obj = i->second; + // This shouldn't happen but check it + if(obj == NULL) + { + infostream<<"NULL object found in ServerEnvironment" + <<" while finding removed objects. id="<<id<<std::endl; + // Id to be removed from m_active_objects + objects_to_remove.push_back(id); + continue; + } + + /* + We will delete objects that are marked as removed or thatare + waiting for deletion after deactivation + */ + if (!obj->m_removed && !obj->m_pending_deactivation) + continue; + + /* + Delete static data from block if is marked as removed + */ + if(obj->m_static_exists && obj->m_removed) + { + MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); + if (block) { + block->m_static_objects.remove(id); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_REMOVE_OBJECTS_REMOVE); + obj->m_static_exists = false; + } else { + infostream<<"Failed to emerge block from which an object to " + <<"be removed was loaded from. id="<<id<<std::endl; + } + } + + // If m_known_by_count > 0, don't actually remove. On some future + // invocation this will be 0, which is when removal will continue. + if(obj->m_known_by_count > 0) + continue; + + /* + Move static data from active to stored if not marked as removed + */ + if(obj->m_static_exists && !obj->m_removed){ + MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); + if (block) { + std::map<u16, StaticObject>::iterator i = + block->m_static_objects.m_active.find(id); + if(i != block->m_static_objects.m_active.end()){ + block->m_static_objects.m_stored.push_back(i->second); + block->m_static_objects.m_active.erase(id); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_REMOVE_OBJECTS_DEACTIVATE); + } + } else { + infostream<<"Failed to emerge block from which an object to " + <<"be deactivated was loaded from. id="<<id<<std::endl; + } + } + + // Tell the object about removal + obj->removingFromEnvironment(); + // Deregister in scripting api + m_script->removeObjectReference(obj); + + // Delete + if(obj->environmentDeletes()) + delete obj; + + // Id to be removed from m_active_objects + objects_to_remove.push_back(id); + } + // Remove references from m_active_objects + for(std::vector<u16>::iterator i = objects_to_remove.begin(); + i != objects_to_remove.end(); ++i) { + m_active_objects.erase(*i); + } +} + +static void print_hexdump(std::ostream &o, const std::string &data) +{ + const int linelength = 16; + for(int l=0; ; l++){ + int i0 = linelength * l; + bool at_end = false; + int thislinelength = linelength; + if(i0 + thislinelength > (int)data.size()){ + thislinelength = data.size() - i0; + at_end = true; + } + for(int di=0; di<linelength; di++){ + int i = i0 + di; + char buf[4]; + if(di<thislinelength) + snprintf(buf, 4, "%.2x ", data[i]); + else + snprintf(buf, 4, " "); + o<<buf; + } + o<<" "; + for(int di=0; di<thislinelength; di++){ + int i = i0 + di; + if(data[i] >= 32) + o<<data[i]; + else + o<<"."; + } + o<<std::endl; + if(at_end) + break; + } +} + +/* + Convert stored objects from blocks near the players to active. +*/ +void ServerEnvironment::activateObjects(MapBlock *block, u32 dtime_s) +{ + if(block == NULL) + return; + + // Ignore if no stored objects (to not set changed flag) + if(block->m_static_objects.m_stored.empty()) + return; + + verbosestream<<"ServerEnvironment::activateObjects(): " + <<"activating objects of block "<<PP(block->getPos()) + <<" ("<<block->m_static_objects.m_stored.size() + <<" objects)"<<std::endl; + bool large_amount = (block->m_static_objects.m_stored.size() > g_settings->getU16("max_objects_per_block")); + if (large_amount) { + errorstream<<"suspiciously large amount of objects detected: " + <<block->m_static_objects.m_stored.size()<<" in " + <<PP(block->getPos()) + <<"; removing all of them."<<std::endl; + // Clear stored list + block->m_static_objects.m_stored.clear(); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_TOO_MANY_OBJECTS); + return; + } + + // Activate stored objects + std::vector<StaticObject> new_stored; + for (std::vector<StaticObject>::iterator + i = block->m_static_objects.m_stored.begin(); + i != block->m_static_objects.m_stored.end(); ++i) { + StaticObject &s_obj = *i; + + // Create an active object from the data + ServerActiveObject *obj = ServerActiveObject::create + ((ActiveObjectType) s_obj.type, this, 0, s_obj.pos, s_obj.data); + // If couldn't create object, store static data back. + if(obj == NULL) { + errorstream<<"ServerEnvironment::activateObjects(): " + <<"failed to create active object from static object " + <<"in block "<<PP(s_obj.pos/BS) + <<" type="<<(int)s_obj.type<<" data:"<<std::endl; + print_hexdump(verbosestream, s_obj.data); + + new_stored.push_back(s_obj); + continue; + } + verbosestream<<"ServerEnvironment::activateObjects(): " + <<"activated static object pos="<<PP(s_obj.pos/BS) + <<" type="<<(int)s_obj.type<<std::endl; + // This will also add the object to the active static list + addActiveObjectRaw(obj, false, dtime_s); + } + // Clear stored list + block->m_static_objects.m_stored.clear(); + // Add leftover failed stuff to stored list + for(std::vector<StaticObject>::iterator + i = new_stored.begin(); + i != new_stored.end(); ++i) { + StaticObject &s_obj = *i; + block->m_static_objects.m_stored.push_back(s_obj); + } + + // Turn the active counterparts of activated objects not pending for + // deactivation + for(std::map<u16, StaticObject>::iterator + i = block->m_static_objects.m_active.begin(); + i != block->m_static_objects.m_active.end(); ++i) + { + u16 id = i->first; + ServerActiveObject *object = getActiveObject(id); + assert(object); + object->m_pending_deactivation = false; + } + + /* + Note: Block hasn't really been modified here. + The objects have just been activated and moved from the stored + static list to the active static list. + As such, the block is essentially the same. + Thus, do not call block->raiseModified(MOD_STATE_WRITE_NEEDED). + Otherwise there would be a huge amount of unnecessary I/O. + */ +} + +/* + Convert objects that are not standing inside active blocks to static. + + If m_known_by_count != 0, active object is not deleted, but static + data is still updated. + + If force_delete is set, active object is deleted nevertheless. It + shall only be set so in the destructor of the environment. + + If block wasn't generated (not in memory or on disk), +*/ +void ServerEnvironment::deactivateFarObjects(bool _force_delete) +{ + std::vector<u16> objects_to_remove; + for(ActiveObjectMap::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + // force_delete might be overriden per object + bool force_delete = _force_delete; + + ServerActiveObject* obj = i->second; + assert(obj); + + // Do not deactivate if static data creation not allowed + if(!force_delete && !obj->isStaticAllowed()) + continue; + + // If pending deactivation, let removeRemovedObjects() do it + if(!force_delete && obj->m_pending_deactivation) + continue; + + u16 id = i->first; + v3f objectpos = obj->getBasePosition(); + + // The block in which the object resides in + v3s16 blockpos_o = getNodeBlockPos(floatToInt(objectpos, BS)); + + // If object's static data is stored in a deactivated block and object + // is actually located in an active block, re-save to the block in + // which the object is actually located in. + if(!force_delete && + obj->m_static_exists && + !m_active_blocks.contains(obj->m_static_block) && + m_active_blocks.contains(blockpos_o)) + { + v3s16 old_static_block = obj->m_static_block; + + // Save to block where object is located + MapBlock *block = m_map->emergeBlock(blockpos_o, false); + if(!block){ + errorstream<<"ServerEnvironment::deactivateFarObjects(): " + <<"Could not save object id="<<id + <<" to it's current block "<<PP(blockpos_o) + <<std::endl; + continue; + } + std::string staticdata_new = ""; + obj->getStaticData(&staticdata_new); + StaticObject s_obj(obj->getType(), objectpos, staticdata_new); + block->m_static_objects.insert(id, s_obj); + obj->m_static_block = blockpos_o; + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_STATIC_DATA_ADDED); + + // Delete from block where object was located + block = m_map->emergeBlock(old_static_block, false); + if(!block){ + errorstream<<"ServerEnvironment::deactivateFarObjects(): " + <<"Could not delete object id="<<id + <<" from it's previous block "<<PP(old_static_block) + <<std::endl; + continue; + } + block->m_static_objects.remove(id); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_STATIC_DATA_REMOVED); + continue; + } + + // If block is active, don't remove + if(!force_delete && m_active_blocks.contains(blockpos_o)) + continue; + + verbosestream<<"ServerEnvironment::deactivateFarObjects(): " + <<"deactivating object id="<<id<<" on inactive block " + <<PP(blockpos_o)<<std::endl; + + // If known by some client, don't immediately delete. + bool pending_delete = (obj->m_known_by_count > 0 && !force_delete); + + /* + Update the static data + */ + + if(obj->isStaticAllowed()) + { + // Create new static object + std::string staticdata_new = ""; + obj->getStaticData(&staticdata_new); + StaticObject s_obj(obj->getType(), objectpos, staticdata_new); + + bool stays_in_same_block = false; + bool data_changed = true; + + if (obj->m_static_exists) { + if (obj->m_static_block == blockpos_o) + stays_in_same_block = true; + + MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); + + if (block) { + std::map<u16, StaticObject>::iterator n = + block->m_static_objects.m_active.find(id); + if (n != block->m_static_objects.m_active.end()) { + StaticObject static_old = n->second; + + float save_movem = obj->getMinimumSavedMovement(); + + if (static_old.data == staticdata_new && + (static_old.pos - objectpos).getLength() < save_movem) + data_changed = false; + } else { + errorstream<<"ServerEnvironment::deactivateFarObjects(): " + <<"id="<<id<<" m_static_exists=true but " + <<"static data doesn't actually exist in " + <<PP(obj->m_static_block)<<std::endl; + } + } + } + + bool shall_be_written = (!stays_in_same_block || data_changed); + + // Delete old static object + if(obj->m_static_exists) + { + MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); + if(block) + { + block->m_static_objects.remove(id); + obj->m_static_exists = false; + // Only mark block as modified if data changed considerably + if(shall_be_written) + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_STATIC_DATA_CHANGED); + } + } + + // Add to the block where the object is located in + v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); + // Get or generate the block + MapBlock *block = NULL; + try{ + block = m_map->emergeBlock(blockpos); + } catch(InvalidPositionException &e){ + // Handled via NULL pointer + // NOTE: emergeBlock's failure is usually determined by it + // actually returning NULL + } + + if(block) + { + if (block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")) { + warningstream << "ServerEnv: Trying to store id = " << obj->getId() + << " statically but block " << PP(blockpos) + << " already contains " + << block->m_static_objects.m_stored.size() + << " objects." + << " Forcing delete." << std::endl; + force_delete = true; + } else { + // If static counterpart already exists in target block, + // remove it first. + // This shouldn't happen because the object is removed from + // the previous block before this according to + // obj->m_static_block, but happens rarely for some unknown + // reason. Unsuccessful attempts have been made to find + // said reason. + if(id && block->m_static_objects.m_active.find(id) != block->m_static_objects.m_active.end()){ + warningstream<<"ServerEnv: Performing hack #83274" + <<std::endl; + block->m_static_objects.remove(id); + } + // Store static data + u16 store_id = pending_delete ? id : 0; + block->m_static_objects.insert(store_id, s_obj); + + // Only mark block as modified if data changed considerably + if(shall_be_written) + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_STATIC_DATA_CHANGED); + + obj->m_static_exists = true; + obj->m_static_block = block->getPos(); + } + } + else{ + if(!force_delete){ + v3s16 p = floatToInt(objectpos, BS); + errorstream<<"ServerEnv: Could not find or generate " + <<"a block for storing id="<<obj->getId() + <<" statically (pos="<<PP(p)<<")"<<std::endl; + continue; + } + } + } + + /* + If known by some client, set pending deactivation. + Otherwise delete it immediately. + */ + + if(pending_delete && !force_delete) + { + verbosestream<<"ServerEnvironment::deactivateFarObjects(): " + <<"object id="<<id<<" is known by clients" + <<"; not deleting yet"<<std::endl; + + obj->m_pending_deactivation = true; + continue; + } + + verbosestream<<"ServerEnvironment::deactivateFarObjects(): " + <<"object id="<<id<<" is not known by clients" + <<"; deleting"<<std::endl; + + // Tell the object about removal + obj->removingFromEnvironment(); + // Deregister in scripting api + m_script->removeObjectReference(obj); + + // Delete active object + if(obj->environmentDeletes()) + delete obj; + // Id to be removed from m_active_objects + objects_to_remove.push_back(id); + } + + // Remove references from m_active_objects + for(std::vector<u16>::iterator i = objects_to_remove.begin(); + i != objects_to_remove.end(); ++i) { + m_active_objects.erase(*i); + } +} + +PlayerDatabase *ServerEnvironment::openPlayerDatabase(const std::string &name, + const std::string &savedir, const Settings &conf) +{ + + if (name == "sqlite3") + return new PlayerDatabaseSQLite3(savedir); + else if (name == "dummy") + return new Database_Dummy(); +#if USE_POSTGRESQL + else if (name == "postgresql") { + std::string connect_string = ""; + conf.getNoEx("pgsql_player_connection", connect_string); + return new PlayerDatabasePostgreSQL(connect_string); + } +#endif + else if (name == "files") + return new PlayerDatabaseFiles(savedir + DIR_DELIM + "players"); + else + throw BaseException(std::string("Database backend ") + name + " not supported."); +} + +bool ServerEnvironment::migratePlayersDatabase(const GameParams &game_params, + const Settings &cmd_args) +{ + std::string migrate_to = cmd_args.get("migrate-players"); + Settings world_mt; + std::string world_mt_path = game_params.world_path + DIR_DELIM + "world.mt"; + if (!world_mt.readConfigFile(world_mt_path.c_str())) { + errorstream << "Cannot read world.mt!" << std::endl; + return false; + } + + if (!world_mt.exists("player_backend")) { + errorstream << "Please specify your current backend in world.mt:" + << std::endl + << " player_backend = {files|sqlite3|postgresql}" + << std::endl; + return false; + } + + std::string backend = world_mt.get("player_backend"); + if (backend == migrate_to) { + errorstream << "Cannot migrate: new backend is same" + << " as the old one" << std::endl; + return false; + } + + const std::string players_backup_path = game_params.world_path + DIR_DELIM + + "players.bak"; + + if (backend == "files") { + // Create backup directory + fs::CreateDir(players_backup_path); + } + + try { + PlayerDatabase *srcdb = ServerEnvironment::openPlayerDatabase(backend, + game_params.world_path, world_mt); + PlayerDatabase *dstdb = ServerEnvironment::openPlayerDatabase(migrate_to, + game_params.world_path, world_mt); + + std::vector<std::string> player_list; + srcdb->listPlayers(player_list); + for (std::vector<std::string>::const_iterator it = player_list.begin(); + it != player_list.end(); ++it) { + actionstream << "Migrating player " << it->c_str() << std::endl; + RemotePlayer player(it->c_str(), NULL); + PlayerSAO playerSAO(NULL, &player, 15000, false); + + srcdb->loadPlayer(&player, &playerSAO); + + playerSAO.finalize(&player, std::set<std::string>()); + player.setPlayerSAO(&playerSAO); + + dstdb->savePlayer(&player); + + // For files source, move player files to backup dir + if (backend == "files") { + fs::Rename( + game_params.world_path + DIR_DELIM + "players" + DIR_DELIM + (*it), + players_backup_path + DIR_DELIM + (*it)); + } + } + + actionstream << "Successfully migrated " << player_list.size() << " players" + << std::endl; + world_mt.set("player_backend", migrate_to); + if (!world_mt.updateConfigFile(world_mt_path.c_str())) + errorstream << "Failed to update world.mt!" << std::endl; + else + actionstream << "world.mt updated" << std::endl; + + // When migration is finished from file backend, remove players directory if empty + if (backend == "files") { + fs::DeleteSingleFileOrEmptyDirectory(game_params.world_path + DIR_DELIM + + "players"); + } + + delete srcdb; + delete dstdb; + + } catch (BaseException &e) { + errorstream << "An error occured during migration: " << e.what() << std::endl; + return false; + } + return true; +} diff --git a/src/serverenvironment.h b/src/serverenvironment.h new file mode 100644 index 000000000..7c370fd54 --- /dev/null +++ b/src/serverenvironment.h @@ -0,0 +1,438 @@ +/* +Minetest +Copyright (C) 2010-2017 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef SERVER_ENVIRONMENT_HEADER +#define SERVER_ENVIRONMENT_HEADER + +#include "environment.h" +#include "mapnode.h" +#include "mapblock.h" +#include <set> + +class IGameDef; +class ServerMap; +struct GameParams; +class RemotePlayer; +class PlayerDatabase; +class PlayerSAO; +class ServerEnvironment; +class ActiveBlockModifier; +class ServerActiveObject; +class Server; +class ServerScripting; + +/* + {Active, Loading} block modifier interface. + + These are fed into ServerEnvironment at initialization time; + ServerEnvironment handles deleting them. +*/ + +class ActiveBlockModifier +{ +public: + ActiveBlockModifier(){}; + virtual ~ActiveBlockModifier(){}; + + // Set of contents to trigger on + virtual const std::set<std::string> &getTriggerContents() const = 0; + // Set of required neighbors (trigger doesn't happen if none are found) + // Empty = do not check neighbors + virtual const std::set<std::string> &getRequiredNeighbors() const = 0; + // Trigger interval in seconds + virtual float getTriggerInterval() = 0; + // Random chance of (1 / return value), 0 is disallowed + virtual u32 getTriggerChance() = 0; + // Whether to modify chance to simulate time lost by an unnattended block + virtual bool getSimpleCatchUp() = 0; + // This is called usually at interval for 1/chance of the nodes + virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){}; + virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, + u32 active_object_count, u32 active_object_count_wider){}; +}; + +struct ABMWithState +{ + ActiveBlockModifier *abm; + float timer; + + ABMWithState(ActiveBlockModifier *abm_); +}; + +struct LoadingBlockModifierDef +{ + // Set of contents to trigger on + std::set<std::string> trigger_contents; + std::string name; + bool run_at_every_load; + + virtual ~LoadingBlockModifierDef() {} + virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){}; +}; + +struct LBMContentMapping +{ + typedef std::map<content_t, std::vector<LoadingBlockModifierDef *> > container_map; + container_map map; + + std::vector<LoadingBlockModifierDef *> lbm_list; + + // Needs to be separate method (not inside destructor), + // because the LBMContentMapping may be copied and destructed + // many times during operation in the lbm_lookup_map. + void deleteContents(); + void addLBM(LoadingBlockModifierDef *lbm_def, IGameDef *gamedef); + const std::vector<LoadingBlockModifierDef *> *lookup(content_t c) const; +}; + +class LBMManager +{ +public: + LBMManager(): + m_query_mode(false) + {} + + ~LBMManager(); + + // Don't call this after loadIntroductionTimes() ran. + void addLBMDef(LoadingBlockModifierDef *lbm_def); + + void loadIntroductionTimes(const std::string ×, + IGameDef *gamedef, u32 now); + + // Don't call this before loadIntroductionTimes() ran. + std::string createIntroductionTimesString(); + + // Don't call this before loadIntroductionTimes() ran. + void applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp); + + // Warning: do not make this std::unordered_map, order is relevant here + typedef std::map<u32, LBMContentMapping> lbm_lookup_map; + +private: + // Once we set this to true, we can only query, + // not modify + bool m_query_mode; + + // For m_query_mode == false: + // The key of the map is the LBM def's name. + // TODO make this std::unordered_map + std::map<std::string, LoadingBlockModifierDef *> m_lbm_defs; + + // For m_query_mode == true: + // The key of the map is the LBM def's first introduction time. + lbm_lookup_map m_lbm_lookup; + + // Returns an iterator to the LBMs that were introduced + // after the given time. This is guaranteed to return + // valid values for everything + lbm_lookup_map::const_iterator getLBMsIntroducedAfter(u32 time) + { return m_lbm_lookup.lower_bound(time); } +}; + +/* + List of active blocks, used by ServerEnvironment +*/ + +class ActiveBlockList +{ +public: + void update(std::vector<v3s16> &active_positions, + s16 radius, + std::set<v3s16> &blocks_removed, + std::set<v3s16> &blocks_added); + + bool contains(v3s16 p){ + return (m_list.find(p) != m_list.end()); + } + + void clear(){ + m_list.clear(); + } + + std::set<v3s16> m_list; + std::set<v3s16> m_forceloaded_list; + +private: +}; + +/* + Operation mode for ServerEnvironment::clearObjects() +*/ +enum ClearObjectsMode { + // Load and go through every mapblock, clearing objects + CLEAR_OBJECTS_MODE_FULL, + + // Clear objects immediately in loaded mapblocks; + // clear objects in unloaded mapblocks only when the mapblocks are next activated. + CLEAR_OBJECTS_MODE_QUICK, +}; + +/* + The server-side environment. + + This is not thread-safe. Server uses an environment mutex. +*/ + +typedef UNORDERED_MAP<u16, ServerActiveObject *> ActiveObjectMap; + +class ServerEnvironment : public Environment +{ +public: + ServerEnvironment(ServerMap *map, ServerScripting *scriptIface, + Server *server, const std::string &path_world); + ~ServerEnvironment(); + + Map & getMap(); + + ServerMap & getServerMap(); + + //TODO find way to remove this fct! + ServerScripting* getScriptIface() + { return m_script; } + + Server *getGameDef() + { return m_server; } + + float getSendRecommendedInterval() + { return m_recommended_send_interval; } + + void kickAllPlayers(AccessDeniedCode reason, + const std::string &str_reason, bool reconnect); + // Save players + void saveLoadedPlayers(); + void savePlayer(RemotePlayer *player); + PlayerSAO *loadPlayer(RemotePlayer *player, bool *new_player, u16 peer_id, + bool is_singleplayer); + void addPlayer(RemotePlayer *player); + void removePlayer(RemotePlayer *player); + bool removePlayerFromDatabase(const std::string &name); + + /* + Save and load time of day and game timer + */ + void saveMeta(); + void loadMeta(); + // to be called instead of loadMeta if + // env_meta.txt doesn't exist (e.g. new world) + void loadDefaultMeta(); + + u32 addParticleSpawner(float exptime); + u32 addParticleSpawner(float exptime, u16 attached_id); + void deleteParticleSpawner(u32 id, bool remove_from_object = true); + + /* + External ActiveObject interface + ------------------------------------------- + */ + + ServerActiveObject* getActiveObject(u16 id); + + /* + Add an active object to the environment. + Environment handles deletion of object. + Object may be deleted by environment immediately. + If id of object is 0, assigns a free id to it. + Returns the id of the object. + Returns 0 if not added and thus deleted. + */ + u16 addActiveObject(ServerActiveObject *object); + + /* + Add an active object as a static object to the corresponding + MapBlock. + Caller allocates memory, ServerEnvironment frees memory. + Return value: true if succeeded, false if failed. + (note: not used, pending removal from engine) + */ + //bool addActiveObjectAsStatic(ServerActiveObject *object); + + /* + Find out what new objects have been added to + inside a radius around a position + */ + void getAddedActiveObjects(PlayerSAO *playersao, s16 radius, + s16 player_radius, + std::set<u16> ¤t_objects, + std::queue<u16> &added_objects); + + /* + Find out what new objects have been removed from + inside a radius around a position + */ + void getRemovedActiveObjects(PlayerSAO *playersao, s16 radius, + s16 player_radius, + std::set<u16> ¤t_objects, + std::queue<u16> &removed_objects); + + /* + Get the next message emitted by some active object. + Returns a message with id=0 if no messages are available. + */ + ActiveObjectMessage getActiveObjectMessage(); + + /* + Activate objects and dynamically modify for the dtime determined + from timestamp and additional_dtime + */ + void activateBlock(MapBlock *block, u32 additional_dtime=0); + + /* + {Active,Loading}BlockModifiers + ------------------------------------------- + */ + + void addActiveBlockModifier(ActiveBlockModifier *abm); + void addLoadingBlockModifierDef(LoadingBlockModifierDef *lbm); + + /* + Other stuff + ------------------------------------------- + */ + + // Script-aware node setters + bool setNode(v3s16 p, const MapNode &n); + bool removeNode(v3s16 p); + bool swapNode(v3s16 p, const MapNode &n); + + // Find all active objects inside a radius around a point + void getObjectsInsideRadius(std::vector<u16> &objects, v3f pos, float radius); + + // Clear objects, loading and going through every MapBlock + void clearObjects(ClearObjectsMode mode); + + // This makes stuff happen + void step(f32 dtime); + + //check if there's a line of sight between two positions + bool line_of_sight(v3f pos1, v3f pos2, float stepsize=1.0, v3s16 *p=NULL); + + u32 getGameTime() const { return m_game_time; } + + void reportMaxLagEstimate(float f) { m_max_lag_estimate = f; } + float getMaxLagEstimate() { return m_max_lag_estimate; } + + std::set<v3s16>* getForceloadedBlocks() { return &m_active_blocks.m_forceloaded_list; }; + + // Sets the static object status all the active objects in the specified block + // This is only really needed for deleting blocks from the map + void setStaticForActiveObjectsInBlock(v3s16 blockpos, + bool static_exists, v3s16 static_block=v3s16(0,0,0)); + + RemotePlayer *getPlayer(const u16 peer_id); + RemotePlayer *getPlayer(const char* name); + + static bool migratePlayersDatabase(const GameParams &game_params, + const Settings &cmd_args); +private: + + static PlayerDatabase *openPlayerDatabase(const std::string &name, + const std::string &savedir, const Settings &conf); + /* + Internal ActiveObject interface + ------------------------------------------- + */ + + /* + Add an active object to the environment. + + Called by addActiveObject. + + Object may be deleted by environment immediately. + If id of object is 0, assigns a free id to it. + Returns the id of the object. + Returns 0 if not added and thus deleted. + */ + u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed, u32 dtime_s); + + /* + Remove all objects that satisfy (m_removed && m_known_by_count==0) + */ + void removeRemovedObjects(); + + /* + Convert stored objects from block to active + */ + void activateObjects(MapBlock *block, u32 dtime_s); + + /* + Convert objects that are not in active blocks to static. + + If m_known_by_count != 0, active object is not deleted, but static + data is still updated. + + If force_delete is set, active object is deleted nevertheless. It + shall only be set so in the destructor of the environment. + */ + void deactivateFarObjects(bool force_delete); + + /* + Member variables + */ + + // The map + ServerMap *m_map; + // Lua state + ServerScripting* m_script; + // Server definition + Server *m_server; + // World path + const std::string m_path_world; + // Active object list + ActiveObjectMap m_active_objects; + // Outgoing network message buffer for active objects + std::queue<ActiveObjectMessage> m_active_object_messages; + // Some timers + float m_send_recommended_timer; + IntervalLimiter m_object_management_interval; + // List of active blocks + ActiveBlockList m_active_blocks; + IntervalLimiter m_active_blocks_management_interval; + IntervalLimiter m_active_block_modifier_interval; + IntervalLimiter m_active_blocks_nodemetadata_interval; + int m_active_block_interval_overload_skip; + // Time from the beginning of the game in seconds. + // Incremented in step(). + u32 m_game_time; + // A helper variable for incrementing the latter + float m_game_time_fraction_counter; + // Time of last clearObjects call (game time). + // When a mapblock older than this is loaded, its objects are cleared. + u32 m_last_clear_objects_time; + // Active block modifiers + std::vector<ABMWithState> m_abms; + LBMManager m_lbm_mgr; + // An interval for generally sending object positions and stuff + float m_recommended_send_interval; + // Estimate for general maximum lag as determined by server. + // Can raise to high values like 15s with eg. map generation mods. + float m_max_lag_estimate; + + // peer_ids in here should be unique, except that there may be many 0s + std::vector<RemotePlayer*> m_players; + + PlayerDatabase *m_player_database; + + // Particles + IntervalLimiter m_particle_management_interval; + UNORDERED_MAP<u32, float> m_particle_spawners; + UNORDERED_MAP<u32, u16> m_particle_spawner_attachments; +}; + +#endif diff --git a/src/serverlist.cpp b/src/serverlist.cpp index 87ca5dc04..cc38ec8ce 100644 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -196,7 +196,7 @@ const std::string serializeJson(const std::vector<ServerListSpec> &serverlist) #if USE_CURL -void sendAnnounce(const std::string &action, +void sendAnnounce(AnnounceAction action, const u16 port, const std::vector<std::string> &clients_names, const double uptime, @@ -204,15 +204,17 @@ void sendAnnounce(const std::string &action, const float lag, const std::string &gameid, const std::string &mg_name, - const std::vector<ModSpec> &mods) + const std::vector<ModSpec> &mods, + bool dedicated) { + static const char *aa_names[] = {"start", "update", "delete"}; Json::Value server; - server["action"] = action; + server["action"] = aa_names[action]; server["port"] = port; if (g_settings->exists("server_address")) { server["address"] = g_settings->get("server_address"); } - if (action != "delete") { + if (action != AA_DELETE) { bool strict_checking = g_settings->getBool("strict_protocol_version_checking"); server["name"] = g_settings->get("server_name"); server["description"] = g_settings->get("server_description"); @@ -237,20 +239,19 @@ void sendAnnounce(const std::string &action, if (gameid != "") server["gameid"] = gameid; } - if (action == "start") { - server["dedicated"] = g_settings->getBool("server_dedicated"); + if (action == AA_START) { + server["dedicated"] = dedicated; server["rollback"] = g_settings->getBool("enable_rollback_recording"); server["mapgen"] = mg_name; server["privs"] = g_settings->get("default_privs"); server["can_see_far_names"] = g_settings->getS16("player_transfer_distance") <= 0; server["mods"] = Json::Value(Json::arrayValue); for (std::vector<ModSpec>::const_iterator it = mods.begin(); - it != mods.end(); - ++it) { + it != mods.end(); ++it) { server["mods"].append(it->name); } actionstream << "Announcing to " << g_settings->get("serverlist_url") << std::endl; - } else { + } else if (action == AA_UPDATE) { if (lag) server["lag"] = lag; } @@ -264,4 +265,5 @@ void sendAnnounce(const std::string &action, } #endif -} //namespace ServerList +} // namespace ServerList + diff --git a/src/serverlist.h b/src/serverlist.h index 0747c3920..079026199 100644 --- a/src/serverlist.h +++ b/src/serverlist.h @@ -29,22 +29,27 @@ typedef Json::Value ServerListSpec; namespace ServerList { - std::vector<ServerListSpec> getLocal(); - std::vector<ServerListSpec> getOnline(); - bool deleteEntry(const ServerListSpec &server); - bool insert(const ServerListSpec &server); - std::vector<ServerListSpec> deSerialize(const std::string &liststring); - const std::string serialize(const std::vector<ServerListSpec> &serverlist); - std::vector<ServerListSpec> deSerializeJson(const std::string &liststring); - const std::string serializeJson(const std::vector<ServerListSpec> &serverlist); - #if USE_CURL - void sendAnnounce(const std::string &action, const u16 port, - const std::vector<std::string> &clients_names = std::vector<std::string>(), - const double uptime = 0, const u32 game_time = 0, - const float lag = 0, const std::string &gameid = "", - const std::string &mg_name = "", - const std::vector<ModSpec> &mods = std::vector<ModSpec>()); - #endif -} // ServerList namespace +std::vector<ServerListSpec> getLocal(); +std::vector<ServerListSpec> getOnline(); + +bool deleteEntry(const ServerListSpec &server); +bool insert(const ServerListSpec &server); + +std::vector<ServerListSpec> deSerialize(const std::string &liststring); +const std::string serialize(const std::vector<ServerListSpec> &serverlist); +std::vector<ServerListSpec> deSerializeJson(const std::string &liststring); +const std::string serializeJson(const std::vector<ServerListSpec> &serverlist); + +#if USE_CURL +enum AnnounceAction {AA_START, AA_UPDATE, AA_DELETE}; +void sendAnnounce(AnnounceAction, u16 port, + const std::vector<std::string> &clients_names = std::vector<std::string>(), + double uptime = 0, u32 game_time = 0, float lag = 0, + const std::string &gameid = "", const std::string &mg_name = "", + const std::vector<ModSpec> &mods = std::vector<ModSpec>(), + bool dedicated = false); +#endif + +} // namespace ServerList #endif diff --git a/src/serverobject.h b/src/serverobject.h index 9884eb0a1..38204980e 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -119,10 +119,10 @@ public: when it is created (converted from static to active - actually the data is the static form) */ - virtual std::string getStaticData() + virtual void getStaticData(std::string *result) const { assert(isStaticAllowed()); - return ""; + *result = ""; } /* Return false in here to never save and instead remove object @@ -146,8 +146,8 @@ public: virtual void setArmorGroups(const ItemGroupList &armor_groups) {} - virtual ItemGroupList getArmorGroups() - { return ItemGroupList(); } + virtual const ItemGroupList &getArmorGroups() + { static const ItemGroupList rv; return rv; } virtual void setPhysicsOverride(float physics_override_speed, float physics_override_jump, float physics_override_gravity) {} virtual void setAnimation(v2f frames, float frame_speed, float frame_blend, bool frame_loop) @@ -166,8 +166,8 @@ public: {} virtual void removeAttachmentChild(int child_id) {} - virtual UNORDERED_SET<int> getAttachmentChildIds() - { return UNORDERED_SET<int>(); } + virtual const UNORDERED_SET<int> &getAttachmentChildIds() + { static const UNORDERED_SET<int> rv; return rv; } virtual ObjectProperties* accessObjectProperties() { return NULL; } virtual void notifyObjectPropertiesModified() diff --git a/src/settings.cpp b/src/settings.cpp index c4c3c9073..b4083264e 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -90,33 +90,6 @@ bool Settings::checkValueValid(const std::string &value) return true; } - -std::string Settings::sanitizeName(const std::string &name) -{ - std::string n = trim(name); - - for (const char *s = "=\"{}#"; *s; s++) - n.erase(std::remove(n.begin(), n.end(), *s), n.end()); - - return n; -} - - -std::string Settings::sanitizeValue(const std::string &value) -{ - std::string v(value); - size_t p = 0; - - if (v.substr(0, 3) == "\"\"\"") - v.erase(0, 3); - - while ((p = v.find("\n\"\"\"")) != std::string::npos) - v.erase(p, 4); - - return v; -} - - std::string Settings::getMultiline(std::istream &is, size_t *num_lines) { size_t lines = 1; @@ -398,7 +371,7 @@ Settings *Settings::getGroup(const std::string &name) const } -std::string Settings::get(const std::string &name) const +const std::string &Settings::get(const std::string &name) const { const SettingsEntry &entry = getEntry(name); if (entry.is_group) diff --git a/src/settings.h b/src/settings.h index b19733514..8c4f6e559 100644 --- a/src/settings.h +++ b/src/settings.h @@ -74,24 +74,21 @@ struct ValueSpec { }; struct SettingsEntry { - SettingsEntry() - { - group = NULL; - is_group = false; - } - - SettingsEntry(const std::string &value_) - { - value = value_; - group = NULL; - is_group = false; - } - - SettingsEntry(Settings *group_) - { - group = group_; - is_group = true; - } + SettingsEntry() : + group(NULL), + is_group(false) + {} + + SettingsEntry(const std::string &value_) : + value(value_), + group(NULL), + is_group(false) + {} + + SettingsEntry(Settings *group_) : + group(group_), + is_group(true) + {} std::string value; Settings *group; @@ -129,8 +126,6 @@ public: static bool checkNameValid(const std::string &name); static bool checkValueValid(const std::string &value); - static std::string sanitizeName(const std::string &name); - static std::string sanitizeValue(const std::string &value); static std::string getMultiline(std::istream &is, size_t *num_lines=NULL); static void printEntry(std::ostream &os, const std::string &name, const SettingsEntry &entry, u32 tab_depth=0); @@ -141,7 +136,7 @@ public: const SettingsEntry &getEntry(const std::string &name) const; Settings *getGroup(const std::string &name) const; - std::string get(const std::string &name) const; + const std::string &get(const std::string &name) const; bool getBool(const std::string &name) const; u16 getU16(const std::string &name) const; s16 getS16(const std::string &name) const; diff --git a/src/settings_translation_file.cpp b/src/settings_translation_file.cpp index 39223d9ce..383da33a7 100644 --- a/src/settings_translation_file.cpp +++ b/src/settings_translation_file.cpp @@ -37,6 +37,10 @@ fake_function() { gettext("Continuous forward movement (only used for testing)."); gettext("Enable Joysticks"); gettext("Enable Joysticks"); + gettext("Joystick ID"); + gettext("The identifier of the joystick to use"); + gettext("Joystick Type"); + gettext("The type of joystick"); gettext("Joystick button repetition interval"); gettext("The time in seconds it takes between repeated events\nwhen holding down a joystick button combination."); gettext("Joystick frustum sensitivity"); @@ -61,6 +65,8 @@ fake_function() { gettext("Key for opening the chat window.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); gettext("Command key"); gettext("Key for opening the chat window to type commands.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Command key"); + gettext("Key for opening the chat window to type local commands.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); gettext("Console key"); gettext("Key for opening the chat console.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); gettext("Range select key"); @@ -71,6 +77,16 @@ fake_function() { gettext("Key for toggling fast mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); gettext("Noclip key"); gettext("Key for toggling noclip mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar next key"); + gettext("Key for selecting the next item in the hotbar.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar previous key"); + gettext("Key for selecting the previous item in the hotbar.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Mute key"); + gettext("Key for muting the game.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Inc. volume key"); + gettext("Key for increasing the volume.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Dec. volume key"); + gettext("Key for decreasing the volume.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); gettext("Autorun key"); gettext("Key for toggling autorun.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); gettext("Cinematic mode key"); @@ -81,10 +97,14 @@ fake_function() { gettext("Key for taking screenshots.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); gettext("Drop item key"); gettext("Key for dropping the currently selected item.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("View zoom key"); + gettext("Key to use view zoom when possible.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); gettext("HUD toggle key"); gettext("Key for toggling the display of the HUD.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); gettext("Chat toggle key"); gettext("Key for toggling the display of the chat.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Large chat console key"); + gettext("Key for toggling the display of the large chat console.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); gettext("Fog toggle key"); gettext("Key for toggling the display of the fog.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); gettext("Camera update toggle key"); @@ -114,6 +134,8 @@ fake_function() { gettext("Show entity selection boxes"); gettext("Connect to external media server"); gettext("Enable usage of remote media server (if provided by server).\nRemote servers offer a significantly faster way to download media (e.g. textures)\nwhen connecting to the server."); + gettext("Client modding"); + gettext("Enable Lua modding support on client.\nThis support is experimental and API can change."); gettext("Serverlist URL"); gettext("URL to the server list displayed in the Multiplayer Tab."); gettext("Serverlist file"); @@ -137,6 +159,8 @@ fake_function() { gettext("Use 3D cloud look instead of flat."); gettext("Node highlighting"); gettext("Method used to highlight selected object."); + gettext("Digging particles"); + gettext("Adds particles when digging a node."); gettext("Filtering"); gettext("Mipmapping"); gettext("Use mip mapping to scale textures. May slightly increase performance."); @@ -152,9 +176,13 @@ fake_function() { gettext("When using bilinear/trilinear/anisotropic filters, low-resolution textures\ncan be blurred, so automatically upscale them with nearest-neighbor\ninterpolation to preserve crisp pixels. This sets the minimum texture size\nfor the upscaled textures; higher values look sharper, but require more\nmemory. Powers of 2 are recommended. Setting this higher than 1 may not\nhave a visible effect unless bilinear/trilinear/anisotropic filtering is\nenabled."); gettext("FSAA"); gettext("Experimental option, might cause visible spaces between blocks\nwhen set to higher number than 0."); + gettext("Undersampling"); + gettext("Undersampling is similar to using lower screen resolution, but it applies\nto the game world only, keeping the GUI intact.\nIt should give significant performance boost at the cost of less detailed image."); gettext("Shaders"); gettext("Shaders"); - gettext("Shaders allow advanced visual effects and may increase performance on some video cards.\nThy only work with the OpenGL video backend."); + gettext("Shaders allow advanced visual effects and may increase performance on some video cards.\nThis only works with the OpenGL video backend."); + gettext("Shader path"); + gettext("Path to shader directory. If no path is defined, default location will be used."); gettext("Tone Mapping"); gettext("Filmic tone mapping"); gettext("Enables filmic tone mapping"); @@ -212,7 +240,7 @@ fake_function() { gettext("Field of view for zoom"); gettext("Field of view while zooming in degrees.\nThis requires the \"zoom\" privilege on the server."); gettext("Gamma"); - gettext("Adjust the gamma encoding for the light tables. Lower numbers are brighter.\nThis setting is for the client only and is ignored by the server."); + gettext("Adjust the gamma encoding for the light tables. Higher numbers are brighter.\nThis setting is for the client only and is ignored by the server."); gettext("Texture path"); gettext("Path to texture directory. All textures are first searched from here."); gettext("Video driver"); @@ -221,12 +249,16 @@ fake_function() { gettext("Height on which clouds are appearing."); gettext("Cloud radius"); gettext("Radius of cloud area stated in number of 64 node cloud squares.\nValues larger than 26 will start to produce sharp cutoffs at cloud area corners."); - gettext("View bobbing"); - gettext("Multiplier for view bobbing.\nFor example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."); - gettext("Fall bobbing"); + gettext("Enable view bobbing"); + gettext("Enables view bobbing when walking."); + gettext("View bobbing factor"); + gettext("Enable view bobbing and amount of view bobbing.\nFor example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."); + gettext("Fall bobbing factor"); gettext("Multiplier for fall bobbing.\nFor example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."); gettext("3D mode"); gettext("3D support.\nCurrently supported:\n- none: no 3d output.\n- anaglyph: cyan/magenta color 3d.\n- interlaced: odd/even line based polarisation screen support.\n- topbottom: split screen top/bottom.\n- sidebyside: split screen side by side.\n- pageflip: quadbuffer based 3d."); + gettext("Console height"); + gettext("In-game chat console height, between 0.1 (10%) and 1.0 (100%)."); gettext("Console color"); gettext("In-game chat console background color (R,G,B)."); gettext("Console alpha"); @@ -243,8 +275,14 @@ fake_function() { gettext("Whether node texture animations should be desynchronized per mapblock."); gettext("Maximum hotbar width"); gettext("Maximum proportion of current window to be used for hotbar.\nUseful if there's something to be displayed right or left of hotbar."); + gettext("HUD scale factor"); + gettext("Modifies the size of the hudbar elements."); gettext("Mesh cache"); gettext("Enables caching of facedir rotated meshes."); + gettext("Mapblock mesh generation delay"); + gettext("Delay between mesh updates on the client in ms. Increasing this will slow\ndown the rate of mesh updates, thus reducing jitter on slower clients."); + gettext("Mapblock mesh generator's MapBlock cache size MB"); + gettext("Size of the MapBlock cache of the mesh generator. Increasing this will\nincrease the cache hit %, reducing the data being copied from the main\nthread, thus reducing jitter."); gettext("Minimap"); gettext("Enables minimap."); gettext("Round minimap"); @@ -257,8 +295,12 @@ fake_function() { gettext("The strength (darkness) of node ambient-occlusion shading.\nLower is darker, Higher is lighter. The valid range of values for this\nsetting is 0.25 to 4.0 inclusive. If the value is out of range it will be\nset to the nearest valid value."); gettext("Inventory items animations"); gettext("Enables animation of inventory items."); + gettext("Inventory image hack"); + gettext("Android systems only: Tries to create inventory textures from meshes\nwhen no supported render was found."); gettext("Fog Start"); gettext("Fraction of the visible distance at which fog starts to be rendered"); + gettext("Opaque liquids"); + gettext("Makes all liquids opaque"); gettext("Menus"); gettext("Clouds in menu"); gettext("Use a cloud animation for the main menu background."); @@ -295,6 +337,8 @@ fake_function() { gettext("Advanced"); gettext("DPI"); gettext("Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens."); + gettext("Enable console window"); + gettext("Windows systems only: Start Minetest with the command line window in the background.\nContains the same information as the file debug.txt (default name)."); gettext("Sound"); gettext("Sound"); gettext("Volume"); @@ -351,8 +395,12 @@ fake_function() { gettext("World directory (everything in the world is stored here).\nNot needed if starting from the main menu."); gettext("Item entity TTL"); gettext("Time in seconds for item entity (dropped items) to live.\nSetting it to -1 disables the feature."); + gettext("Status message on connection"); + gettext("If enabled, show the server status message on player connection."); gettext("Damage"); gettext("Enable players getting damage and dying."); + gettext("Creative"); + gettext("Enable creative mode for new created maps."); gettext("Fixed map seed"); gettext("A chosen map seed for a new map, leave empty for random.\nWill be overridden when creating a new world in the main menu."); gettext("Default password"); @@ -438,6 +486,8 @@ fake_function() { gettext("Liquid update interval in seconds."); gettext("block send optimize distance"); gettext("At this distance the server will aggressively optimize which blocks are sent to clients.\nSmall values potentially improve performance a lot, at the expense of visible rendering glitches.\n(some blocks will not be rendered under water and in caves, as well as sometimes on land)\nSetting this to a value greater than max_block_send_distance disables this optimization.\nStated in mapblocks (16 nodes)"); + gettext("Server side occlusion culling"); + gettext("If enabled the server will perform map block occlusion culling based on\non the eye position of the player. This can reduce the number of blocks\nsent to the client 50-80%. The client will not longer receive most invisible\nso that the utility of noclip mode is reduced."); gettext("Mapgen"); gettext("Mapgen name"); gettext("Name of map generator to be used when creating a new world.\nCreating a world in the main menu will override this."); @@ -446,7 +496,7 @@ fake_function() { gettext("Max block generate distance"); gettext("From how far blocks are generated for clients, stated in mapblocks (16 nodes)."); gettext("Map generation limit"); - gettext("Where the map generator stops.\nPlease note:\n- Limited to 31000 (setting above has no effect)\n- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n- Those groups have an offset of -32, -32 nodes from the origin.\n- Only groups which are within the map_generation_limit are generated"); + gettext("Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\nOnly mapchunks completely within the mapgen limit are generated.\nValue is stored per-world."); gettext("Mapgen flags"); gettext("Global map generation attributes.\nIn Mapgen v6 the 'decorations' flag controls all decorations except trees\nand junglegrass, in all other mapgens this flag controls all decorations.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them."); gettext("Advanced"); @@ -462,109 +512,168 @@ fake_function() { gettext("Maximum number of blocks to be queued that are to be generated.\nSet to blank for an appropriate amount to be chosen automatically."); gettext("Number of emerge threads"); gettext("Number of emerge threads to use. Make this field blank, or increase this number\nto use multiple threads. On multiprocessor systems, this will improve mapgen speed greatly\nat the cost of slightly buggy caves."); - gettext("Mapgen biome heat noise parameters"); - gettext("Noise parameters for biome API temperature, humidity and biome blend."); - gettext("Mapgen heat blend noise parameters"); - gettext("Mapgen biome humidity noise parameters"); - gettext("Mapgen biome humidity blend noise parameters"); + gettext("Biome API temperature and humidity noise parameters"); + gettext("Heat noise"); + gettext("Temperature variation for biomes."); + gettext("Heat blend noise"); + gettext("Small-scale temperature variation for blending biomes on borders."); + gettext("Humidity noise"); + gettext("Humidity variation for biomes."); + gettext("Humidity blend noise"); + gettext("Small-scale humidity variation for blending biomes on borders."); gettext("Mapgen v5"); - gettext("Mapgen v5 cave width"); + gettext("Mapgen v5 specific flags"); + gettext("Map generation attributes specific to Mapgen v5.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them."); + gettext("Cave width"); gettext("Controls width of tunnels, a smaller value creates wider tunnels."); - gettext("Mapgen v5 filler depth noise parameters"); - gettext("Mapgen v5 factor noise parameters"); - gettext("Mapgen v5 height noise parameters"); - gettext("Mapgen v5 cave1 noise parameters"); - gettext("Mapgen v5 cave2 noise parameters"); + gettext("Cavern limit"); + gettext("Y-level of cavern upper limit."); + gettext("Cavern taper"); + gettext("Y-distance over which caverns expand to full size."); + gettext("Cavern threshold"); + gettext("Defines full size of caverns, smaller values create larger caverns."); + gettext("Filler depth noise"); + gettext("Variation of biome filler depth."); + gettext("Factor noise"); + gettext("Variation of terrain vertical scale.\nWhen noise is < -0.55 terrain is near-flat."); + gettext("Height noise"); + gettext("Y-level of average terrain surface."); + gettext("Cave1 noise"); + gettext("First of 2 3D noises that together define tunnels."); + gettext("Cave2 noise"); + gettext("Second of 2 3D noises that together define tunnels."); + gettext("Cavern noise"); + gettext("3D noise defining giant caverns."); gettext("Mapgen v6"); - gettext("Mapgen v6 flags"); - gettext("Map generation attributes specific to Mapgen v6.\nWhen snowbiomes are enabled jungles are automatically enabled, the 'jungles' flag is ignored.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them."); - gettext("Mapgen v6 desert frequency"); - gettext("Controls size of deserts and beaches in Mapgen v6.\nWhen snowbiomes are enabled 'mgv6_freq_desert' is ignored."); - gettext("Mapgen v6 beach frequency"); - gettext("Mapgen v6 terrain base noise parameters"); - gettext("Mapgen v6 terrain altitude noise parameters"); - gettext("Mapgen v6 steepness noise parameters"); - gettext("Mapgen v6 height select noise parameters"); - gettext("Mapgen v6 mud noise parameters"); - gettext("Mapgen v6 beach noise parameters"); - gettext("Mapgen v6 biome noise parameters"); - gettext("Mapgen v6 cave noise parameters"); - gettext("Mapgen v6 humidity noise parameters"); - gettext("Mapgen v6 trees noise parameters"); - gettext("Mapgen v6 apple trees noise parameters"); + gettext("Mapgen v6 specific flags"); + gettext("Map generation attributes specific to Mapgen v6.\nThe 'snowbiomes' flag enables the new 5 biome system.\nWhen the new biome system is enabled jungles are automatically enabled and\nthe 'jungles' flag is ignored.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them."); + gettext("Desert noise threshold"); + gettext("Deserts occur when np_biome exceeds this value.\nWhen the new biome system is enabled, this is ignored."); + gettext("Beach noise threshold"); + gettext("Sandy beaches occur when np_beach exceeds this value."); + gettext("Terrain base noise"); + gettext("Y-level of lower terrain and lakebeds."); + gettext("Terrain higher noise"); + gettext("Y-level of higher (cliff-top) terrain."); + gettext("Steepness noise"); + gettext("Varies steepness of cliffs."); + gettext("Height select noise"); + gettext("Defines areas of 'terrain_higher' (cliff-top terrain)."); + gettext("Mud noise"); + gettext("Varies depth of biome surface nodes."); + gettext("Beach noise"); + gettext("Defines areas with sandy beaches."); + gettext("Biome noise"); + gettext("Temperature variation for biomes."); + gettext("Cave noise"); + gettext("Variation of number of caves."); + gettext("Humidity noise"); + gettext("Humidity variation for biomes."); + gettext("Trees noise"); + gettext("Defines tree areas and tree density."); + gettext("Apple trees noise"); + gettext("Defines areas where trees have apples."); gettext("Mapgen v7"); - gettext("Mapgen v7 flags"); + gettext("Mapgen v7 specific flags"); gettext("Map generation attributes specific to Mapgen v7.\nThe 'ridges' flag enables the rivers.\nFloatlands are currently experimental and subject to change.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them."); - gettext("Mapgen v7 cave width"); + gettext("Cave width"); gettext("Controls width of tunnels, a smaller value creates wider tunnels."); - gettext("Mapgen v7 floatland mountain density"); + gettext("Floatland mountain density"); gettext("Controls the density of floatland mountain terrain.\nIs an offset added to the 'np_mountain' noise value."); - gettext("Mapgen v7 floatland mountain height"); + gettext("Floatland mountain height"); gettext("Typical maximum height, above and below midpoint, of floatland mountain terrain."); - gettext("Mapgen v7 floatland level"); + gettext("Floatland level"); gettext("Y-level of floatland midpoint and lake surface."); - gettext("Mapgen v7 shadow limit"); + gettext("Shadow limit"); gettext("Y-level to which floatland shadows extend."); - gettext("Mapgen v7 terrain base noise parameters"); - gettext("Mapgen v7 terrain altitude noise parameters"); - gettext("Mapgen v7 terrain persistation noise parameters"); - gettext("Mapgen v7 height select noise parameters"); - gettext("Mapgen v7 filler depth noise parameters"); - gettext("Mapgen v7 mount height noise parameters"); - gettext("Mapgen v7 river course noise parameters"); - gettext("Mapgen v7 floatland base terrain noise parameters"); - gettext("Mapgen v7 floatland base terrain height noise parameters"); - gettext("Mapgen v7 mountain noise parameters"); - gettext("Mapgen v7 river channel wall noise parameters"); - gettext("Mapgen v7 cave1 noise parameters"); - gettext("Mapgen v7 cave2 noise parameters"); + gettext("Cavern limit"); + gettext("Y-level of cavern upper limit."); + gettext("Cavern taper"); + gettext("Y-distance over which caverns expand to full size."); + gettext("Cavern threshold"); + gettext("Defines full size of caverns, smaller values create larger caverns."); + gettext("Terrain base noise"); + gettext("Y-level of higher (cliff-top) terrain."); + gettext("Terrain alt noise"); + gettext("Y-level of lower terrain and lakebeds."); + gettext("Terrain persistence noise"); + gettext("Varies roughness of terrain.\nDefines the 'persistence' value for terrain_base and terrain_alt noises."); + gettext("Height select noise"); + gettext("Defines areas of higher (cliff-top) terrain and affects steepness of cliffs."); + gettext("Filler depth noise"); + gettext("Variation of biome filler depth."); + gettext("Mountain height noise"); + gettext("Variation of maximum mountain height (in nodes)."); + gettext("Ridge underwater noise"); + gettext("Defines large-scale river channel structure."); + gettext("Floatland base noise"); + gettext("Defines areas of floatland smooth terrain.\nSmooth floatlands occur when noise > 0."); + gettext("Floatland base height noise"); + gettext("Variation of hill height and lake depth on floatland smooth terrain."); + gettext("Mountain noise"); + gettext("3D noise defining mountain structure and height.\nAlso defines structure of floatland mountain terrain."); + gettext("Ridge noise"); + gettext("3D noise defining structure of river canyon walls."); + gettext("Cavern noise"); + gettext("3D noise defining giant caverns."); + gettext("Cave1 noise"); + gettext("First of 2 3D noises that together define tunnels."); + gettext("Cave2 noise"); + gettext("Second of 2 3D noises that together define tunnels."); gettext("Mapgen flat"); - gettext("Mapgen flat flags"); + gettext("Mapgen flat specific flags"); gettext("Map generation attributes specific to Mapgen flat.\nOccasional lakes and hills can be added to the flat world.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them."); - gettext("Mapgen flat ground level"); + gettext("Ground level"); gettext("Y of flat ground."); - gettext("Mapgen flat large cave depth"); + gettext("Large cave depth"); gettext("Y of upper limit of large pseudorandom caves."); - gettext("Mapgen flat cave width"); + gettext("Cave width"); gettext("Controls width of tunnels, a smaller value creates wider tunnels."); - gettext("Mapgen flat lake threshold"); + gettext("Lake threshold"); gettext("Terrain noise threshold for lakes.\nControls proportion of world area covered by lakes.\nAdjust towards 0.0 for a larger proportion."); - gettext("Mapgen flat lake steepness"); + gettext("Lake steepness"); gettext("Controls steepness/depth of lake depressions."); - gettext("Mapgen flat hill threshold"); + gettext("Hill threshold"); gettext("Terrain noise threshold for hills.\nControls proportion of world area covered by hills.\nAdjust towards 0.0 for a larger proportion."); - gettext("Mapgen flat hill steepness"); + gettext("Hill steepness"); gettext("Controls steepness/height of hills."); - gettext("Mapgen flat terrain noise parameters"); - gettext("Determines terrain shape.\nThe 3 numbers in brackets control the scale of the\nterrain, the 3 numbers should be identical."); - gettext("Mapgen flat filler depth noise parameters"); - gettext("Mapgen flat cave1 noise parameters"); - gettext("Mapgen flat cave2 noise parameters"); + gettext("Terrain noise"); + gettext("Defines location and terrain of optional hills and lakes."); + gettext("Filler depth noise"); + gettext("Variation of biome filler depth."); + gettext("Cave1 noise"); + gettext("First of 2 3D noises that together define tunnels."); + gettext("Cave2 noise"); + gettext("Second of 2 3D noises that together define tunnels."); gettext("Mapgen fractal"); - gettext("Mapgen fractal cave width"); + gettext("Cave width"); gettext("Controls width of tunnels, a smaller value creates wider tunnels."); - gettext("Mapgen fractal fractal"); + gettext("Fractal type"); gettext("Choice of 18 fractals from 9 formulas.\n1 = 4D \"Roundy\" mandelbrot set.\n2 = 4D \"Roundy\" julia set.\n3 = 4D \"Squarry\" mandelbrot set.\n4 = 4D \"Squarry\" julia set.\n5 = 4D \"Mandy Cousin\" mandelbrot set.\n6 = 4D \"Mandy Cousin\" julia set.\n7 = 4D \"Variation\" mandelbrot set.\n8 = 4D \"Variation\" julia set.\n9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot set.\n10 = 3D \"Mandelbrot/Mandelbar\" julia set.\n11 = 3D \"Christmas Tree\" mandelbrot set.\n12 = 3D \"Christmas Tree\" julia set.\n13 = 3D \"Mandelbulb\" mandelbrot set.\n14 = 3D \"Mandelbulb\" julia set.\n15 = 3D \"Cosine Mandelbulb\" mandelbrot set.\n16 = 3D \"Cosine Mandelbulb\" julia set.\n17 = 4D \"Mandelbulb\" mandelbrot set.\n18 = 4D \"Mandelbulb\" julia set."); - gettext("Mapgen fractal iterations"); + gettext("Iterations"); gettext("Iterations of the recursive function.\nControls the amount of fine detail."); - gettext("Mapgen fractal scale"); + gettext("Scale"); gettext("Approximate (X,Y,Z) scale of fractal in nodes."); - gettext("Mapgen fractal offset"); + gettext("Offset"); gettext("(X,Y,Z) offset of fractal from world centre in units of 'scale'.\nUsed to move a suitable spawn area of low land close to (0, 0).\nThe default is suitable for mandelbrot sets, it needs to be edited for julia sets.\nRange roughly -2 to 2. Multiply by 'scale' for offset in nodes."); - gettext("Mapgen fractal slice w"); + gettext("Slice w"); gettext("W co-ordinate of the generated 3D slice of a 4D fractal.\nDetermines which 3D slice of the 4D shape is generated.\nHas no effect on 3D fractals.\nRange roughly -2 to 2."); - gettext("Mapgen fractal julia x"); + gettext("Julia x"); gettext("Julia set only: X component of hypercomplex constant determining julia shape.\nRange roughly -2 to 2."); - gettext("Mapgen fractal julia y"); + gettext("Julia y"); gettext("Julia set only: Y component of hypercomplex constant determining julia shape.\nRange roughly -2 to 2."); - gettext("Mapgen fractal julia z"); + gettext("Julia z"); gettext("Julia set only: Z component of hypercomplex constant determining julia shape.\nRange roughly -2 to 2."); - gettext("Mapgen fractal julia w"); + gettext("Julia w"); gettext("Julia set only: W component of hypercomplex constant determining julia shape.\nHas no effect on 3D fractals.\nRange roughly -2 to 2."); - gettext("Mapgen fractal seabed noise parameters"); - gettext("Mapgen fractal filler depth noise parameters"); - gettext("Mapgen fractal cave1 noise parameters"); - gettext("Mapgen fractal cave2 noise parameters"); + gettext("Seabed noise"); + gettext("Y-level of seabed."); + gettext("Filler depth noise"); + gettext("Variation of biome filler depth."); + gettext("Cave1 noise"); + gettext("First of 2 3D noises that together define tunnels."); + gettext("Cave2 noise"); + gettext("Second of 2 3D noises that together define tunnels."); gettext("Mapgen Valleys"); gettext("General"); gettext("Valleys C Flags"); @@ -620,7 +729,7 @@ fake_function() { gettext("Default report format"); gettext("The default format in which profiles are being saved,\nwhen calling `/profiler save [format]` without format."); gettext("Report path"); - gettext("The file path relative to your worldpath in which profiles will be saved to.\n"); + gettext("The file path relative to your worldpath in which profiles will be saved to."); gettext("Instrumentation"); gettext("Entity methods"); gettext("Instrument the methods of entities on registration."); diff --git a/src/shader.cpp b/src/shader.cpp index c0ecf738d..66f32c9a1 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -340,7 +340,7 @@ IWritableShaderSource* createShaderSource(IrrlichtDevice *device) /* Generate shader given the shader name. */ -ShaderInfo generate_shader(std::string name, +ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtype, IrrlichtDevice *device, std::vector<ShaderCallback *> &callbacks, const std::vector<IShaderConstantSetterFactory*> &setter_factories, @@ -525,7 +525,7 @@ void ShaderSource::rebuildShaders() } -ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype, +ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtype, IrrlichtDevice *device, std::vector<ShaderCallback *> &callbacks, const std::vector<IShaderConstantSetterFactory*> &setter_factories, SourceShaderCache *sourcecache) @@ -543,7 +543,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype, shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL; break; case TILE_MATERIAL_LIQUID_TRANSPARENT: - shaderinfo.base_material = video::EMT_TRANSPARENT_VERTEX_ALPHA; + shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL; break; case TILE_MATERIAL_LIQUID_OPAQUE: shaderinfo.base_material = video::EMT_SOLID; diff --git a/src/sky.cpp b/src/sky.cpp index 211a2dcdc..b739fe1ad 100644 --- a/src/sky.cpp +++ b/src/sky.cpp @@ -85,6 +85,8 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id, } m_directional_colored_fog = g_settings->getBool("directional_colored_fog"); + + m_clouds_enabled = true; } @@ -534,8 +536,10 @@ void Sky::update(float time_of_day, float time_brightness, video::SColorf skycolor_bright_dawn_f = video::SColor(255, 180, 186, 250); video::SColorf skycolor_bright_night_f = video::SColor(255, 0, 107, 255); - video::SColorf cloudcolor_bright_normal_f = video::SColor(255, 240, 240, 255); - video::SColorf cloudcolor_bright_dawn_f = video::SColor(255, 255, 223, 191); + // pure white: becomes "diffuse light component" for clouds + video::SColorf cloudcolor_bright_normal_f = video::SColor(255, 255, 255, 255); + // dawn-factoring version of pure white (note: R is above 1.0) + video::SColorf cloudcolor_bright_dawn_f(255.0f/240.0f, 223.0f/240.0f, 191.0f/255.0f); float cloud_color_change_fraction = 0.95; if (sunlight_seen) { @@ -605,7 +609,7 @@ void Sky::update(float time_of_day, float time_brightness, ); // Horizon coloring based on sun and moon direction during sunset and sunrise - video::SColor pointcolor = video::SColor(255, 255, 255, m_bgcolor.getAlpha()); + video::SColor pointcolor = video::SColor(m_bgcolor.getAlpha(), 255, 255, 255); if (m_directional_colored_fog) { if (m_horizon_blend() != 0) { // Calculate hemisphere value from yaw, (inverted in third person front view) @@ -17,9 +17,9 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "irrlichttypes_extrabloated.h" #include <ISceneNode.h> #include "camera.h" +#include "irrlichttypes_extrabloated.h" #ifndef SKY_HEADER #define SKY_HEADER @@ -34,7 +34,7 @@ class Sky : public scene::ISceneNode { public: //! constructor - Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id, + Sky(scene::ISceneNode *parent, scene::ISceneManager *mgr, s32 id, ITextureSource *tsrc); virtual void OnRegisterSceneNode(); @@ -42,35 +42,37 @@ public: //! renders the node. virtual void render(); - virtual const aabb3f &getBoundingBox() const - { return m_box; } + virtual const aabb3f &getBoundingBox() const { return m_box; } // Used by Irrlicht for optimizing rendering - virtual video::SMaterial& getMaterial(u32 i) - { return m_materials[i]; } + virtual video::SMaterial &getMaterial(u32 i) { return m_materials[i]; } // Used by Irrlicht for optimizing rendering - virtual u32 getMaterialCount() const - { return SKY_MATERIAL_COUNT; } + virtual u32 getMaterialCount() const { return SKY_MATERIAL_COUNT; } + + void update(float m_time_of_day, float time_brightness, float direct_brightness, + bool sunlight_seen, CameraMode cam_mode, float yaw, float pitch); - void update(float m_time_of_day, float time_brightness, - float direct_brightness, bool sunlight_seen, CameraMode cam_mode, - float yaw, float pitch); - - float getBrightness(){ return m_brightness; } + float getBrightness() { return m_brightness; } - video::SColor getBgColor(){ + const video::SColor &getBgColor() const + { return m_visible ? m_bgcolor : m_fallback_bg_color; } - video::SColor getSkyColor(){ + + const video::SColor &getSkyColor() const + { return m_visible ? m_skycolor : m_fallback_bg_color; } - - bool getCloudsVisible(){ return m_clouds_visible && m_visible; } - video::SColorf getCloudColor(){ return m_cloudcolor_f; } - void setVisible(bool visible){ m_visible = visible; } - void setFallbackBgColor(const video::SColor &fallback_bg_color){ + bool getCloudsVisible() { return m_clouds_visible && m_clouds_enabled; } + const video::SColorf &getCloudColor() { return m_cloudcolor_f; } + + void setVisible(bool visible) { m_visible = visible; } + // Set only from set_sky API + void setCloudsEnabled(bool clouds_enabled) { m_clouds_enabled = clouds_enabled; } + void setFallbackBgColor(const video::SColor &fallback_bg_color) + { m_fallback_bg_color = fallback_bg_color; } @@ -83,7 +85,8 @@ private: { if (!m_sunlight_seen) return 0; - float x = m_time_of_day >= 0.5 ? (1 - m_time_of_day) * 2 : m_time_of_day * 2; + float x = m_time_of_day >= 0.5 ? (1 - m_time_of_day) * 2 + : m_time_of_day * 2; if (x <= 0.3) return 0; @@ -98,19 +101,19 @@ private: video::SColor m_mix_scolor(video::SColor col1, video::SColor col2, f32 factor) { video::SColor result = video::SColor( - col1.getAlpha() * (1 - factor) + col2.getAlpha() * factor, - col1.getRed() * (1 - factor) + col2.getRed() * factor, - col1.getGreen() * (1 - factor) + col2.getGreen() * factor, - col1.getBlue() * (1 - factor) + col2.getBlue() * factor); + col1.getAlpha() * (1 - factor) + col2.getAlpha() * factor, + col1.getRed() * (1 - factor) + col2.getRed() * factor, + col1.getGreen() * (1 - factor) + col2.getGreen() * factor, + col1.getBlue() * (1 - factor) + col2.getBlue() * factor); return result; } video::SColorf m_mix_scolorf(video::SColorf col1, video::SColorf col2, f32 factor) { - video::SColorf result = video::SColorf( - col1.r * (1 - factor) + col2.r * factor, - col1.g * (1 - factor) + col2.g * factor, - col1.b * (1 - factor) + col2.b * factor, - col1.a * (1 - factor) + col2.a * factor); + video::SColorf result = + video::SColorf(col1.r * (1 - factor) + col2.r * factor, + col1.g * (1 - factor) + col2.g * factor, + col1.b * (1 - factor) + col2.b * factor, + col1.a * (1 - factor) + col2.a * factor); return result; } @@ -122,7 +125,8 @@ private: bool m_sunlight_seen; float m_brightness; float m_cloud_brightness; - bool m_clouds_visible; + bool m_clouds_visible; // Whether clouds are disabled due to player underground + bool m_clouds_enabled; // Initialised to true, reset only by set_sky API bool m_directional_colored_fog; video::SColorf m_bgcolor_bright_f; video::SColorf m_skycolor_bright_f; @@ -131,12 +135,11 @@ private: video::SColor m_skycolor; video::SColorf m_cloudcolor_f; v3f m_stars[SKY_STAR_COUNT]; - video::S3DVertex m_star_vertices[SKY_STAR_COUNT*4]; - video::ITexture* m_sun_texture; - video::ITexture* m_moon_texture; - video::ITexture* m_sun_tonemap; - video::ITexture* m_moon_tonemap; + video::S3DVertex m_star_vertices[SKY_STAR_COUNT * 4]; + video::ITexture *m_sun_texture; + video::ITexture *m_moon_texture; + video::ITexture *m_sun_tonemap; + video::ITexture *m_moon_tonemap; }; #endif - diff --git a/src/sound.h b/src/sound.h index c21401e8b..76c0d1be4 100644 --- a/src/sound.h +++ b/src/sound.h @@ -20,9 +20,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef SOUND_HEADER #define SOUND_HEADER -#include "irrlichttypes_bloated.h" -#include <string> #include <set> +#include <string> +#include "irrlichttypes_bloated.h" class OnDemandSoundFetcher { @@ -34,68 +34,88 @@ public: struct SimpleSoundSpec { + SimpleSoundSpec(const std::string &name = "", float gain = 1.0, float fade = 0.0) + : name(name), gain(gain), fade(fade) + { + } + + bool exists() const { return name != ""; } + std::string name; float gain; - SimpleSoundSpec(std::string name="", float gain=1.0): - name(name), - gain(gain) - {} - bool exists() {return name != "";} - // Serialization intentionally left out + float fade; }; class ISoundManager { public: - virtual ~ISoundManager(){} - + virtual ~ISoundManager() {} // Multiple sounds can be loaded per name; when played, the sound // should be chosen randomly from alternatives // Return value determines success/failure - virtual bool loadSoundFile(const std::string &name, - const std::string &filepath) = 0; - virtual bool loadSoundData(const std::string &name, - const std::string &filedata) = 0; + virtual bool loadSoundFile( + const std::string &name, const std::string &filepath) = 0; + virtual bool loadSoundData( + const std::string &name, const std::string &filedata) = 0; virtual void updateListener(v3f pos, v3f vel, v3f at, v3f up) = 0; virtual void setListenerGain(float gain) = 0; // playSound functions return -1 on failure, otherwise a handle to the // sound. If name=="", call should be ignored without error. - virtual int playSound(const std::string &name, bool loop, - float volume) = 0; - virtual int playSoundAt(const std::string &name, bool loop, - float volume, v3f pos) = 0; + virtual int playSound(const std::string &name, bool loop, float volume, + float fade = 0) = 0; + virtual int playSoundAt( + const std::string &name, bool loop, float volume, v3f pos) = 0; virtual void stopSound(int sound) = 0; virtual bool soundExists(int sound) = 0; virtual void updateSoundPosition(int sound, v3f pos) = 0; + virtual bool updateSoundGain(int id, float gain) = 0; + virtual float getSoundGain(int id) = 0; + virtual void step(float dtime) = 0; + virtual void fadeSound(int sound, float step, float gain) = 0; int playSound(const SimpleSoundSpec &spec, bool loop) - { return playSound(spec.name, loop, spec.gain); } + { + return playSound(spec.name, loop, spec.gain, spec.fade); + } int playSoundAt(const SimpleSoundSpec &spec, bool loop, v3f pos) - { return playSoundAt(spec.name, loop, spec.gain, pos); } + { + return playSoundAt(spec.name, loop, spec.gain, pos); + } }; -class DummySoundManager: public ISoundManager +class DummySoundManager : public ISoundManager { public: - virtual bool loadSoundFile(const std::string &name, - const std::string &filepath) {return true;} - virtual bool loadSoundData(const std::string &name, - const std::string &filedata) {return true;} + virtual bool loadSoundFile(const std::string &name, const std::string &filepath) + { + return true; + } + virtual bool loadSoundData(const std::string &name, const std::string &filedata) + { + return true; + } void updateListener(v3f pos, v3f vel, v3f at, v3f up) {} void setListenerGain(float gain) {} - int playSound(const std::string &name, bool loop, - float volume) {return 0;} - int playSoundAt(const std::string &name, bool loop, - float volume, v3f pos) {return 0;} + int playSound(const std::string &name, bool loop, float volume, float fade) + { + return 0; + } + int playSoundAt(const std::string &name, bool loop, float volume, v3f pos) + { + return 0; + } void stopSound(int sound) {} - bool soundExists(int sound) {return false;} + bool soundExists(int sound) { return false; } void updateSoundPosition(int sound, v3f pos) {} + bool updateSoundGain(int id, float gain) { return false; } + float getSoundGain(int id) { return 0; } + void step(float dtime) {} + void fadeSound(int sound, float step, float gain) {} }; // Global DummySoundManager singleton extern DummySoundManager dummySoundManager; #endif - diff --git a/src/sound_openal.cpp b/src/sound_openal.cpp index 317667f52..a425af827 100644 --- a/src/sound_openal.cpp +++ b/src/sound_openal.cpp @@ -274,6 +274,19 @@ private: UNORDERED_MAP<std::string, std::vector<SoundBuffer*> > m_buffers; UNORDERED_MAP<int, PlayingSound*> m_sounds_playing; v3f m_listener_pos; + struct FadeState { + FadeState() {} + FadeState(float step, float current_gain, float target_gain): + step(step), + current_gain(current_gain), + target_gain(target_gain) {} + float step; + float current_gain; + float target_gain; + }; + + UNORDERED_MAP<int, FadeState> m_sounds_fading; + float m_fade_delay; public: bool m_is_initialized; OpenALSoundManager(OnDemandSoundFetcher *fetcher): @@ -281,6 +294,7 @@ public: m_device(NULL), m_context(NULL), m_next_id(1), + m_fade_delay(0), m_is_initialized(false) { ALCenum error = ALC_NO_ERROR; @@ -317,7 +331,7 @@ public: return; } - alDistanceModel(AL_EXPONENT_DISTANCE); + alDistanceModel(AL_INVERSE_DISTANCE); infostream<<"Audio: Initialized: OpenAL "<<alGetString(AL_VERSION) <<", using "<<alcGetString(m_device, ALC_DEVICE_SPECIFIER) @@ -349,6 +363,11 @@ public: infostream<<"Audio: Deinitialized."<<std::endl; } + void step(float dtime) + { + doFades(dtime); + } + void addBuffer(const std::string &name, SoundBuffer *buf) { UNORDERED_MAP<std::string, std::vector<SoundBuffer*> >::iterator i = @@ -409,7 +428,6 @@ public: alSourcei(sound->source_id, AL_SOURCE_RELATIVE, false); alSource3f(sound->source_id, AL_POSITION, pos.X, pos.Y, pos.Z); alSource3f(sound->source_id, AL_VELOCITY, 0, 0, 0); - //alSourcef(sound->source_id, AL_ROLLOFF_FACTOR, 0.7); alSourcef(sound->source_id, AL_REFERENCE_DISTANCE, 30.0); alSourcei(sound->source_id, AL_LOOPING, loop ? AL_TRUE : AL_FALSE); volume = MYMAX(0.0, volume); @@ -516,6 +534,7 @@ public: addBuffer(name, buf); return false; } + bool loadSoundData(const std::string &name, const std::string &filedata) { @@ -542,7 +561,7 @@ public: alListenerf(AL_GAIN, gain); } - int playSound(const std::string &name, bool loop, float volume) + int playSound(const std::string &name, bool loop, float volume, float fade) { maintain(); if(name == "") @@ -553,8 +572,16 @@ public: <<std::endl; return -1; } - return playSoundRaw(buf, loop, volume); + int handle = -1; + if (fade > 0) { + handle = playSoundRaw(buf, loop, 0); + fadeSound(handle, fade, volume); + } else { + handle = playSoundRaw(buf, loop, volume); + } + return handle; } + int playSoundAt(const std::string &name, bool loop, float volume, v3f pos) { maintain(); @@ -568,16 +595,55 @@ public: } return playSoundRawAt(buf, loop, volume, pos); } + void stopSound(int sound) { maintain(); deleteSound(sound); } + + void fadeSound(int soundid, float step, float gain) + { + m_sounds_fading[soundid] = FadeState(step, getSoundGain(soundid), gain); + } + + void doFades(float dtime) + { + m_fade_delay += dtime; + + if (m_fade_delay < 0.1f) + return; + + float chkGain = 0; + for (UNORDERED_MAP<int, FadeState>::iterator i = m_sounds_fading.begin(); + i != m_sounds_fading.end();) { + if (i->second.step < 0.f) + chkGain = -(i->second.current_gain); + else + chkGain = i->second.current_gain; + + if (chkGain < i->second.target_gain) { + i->second.current_gain += (i->second.step * m_fade_delay); + i->second.current_gain = rangelim(i->second.current_gain, 0, 1); + + updateSoundGain(i->first, i->second.current_gain); + ++i; + } else { + if (i->second.target_gain <= 0.f) + stopSound(i->first); + + m_sounds_fading.erase(i++); + } + } + m_fade_delay = 0; + } + bool soundExists(int sound) { maintain(); return (m_sounds_playing.count(sound) != 0); } + void updateSoundPosition(int id, v3f pos) { UNORDERED_MAP<int, PlayingSound*>::iterator i = m_sounds_playing.find(id); @@ -590,6 +656,29 @@ public: alSource3f(sound->source_id, AL_VELOCITY, 0, 0, 0); alSourcef(sound->source_id, AL_REFERENCE_DISTANCE, 30.0); } + + bool updateSoundGain(int id, float gain) + { + UNORDERED_MAP<int, PlayingSound*>::iterator i = m_sounds_playing.find(id); + if (i == m_sounds_playing.end()) + return false; + + PlayingSound *sound = i->second; + alSourcef(sound->source_id, AL_GAIN, gain); + return true; + } + + float getSoundGain(int id) + { + UNORDERED_MAP<int, PlayingSound*>::iterator i = m_sounds_playing.find(id); + if (i == m_sounds_playing.end()) + return 0; + + PlayingSound *sound = i->second; + ALfloat gain; + alGetSourcef(sound->source_id, AL_GAIN, &gain); + return gain; + } }; ISoundManager *createOpenALSoundManager(OnDemandSoundFetcher *fetcher) diff --git a/src/threading/event.cpp b/src/threading/event.cpp index 0d5928f10..a22c6628b 100644 --- a/src/threading/event.cpp +++ b/src/threading/event.cpp @@ -35,6 +35,8 @@ Event::Event() pthread_mutex_init(&mutex, NULL); notified = false; # endif +#elif USE_CPP11_MUTEX + notified = false; #endif } diff --git a/src/threading/event.h b/src/threading/event.h index 26cb8997a..79a99ce1f 100644 --- a/src/threading/event.h +++ b/src/threading/event.h @@ -29,19 +29,19 @@ DEALINGS IN THE SOFTWARE. #include "threads.h" #if USE_CPP11_MUTEX - #include <condition_variable> - #include "threading/mutex.h" - #include "threading/mutex_auto_lock.h" +#include <condition_variable> +#include "threading/mutex.h" +#include "threading/mutex_auto_lock.h" #endif - /** A syncronization primitive that will wake up one waiting thread when signaled. * Calling @c signal() multiple times before a waiting thread has had a chance * to notice the signal will wake only one thread. Additionally, if no threads * are waiting on the event when it is signaled, the next call to @c wait() * will return (almost) immediately. */ -class Event { +class Event +{ public: Event(); #ifndef USE_CPP11_MUTEX diff --git a/src/threading/mutex.cpp b/src/threading/mutex.cpp index 0908b5d37..d864f12c5 100644 --- a/src/threading/mutex.cpp +++ b/src/threading/mutex.cpp @@ -88,6 +88,15 @@ void Mutex::lock() #endif } +bool Mutex::try_lock() +{ +#if USE_WIN_MUTEX + return TryEnterCriticalSection(&mutex) != 0; +#else + return pthread_mutex_trylock(&mutex) == 0; +#endif +} + void Mutex::unlock() { #if USE_WIN_MUTEX diff --git a/src/threading/mutex.h b/src/threading/mutex.h index fb5c029fc..6feb23c25 100644 --- a/src/threading/mutex.h +++ b/src/threading/mutex.h @@ -56,6 +56,8 @@ public: void lock(); void unlock(); + bool try_lock(); + protected: Mutex(bool recursive); void init_mutex(bool recursive); diff --git a/src/threading/semaphore.h b/src/threading/semaphore.h index 822856396..8ff376666 100644 --- a/src/threading/semaphore.h +++ b/src/threading/semaphore.h @@ -21,21 +21,22 @@ with this program; if not, write to the Free Software Foundation, Inc., #define THREADING_SEMAPHORE_H #if defined(_WIN32) - #include <windows.h> +#include <windows.h> #elif defined(__MACH__) && defined(__APPLE__) - #include <mach/semaphore.h> +#include <mach/semaphore.h> #else - #include <semaphore.h> +#include <semaphore.h> #endif #include "util/basic_macros.h" -class Semaphore { +class Semaphore +{ public: - Semaphore(int val=0); + Semaphore(int val = 0); ~Semaphore(); - void post(unsigned int num=1); + void post(unsigned int num = 1); void wait(); bool wait(unsigned int time_ms); @@ -52,4 +53,3 @@ private: }; #endif - diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp index fbe4ba1f3..1909da61d 100644 --- a/src/threading/thread.cpp +++ b/src/threading/thread.cpp @@ -101,6 +101,11 @@ Thread::Thread(const std::string &name) : Thread::~Thread() { kill(); + + // Make sure start finished mutex is unlocked before it's destroyed + m_start_finished_mutex.try_lock(); + m_start_finished_mutex.unlock(); + } @@ -113,6 +118,9 @@ bool Thread::start() m_request_stop = false; + // The mutex may already be locked if the thread is being restarted + m_start_finished_mutex.try_lock(); + #if USE_CPP11_THREADS try { @@ -135,6 +143,9 @@ bool Thread::start() #endif + // Allow spawned thread to continue + m_start_finished_mutex.unlock(); + while (!m_running) sleep_ms(1); @@ -241,7 +252,7 @@ DWORD WINAPI Thread::threadProc(LPVOID param) Thread *thr = (Thread *)param; #ifdef _AIX - m_kernel_thread_id = thread_self(); + thr->m_kernel_thread_id = thread_self(); #endif thr->setName(thr->m_name); @@ -249,6 +260,10 @@ DWORD WINAPI Thread::threadProc(LPVOID param) g_logger.registerThread(thr->m_name); thr->m_running = true; + // Wait for the thread that started this one to finish initializing the + // thread handle so that getThreadId/getThreadHandle will work. + thr->m_start_finished_mutex.lock(); + thr->m_retval = thr->run(); thr->m_running = false; diff --git a/src/threading/thread.h b/src/threading/thread.h index 14a0e13ab..4785d3e03 100644 --- a/src/threading/thread.h +++ b/src/threading/thread.h @@ -153,6 +153,7 @@ private: Atomic<bool> m_request_stop; Atomic<bool> m_running; Mutex m_mutex; + Mutex m_start_finished_mutex; #if USE_CPP11_THREADS std::thread *m_thread_obj; diff --git a/src/tileanimation.cpp b/src/tileanimation.cpp new file mode 100644 index 000000000..67d27d396 --- /dev/null +++ b/src/tileanimation.cpp @@ -0,0 +1,131 @@ +/* +Minetest +Copyright (C) 2016 sfan5 <sfan5@live.de> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ +#include "tileanimation.h" +#include "util/serialize.h" + +void TileAnimationParams::serialize(std::ostream &os, u16 protocol_version) const +{ + if (protocol_version < 29) { + if (type == TAT_VERTICAL_FRAMES) { + writeU8(os, type); + writeU16(os, vertical_frames.aspect_w); + writeU16(os, vertical_frames.aspect_h); + writeF1000(os, vertical_frames.length); + } else { + writeU8(os, TAT_NONE); + writeU16(os, 1); + writeU16(os, 1); + writeF1000(os, 1.0); + } + return; + } + + writeU8(os, type); + if (type == TAT_VERTICAL_FRAMES) { + writeU16(os, vertical_frames.aspect_w); + writeU16(os, vertical_frames.aspect_h); + writeF1000(os, vertical_frames.length); + } else if (type == TAT_SHEET_2D) { + writeU8(os, sheet_2d.frames_w); + writeU8(os, sheet_2d.frames_h); + writeF1000(os, sheet_2d.frame_length); + } +} + +void TileAnimationParams::deSerialize(std::istream &is, u16 protocol_version) +{ + type = (TileAnimationType) readU8(is); + if (protocol_version < 29) { + vertical_frames.aspect_w = readU16(is); + vertical_frames.aspect_h = readU16(is); + vertical_frames.length = readF1000(is); + return; + } + + if (type == TAT_VERTICAL_FRAMES) { + vertical_frames.aspect_w = readU16(is); + vertical_frames.aspect_h = readU16(is); + vertical_frames.length = readF1000(is); + } else if (type == TAT_SHEET_2D) { + sheet_2d.frames_w = readU8(is); + sheet_2d.frames_h = readU8(is); + sheet_2d.frame_length = readF1000(is); + } +} + +void TileAnimationParams::determineParams(v2u32 texture_size, int *frame_count, + int *frame_length_ms, v2u32 *frame_size) const +{ + if (type == TAT_VERTICAL_FRAMES) { + int frame_height = (float)texture_size.X / + (float)vertical_frames.aspect_w * + (float)vertical_frames.aspect_h; + int _frame_count = texture_size.Y / frame_height; + if (frame_count) + *frame_count = _frame_count; + if (frame_length_ms) + *frame_length_ms = 1000.0 * vertical_frames.length / _frame_count; + if (frame_size) + *frame_size = v2u32(texture_size.X, frame_height); + } else if (type == TAT_SHEET_2D) { + if (frame_count) + *frame_count = sheet_2d.frames_w * sheet_2d.frames_h; + if (frame_length_ms) + *frame_length_ms = 1000 * sheet_2d.frame_length; + if (frame_size) + *frame_size = v2u32(texture_size.X / sheet_2d.frames_w, texture_size.Y / sheet_2d.frames_h); + } + // caller should check for TAT_NONE +} + +void TileAnimationParams::getTextureModifer(std::ostream &os, v2u32 texture_size, int frame) const +{ + if (type == TAT_NONE) + return; + if (type == TAT_VERTICAL_FRAMES) { + int frame_count; + determineParams(texture_size, &frame_count, NULL, NULL); + os << "^[verticalframe:" << frame_count << ":" << frame; + } else if (type == TAT_SHEET_2D) { + int q, r; + q = frame / sheet_2d.frames_w; + r = frame % sheet_2d.frames_w; + os << "^[sheet:" << sheet_2d.frames_w << "x" << sheet_2d.frames_h + << ":" << r << "," << q; + } +} + +v2f TileAnimationParams::getTextureCoords(v2u32 texture_size, int frame) const +{ + v2u32 ret(0, 0); + if (type == TAT_VERTICAL_FRAMES) { + int frame_height = (float)texture_size.X / + (float)vertical_frames.aspect_w * + (float)vertical_frames.aspect_h; + ret = v2u32(0, frame_height * frame); + } else if (type == TAT_SHEET_2D) { + v2u32 frame_size; + determineParams(texture_size, NULL, NULL, &frame_size); + int q, r; + q = frame / sheet_2d.frames_w; + r = frame % sheet_2d.frames_w; + ret = v2u32(r * frame_size.X, q * frame_size.Y); + } + return v2f(ret.X / (float) texture_size.X, ret.Y / (float) texture_size.Y); +} diff --git a/src/tileanimation.h b/src/tileanimation.h new file mode 100644 index 000000000..9872e7917 --- /dev/null +++ b/src/tileanimation.h @@ -0,0 +1,62 @@ +/* +Minetest +Copyright (C) 2016 sfan5 <sfan5@live.de> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef TILEANIMATION_HEADER +#define TILEANIMATION_HEADER + +#include <iostream> +#include "irrlichttypes_bloated.h" + +enum TileAnimationType +{ + TAT_NONE = 0, + TAT_VERTICAL_FRAMES = 1, + TAT_SHEET_2D = 2, +}; + +struct TileAnimationParams +{ + enum TileAnimationType type; + union + { + // struct { + // } none; + struct + { + int aspect_w; // width for aspect ratio + int aspect_h; // height for aspect ratio + float length; // seconds + } vertical_frames; + struct + { + int frames_w; // number of frames left-to-right + int frames_h; // number of frames top-to-bottom + float frame_length; // seconds + } sheet_2d; + }; + + void serialize(std::ostream &os, u16 protocol_version) const; + void deSerialize(std::istream &is, u16 protocol_version); + void determineParams(v2u32 texture_size, int *frame_count, int *frame_length_ms, + v2u32 *frame_size) const; + void getTextureModifer(std::ostream &os, v2u32 texture_size, int frame) const; + v2f getTextureCoords(v2u32 texture_size, int frame) const; +}; + +#endif diff --git a/src/tool.cpp b/src/tool.cpp index 20b71fb31..bb884938c 100644 --- a/src/tool.cpp +++ b/src/tool.cpp @@ -27,33 +27,30 @@ with this program; if not, write to the Free Software Foundation, Inc., void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const { - if(protocol_version <= 17) - writeU8(os, 1); // version - else - writeU8(os, 2); // version + writeU8(os, 2); // version (protocol >= 18) writeF1000(os, full_punch_interval); writeS16(os, max_drop_level); writeU32(os, groupcaps.size()); for (ToolGCMap::const_iterator i = groupcaps.begin(); i != groupcaps.end(); ++i) { const std::string *name = &i->first; const ToolGroupCap *cap = &i->second; - os<<serializeString(*name); + os << serializeString(*name); writeS16(os, cap->uses); writeS16(os, cap->maxlevel); writeU32(os, cap->times.size()); for (UNORDERED_MAP<int, float>::const_iterator - i = cap->times.begin(); i != cap->times.end(); ++i) { - writeS16(os, i->first); - writeF1000(os, i->second); + j = cap->times.begin(); j != cap->times.end(); ++j) { + writeS16(os, j->first); + writeF1000(os, j->second); } } - if(protocol_version > 17){ - writeU32(os, damageGroups.size()); - for (DamageGroup::const_iterator i = damageGroups.begin(); - i != damageGroups.end(); ++i) { - os<<serializeString(i->first); - writeS16(os, i->second); - } + + writeU32(os, damageGroups.size()); + + for (DamageGroup::const_iterator i = damageGroups.begin(); + i != damageGroups.end(); ++i) { + os << serializeString(i->first); + writeS16(os, i->second); } } @@ -101,7 +98,7 @@ DigParams getDigParams(const ItemGroupList &groups, return DigParams(true, 0.5, 0, "dig_immediate"); case 3: //infostream<<"dig_immediate=3"<<std::endl; - return DigParams(true, 0.0, 0, "dig_immediate"); + return DigParams(true, 0, 0, "dig_immediate"); default: break; } diff --git a/src/tool.h b/src/tool.h index ebba5b749..f33152355 100644 --- a/src/tool.h +++ b/src/tool.h @@ -63,8 +63,8 @@ struct ToolCapabilities ToolCapabilities( float full_punch_interval_=1.4, int max_drop_level_=1, - ToolGCMap groupcaps_=ToolGCMap(), - DamageGroup damageGroups_=DamageGroup() + const ToolGCMap &groupcaps_ = ToolGCMap(), + const DamageGroup &damageGroups_ = DamageGroup() ): full_punch_interval(full_punch_interval_), max_drop_level(max_drop_level_), @@ -85,8 +85,8 @@ struct DigParams u16 wear; std::string main_group; - DigParams(bool a_diggable=false, float a_time=0, u16 a_wear=0, - std::string a_main_group=""): + DigParams(bool a_diggable = false, float a_time = 0.0f, u16 a_wear = 0, + const std::string &a_main_group = ""): diggable(a_diggable), time(a_time), wear(a_wear), diff --git a/src/touchscreengui.cpp b/src/touchscreengui.cpp index 8d210c63a..0139b8c4f 100644 --- a/src/touchscreengui.cpp +++ b/src/touchscreengui.cpp @@ -794,7 +794,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event) if (m_move_id == -1) { m_move_id = event.TouchInput.ID; m_move_has_really_moved = false; - m_move_downtime = getTimeMs(); + m_move_downtime = porting::getTimeMs(); m_move_downlocation = v2s32(event.TouchInput.X, event.TouchInput.Y); m_move_sent_as_mouse_event = false; } @@ -922,7 +922,7 @@ bool TouchScreenGUI::doubleTapDetection() m_key_events[1].x = m_move_downlocation.X; m_key_events[1].y = m_move_downlocation.Y; - u32 delta = porting::getDeltaMs(m_key_events[0].down_time, getTimeMs()); + u64 delta = porting::getDeltaMs(m_key_events[0].down_time, porting::getTimeMs()); if (delta > 400) return false; @@ -1006,7 +1006,7 @@ void TouchScreenGUI::step(float dtime) (!m_move_has_really_moved) && (!m_move_sent_as_mouse_event)) { - u32 delta = porting::getDeltaMs(m_move_downtime,getTimeMs()); + u64 delta = porting::getDeltaMs(m_move_downtime, porting::getTimeMs()); if (delta > MIN_DIG_TIME_MS) { m_shootline = m_device diff --git a/src/touchscreengui.h b/src/touchscreengui.h index 53fc6d683..f4f1766c9 100644 --- a/src/touchscreengui.h +++ b/src/touchscreengui.h @@ -19,15 +19,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef TOUCHSCREENGUI_HEADER #define TOUCHSCREENGUI_HEADER -#include <IGUIEnvironment.h> -#include <IGUIButton.h> #include <IEventReceiver.h> +#include <IGUIButton.h> +#include <IGUIEnvironment.h> -#include <vector> #include <map> +#include <vector> -#include "game.h" #include "client/tile.h" +#include "game.h" using namespace irr; using namespace irr::core; @@ -68,32 +68,32 @@ typedef enum { #define SETTINGS_BAR_Y_OFFSET 6.5 #define RARE_CONTROLS_BAR_Y_OFFSET 4 -extern const char** touchgui_button_imagenames; +extern const char **touchgui_button_imagenames; -struct button_info { - float repeatcounter; - float repeatdelay; - irr::EKEY_CODE keycode; +struct button_info +{ + float repeatcounter; + float repeatdelay; + irr::EKEY_CODE keycode; std::vector<int> ids; - IGUIButton* guibutton = NULL; - bool immediate_release; + IGUIButton *guibutton = NULL; + bool immediate_release; }; class AutoHideButtonBar { public: + AutoHideButtonBar(IrrlichtDevice *device, IEventReceiver *receiver); - AutoHideButtonBar( IrrlichtDevice *device, IEventReceiver* receiver ); - - void init(ISimpleTextureSource* tsrc, const char* starter_img, - int button_id, v2s32 UpperLeft, v2s32 LowerRight, - autohide_button_bar_dir dir, float timeout); + void init(ISimpleTextureSource *tsrc, const char *starter_img, int button_id, + v2s32 UpperLeft, v2s32 LowerRight, autohide_button_bar_dir dir, + float timeout); ~AutoHideButtonBar(); /* add button to be shown */ - void addButton(touch_gui_button_id id, const wchar_t* caption, - const char* btn_image); + void addButton(touch_gui_button_id id, const wchar_t *caption, + const char *btn_image); /* detect settings bar button events */ bool isButton(const SEvent &event); @@ -114,40 +114,41 @@ public: void show(); private: - ISimpleTextureSource* m_texturesource; - irr::video::IVideoDriver* m_driver; - IGUIEnvironment* m_guienv; - IEventReceiver* m_receiver; - v2u32 m_screensize; - button_info m_starter; - std::vector<button_info*> m_buttons; + ISimpleTextureSource *m_texturesource; + irr::video::IVideoDriver *m_driver; + IGUIEnvironment *m_guienv; + IEventReceiver *m_receiver; + v2u32 m_screensize; + button_info m_starter; + std::vector<button_info *> m_buttons; - v2s32 m_upper_left; - v2s32 m_lower_right; + v2s32 m_upper_left; + v2s32 m_lower_right; /* show settings bar */ - bool m_active; + bool m_active; - bool m_visible; + bool m_visible; /* settings bar timeout */ - float m_timeout; - float m_timeout_value; - bool m_initialized; - autohide_button_bar_dir m_dir; + float m_timeout; + float m_timeout_value; + bool m_initialized; + autohide_button_bar_dir m_dir; }; class TouchScreenGUI { public: - TouchScreenGUI(IrrlichtDevice *device, IEventReceiver* receiver); + TouchScreenGUI(IrrlichtDevice *device, IEventReceiver *receiver); ~TouchScreenGUI(); void translateEvent(const SEvent &event); - void init(ISimpleTextureSource* tsrc); + void init(ISimpleTextureSource *tsrc); - double getYawChange() { + double getYawChange() + { double res = m_camera_yaw_change; m_camera_yaw_change = 0; return res; @@ -166,28 +167,28 @@ public: void show(); private: - IrrlichtDevice* m_device; - IGUIEnvironment* m_guienv; - IEventReceiver* m_receiver; - ISimpleTextureSource* m_texturesource; - v2u32 m_screensize; - std::map<int,rect<s32> > m_hud_rects; - std::map<int,irr::EKEY_CODE> m_hud_ids; - bool m_visible; // is the gui visible + IrrlichtDevice *m_device; + IGUIEnvironment *m_guienv; + IEventReceiver *m_receiver; + ISimpleTextureSource *m_texturesource; + v2u32 m_screensize; + std::map<int, rect<s32> > m_hud_rects; + std::map<int, irr::EKEY_CODE> m_hud_ids; + bool m_visible; // is the gui visible /* value in degree */ - double m_camera_yaw_change; - double m_camera_pitch; + double m_camera_yaw_change; + double m_camera_pitch; - line3d<f32> m_shootline; + line3d<f32> m_shootline; - rect<s32> m_control_pad_rect; + rect<s32> m_control_pad_rect; - int m_move_id; - bool m_move_has_really_moved; - s32 m_move_downtime; - bool m_move_sent_as_mouse_event; - v2s32 m_move_downlocation; + int m_move_id; + bool m_move_has_really_moved; + s64 m_move_downtime; + bool m_move_sent_as_mouse_event; + v2s32 m_move_downlocation; button_info m_buttons[after_last_element_id]; @@ -206,9 +207,10 @@ private: float repeat_delay = BUTTON_REPEAT_DELAY); /* load texture */ - void loadButtonTexture(button_info* btn, const char* path, rect<s32> button_rect); + void loadButtonTexture(button_info *btn, const char *path, rect<s32> button_rect); - struct id_status{ + struct id_status + { int id; int X; int Y; @@ -236,7 +238,8 @@ private: int getGuiButtonSize(); /* doubleclick detection variables */ - struct key_event { + struct key_event + { unsigned int down_time; s32 x; s32 y; diff --git a/src/treegen.cpp b/src/treegen.cpp index f37bf0e86..8bf9619a0 100644 --- a/src/treegen.cpp +++ b/src/treegen.cpp @@ -21,11 +21,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <stack> #include "util/pointer.h" #include "util/numeric.h" -#include "util/mathconstants.h" #include "map.h" -#include "environment.h" +#include "serverenvironment.h" #include "nodedef.h" #include "treegen.h" +#include "voxelalgorithms.h" namespace treegen { @@ -113,7 +113,7 @@ void make_tree(MMVManip &vmanip, v3s16 p0, // L-System tree LUA spawner treegen::error spawn_ltree(ServerEnvironment *env, v3s16 p0, - INodeDefManager *ndef, TreeDef tree_definition) + INodeDefManager *ndef, const TreeDef &tree_definition) { ServerMap *map = &env->getServerMap(); std::map<v3s16, MapBlock*> modified_blocks; @@ -126,12 +126,8 @@ treegen::error spawn_ltree(ServerEnvironment *env, v3s16 p0, if (e != SUCCESS) return e; - vmanip.blitBackAll(&modified_blocks); + voxalgo::blit_back_with_light(map, &vmanip, &modified_blocks); - // update lighting - std::map<v3s16, MapBlock*> lighting_modified_blocks; - lighting_modified_blocks.insert(modified_blocks.begin(), modified_blocks.end()); - map->updateLighting(lighting_modified_blocks, modified_blocks); // Send a MEET_OTHER event MapEditEvent event; event.type = MEET_OTHER; diff --git a/src/treegen.h b/src/treegen.h index 4e6f95e67..8777c369c 100644 --- a/src/treegen.h +++ b/src/treegen.h @@ -73,7 +73,7 @@ namespace treegen { TreeDef tree_definition); // Spawn L-systems tree from LUA treegen::error spawn_ltree (ServerEnvironment *env, v3s16 p0, INodeDefManager *ndef, - TreeDef tree_definition); + const TreeDef &tree_definition); // L-System tree gen helper functions void tree_node_placement(MMVManip &vmanip, v3f p0, diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 41ccf0d2d..570807ba7 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -19,10 +19,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "test.h" -#include "log.h" #include "nodedef.h" #include "itemdef.h" #include "gamedef.h" +#include "mods.h" content_t t_CONTENT_STONE; content_t t_CONTENT_GRASS; @@ -59,6 +59,16 @@ public: void defineSomeNodes(); + virtual const std::vector<ModSpec> &getMods() const + { + static std::vector<ModSpec> testmodspec; + return testmodspec; + } + virtual const ModSpec* getModSpec(const std::string &modname) const { return NULL; } + virtual std::string getModStoragePath() const { return "."; } + virtual bool registerModStorage(ModMetadata *meta) { return true; } + virtual void unregisterModStorage(const std::string &name) {} + private: IItemDefManager *m_itemdef; INodeDefManager *m_nodedef; @@ -219,7 +229,7 @@ bool run_tests() { DSTACK(FUNCTION_NAME); - u32 t1 = porting::getTime(PRECISION_MILLI); + u64 t1 = porting::getTimeMs(); TestGameDef gamedef; g_logger.setLevelSilenced(LL_ERROR, true); @@ -236,7 +246,7 @@ bool run_tests() num_total_tests_run += testmods[i]->num_tests_run; } - u32 tdiff = porting::getTime(PRECISION_MILLI) - t1; + u64 tdiff = porting::getTimeMs() - t1; g_logger.setLevelSilenced(LL_ERROR, false); @@ -263,12 +273,12 @@ bool run_tests() bool TestBase::testModule(IGameDef *gamedef) { rawstream << "======== Testing module " << getName() << std::endl; - u32 t1 = porting::getTime(PRECISION_MILLI); + u64 t1 = porting::getTimeMs(); runTests(gamedef); - u32 tdiff = porting::getTime(PRECISION_MILLI) - t1; + u64 tdiff = porting::getTimeMs() - t1; rawstream << "======== Module " << getName() << " " << (num_tests_failed ? "failed" : "passed") << " (" << num_tests_failed << " failures / " << num_tests_run << " tests) - " << tdiff diff --git a/src/unittest/test.h b/src/unittest/test.h index e60e657cc..bf76e8bb2 100644 --- a/src/unittest/test.h +++ b/src/unittest/test.h @@ -33,7 +33,7 @@ class TestFailedException : public std::exception { // Runs a unit test and reports results #define TEST(fxn, ...) do { \ - u32 t1 = porting::getTime(PRECISION_MILLI); \ + u64 t1 = porting::getTimeMs(); \ try { \ fxn(__VA_ARGS__); \ rawstream << "[PASS] "; \ @@ -46,7 +46,7 @@ class TestFailedException : public std::exception { num_tests_failed++; \ } \ num_tests_run++; \ - u32 tdiff = porting::getTime(PRECISION_MILLI) - t1; \ + u64 tdiff = porting::getTimeMs() - t1; \ rawstream << #fxn << " - " << tdiff << "ms" << std::endl; \ } while (0) diff --git a/src/unittest/test_connection.cpp b/src/unittest/test_connection.cpp index 49e412fc8..d63322d69 100644 --- a/src/unittest/test_connection.cpp +++ b/src/unittest/test_connection.cpp @@ -305,7 +305,7 @@ void TestConnection::testConnectSendReceive() u16 peer_id = 132; u16 size = 0; bool received = false; - u32 timems0 = porting::getTimeMs(); + u64 timems0 = porting::getTimeMs(); for (;;) { if (porting::getTimeMs() - timems0 > 5000 || received) break; diff --git a/src/unittest/test_mapnode.cpp b/src/unittest/test_mapnode.cpp index 9ecc2f82d..70e7d42cf 100644 --- a/src/unittest/test_mapnode.cpp +++ b/src/unittest/test_mapnode.cpp @@ -23,7 +23,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include "content_mapnode.h" -class TestMapNode : public TestBase { +class TestMapNode : public TestBase +{ public: TestMapNode() { TestManager::registerTestModule(this); } const char *getName() { return "TestMapNode"; } diff --git a/src/unittest/test_nodedef.cpp b/src/unittest/test_nodedef.cpp index 85093f52f..cb99ae854 100644 --- a/src/unittest/test_nodedef.cpp +++ b/src/unittest/test_nodedef.cpp @@ -25,7 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include "network/networkprotocol.h" -class TestNodeDef : public TestBase { +class TestNodeDef : public TestBase +{ public: TestNodeDef() { TestManager::registerTestModule(this); } const char *getName() { return "TestNodeDef"; } @@ -55,7 +56,7 @@ void TestNodeDef::testContentFeaturesSerialization() std::ostringstream os(std::ios::binary); f.serialize(os, LATEST_PROTOCOL_VERSION); - //verbosestream<<"Test ContentFeatures size: "<<os.str().size()<<std::endl; + // verbosestream<<"Test ContentFeatures size: "<<os.str().size()<<std::endl; std::istringstream is(os.str(), std::ios::binary); ContentFeatures f2; diff --git a/src/unittest/test_noderesolver.cpp b/src/unittest/test_noderesolver.cpp index 55acece6a..b009f5d2e 100644 --- a/src/unittest/test_noderesolver.cpp +++ b/src/unittest/test_noderesolver.cpp @@ -24,6 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gamedef.h" #include "nodedef.h" +#include <algorithm> + class TestNodeResolver : public TestBase { public: diff --git a/src/unittest/test_objdef.cpp b/src/unittest/test_objdef.cpp index df2633b38..c2acdcfe7 100644 --- a/src/unittest/test_objdef.cpp +++ b/src/unittest/test_objdef.cpp @@ -22,7 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "exceptions.h" #include "objdef.h" -class TestObjDef : public TestBase { +class TestObjDef : public TestBase +{ public: TestObjDef() { TestManager::registerTestModule(this); } const char *getName() { return "TestObjDef"; } @@ -60,7 +61,6 @@ void TestObjDef::testHandles() UASSERTEQ(ObjDefHandle, OBJDEF_ORE, type); } - void TestObjDef::testAddGetSetClear() { ObjDefManager testmgr(NULL, OBJDEF_GENERIC); diff --git a/src/unittest/test_player.cpp b/src/unittest/test_player.cpp index 85fbc8b2d..e2b1cd855 100644 --- a/src/unittest/test_player.cpp +++ b/src/unittest/test_player.cpp @@ -24,65 +24,17 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_sao.h" #include "server.h" -class TestPlayer : public TestBase { +class TestPlayer : public TestBase +{ public: TestPlayer() { TestManager::registerTestModule(this); } const char *getName() { return "TestPlayer"; } void runTests(IGameDef *gamedef); - - void testSave(IGameDef *gamedef); - void testLoad(IGameDef *gamedef); }; static TestPlayer g_test_instance; void TestPlayer::runTests(IGameDef *gamedef) { - TEST(testSave, gamedef); - TEST(testLoad, gamedef); -} - -void TestPlayer::testSave(IGameDef *gamedef) -{ - RemotePlayer rplayer("testplayer_save", gamedef->idef()); - PlayerSAO sao(NULL, 1, false); - sao.initialize(&rplayer, std::set<std::string>()); - rplayer.setPlayerSAO(&sao); - sao.setBreath(10); - sao.setHPRaw(8); - sao.setYaw(0.1f); - sao.setPitch(0.6f); - sao.setBasePosition(v3f(450.2f, -15.7f, 68.1f)); - rplayer.save(".", gamedef); - UASSERT(fs::PathExists("testplayer_save")); -} - -void TestPlayer::testLoad(IGameDef *gamedef) -{ - RemotePlayer rplayer("testplayer_load", gamedef->idef()); - PlayerSAO sao(NULL, 1, false); - sao.initialize(&rplayer, std::set<std::string>()); - rplayer.setPlayerSAO(&sao); - sao.setBreath(10); - sao.setHPRaw(8); - sao.setYaw(0.1f); - sao.setPitch(0.6f); - sao.setBasePosition(v3f(450.2f, -15.7f, 68.1f)); - rplayer.save(".", gamedef); - UASSERT(fs::PathExists("testplayer_load")); - - RemotePlayer rplayer_load("testplayer_load", gamedef->idef()); - PlayerSAO sao_load(NULL, 2, false); - std::ifstream is("testplayer_load", std::ios_base::binary); - UASSERT(is.good()); - rplayer_load.deSerialize(is, "testplayer_load", &sao_load); - is.close(); - - UASSERT(strcmp(rplayer_load.getName(), "testplayer_load") == 0); - UASSERT(sao_load.getBreath() == 10); - UASSERT(sao_load.getHP() == 8); - UASSERT(sao_load.getYaw() == 0.1f); - UASSERT(sao_load.getPitch() == 0.6f); - UASSERT(sao_load.getBasePosition() == v3f(450.2f, -15.7f, 68.1f)); } diff --git a/src/unittest/test_profiler.cpp b/src/unittest/test_profiler.cpp index fbc03f232..92d336a72 100644 --- a/src/unittest/test_profiler.cpp +++ b/src/unittest/test_profiler.cpp @@ -21,7 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "profiler.h" -class TestProfiler : public TestBase { +class TestProfiler : public TestBase +{ public: TestProfiler() { TestManager::registerTestModule(this); } const char *getName() { return "TestProfiler"; } diff --git a/src/unittest/test_threading.cpp b/src/unittest/test_threading.cpp index cdbf9674e..e1e1d3660 100644 --- a/src/unittest/test_threading.cpp +++ b/src/unittest/test_threading.cpp @@ -39,9 +39,7 @@ static TestThreading g_test_instance; void TestThreading::runTests(IGameDef *gamedef) { -#if !(defined(__MACH__) && defined(__APPLE__)) TEST(testStartStopWait); -#endif TEST(testThreadKill); TEST(testAtomicSemaphoreThread); } diff --git a/src/unittest/test_voxelalgorithms.cpp b/src/unittest/test_voxelalgorithms.cpp index 31b9cadd5..fd83844af 100644 --- a/src/unittest/test_voxelalgorithms.cpp +++ b/src/unittest/test_voxelalgorithms.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gamedef.h" #include "voxelalgorithms.h" +#include "util/numeric.h" class TestVoxelAlgorithms : public TestBase { public: @@ -31,6 +32,7 @@ public: void testPropogateSunlight(INodeDefManager *ndef); void testClearLightAndCollectSources(INodeDefManager *ndef); + void testVoxelLineIterator(INodeDefManager *ndef); }; static TestVoxelAlgorithms g_test_instance; @@ -41,6 +43,7 @@ void TestVoxelAlgorithms::runTests(IGameDef *gamedef) TEST(testPropogateSunlight, ndef); TEST(testClearLightAndCollectSources, ndef); + TEST(testVoxelLineIterator, ndef); } //////////////////////////////////////////////////////////////////////////////// @@ -202,3 +205,59 @@ void TestVoxelAlgorithms::testClearLightAndCollectSources(INodeDefManager *ndef) UASSERT(unlight_from.size() == 1); } } + +void TestVoxelAlgorithms::testVoxelLineIterator(INodeDefManager *ndef) +{ + // Test some lines + // Do not test lines that start or end on the border of + // two voxels as rounding errors can make the test fail! + std::vector<core::line3d<f32> > lines; + for (f32 x = -9.1; x < 9; x += 3.124) { + for (f32 y = -9.2; y < 9; y += 3.123) { + for (f32 z = -9.3; z < 9; z += 3.122) { + lines.push_back(core::line3d<f32>(-x, -y, -z, x, y, z)); + } + } + } + lines.push_back(core::line3d<f32>(0, 0, 0, 0, 0, 0)); + // Test every line + std::vector<core::line3d<f32> >::iterator it = lines.begin(); + for (; it < lines.end(); it++) { + core::line3d<f32> l = *it; + + // Initialize test + voxalgo::VoxelLineIterator iterator(l.start, l.getVector()); + + //Test the first voxel + v3s16 start_voxel = floatToInt(l.start, 1); + UASSERT(iterator.m_current_node_pos == start_voxel); + + // Values for testing + v3s16 end_voxel = floatToInt(l.end, 1); + v3s16 voxel_vector = end_voxel - start_voxel; + int nodecount = abs(voxel_vector.X) + abs(voxel_vector.Y) + + abs(voxel_vector.Z); + int actual_nodecount = 0; + v3s16 old_voxel = iterator.m_current_node_pos; + + while (iterator.hasNext()) { + iterator.next(); + actual_nodecount++; + v3s16 new_voxel = iterator.m_current_node_pos; + // This must be a neighbor of the old voxel + UASSERTEQ(f32, (new_voxel - old_voxel).getLengthSQ(), 1); + // The line must intersect with the voxel + v3f voxel_center = intToFloat(iterator.m_current_node_pos, 1); + aabb3f box(voxel_center - v3f(0.5, 0.5, 0.5), + voxel_center + v3f(0.5, 0.5, 0.5)); + UASSERT(box.intersectsWithLine(l)); + // Update old voxel + old_voxel = new_voxel; + } + + // Test last node + UASSERT(iterator.m_current_node_pos == end_voxel); + // Test node count + UASSERTEQ(int, actual_nodecount, nodecount); + } +} diff --git a/src/util/basic_macros.h b/src/util/basic_macros.h index c100b4f25..687d7cf85 100644 --- a/src/util/basic_macros.h +++ b/src/util/basic_macros.h @@ -20,14 +20,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef BASICMACROS_HEADER #define BASICMACROS_HEADER -#include <algorithm> - #define ARRLEN(x) (sizeof(x) / sizeof((x)[0])) #define MYMIN(a, b) ((a) < (b) ? (a) : (b)) #define MYMAX(a, b) ((a) > (b) ? (a) : (b)) +// Requires <algorithm> #define CONTAINS(c, v) (std::find((c).begin(), (c).end(), (v)) != (c).end()) // To disable copy constructors and assignment operations for some class @@ -50,4 +49,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #define STATIC_ASSERT(expr, msg) \ UNUSED_ATTRIBUTE typedef char msg[!!(expr) * 2 - 1] +// Macros to facilitate writing position vectors to a stream +// Usage: +// v3s16 pos(1,2,3); +// mystream << "message " << PP(pos) << std::endl; + +#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" + +#define PP2(x) "("<<(x).X<<","<<(x).Y<<")" + #endif diff --git a/src/util/cpp11.h b/src/util/cpp11.h new file mode 100644 index 000000000..14913cb86 --- /dev/null +++ b/src/util/cpp11.h @@ -0,0 +1,32 @@ +/* +Minetest +Copyright (C) 2016 nerzhul, Loic Blot <loic.blot@unix-experience.fr> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MT_CPP11_HEADER +#define MT_CPP11_HEADER + +#if __cplusplus < 201103L || _MSC_VER < 1600 +#define USE_CPP11_FAKE_KEYWORD +#endif + +#ifdef USE_CPP11_FAKE_KEYWORD +#define constexpr const +#define nullptr NULL +#endif + +#endif diff --git a/src/util/cpp11_container.h b/src/util/cpp11_container.h index 88317c9c4..0194385fc 100644 --- a/src/util/cpp11_container.h +++ b/src/util/cpp11_container.h @@ -29,15 +29,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #endif #ifdef USE_UNORDERED_CONTAINERS - #include <unordered_map> - #include <unordered_set> - #define UNORDERED_MAP std::unordered_map - #define UNORDERED_SET std::unordered_set +#include <unordered_map> +#include <unordered_set> +#define UNORDERED_MAP std::unordered_map +#define UNORDERED_SET std::unordered_set #else - #include <map> - #include <set> - #define UNORDERED_MAP std::map - #define UNORDERED_SET std::set +#include <map> +#include <set> +#define UNORDERED_MAP std::map +#define UNORDERED_SET std::set #endif #endif diff --git a/src/util/directiontables.h b/src/util/directiontables.h index 0dd3aab09..3cfe0fb3e 100644 --- a/src/util/directiontables.h +++ b/src/util/directiontables.h @@ -30,5 +30,59 @@ extern const v3s16 g_26dirs[26]; // 26th is (0,0,0) extern const v3s16 g_27dirs[27]; -#endif +/// Direction in the 6D format. g_27dirs contains corresponding vectors. +/// Here P means Positive, N stands for Negative. +enum Direction6D { +// 0 + D6D_ZP, + D6D_YP, + D6D_XP, + D6D_ZN, + D6D_YN, + D6D_XN, +// 6 + D6D_XN_YP, + D6D_XP_YP, + D6D_YP_ZP, + D6D_YP_ZN, + D6D_XN_ZP, + D6D_XP_ZP, + D6D_XN_ZN, + D6D_XP_ZN, + D6D_XN_YN, + D6D_XP_YN, + D6D_YN_ZP, + D6D_YN_ZN, +// 18 + D6D_XN_YP_ZP, + D6D_XP_YP_ZP, + D6D_XN_YP_ZN, + D6D_XP_YP_ZN, + D6D_XN_YN_ZP, + D6D_XP_YN_ZP, + D6D_XN_YN_ZN, + D6D_XP_YN_ZN, +// 26 + D6D, + +// aliases + D6D_BACK = D6D_ZP, + D6D_TOP = D6D_YP, + D6D_RIGHT = D6D_XP, + D6D_FRONT = D6D_ZN, + D6D_BOTTOM = D6D_YN, + D6D_LEFT = D6D_XN, +}; +/// Direction in the wallmounted format. +/// P is Positive, N is Negative. +enum DirectionWallmounted { + DWM_YP, + DWM_YN, + DWM_XP, + DWM_XN, + DWM_ZP, + DWM_ZN, +}; + +#endif diff --git a/src/util/hex.h b/src/util/hex.h index 6f00a79bf..c205d01da 100644 --- a/src/util/hex.h +++ b/src/util/hex.h @@ -30,9 +30,8 @@ static inline std::string hex_encode(const char *data, unsigned int data_size) char buf2[3]; buf2[2] = '\0'; - for(unsigned int i = 0; i < data_size; i++) - { - unsigned char c = (unsigned char) data[i]; + for (unsigned int i = 0; i < data_size; i++) { + unsigned char c = (unsigned char)data[i]; buf2[0] = hex_chars[(c & 0xf0) >> 4]; buf2[1] = hex_chars[c & 0x0f]; ret.append(buf2); @@ -43,16 +42,16 @@ static inline std::string hex_encode(const char *data, unsigned int data_size) static inline std::string hex_encode(const std::string &data) { - return hex_encode(data.c_str(), data.size()); + return hex_encode(data.c_str(), data.size()); } static inline bool hex_digit_decode(char hexdigit, unsigned char &value) { - if(hexdigit >= '0' && hexdigit <= '9') + if (hexdigit >= '0' && hexdigit <= '9') value = hexdigit - '0'; - else if(hexdigit >= 'A' && hexdigit <= 'F') + else if (hexdigit >= 'A' && hexdigit <= 'F') value = hexdigit - 'A' + 10; - else if(hexdigit >= 'a' && hexdigit <= 'f') + else if (hexdigit >= 'a' && hexdigit <= 'f') value = hexdigit - 'a' + 10; else return false; diff --git a/src/util/mathconstants.h b/src/util/mathconstants.h deleted file mode 100644 index 1b478aa95..000000000 --- a/src/util/mathconstants.h +++ /dev/null @@ -1,7 +0,0 @@ -#include <math.h> - -// MSVC doesn't seem to define this -#ifndef M_PI - #define M_PI 3.1415926535 -#endif - diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp index a9e7ae584..e6a9cb75e 100644 --- a/src/util/numeric.cpp +++ b/src/util/numeric.cpp @@ -18,107 +18,15 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "numeric.h" -#include "mathconstants.h" #include "log.h" #include "../constants.h" // BS, MAP_BLOCKSIZE #include "../noise.h" // PseudoRandom, PcgRandom #include "../threading/mutex_auto_lock.h" #include <string.h> -#include <iostream> -UNORDERED_MAP<u16, std::vector<v3s16> > FacePositionCache::m_cache; -Mutex FacePositionCache::m_cache_mutex; -// Calculate the borders of a "d-radius" cube -// TODO: Make it work without mutex and data races, probably thread-local -std::vector<v3s16> FacePositionCache::getFacePositions(u16 d) -{ - MutexAutoLock cachelock(m_cache_mutex); - if (m_cache.find(d) != m_cache.end()) - return m_cache[d]; - - generateFacePosition(d); - return m_cache[d]; - -} - -void FacePositionCache::generateFacePosition(u16 d) -{ - m_cache[d] = std::vector<v3s16>(); - if(d == 0) { - m_cache[d].push_back(v3s16(0,0,0)); - return; - } - if(d == 1) { - /* - This is an optimized sequence of coordinates. - */ - m_cache[d].push_back(v3s16( 0, 1, 0)); // top - m_cache[d].push_back(v3s16( 0, 0, 1)); // back - m_cache[d].push_back(v3s16(-1, 0, 0)); // left - m_cache[d].push_back(v3s16( 1, 0, 0)); // right - m_cache[d].push_back(v3s16( 0, 0,-1)); // front - m_cache[d].push_back(v3s16( 0,-1, 0)); // bottom - // 6 - m_cache[d].push_back(v3s16(-1, 0, 1)); // back left - m_cache[d].push_back(v3s16( 1, 0, 1)); // back right - m_cache[d].push_back(v3s16(-1, 0,-1)); // front left - m_cache[d].push_back(v3s16( 1, 0,-1)); // front right - m_cache[d].push_back(v3s16(-1,-1, 0)); // bottom left - m_cache[d].push_back(v3s16( 1,-1, 0)); // bottom right - m_cache[d].push_back(v3s16( 0,-1, 1)); // bottom back - m_cache[d].push_back(v3s16( 0,-1,-1)); // bottom front - m_cache[d].push_back(v3s16(-1, 1, 0)); // top left - m_cache[d].push_back(v3s16( 1, 1, 0)); // top right - m_cache[d].push_back(v3s16( 0, 1, 1)); // top back - m_cache[d].push_back(v3s16( 0, 1,-1)); // top front - // 18 - m_cache[d].push_back(v3s16(-1, 1, 1)); // top back-left - m_cache[d].push_back(v3s16( 1, 1, 1)); // top back-right - m_cache[d].push_back(v3s16(-1, 1,-1)); // top front-left - m_cache[d].push_back(v3s16( 1, 1,-1)); // top front-right - m_cache[d].push_back(v3s16(-1,-1, 1)); // bottom back-left - m_cache[d].push_back(v3s16( 1,-1, 1)); // bottom back-right - m_cache[d].push_back(v3s16(-1,-1,-1)); // bottom front-left - m_cache[d].push_back(v3s16( 1,-1,-1)); // bottom front-right - // 26 - return; - } - // Take blocks in all sides, starting from y=0 and going +-y - for(s16 y=0; y<=d-1; y++) { - // Left and right side, including borders - for(s16 z=-d; z<=d; z++) { - m_cache[d].push_back(v3s16(d,y,z)); - m_cache[d].push_back(v3s16(-d,y,z)); - if(y != 0) { - m_cache[d].push_back(v3s16(d,-y,z)); - m_cache[d].push_back(v3s16(-d,-y,z)); - } - } - // Back and front side, excluding borders - for(s16 x=-d+1; x<=d-1; x++) { - m_cache[d].push_back(v3s16(x,y,d)); - m_cache[d].push_back(v3s16(x,y,-d)); - if(y != 0) { - m_cache[d].push_back(v3s16(x,-y,d)); - m_cache[d].push_back(v3s16(x,-y,-d)); - } - } - } - - // Take the bottom and top face with borders - // -d<x<d, y=+-d, -d<z<d - for(s16 x=-d; x<=d; x++) - for(s16 z=-d; z<=d; z++) { - m_cache[d].push_back(v3s16(x,-d,z)); - m_cache[d].push_back(v3s16(x,d,z)); - } -} - -/* - myrand -*/ +// myrand PcgRandom g_pcgrand; diff --git a/src/util/numeric.h b/src/util/numeric.h index 4cdc254c3..4a27f657d 100644 --- a/src/util/numeric.h +++ b/src/util/numeric.h @@ -26,28 +26,20 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "../irr_v3d.h" #include "../irr_aabb3d.h" #include "../threading/mutex.h" -#include "cpp11_container.h" -#include <list> -#include <vector> +#define rangelim(d, min, max) ((d) < (min) ? (min) : ((d) > (max) ? (max) : (d))) +#define myfloor(x) ((x) < 0.0 ? (int)(x) - 1 : (int)(x)) +// The naive swap performs better than the xor version +#define SWAP(t, x, y) do { \ + t temp = x; \ + x = y; \ + y = temp; \ +} while (0) -/* - * This class permits to cache getFacePosition call results - * This reduces CPU usage and vector calls - */ -class FacePositionCache -{ -public: - static std::vector<v3s16> getFacePositions(u16 d); -private: - static void generateFacePosition(u16 d); - static UNORDERED_MAP<u16, std::vector<v3s16> > m_cache; - static Mutex m_cache_mutex; -}; inline s16 getContainerPos(s16 p, s16 d) { - return (p>=0 ? p : p-d+1) / d; + return (p >= 0 ? p : p - d + 1) / d; } inline v2s16 getContainerPos(v2s16 p, s16 d) @@ -130,16 +122,6 @@ inline bool isInArea(v3s16 p, v3s16 d) ); } -#define rangelim(d, min, max) ((d) < (min) ? (min) : ((d)>(max)?(max):(d))) -#define myfloor(x) ((x) > 0.0 ? (int)(x) : (int)(x) - 1) - -// The naive swap performs better than the xor version -#define SWAP(t, x, y) do { \ - t temp = x; \ - x = y; \ - y = temp; \ -} while (0) - inline void sortBoxVerticies(v3s16 &p1, v3s16 &p2) { if (p1.X > p2.X) SWAP(s16, p1.X, p2.X); @@ -149,6 +131,16 @@ inline void sortBoxVerticies(v3s16 &p1, v3s16 &p2) { SWAP(s16, p1.Z, p2.Z); } +inline v3s16 componentwise_min(const v3s16 &a, const v3s16 &b) +{ + return v3s16(MYMIN(a.X, b.X), MYMIN(a.Y, b.Y), MYMIN(a.Z, b.Z)); +} + +inline v3s16 componentwise_max(const v3s16 &a, const v3s16 &b) +{ + return v3s16(MYMAX(a.X, b.X), MYMAX(a.Y, b.Y), MYMAX(a.Z, b.Z)); +} + /** Returns \p f wrapped to the range [-360, 360] * @@ -256,11 +248,10 @@ inline s32 myround(f32 f) */ inline v3s16 floatToInt(v3f p, f32 d) { - v3s16 p2( - (p.X + (p.X>0 ? d/2 : -d/2))/d, - (p.Y + (p.Y>0 ? d/2 : -d/2))/d, - (p.Z + (p.Z>0 ? d/2 : -d/2))/d); - return p2; + return v3s16( + (p.X + (p.X > 0 ? d / 2 : -d / 2)) / d, + (p.Y + (p.Y > 0 ? d / 2 : -d / 2)) / d, + (p.Z + (p.Z > 0 ? d / 2 : -d / 2)) / d); } /* @@ -268,34 +259,31 @@ inline v3s16 floatToInt(v3f p, f32 d) */ inline v3f intToFloat(v3s16 p, f32 d) { - v3f p2( + return v3f( (f32)p.X * d, (f32)p.Y * d, (f32)p.Z * d ); - return p2; } // Random helper. Usually d=BS inline aabb3f getNodeBox(v3s16 p, float d) { return aabb3f( - (float)p.X * d - 0.5*d, - (float)p.Y * d - 0.5*d, - (float)p.Z * d - 0.5*d, - (float)p.X * d + 0.5*d, - (float)p.Y * d + 0.5*d, - (float)p.Z * d + 0.5*d + (float)p.X * d - 0.5 * d, + (float)p.Y * d - 0.5 * d, + (float)p.Z * d - 0.5 * d, + (float)p.X * d + 0.5 * d, + (float)p.Y * d + 0.5 * d, + (float)p.Z * d + 0.5 * d ); } + class IntervalLimiter { public: - IntervalLimiter(): - m_accumulator(0) - { - } + IntervalLimiter() : m_accumulator(0) {} /* dtime: time from last call to this method wanted_interval: interval wanted @@ -306,15 +294,17 @@ public: bool step(float dtime, float wanted_interval) { m_accumulator += dtime; - if(m_accumulator < wanted_interval) + if (m_accumulator < wanted_interval) return false; m_accumulator -= wanted_interval; return true; } -protected: + +private: float m_accumulator; }; + /* Splits a list into "pages". For example, the list [1,2,3,4,5] split into two pages would be [1,2,3],[4,5]. This function computes the @@ -330,29 +320,21 @@ protected: */ inline void paging(u32 length, u32 page, u32 pagecount, u32 &minindex, u32 &maxindex) { - if(length < 1 || pagecount < 1 || page < 1 || page > pagecount) - { + if (length < 1 || pagecount < 1 || page < 1 || page > pagecount) { // Special cases or invalid parameters minindex = maxindex = 0; - } - else if(pagecount <= length) - { + } else if(pagecount <= length) { // Less pages than entries in the list: // Each page contains at least one entry minindex = (length * (page-1) + (pagecount-1)) / pagecount; maxindex = (length * page + (pagecount-1)) / pagecount; - } - else - { + } else { // More pages than entries in the list: // Make sure the empty pages are at the end - if(page < length) - { + if (page < length) { minindex = page-1; maxindex = page; - } - else - { + } else { minindex = 0; maxindex = 0; } @@ -361,14 +343,14 @@ inline void paging(u32 length, u32 page, u32 pagecount, u32 &minindex, u32 &maxi inline float cycle_shift(float value, float by = 0, float max = 1) { - if (value + by < 0) return max + by + value; + if (value + by < 0) return value + by + max; if (value + by > max) return value + by - max; return value + by; } inline bool is_power_of_two(u32 n) { - return n != 0 && (n & (n-1)) == 0; + return n != 0 && (n & (n - 1)) == 0; } // Compute next-higher power of 2 efficiently, e.g. for power-of-2 texture sizes. diff --git a/src/util/pointedthing.cpp b/src/util/pointedthing.cpp index cd13000b5..ed3d4bb67 100644 --- a/src/util/pointedthing.cpp +++ b/src/util/pointedthing.cpp @@ -27,29 +27,25 @@ PointedThing::PointedThing(): type(POINTEDTHING_NOTHING), node_undersurface(0,0,0), node_abovesurface(0,0,0), + node_real_undersurface(0,0,0), + intersection_point(0,0,0), + intersection_normal(0,0,0), object_id(-1) {} std::string PointedThing::dump() const { std::ostringstream os(std::ios::binary); - if(type == POINTEDTHING_NOTHING) - { + if (type == POINTEDTHING_NOTHING) { os<<"[nothing]"; - } - else if(type == POINTEDTHING_NODE) - { + } else if (type == POINTEDTHING_NODE) { const v3s16 &u = node_undersurface; const v3s16 &a = node_abovesurface; os<<"[node under="<<u.X<<","<<u.Y<<","<<u.Z << " above="<<a.X<<","<<a.Y<<","<<a.Z<<"]"; - } - else if(type == POINTEDTHING_OBJECT) - { + } else if (type == POINTEDTHING_OBJECT) { os<<"[object "<<object_id<<"]"; - } - else - { + } else { os<<"[unknown PointedThing]"; } return os.str(); @@ -59,61 +55,56 @@ void PointedThing::serialize(std::ostream &os) const { writeU8(os, 0); // version writeU8(os, (u8)type); - if(type == POINTEDTHING_NOTHING) - { - // nothing - } - else if(type == POINTEDTHING_NODE) - { + switch (type) { + case POINTEDTHING_NOTHING: + break; + case POINTEDTHING_NODE: writeV3S16(os, node_undersurface); writeV3S16(os, node_abovesurface); - } - else if(type == POINTEDTHING_OBJECT) - { + break; + case POINTEDTHING_OBJECT: writeS16(os, object_id); + break; } } void PointedThing::deSerialize(std::istream &is) { int version = readU8(is); - if(version != 0) throw SerializationError( + if (version != 0) throw SerializationError( "unsupported PointedThing version"); type = (PointedThingType) readU8(is); - if(type == POINTEDTHING_NOTHING) - { - // nothing - } - else if(type == POINTEDTHING_NODE) - { + switch (type) { + case POINTEDTHING_NOTHING: + break; + case POINTEDTHING_NODE: node_undersurface = readV3S16(is); node_abovesurface = readV3S16(is); - } - else if(type == POINTEDTHING_OBJECT) - { + break; + case POINTEDTHING_OBJECT: object_id = readS16(is); - } - else - { - throw SerializationError( - "unsupported PointedThingType"); + break; + default: + throw SerializationError("unsupported PointedThingType"); } } bool PointedThing::operator==(const PointedThing &pt2) const { - if(type != pt2.type) + if (type != pt2.type) + { return false; - if(type == POINTEDTHING_NODE) + } + if (type == POINTEDTHING_NODE) { - if(node_undersurface != pt2.node_undersurface) - return false; - if(node_abovesurface != pt2.node_abovesurface) + if ((node_undersurface != pt2.node_undersurface) + || (node_abovesurface != pt2.node_abovesurface) + || (node_real_undersurface != pt2.node_real_undersurface)) return false; } - else if(type == POINTEDTHING_OBJECT) + else if (type == POINTEDTHING_OBJECT) { - if(object_id != pt2.object_id) + if (object_id != pt2.object_id) return false; } return true; diff --git a/src/util/pointedthing.h b/src/util/pointedthing.h index 2b2703e98..f695a4ebd 100644 --- a/src/util/pointedthing.h +++ b/src/util/pointedthing.h @@ -32,17 +32,57 @@ enum PointedThingType POINTEDTHING_OBJECT }; +//! An active object or node which is selected by a ray on the map. struct PointedThing { + //! The type of the pointed object. PointedThingType type; + /*! + * Only valid if type is POINTEDTHING_NODE. + * The coordinates of the node which owns the + * nodebox that the ray hits first. + * This may differ from node_real_undersurface if + * a nodebox exceeds the limits of its node. + */ v3s16 node_undersurface; + /*! + * Only valid if type is POINTEDTHING_NODE. + * The coordinates of the last node the ray intersects + * before node_undersurface. Same as node_undersurface + * if the ray starts in a nodebox. + */ v3s16 node_abovesurface; + /*! + * Only valid if type is POINTEDTHING_NODE. + * The coordinates of the node which contains the + * point of the collision and the nodebox of the node. + */ + v3s16 node_real_undersurface; + /*! + * Only valid if type isn't POINTEDTHING_NONE. + * First intersection point of the ray and the nodebox. + */ + v3f intersection_point; + /*! + * Only valid if type isn't POINTEDTHING_NONE. + * Normal vector of the intersection. + * This is perpendicular to the face the ray hits, + * points outside of the box and it's length is 1. + */ + v3s16 intersection_normal; + /*! + * Only valid if type is POINTEDTHING_OBJECT. + * The ID of the object the ray hit. + */ s16 object_id; PointedThing(); std::string dump() const; void serialize(std::ostream &os) const; void deSerialize(std::istream &is); + /*! + * This function ignores the intersection point and normal. + */ bool operator==(const PointedThing &pt2) const; bool operator!=(const PointedThing &pt2) const; }; diff --git a/src/util/serialize.cpp b/src/util/serialize.cpp index 99cb990f1..61d369bc4 100644 --- a/src/util/serialize.cpp +++ b/src/util/serialize.cpp @@ -354,6 +354,55 @@ std::string deSerializeJsonString(std::istream &is) return os.str(); } +std::string serializeJsonStringIfNeeded(const std::string &s) +{ + for (size_t i = 0; i < s.size(); ++i) { + if (s[i] <= 0x1f || s[i] >= 0x7f || s[i] == ' ' || s[i] == '\"') + return serializeJsonString(s); + } + return s; +} + +std::string deSerializeJsonStringIfNeeded(std::istream &is) +{ + std::ostringstream tmp_os; + bool expect_initial_quote = true; + bool is_json = false; + bool was_backslash = false; + for (;;) { + char c = is.get(); + if (is.eof()) + break; + + if (expect_initial_quote && c == '"') { + tmp_os << c; + is_json = true; + } else if(is_json) { + tmp_os << c; + if (was_backslash) + was_backslash = false; + else if (c == '\\') + was_backslash = true; + else if (c == '"') + break; // Found end of string + } else { + if (c == ' ') { + // Found end of word + is.unget(); + break; + } else { + tmp_os << c; + } + } + expect_initial_quote = false; + } + if (is_json) { + std::istringstream tmp_is(tmp_os.str(), std::ios::binary); + return deSerializeJsonString(tmp_is); + } else + return tmp_os.str(); +} + //// //// String/Struct conversions //// diff --git a/src/util/serialize.h b/src/util/serialize.h index 36324a675..e22434191 100644 --- a/src/util/serialize.h +++ b/src/util/serialize.h @@ -405,6 +405,13 @@ std::string serializeJsonString(const std::string &plain); // Reads a string encoded in JSON format std::string deSerializeJsonString(std::istream &is); +// If the string contains spaces, quotes or control characters, encodes as JSON. +// Else returns the string unmodified. +std::string serializeJsonStringIfNeeded(const std::string &s); + +// Parses a string serialized by serializeJsonStringIfNeeded. +std::string deSerializeJsonStringIfNeeded(std::istream &is); + // Creates a string consisting of the hexadecimal representation of `data` std::string serializeHexString(const std::string &data, bool insert_spaces=false); diff --git a/src/util/sha1.h b/src/util/sha1.h index c04947373..0ac08c67b 100644 --- a/src/util/sha1.h +++ b/src/util/sha1.h @@ -29,22 +29,23 @@ typedef unsigned int Uint32; class SHA1 { - private: - // fields - Uint32 H0, H1, H2, H3, H4; - unsigned char bytes[64]; - int unprocessedBytes; - Uint32 size; - void process(); - public: - SHA1(); - ~SHA1(); - void addBytes( const char* data, int num ); - unsigned char* getDigest(); - // utility methods - static Uint32 lrot( Uint32 x, int bits ); - static void storeBigEndianUint32( unsigned char* byte, Uint32 num ); - static void hexPrinter( unsigned char* c, int l ); +private: + // fields + Uint32 H0, H1, H2, H3, H4; + unsigned char bytes[64]; + int unprocessedBytes; + Uint32 size; + void process(); + +public: + SHA1(); + ~SHA1(); + void addBytes(const char *data, int num); + unsigned char *getDigest(); + // utility methods + static Uint32 lrot(Uint32 x, int bits); + static void storeBigEndianUint32(unsigned char *byte, Uint32 num); + static void hexPrinter(unsigned char *c, int l); }; #define SHA1_HEADER diff --git a/src/util/sha2.h b/src/util/sha2.h index 6ac045feb..233c85a81 100644 --- a/src/util/sha2.h +++ b/src/util/sha2.h @@ -57,21 +57,21 @@ */ #ifndef HEADER_SHA_H -# define HEADER_SHA_H +#define HEADER_SHA_H -# include <stddef.h> +#include <stddef.h> -#ifdef __cplusplus +#ifdef __cplusplus extern "C" { #endif -# if defined(OPENSSL_NO_SHA) || (defined(OPENSSL_NO_SHA0) && defined(OPENSSL_NO_SHA1)) -# error SHA is disabled. -# endif +#if defined(OPENSSL_NO_SHA) || (defined(OPENSSL_NO_SHA0) && defined(OPENSSL_NO_SHA1)) +#error SHA is disabled. +#endif -# if defined(OPENSSL_FIPS) -# define FIPS_SHA_SIZE_T size_t -# endif +#if defined(OPENSSL_FIPS) +#define FIPS_SHA_SIZE_T size_t +#endif /* Compat stuff from OpenSSL land @@ -79,11 +79,10 @@ extern "C" { /* crypto.h */ -# define fips_md_init(alg) fips_md_init_ctx(alg, alg) +#define fips_md_init(alg) fips_md_init_ctx(alg, alg) -# define fips_md_init_ctx(alg, cx) \ - int alg##_Init(cx##_CTX *c) -# define fips_cipher_abort(alg) while(0) +#define fips_md_init_ctx(alg, cx) int alg##_Init(cx##_CTX *c) +#define fips_cipher_abort(alg) while (0) /*- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -92,47 +91,51 @@ extern "C" { * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ -# if defined(__LP32__) -# define SHA_LONG unsigned long -# elif defined(__ILP64__) -# define SHA_LONG unsigned long -# define SHA_LONG_LOG2 3 -# else -# define SHA_LONG unsigned int -# endif - -# define SHA_LBLOCK 16 -# define SHA_CBLOCK (SHA_LBLOCK*4)/* SHA treats input data as a - * contiguous array of 32 bit wide - * big-endian values. */ -# define SHA_LAST_BLOCK (SHA_CBLOCK-8) -# define SHA_DIGEST_LENGTH 20 - -typedef struct SHAstate_st { - SHA_LONG h0, h1, h2, h3, h4; - SHA_LONG Nl, Nh; - SHA_LONG data[SHA_LBLOCK]; - unsigned int num; +#if defined(__LP32__) +#define SHA_LONG unsigned long +#elif defined(__ILP64__) +#define SHA_LONG unsigned long +#define SHA_LONG_LOG2 3 +#else +#define SHA_LONG unsigned int +#endif + +#define SHA_LBLOCK 16 +#define SHA_CBLOCK \ + (SHA_LBLOCK * 4) /* SHA treats input data as a \ + * contiguous array of 32 bit wide \ + * big-endian values. */ +#define SHA_LAST_BLOCK (SHA_CBLOCK - 8) +#define SHA_DIGEST_LENGTH 20 + +typedef struct SHAstate_st +{ + SHA_LONG h0, h1, h2, h3, h4; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num; } SHA_CTX; -# define SHA256_CBLOCK (SHA_LBLOCK*4)/* SHA-256 treats input data as a - * contiguous array of 32 bit wide - * big-endian values. */ -# define SHA224_DIGEST_LENGTH 28 -# define SHA256_DIGEST_LENGTH 32 - -typedef struct SHA256state_st { - SHA_LONG h[8]; - SHA_LONG Nl, Nh; - SHA_LONG data[SHA_LBLOCK]; - unsigned int num, md_len; +#define SHA256_CBLOCK \ + (SHA_LBLOCK * 4) /* SHA-256 treats input data as a \ + * contiguous array of 32 bit wide \ + * big-endian values. */ +#define SHA224_DIGEST_LENGTH 28 +#define SHA256_DIGEST_LENGTH 32 + +typedef struct SHA256state_st +{ + SHA_LONG h[8]; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num, md_len; } SHA256_CTX; -# ifndef OPENSSL_NO_SHA256 -# ifdef OPENSSL_FIPS +#ifndef OPENSSL_NO_SHA256 +#ifdef OPENSSL_FIPS int private_SHA224_Init(SHA256_CTX *c); int private_SHA256_Init(SHA256_CTX *c); -# endif +#endif int SHA224_Init(SHA256_CTX *c); int SHA224_Update(SHA256_CTX *c, const void *data, size_t len); int SHA224_Final(unsigned char *md, SHA256_CTX *c); @@ -142,12 +145,12 @@ int SHA256_Update(SHA256_CTX *c, const void *data, size_t len); int SHA256_Final(unsigned char *md, SHA256_CTX *c); unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md); void SHA256_Transform(SHA256_CTX *c, const unsigned char *data); -# endif +#endif -# define SHA384_DIGEST_LENGTH 48 -# define SHA512_DIGEST_LENGTH 64 +#define SHA384_DIGEST_LENGTH 48 +#define SHA512_DIGEST_LENGTH 64 -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/src/util/sha256.c b/src/util/sha256.c index 4c2bb71a8..4241f31f3 100644 --- a/src/util/sha256.c +++ b/src/util/sha256.c @@ -30,11 +30,6 @@ static void OPENSSL_cleanse(void *ptr, size_t len) cleanse_ctr = (unsigned char)ctr; } -# define fips_md_init(alg) fips_md_init_ctx(alg, alg) -# define fips_md_init_ctx(alg, cx) \ - int alg##_Init(cx##_CTX *c) -# define fips_cipher_abort(alg) while(0) - fips_md_init_ctx(SHA224, SHA256) { memset(c, 0, sizeof(*c)); diff --git a/src/util/srp.cpp b/src/util/srp.cpp index 77c1816e8..430ba1137 100644 --- a/src/util/srp.cpp +++ b/src/util/srp.cpp @@ -44,7 +44,7 @@ #if USE_SYSTEM_GMP || defined (__ANDROID__) || defined (ANDROID) #include <gmp.h> #else - #include <gmp/mini-gmp.h> + #include <mini-gmp.h> #endif #include <util/sha2.h> diff --git a/src/util/string.cpp b/src/util/string.cpp index 94064ef93..d41b91f24 100644 --- a/src/util/string.cpp +++ b/src/util/string.cpp @@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "hex.h" #include "../porting.h" +#include <algorithm> #include <sstream> #include <iomanip> #include <map> @@ -561,6 +562,7 @@ ColorContainer::ColorContainer() colors["darkgoldenrod"] = 0xb8860b; colors["darkgray"] = 0xa9a9a9; colors["darkgreen"] = 0x006400; + colors["darkgrey"] = 0xa9a9a9; colors["darkkhaki"] = 0xbdb76b; colors["darkmagenta"] = 0x8b008b; colors["darkolivegreen"] = 0x556b2f; @@ -571,11 +573,13 @@ ColorContainer::ColorContainer() colors["darkseagreen"] = 0x8fbc8f; colors["darkslateblue"] = 0x483d8b; colors["darkslategray"] = 0x2f4f4f; + colors["darkslategrey"] = 0x2f4f4f; colors["darkturquoise"] = 0x00ced1; colors["darkviolet"] = 0x9400d3; colors["deeppink"] = 0xff1493; colors["deepskyblue"] = 0x00bfff; colors["dimgray"] = 0x696969; + colors["dimgrey"] = 0x696969; colors["dodgerblue"] = 0x1e90ff; colors["firebrick"] = 0xb22222; colors["floralwhite"] = 0xfffaf0; @@ -588,6 +592,7 @@ ColorContainer::ColorContainer() colors["gray"] = 0x808080; colors["green"] = 0x008000; colors["greenyellow"] = 0xadff2f; + colors["grey"] = 0x808080; colors["honeydew"] = 0xf0fff0; colors["hotpink"] = 0xff69b4; colors["indianred"] = 0xcd5c5c; @@ -604,11 +609,13 @@ ColorContainer::ColorContainer() colors["lightgoldenrodyellow"] = 0xfafad2; colors["lightgray"] = 0xd3d3d3; colors["lightgreen"] = 0x90ee90; + colors["lightgrey"] = 0xd3d3d3; colors["lightpink"] = 0xffb6c1; colors["lightsalmon"] = 0xffa07a; colors["lightseagreen"] = 0x20b2aa; colors["lightskyblue"] = 0x87cefa; colors["lightslategray"] = 0x778899; + colors["lightslategrey"] = 0x778899; colors["lightsteelblue"] = 0xb0c4de; colors["lightyellow"] = 0xffffe0; colors["lime"] = 0x00ff00; @@ -661,6 +668,7 @@ ColorContainer::ColorContainer() colors["skyblue"] = 0x87ceeb; colors["slateblue"] = 0x6a5acd; colors["slategray"] = 0x708090; + colors["slategrey"] = 0x708090; colors["snow"] = 0xfffafa; colors["springgreen"] = 0x00ff7f; colors["steelblue"] = 0x4682b4; diff --git a/src/util/string.h b/src/util/string.h index 572c37150..cc278da13 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -232,7 +232,7 @@ inline std::vector<std::basic_string<T> > str_split( */ inline std::string lowercase(const std::string &str) { - std::string s2; + std::string s2 = ""; s2.reserve(str.size()); @@ -423,6 +423,18 @@ inline void str_replace(std::string &str, const std::string &pattern, } /** + * Escapes characters [ ] \ , ; that can not be used in formspecs + */ +inline void str_formspec_escape(std::string &str) +{ + str_replace(str, "\\", "\\\\"); + str_replace(str, "]", "\\]"); + str_replace(str, "[", "\\["); + str_replace(str, ";", "\\;"); + str_replace(str, ",", "\\,"); +} + +/** * Replace all occurrences of the character \p from in \p str with \p to. * * @param str The string to (potentially) modify. @@ -614,4 +626,28 @@ inline const char *bool_to_cstr(bool val) return val ? "true" : "false"; } +inline const std::string duration_to_string(int sec) +{ + int min = sec / 60; + sec %= 60; + int hour = min / 60; + min %= 60; + + std::stringstream ss; + if (hour > 0) { + ss << hour << "h "; + } + + if (min > 0) { + ss << min << "m "; + } + + if (sec > 0) { + ss << sec << "s "; + } + + return ss.str(); +} + + #endif diff --git a/src/util/thread.h b/src/util/thread.h index 5ed63544c..b96f302f6 100644 --- a/src/util/thread.h +++ b/src/util/thread.h @@ -26,11 +26,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "../threading/mutex_auto_lock.h" #include "porting.h" #include "log.h" +#include "container.h" template<typename T> -class MutexedVariable { +class MutexedVariable +{ public: - MutexedVariable(T value): + MutexedVariable(const T &value): m_value(value) {} @@ -40,21 +42,14 @@ public: return m_value; } - void set(T value) + void set(const T &value) { MutexAutoLock lock(m_mutex); m_value = value; } - // You'll want to grab this in a SharedPtr - MutexAutoLock *getLock() - { - return new MutexAutoLock(m_mutex); - } - // You pretty surely want to grab the lock when accessing this T m_value; - private: Mutex m_mutex; }; @@ -88,8 +83,8 @@ public: GetRequest() {} ~GetRequest() {} - GetRequest(Key a_key) { - key = a_key; + GetRequest(const Key &a_key): key(a_key) + { } Key key; @@ -111,7 +106,7 @@ public: return m_queue.empty(); } - void add(Key key, Caller caller, CallerData callerdata, + void add(const Key &key, Caller caller, CallerData callerdata, ResultQueue<Key, T, Caller, CallerData> *dest) { typename std::deque<GetRequest<Key, T, Caller, CallerData> >::iterator i; diff --git a/src/util/timetaker.cpp b/src/util/timetaker.cpp index dcf07dc0d..ac686c3a3 100644 --- a/src/util/timetaker.cpp +++ b/src/util/timetaker.cpp @@ -19,31 +19,26 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "timetaker.h" -#include "../gettime.h" +#include "../porting.h" #include "../log.h" #include <ostream> -TimeTaker::TimeTaker(const char *name, u32 *result, TimePrecision prec) +TimeTaker::TimeTaker(const std::string &name, u64 *result, TimePrecision prec) { m_name = name; m_result = result; m_running = true; m_precision = prec; - m_time1 = getTime(prec); + m_time1 = porting::getTime(prec); } -u32 TimeTaker::stop(bool quiet) +u64 TimeTaker::stop(bool quiet) { - if(m_running) - { - u32 time2 = getTime(m_precision); - u32 dtime = time2 - m_time1; - if(m_result != NULL) - { + if (m_running) { + u64 dtime = porting::getTime(m_precision) - m_time1; + if (m_result != NULL) { (*m_result) += dtime; - } - else - { + } else { if (!quiet) { static const char* const units[] = { "s" /* PRECISION_SECONDS */, @@ -62,10 +57,8 @@ u32 TimeTaker::stop(bool quiet) return 0; } -u32 TimeTaker::getTimerTime() +u64 TimeTaker::getTimerTime() { - u32 time2 = getTime(m_precision); - u32 dtime = time2 - m_time1; - return dtime; + return porting::getTime(m_precision) - m_time1; } diff --git a/src/util/timetaker.h b/src/util/timetaker.h index 5512c205f..c10f4f535 100644 --- a/src/util/timetaker.h +++ b/src/util/timetaker.h @@ -30,24 +30,24 @@ with this program; if not, write to the Free Software Foundation, Inc., class TimeTaker { public: - TimeTaker(const char *name, u32 *result=NULL, - TimePrecision=PRECISION_MILLI); + TimeTaker(const std::string &name, u64 *result=NULL, + TimePrecision prec=PRECISION_MILLI); ~TimeTaker() { stop(); } - u32 stop(bool quiet=false); + u64 stop(bool quiet=false); - u32 getTimerTime(); + u64 getTimerTime(); private: - const char *m_name; - u32 m_time1; + std::string m_name; + u64 m_time1; bool m_running; TimePrecision m_precision; - u32 *m_result; + u64 *m_result; }; #endif diff --git a/src/voxel.cpp b/src/voxel.cpp index 87773b240..78efde5bb 100644 --- a/src/voxel.cpp +++ b/src/voxel.cpp @@ -27,14 +27,10 @@ with this program; if not, write to the Free Software Foundation, Inc., /* Debug stuff */ -u32 addarea_time = 0; -u32 emerge_time = 0; -u32 emerge_load_time = 0; -u32 clearflag_time = 0; -//u32 getwaterpressure_time = 0; -//u32 spreadwaterpressure_time = 0; -u32 updateareawaterpressure_time = 0; -u32 flowwater_pre_time = 0; +u64 addarea_time = 0; +u64 emerge_time = 0; +u64 emerge_load_time = 0; +u64 clearflag_time = 0; VoxelManipulator::VoxelManipulator(): diff --git a/src/voxel.h b/src/voxel.h index 58ad39be4..3a64ccc79 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -49,8 +49,8 @@ class INodeDefManager; /* Debug stuff */ -extern u32 emerge_time; -extern u32 emerge_load_time; +extern u64 emerge_time; +extern u64 emerge_load_time; /* This class resembles aabbox3d<s16> a lot, but has inclusive diff --git a/src/voxelalgorithms.cpp b/src/voxelalgorithms.cpp index 93cc33acc..40f8595a7 100644 --- a/src/voxelalgorithms.cpp +++ b/src/voxelalgorithms.cpp @@ -423,6 +423,7 @@ void unspread_light(Map *map, INodeDefManager *nodemgr, LightBank bank, if (step_rel_block_pos(i, neighbor_rel_pos, neighbor_block_pos)) { neighbor_block = map->getBlockNoCreateNoEx(neighbor_block_pos); if (neighbor_block == NULL) { + current.block->setLightingComplete(bank, i, false); continue; } } else { @@ -486,7 +487,8 @@ void unspread_light(Map *map, INodeDefManager *nodemgr, LightBank bank, * \param modified_blocks output, all modified map blocks are added to this */ void spread_light(Map *map, INodeDefManager *nodemgr, LightBank bank, - LightQueue &light_sources, std::map<v3s16, MapBlock*> &modified_blocks) + LightQueue &light_sources, + std::map<v3s16, MapBlock*> &modified_blocks) { // The light the current node can provide to its neighbors. u8 spreading_light; @@ -511,6 +513,7 @@ void spread_light(Map *map, INodeDefManager *nodemgr, LightBank bank, if (step_rel_block_pos(i, neighbor_rel_pos, neighbor_block_pos)) { neighbor_block = map->getBlockNoCreateNoEx(neighbor_block_pos); if (neighbor_block == NULL) { + current.block->setLightingComplete(bank, i, false); continue; } } else { @@ -539,6 +542,21 @@ void spread_light(Map *map, INodeDefManager *nodemgr, LightBank bank, } } +struct SunlightPropagationUnit{ + v2s16 relative_pos; + bool is_sunlit; + + SunlightPropagationUnit(v2s16 relpos, bool sunlit): + relative_pos(relpos), + is_sunlit(sunlit) + {} +}; + +struct SunlightPropagationData{ + std::vector<SunlightPropagationUnit> data; + v3s16 target_block; +}; + /*! * Returns true if the node gets sunlight from the * node above it. @@ -584,10 +602,11 @@ bool is_sunlight_above(Map *map, v3s16 pos, INodeDefManager *ndef) static const LightBank banks[] = { LIGHTBANK_DAY, LIGHTBANK_NIGHT }; -void update_lighting_nodes(Map *map, INodeDefManager *ndef, +void update_lighting_nodes(Map *map, std::vector<std::pair<v3s16, MapNode> > &oldnodes, std::map<v3s16, MapBlock*> &modified_blocks) { + INodeDefManager *ndef = map->getNodeDefManager(); // For node getter functions bool is_valid_position; @@ -596,6 +615,22 @@ void update_lighting_nodes(Map *map, INodeDefManager *ndef, LightBank bank = banks[i]; UnlightQueue disappearing_lights(256); ReLightQueue light_sources(256); + // Nodes that are brighter than the brightest modified node was + // won't change, since they didn't get their light from a + // modified node. + u8 min_safe_light = 0; + for (std::vector<std::pair<v3s16, MapNode> >::iterator it = + oldnodes.begin(); it < oldnodes.end(); ++it) { + u8 old_light = it->second.getLight(bank, ndef); + if (old_light > min_safe_light) { + min_safe_light = old_light; + } + } + // If only one node changed, even nodes with the same brightness + // didn't get their light from the changed node. + if (oldnodes.size() > 1) { + min_safe_light++; + } // For each changed node process sunlight and initialize for (std::vector<std::pair<v3s16, MapNode> >::iterator it = oldnodes.begin(); it < oldnodes.end(); ++it) { @@ -634,11 +669,9 @@ void update_lighting_nodes(Map *map, INodeDefManager *ndef, MapNode n2 = map->getNodeNoEx(p2, &is_valid); if (is_valid) { u8 spread = n2.getLight(bank, ndef); - // If the neighbor is at least as bright as - // this node then its light is not from - // this node. - // Its light can spread to this node. - if (spread > new_light && spread >= old_light) { + // If it is sure that the neighbor won't be + // unlighted, its light can spread to this node. + if (spread > new_light && spread >= min_safe_light) { new_light = spread - 1; } } @@ -735,7 +768,129 @@ void update_lighting_nodes(Map *map, INodeDefManager *ndef, for (u8 i = 0; i <= LIGHT_SUN; i++) { const std::vector<ChangingLight> &lights = light_sources.lights[i]; for (std::vector<ChangingLight>::const_iterator it = lights.begin(); - it < lights.end(); it++) { + it < lights.end(); ++it) { + MapNode n = it->block->getNodeNoCheck(it->rel_position, + &is_valid_position); + n.setLight(bank, i, ndef); + it->block->setNodeNoCheck(it->rel_position, n); + } + } + // Spread lights. + spread_light(map, ndef, bank, light_sources, modified_blocks); + } +} + +/*! + * Borders of a map block in relative node coordinates. + * Compatible with type 'direction'. + */ +const VoxelArea block_borders[] = { + VoxelArea(v3s16(15, 0, 0), v3s16(15, 15, 15)), //X+ + VoxelArea(v3s16(0, 15, 0), v3s16(15, 15, 15)), //Y+ + VoxelArea(v3s16(0, 0, 15), v3s16(15, 15, 15)), //Z+ + VoxelArea(v3s16(0, 0, 0), v3s16(15, 15, 0)), //Z- + VoxelArea(v3s16(0, 0, 0), v3s16(15, 0, 15)), //Y- + VoxelArea(v3s16(0, 0, 0), v3s16(0, 15, 15)) //X- +}; + +/*! + * Returns true if: + * -the node has unloaded neighbors + * -the node doesn't have light + * -the node's light is the same as the maximum of + * its light source and its brightest neighbor minus one. + * . + */ +bool is_light_locally_correct(Map *map, INodeDefManager *ndef, LightBank bank, + v3s16 pos) +{ + bool is_valid_position; + MapNode n = map->getNodeNoEx(pos, &is_valid_position); + const ContentFeatures &f = ndef->get(n); + if (f.param_type != CPT_LIGHT) { + return true; + } + u8 light = n.getLightNoChecks(bank, &f); + assert(f.light_source <= LIGHT_MAX); + u8 brightest_neighbor = f.light_source + 1; + for (direction d = 0; d < 6; ++d) { + MapNode n2 = map->getNodeNoEx(pos + neighbor_dirs[d], + &is_valid_position); + u8 light2 = n2.getLight(bank, ndef); + if (brightest_neighbor < light2) { + brightest_neighbor = light2; + } + } + assert(light <= LIGHT_SUN); + return brightest_neighbor == light + 1; +} + +void update_block_border_lighting(Map *map, MapBlock *block, + std::map<v3s16, MapBlock*> &modified_blocks) +{ + INodeDefManager *ndef = map->getNodeDefManager(); + bool is_valid_position; + for (s32 i = 0; i < 2; i++) { + LightBank bank = banks[i]; + // Since invalid light is not common, do not allocate + // memory if not needed. + UnlightQueue disappearing_lights(0); + ReLightQueue light_sources(0); + // Get incorrect lights + for (direction d = 0; d < 6; d++) { + // For each direction + // Get neighbor block + v3s16 otherpos = block->getPos() + neighbor_dirs[d]; + MapBlock *other = map->getBlockNoCreateNoEx(otherpos); + if (other == NULL) { + continue; + } + // Only update if lighting was not completed. + if (block->isLightingComplete(bank, d) && + other->isLightingComplete(bank, 5 - d)) + continue; + // Reset flags + block->setLightingComplete(bank, d, true); + other->setLightingComplete(bank, 5 - d, true); + // The two blocks and their connecting surfaces + MapBlock *blocks[] = {block, other}; + VoxelArea areas[] = {block_borders[d], block_borders[5 - d]}; + // For both blocks + for (u8 blocknum = 0; blocknum < 2; blocknum++) { + MapBlock *b = blocks[blocknum]; + VoxelArea a = areas[blocknum]; + // For all nodes + for (s32 x = a.MinEdge.X; x <= a.MaxEdge.X; x++) + for (s32 z = a.MinEdge.Z; z <= a.MaxEdge.Z; z++) + for (s32 y = a.MinEdge.Y; y <= a.MaxEdge.Y; y++) { + MapNode n = b->getNodeNoCheck(x, y, z, + &is_valid_position); + u8 light = n.getLight(bank, ndef); + // Sunlight is fixed + if (light < LIGHT_SUN) { + // Unlight if not correct + if (!is_light_locally_correct(map, ndef, bank, + v3s16(x, y, z) + b->getPosRelative())) { + // Initialize for unlighting + n.setLight(bank, 0, ndef); + b->setNodeNoCheck(x, y, z, n); + modified_blocks[b->getPos()]=b; + disappearing_lights.push(light, + relative_v3(x, y, z), b->getPos(), b, + 6); + } + } + } + } + } + // Remove lights + unspread_light(map, ndef, bank, disappearing_lights, light_sources, + modified_blocks); + // Initialize light values for light spreading. + for (u8 i = 0; i <= LIGHT_SUN; i++) { + const std::vector<ChangingLight> &lights = light_sources.lights[i]; + for (std::vector<ChangingLight>::const_iterator it = lights.begin(); + it < lights.end(); ++it) { MapNode n = it->block->getNodeNoCheck(it->rel_position, &is_valid_position); n.setLight(bank, i, ndef); @@ -747,5 +902,573 @@ void update_lighting_nodes(Map *map, INodeDefManager *ndef, } } +/*! + * Resets the lighting of the given VoxelManipulator to + * complete darkness and full sunlight. + * Operates in one map sector. + * + * \param offset contains the least x and z node coordinates + * of the map sector. + * \param light incoming sunlight, light[x][z] is true if there + * is sunlight above the voxel manipulator at the given x-z coordinates. + * The array's indices are relative node coordinates in the sector. + * After the procedure returns, this contains outgoing light at + * the bottom of the voxel manipulator. + */ +void fill_with_sunlight(MMVManip *vm, INodeDefManager *ndef, v2s16 offset, + bool light[MAP_BLOCKSIZE][MAP_BLOCKSIZE]) +{ + // Distance in array between two nodes on top of each other. + s16 ystride = vm->m_area.getExtent().X; + // Cache the ignore node. + MapNode ignore = MapNode(CONTENT_IGNORE); + // For each column of nodes: + for (s16 z = 0; z < MAP_BLOCKSIZE; z++) + for (s16 x = 0; x < MAP_BLOCKSIZE; x++) { + // Position of the column on the map. + v2s16 realpos = offset + v2s16(x, z); + // Array indices in the voxel manipulator + s32 maxindex = vm->m_area.index(realpos.X, vm->m_area.MaxEdge.Y, + realpos.Y); + s32 minindex = vm->m_area.index(realpos.X, vm->m_area.MinEdge.Y, + realpos.Y); + // True if the current node has sunlight. + bool lig = light[z][x]; + // For each node, downwards: + for (s32 i = maxindex; i >= minindex; i -= ystride) { + MapNode *n; + if (vm->m_flags[i] & VOXELFLAG_NO_DATA) + n = &ignore; + else + n = &vm->m_data[i]; + // Ignore IGNORE nodes, these are not generated yet. + if(n->getContent() == CONTENT_IGNORE) + continue; + const ContentFeatures &f = ndef->get(n->getContent()); + if (lig && !f.sunlight_propagates) + // Sunlight is stopped. + lig = false; + // Reset light + n->setLight(LIGHTBANK_DAY, lig ? 15 : 0, f); + n->setLight(LIGHTBANK_NIGHT, 0, f); + } + // Output outgoing light. + light[z][x] = lig; + } +} + +/*! + * Returns incoming sunlight for one map block. + * If block above is not found, it is loaded. + * + * \param pos position of the map block that gets the sunlight. + * \param light incoming sunlight, light[z][x] is true if there + * is sunlight above the block at the given z-x relative + * node coordinates. + */ +void is_sunlight_above_block(ServerMap *map, mapblock_v3 pos, + INodeDefManager *ndef, bool light[MAP_BLOCKSIZE][MAP_BLOCKSIZE]) +{ + mapblock_v3 source_block_pos = pos + v3s16(0, 1, 0); + // Get or load source block. + // It might take a while to load, but correcting incorrect + // sunlight may be even slower. + MapBlock *source_block = map->emergeBlock(source_block_pos, false); + // Trust only generated blocks. + if (source_block == NULL || source_block->isDummy() + || !source_block->isGenerated()) { + // But if there is no block above, then use heuristics + bool sunlight = true; + MapBlock *node_block = map->getBlockNoCreateNoEx(pos); + if (node_block == NULL) + // This should not happen. + sunlight = false; + else + sunlight = !node_block->getIsUnderground(); + for (s16 z = 0; z < MAP_BLOCKSIZE; z++) + for (s16 x = 0; x < MAP_BLOCKSIZE; x++) + light[z][x] = sunlight; + } else { + // Dummy boolean, the position is valid. + bool is_valid_position; + // For each column: + for (s16 z = 0; z < MAP_BLOCKSIZE; z++) + for (s16 x = 0; x < MAP_BLOCKSIZE; x++) { + // Get the bottom block. + MapNode above = source_block->getNodeNoCheck(x, 0, z, + &is_valid_position); + light[z][x] = above.getLight(LIGHTBANK_DAY, ndef) == LIGHT_SUN; + } + } +} + +/*! + * Propagates sunlight down in a given map block. + * + * \param data contains incoming sunlight and shadow and + * the coordinates of the target block. + * \param unlight propagated shadow is inserted here + * \param relight propagated sunlight is inserted here + * + * \returns true if the block was modified, false otherwise. + */ +bool propagate_block_sunlight(Map *map, INodeDefManager *ndef, + SunlightPropagationData *data, UnlightQueue *unlight, ReLightQueue *relight) +{ + bool modified = false; + // Get the block. + MapBlock *block = map->getBlockNoCreateNoEx(data->target_block); + if (block == NULL || block->isDummy()) { + // The work is done if the block does not contain data. + data->data.clear(); + return false; + } + // Dummy boolean + bool is_valid; + // For each changing column of nodes: + size_t index; + for (index = 0; index < data->data.size(); index++) { + SunlightPropagationUnit it = data->data[index]; + // Relative position of the currently inspected node. + relative_v3 current_pos(it.relative_pos.X, MAP_BLOCKSIZE - 1, + it.relative_pos.Y); + if (it.is_sunlit) { + // Propagate sunlight. + // For each node downwards: + for (; current_pos.Y >= 0; current_pos.Y--) { + MapNode n = block->getNodeNoCheck(current_pos, &is_valid); + const ContentFeatures &f = ndef->get(n); + if (n.getLightRaw(LIGHTBANK_DAY, f) < LIGHT_SUN + && f.sunlight_propagates) { + // This node gets sunlight. + n.setLight(LIGHTBANK_DAY, LIGHT_SUN, f); + block->setNodeNoCheck(current_pos, n); + modified = true; + relight->push(LIGHT_SUN, current_pos, data->target_block, + block, 4); + } else { + // Light already valid, propagation stopped. + break; + } + } + } else { + // Propagate shadow. + // For each node downwards: + for (; current_pos.Y >= 0; current_pos.Y--) { + MapNode n = block->getNodeNoCheck(current_pos, &is_valid); + const ContentFeatures &f = ndef->get(n); + if (n.getLightRaw(LIGHTBANK_DAY, f) == LIGHT_SUN) { + // The sunlight is no longer valid. + n.setLight(LIGHTBANK_DAY, 0, f); + block->setNodeNoCheck(current_pos, n); + modified = true; + unlight->push(LIGHT_SUN, current_pos, data->target_block, + block, 4); + } else { + // Reached shadow, propagation stopped. + break; + } + } + } + if (current_pos.Y >= 0) { + // Propagation stopped, remove from data. + data->data[index] = data->data.back(); + data->data.pop_back(); + index--; + } + } + return modified; +} + +/*! + * Borders of a map block in relative node coordinates. + * The areas do not overlap. + * Compatible with type 'direction'. + */ +const VoxelArea block_pad[] = { + VoxelArea(v3s16(15, 0, 0), v3s16(15, 15, 15)), //X+ + VoxelArea(v3s16(1, 15, 0), v3s16(14, 15, 15)), //Y+ + VoxelArea(v3s16(1, 1, 15), v3s16(14, 14, 15)), //Z+ + VoxelArea(v3s16(1, 1, 0), v3s16(14, 14, 0)), //Z- + VoxelArea(v3s16(1, 0, 0), v3s16(14, 0, 15)), //Y- + VoxelArea(v3s16(0, 0, 0), v3s16(0, 15, 15)) //X- +}; + +/*! + * The common part of bulk light updates - it is always executed. + * The procedure takes the nodes that should be unlit, and the + * full modified area. + * + * The procedure handles the correction of all lighting except + * direct sunlight spreading. + * + * \param minblock least coordinates of the changed area in block + * coordinates + * \param maxblock greatest coordinates of the changed area in block + * coordinates + * \param unlight the first queue is for day light, the second is for + * night light. Contains all nodes on the borders that need to be unlit. + * \param relight the first queue is for day light, the second is for + * night light. Contains nodes that were not modified, but got sunlight + * because the changes. + * \param modified_blocks the procedure adds all modified blocks to + * this map + */ +void finish_bulk_light_update(Map *map, mapblock_v3 minblock, + mapblock_v3 maxblock, UnlightQueue unlight[2], ReLightQueue relight[2], + std::map<v3s16, MapBlock*> *modified_blocks) +{ + INodeDefManager *ndef = map->getNodeDefManager(); + // dummy boolean + bool is_valid; + + // --- STEP 1: Do unlighting + + for (size_t bank = 0; bank < 2; bank++) { + LightBank b = banks[bank]; + unspread_light(map, ndef, b, unlight[bank], relight[bank], + *modified_blocks); + } + + // --- STEP 2: Get all newly inserted light sources + + // For each block: + for (s16 b_x = minblock.X; b_x <= maxblock.X; b_x++) + for (s16 b_y = minblock.Y; b_y <= maxblock.Y; b_y++) + for (s16 b_z = minblock.Z; b_z <= maxblock.Z; b_z++) { + const v3s16 blockpos(b_x, b_y, b_z); + MapBlock *block = map->getBlockNoCreateNoEx(blockpos); + if (!block || block->isDummy()) + // Skip not existing blocks + continue; + // For each node in the block: + for (s32 x = 0; x < MAP_BLOCKSIZE; x++) + for (s32 z = 0; z < MAP_BLOCKSIZE; z++) + for (s32 y = 0; y < MAP_BLOCKSIZE; y++) { + v3s16 relpos(x, y, z); + MapNode node = block->getNodeNoCheck(x, y, z, &is_valid); + const ContentFeatures &f = ndef->get(node); + // For each light bank + for (size_t b = 0; b < 2; b++) { + LightBank bank = banks[b]; + u8 light = f.param_type == CPT_LIGHT ? + node.getLightNoChecks(bank, &f): + f.light_source; + if (light > 1) + relight[b].push(light, relpos, blockpos, block, 6); + } // end of banks + } // end of nodes + } // end of blocks + + // --- STEP 3: do light spreading + + // For each light bank: + for (size_t b = 0; b < 2; b++) { + LightBank bank = banks[b]; + // Sunlight is already initialized. + u8 maxlight = (b == 0) ? LIGHT_MAX : LIGHT_SUN; + // Initialize light values for light spreading. + for (u8 i = 0; i <= maxlight; i++) { + const std::vector<ChangingLight> &lights = relight[b].lights[i]; + for (std::vector<ChangingLight>::const_iterator it = lights.begin(); + it < lights.end(); ++it) { + MapNode n = it->block->getNodeNoCheck(it->rel_position, + &is_valid); + n.setLight(bank, i, ndef); + it->block->setNodeNoCheck(it->rel_position, n); + } + } + // Spread lights. + spread_light(map, ndef, bank, relight[b], *modified_blocks); + } +} + +void blit_back_with_light(ServerMap *map, MMVManip *vm, + std::map<v3s16, MapBlock*> *modified_blocks) +{ + INodeDefManager *ndef = map->getNodeDefManager(); + mapblock_v3 minblock = getNodeBlockPos(vm->m_area.MinEdge); + mapblock_v3 maxblock = getNodeBlockPos(vm->m_area.MaxEdge); + // First queue is for day light, second is for night light. + UnlightQueue unlight[] = { UnlightQueue(256), UnlightQueue(256) }; + ReLightQueue relight[] = { ReLightQueue(256), ReLightQueue(256) }; + // Will hold sunlight data. + bool lights[MAP_BLOCKSIZE][MAP_BLOCKSIZE]; + SunlightPropagationData data; + // Dummy boolean. + bool is_valid; + + // --- STEP 1: reset everything to sunlight + + // For each map block: + for (s16 x = minblock.X; x <= maxblock.X; x++) + for (s16 z = minblock.Z; z <= maxblock.Z; z++) { + // Extract sunlight above. + is_sunlight_above_block(map, v3s16(x, maxblock.Y, z), ndef, lights); + v2s16 offset(x, z); + offset *= MAP_BLOCKSIZE; + // Reset the voxel manipulator. + fill_with_sunlight(vm, ndef, offset, lights); + // Copy sunlight data + data.target_block = v3s16(x, minblock.Y - 1, z); + for (s16 z = 0; z < MAP_BLOCKSIZE; z++) + for (s16 x = 0; x < MAP_BLOCKSIZE; x++) + data.data.push_back( + SunlightPropagationUnit(v2s16(x, z), lights[z][x])); + // Propagate sunlight and shadow below the voxel manipulator. + while (!data.data.empty()) { + if (propagate_block_sunlight(map, ndef, &data, &unlight[0], + &relight[0])) + (*modified_blocks)[data.target_block] = + map->getBlockNoCreateNoEx(data.target_block); + // Step downwards. + data.target_block.Y--; + } + } + + // --- STEP 2: Get nodes from borders to unlight + + // In case there are unloaded holes in the voxel manipulator + // unlight each block. + // For each block: + for (s16 b_x = minblock.X; b_x <= maxblock.X; b_x++) + for (s16 b_y = minblock.Y; b_y <= maxblock.Y; b_y++) + for (s16 b_z = minblock.Z; b_z <= maxblock.Z; b_z++) { + v3s16 blockpos(b_x, b_y, b_z); + MapBlock *block = map->getBlockNoCreateNoEx(blockpos); + if (!block || block->isDummy()) + // Skip not existing blocks. + continue; + v3s16 offset = block->getPosRelative(); + // For each border of the block: + for (direction d = 0; d < 6; d++) { + VoxelArea a = block_pad[d]; + // For each node of the border: + for (s32 x = a.MinEdge.X; x <= a.MaxEdge.X; x++) + for (s32 z = a.MinEdge.Z; z <= a.MaxEdge.Z; z++) + for (s32 y = a.MinEdge.Y; y <= a.MaxEdge.Y; y++) { + v3s16 relpos(x, y, z); + // Get old and new node + MapNode oldnode = block->getNodeNoCheck(x, y, z, &is_valid); + const ContentFeatures &oldf = ndef->get(oldnode); + MapNode newnode = vm->getNodeNoExNoEmerge(relpos + offset); + const ContentFeatures &newf = ndef->get(newnode); + // For each light bank + for (size_t b = 0; b < 2; b++) { + LightBank bank = banks[b]; + u8 oldlight = oldf.param_type == CPT_LIGHT ? + oldnode.getLightNoChecks(bank, &oldf): + LIGHT_SUN; // no light information, force unlighting + u8 newlight = newf.param_type == CPT_LIGHT ? + newnode.getLightNoChecks(bank, &newf): + newf.light_source; + // If the new node is dimmer, unlight. + if (oldlight > newlight) { + unlight[b].push( + oldlight, relpos, blockpos, block, 6); + } + } // end of banks + } // end of nodes + } // end of borders + } // end of blocks + + // --- STEP 3: All information extracted, overwrite + + vm->blitBackAll(modified_blocks, true); + + // --- STEP 4: Finish light update + + finish_bulk_light_update(map, minblock, maxblock, unlight, relight, + modified_blocks); +} + +/*! + * Resets the lighting of the given map block to + * complete darkness and full sunlight. + * + * \param light incoming sunlight, light[x][z] is true if there + * is sunlight above the map block at the given x-z coordinates. + * The array's indices are relative node coordinates in the block. + * After the procedure returns, this contains outgoing light at + * the bottom of the map block. + */ +void fill_with_sunlight(MapBlock *block, INodeDefManager *ndef, + bool light[MAP_BLOCKSIZE][MAP_BLOCKSIZE]) +{ + if (block->isDummy()) + return; + // dummy boolean + bool is_valid; + // For each column of nodes: + for (s16 z = 0; z < MAP_BLOCKSIZE; z++) + for (s16 x = 0; x < MAP_BLOCKSIZE; x++) { + // True if the current node has sunlight. + bool lig = light[z][x]; + // For each node, downwards: + for (s16 y = MAP_BLOCKSIZE - 1; y >= 0; y--) { + MapNode n = block->getNodeNoCheck(x, y, z, &is_valid); + // Ignore IGNORE nodes, these are not generated yet. + if (n.getContent() == CONTENT_IGNORE) + continue; + const ContentFeatures &f = ndef->get(n.getContent()); + if (lig && !f.sunlight_propagates) { + // Sunlight is stopped. + lig = false; + } + // Reset light + n.setLight(LIGHTBANK_DAY, lig ? 15 : 0, f); + n.setLight(LIGHTBANK_NIGHT, 0, f); + block->setNodeNoCheck(x, y, z, n); + } + // Output outgoing light. + light[z][x] = lig; + } +} + +void repair_block_light(ServerMap *map, MapBlock *block, + std::map<v3s16, MapBlock*> *modified_blocks) +{ + if (!block || block->isDummy()) + return; + INodeDefManager *ndef = map->getNodeDefManager(); + // First queue is for day light, second is for night light. + UnlightQueue unlight[] = { UnlightQueue(256), UnlightQueue(256) }; + ReLightQueue relight[] = { ReLightQueue(256), ReLightQueue(256) }; + // Will hold sunlight data. + bool lights[MAP_BLOCKSIZE][MAP_BLOCKSIZE]; + SunlightPropagationData data; + // Dummy boolean. + bool is_valid; + + // --- STEP 1: reset everything to sunlight + + mapblock_v3 blockpos = block->getPos(); + (*modified_blocks)[blockpos] = block; + // For each map block: + // Extract sunlight above. + is_sunlight_above_block(map, blockpos, ndef, lights); + // Reset the voxel manipulator. + fill_with_sunlight(block, ndef, lights); + // Copy sunlight data + data.target_block = v3s16(blockpos.X, blockpos.Y - 1, blockpos.Z); + for (s16 z = 0; z < MAP_BLOCKSIZE; z++) + for (s16 x = 0; x < MAP_BLOCKSIZE; x++) { + data.data.push_back( + SunlightPropagationUnit(v2s16(x, z), lights[z][x])); + } + // Propagate sunlight and shadow below the voxel manipulator. + while (!data.data.empty()) { + if (propagate_block_sunlight(map, ndef, &data, &unlight[0], + &relight[0])) + (*modified_blocks)[data.target_block] = + map->getBlockNoCreateNoEx(data.target_block); + // Step downwards. + data.target_block.Y--; + } + + // --- STEP 2: Get nodes from borders to unlight + + // For each border of the block: + for (direction d = 0; d < 6; d++) { + VoxelArea a = block_pad[d]; + // For each node of the border: + for (s32 x = a.MinEdge.X; x <= a.MaxEdge.X; x++) + for (s32 z = a.MinEdge.Z; z <= a.MaxEdge.Z; z++) + for (s32 y = a.MinEdge.Y; y <= a.MaxEdge.Y; y++) { + v3s16 relpos(x, y, z); + // Get node + MapNode node = block->getNodeNoCheck(x, y, z, &is_valid); + const ContentFeatures &f = ndef->get(node); + // For each light bank + for (size_t b = 0; b < 2; b++) { + LightBank bank = banks[b]; + u8 light = f.param_type == CPT_LIGHT ? + node.getLightNoChecks(bank, &f): + f.light_source; + // If the new node is dimmer than sunlight, unlight. + // (if it has maximal light, it is pointless to remove + // surrounding light, as it can only become brighter) + if (LIGHT_SUN > light) { + unlight[b].push( + LIGHT_SUN, relpos, blockpos, block, 6); + } + } // end of banks + } // end of nodes + } // end of borders + + // STEP 3: Remove and spread light + + finish_bulk_light_update(map, blockpos, blockpos, unlight, relight, + modified_blocks); +} + +VoxelLineIterator::VoxelLineIterator( + const v3f &start_position, + const v3f &line_vector) : + m_start_position(start_position), + m_line_vector(line_vector), + m_next_intersection_multi(10000.0f, 10000.0f, 10000.0f), + m_intersection_multi_inc(10000.0f, 10000.0f, 10000.0f), + m_step_directions(1.0f, 1.0f, 1.0f) +{ + m_current_node_pos = floatToInt(m_start_position, 1); + + if (m_line_vector.X > 0) { + m_next_intersection_multi.X = (floorf(m_start_position.X - 0.5) + 1.5 + - m_start_position.X) / m_line_vector.X; + m_intersection_multi_inc.X = 1 / m_line_vector.X; + } else if (m_line_vector.X < 0) { + m_next_intersection_multi.X = (floorf(m_start_position.X - 0.5) + - m_start_position.X + 0.5) / m_line_vector.X; + m_intersection_multi_inc.X = -1 / m_line_vector.X; + m_step_directions.X = -1; + } + + if (m_line_vector.Y > 0) { + m_next_intersection_multi.Y = (floorf(m_start_position.Y - 0.5) + 1.5 + - m_start_position.Y) / m_line_vector.Y; + m_intersection_multi_inc.Y = 1 / m_line_vector.Y; + } else if (m_line_vector.Y < 0) { + m_next_intersection_multi.Y = (floorf(m_start_position.Y - 0.5) + - m_start_position.Y + 0.5) / m_line_vector.Y; + m_intersection_multi_inc.Y = -1 / m_line_vector.Y; + m_step_directions.Y = -1; + } + + if (m_line_vector.Z > 0) { + m_next_intersection_multi.Z = (floorf(m_start_position.Z - 0.5) + 1.5 + - m_start_position.Z) / m_line_vector.Z; + m_intersection_multi_inc.Z = 1 / m_line_vector.Z; + } else if (m_line_vector.Z < 0) { + m_next_intersection_multi.Z = (floorf(m_start_position.Z - 0.5) + - m_start_position.Z + 0.5) / m_line_vector.Z; + m_intersection_multi_inc.Z = -1 / m_line_vector.Z; + m_step_directions.Z = -1; + } + + m_has_next = (m_next_intersection_multi.X <= 1) + || (m_next_intersection_multi.Y <= 1) + || (m_next_intersection_multi.Z <= 1); +} + +void VoxelLineIterator::next() +{ + if ((m_next_intersection_multi.X < m_next_intersection_multi.Y) + && (m_next_intersection_multi.X < m_next_intersection_multi.Z)) { + m_next_intersection_multi.X += m_intersection_multi_inc.X; + m_current_node_pos.X += m_step_directions.X; + } else if ((m_next_intersection_multi.Y < m_next_intersection_multi.Z)) { + m_next_intersection_multi.Y += m_intersection_multi_inc.Y; + m_current_node_pos.Y += m_step_directions.Y; + } else { + m_next_intersection_multi.Z += m_intersection_multi_inc.Z; + m_current_node_pos.Z += m_step_directions.Z; + } + + m_has_next = (m_next_intersection_multi.X <= 1) + || (m_next_intersection_multi.Y <= 1) + || (m_next_intersection_multi.Z <= 1); +} + } // namespace voxalgo diff --git a/src/voxelalgorithms.h b/src/voxelalgorithms.h index 3632546dd..b518979d7 100644 --- a/src/voxelalgorithms.h +++ b/src/voxelalgorithms.h @@ -22,11 +22,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "voxel.h" #include "mapnode.h" -#include <set> -#include <map> +#include "util/container.h" +#include "util/cpp11_container.h" class Map; +class ServerMap; class MapBlock; +class MMVManip; namespace voxalgo { @@ -69,11 +71,103 @@ SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a, */ void update_lighting_nodes( Map *map, - INodeDefManager *ndef, std::vector<std::pair<v3s16, MapNode> > &oldnodes, std::map<v3s16, MapBlock*> &modified_blocks); +/*! + * Updates borders of the given mapblock. + * Only updates if the block was marked with incomplete + * lighting and the neighbor is also loaded. + * + * \param block the block to update + * \param modified_blocks output, contains all map blocks that + * the function modified + */ +void update_block_border_lighting(Map *map, MapBlock *block, + std::map<v3s16, MapBlock*> &modified_blocks); + +/*! + * Copies back nodes from a voxel manipulator + * to the map and updates lighting. + * For server use only. + * + * \param modified_blocks output, contains all map blocks that + * the function modified + */ +void blit_back_with_light(ServerMap *map, MMVManip *vm, + std::map<v3s16, MapBlock*> *modified_blocks); + +/*! + * Corrects the light in a map block. + * For server use only. + * + * \param block the block to update + */ +void repair_block_light(ServerMap *map, MapBlock *block, + std::map<v3s16, MapBlock*> *modified_blocks); + +/*! + * This class iterates trough voxels that intersect with + * a line. The collision detection does not see nodeboxes, + * every voxel is a cube and is returned. + * This iterator steps to all nodes exactly once. + */ +struct VoxelLineIterator +{ +public: + //! Starting position of the line in world coordinates. + v3f m_start_position; + //! Direction and length of the line in world coordinates. + v3f m_line_vector; + /*! + * Each component stores the next smallest positive number, by + * which multiplying the line's vector gives a vector that ends + * on the intersection of two nodes. + */ + v3f m_next_intersection_multi; + /*! + * Each component stores the smallest positive number, by which + * m_next_intersection_multi's components can be increased. + */ + v3f m_intersection_multi_inc; + /*! + * Direction of the line. Each component can be -1 or 1 (if a + * component of the line's vector is 0, then there will be 1). + */ + v3s16 m_step_directions; + //! Position of the current node. + v3s16 m_current_node_pos; + //! If true, the next node will intersect the line, too. + bool m_has_next; + + /*! + * Creates a voxel line iterator with the given line. + * @param start_position starting point of the line + * in voxel coordinates + * @param line_vector length and direction of the + * line in voxel coordinates. start_position+line_vector + * is the end of the line + */ + VoxelLineIterator(const v3f &start_position,const v3f &line_vector); + + /*! + * Steps to the next voxel. + * Updates m_current_node_pos and + * m_previous_node_pos. + * Note that it works even if hasNext() is false, + * continuing the line as a ray. + */ + void next(); + + /*! + * Returns true if the next voxel intersects the given line. + */ + inline bool hasNext() const { return m_has_next; } +}; + } // namespace voxalgo + + #endif diff --git a/src/wieldmesh.cpp b/src/wieldmesh.cpp index 9c4d5b642..7736ec2a2 100644 --- a/src/wieldmesh.cpp +++ b/src/wieldmesh.cpp @@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "wieldmesh.h" #include "inventory.h" -#include "gamedef.h" +#include "client.h" #include "itemdef.h" #include "nodedef.h" #include "mesh.h" @@ -235,27 +235,16 @@ WieldMeshSceneNode::~WieldMeshSceneNode() g_extrusion_mesh_cache = NULL; } -void WieldMeshSceneNode::setCube(const TileSpec tiles[6], +void WieldMeshSceneNode::setCube(const ContentFeatures &f, v3f wield_scale, ITextureSource *tsrc) { scene::IMesh *cubemesh = g_extrusion_mesh_cache->createCube(); - changeToMesh(cubemesh); + scene::SMesh *copy = cloneMesh(cubemesh); cubemesh->drop(); - + postProcessNodeMesh(copy, f, false, true, &m_material_type, &m_colors); + changeToMesh(copy); + copy->drop(); m_meshnode->setScale(wield_scale * WIELD_SCALE_FACTOR); - - // Customize materials - for (u32 i = 0; i < m_meshnode->getMaterialCount(); ++i) { - assert(i < 6); - video::SMaterial &material = m_meshnode->getMaterial(i); - if (tiles[i].animation_frame_count == 1) { - material.setTexture(0, tiles[i].texture); - } else { - FrameSpec animation_frame = tiles[i].frames[0]; - material.setTexture(0, animation_frame.texture); - } - tiles[i].applyMaterialOptions(material); - } } void WieldMeshSceneNode::setExtruded(const std::string &imagename, @@ -274,8 +263,10 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename, dim = core::dimension2d<u32>(dim.Width, frame_height); } scene::IMesh *mesh = g_extrusion_mesh_cache->create(dim); - changeToMesh(mesh); + scene::SMesh *copy = cloneMesh(mesh); mesh->drop(); + changeToMesh(copy); + copy->drop(); m_meshnode->setScale(wield_scale * WIELD_SCALE_FACTOR_EXTRUDED); @@ -283,7 +274,7 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename, video::SMaterial &material = m_meshnode->getMaterial(0); material.setTexture(0, tsrc->getTextureForMesh(imagename)); material.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE; - material.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE; + material.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE; material.MaterialType = m_material_type; material.setFlag(video::EMF_BACK_FACE_CULLING, true); // Enable bi/trilinear filtering only for high resolution textures @@ -304,12 +295,12 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename, } } -void WieldMeshSceneNode::setItem(const ItemStack &item, IGameDef *gamedef) +void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client) { - ITextureSource *tsrc = gamedef->getTextureSource(); - IItemDefManager *idef = gamedef->getItemDefManager(); - IShaderSource *shdrsrc = gamedef->getShaderSource(); - INodeDefManager *ndef = gamedef->getNodeDefManager(); + ITextureSource *tsrc = client->getTextureSource(); + IItemDefManager *idef = client->getItemDefManager(); + IShaderSource *shdrsrc = client->getShaderSource(); + INodeDefManager *ndef = client->getNodeDefManager(); const ItemDefinition &def = item.getDefinition(idef); const ContentFeatures &f = ndef->get(def.name); content_t id = ndef->getId(def.name); @@ -319,9 +310,14 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, IGameDef *gamedef) m_material_type = shdrsrc->getShaderInfo(shader_id).material; } + // Color-related + m_colors.clear(); + m_base_color = idef->getItemstackColor(item, client); + // If wield_image is defined, it overrides everything else if (def.wield_image != "") { setExtruded(def.wield_image, def.wield_scale, tsrc, 1); + m_colors.push_back(ItemPartColor()); return; } // Handle nodes @@ -329,63 +325,50 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, IGameDef *gamedef) else if (def.type == ITEM_NODE) { if (f.mesh_ptr[0]) { // e.g. mesh nodes and nodeboxes - changeToMesh(f.mesh_ptr[0]); - // mesh_ptr[0] is pre-scaled by BS * f->visual_scale + scene::SMesh *mesh = cloneMesh(f.mesh_ptr[0]); + postProcessNodeMesh(mesh, f, m_enable_shaders, true, + &m_material_type, &m_colors); + changeToMesh(mesh); + mesh->drop(); + // mesh is pre-scaled by BS * f->visual_scale m_meshnode->setScale( def.wield_scale * WIELD_SCALE_FACTOR / (BS * f.visual_scale)); } else if (f.drawtype == NDT_AIRLIKE) { changeToMesh(NULL); } else if (f.drawtype == NDT_PLANTLIKE) { - setExtruded(tsrc->getTextureName(f.tiles[0].texture_id), def.wield_scale, tsrc, f.tiles[0].animation_frame_count); + setExtruded(tsrc->getTextureName(f.tiles[0].layers[0].texture_id), + def.wield_scale, tsrc, + f.tiles[0].layers[0].animation_frame_count); } else if (f.drawtype == NDT_NORMAL || f.drawtype == NDT_ALLFACES) { - setCube(f.tiles, def.wield_scale, tsrc); + setCube(f, def.wield_scale, tsrc); } else { - MeshMakeData mesh_make_data(gamedef, false); + MeshMakeData mesh_make_data(client, false); MapNode mesh_make_node(id, 255, 0); mesh_make_data.fillSingleNode(&mesh_make_node); MapBlockMesh mapblock_mesh(&mesh_make_data, v3s16(0, 0, 0)); - changeToMesh(mapblock_mesh.getMesh()); - translateMesh(m_meshnode->getMesh(), v3f(-BS, -BS, -BS)); + scene::SMesh *mesh = cloneMesh(mapblock_mesh.getMesh()); + translateMesh(mesh, v3f(-BS, -BS, -BS)); + postProcessNodeMesh(mesh, f, m_enable_shaders, true, + &m_material_type, &m_colors); + changeToMesh(mesh); + mesh->drop(); m_meshnode->setScale( def.wield_scale * WIELD_SCALE_FACTOR / (BS * f.visual_scale)); } u32 material_count = m_meshnode->getMaterialCount(); - if (material_count > 6) { - errorstream << "WieldMeshSceneNode::setItem: Invalid material " - "count " << material_count << ", truncating to 6" << std::endl; - material_count = 6; - } for (u32 i = 0; i < material_count; ++i) { video::SMaterial &material = m_meshnode->getMaterial(i); material.setFlag(video::EMF_BACK_FACE_CULLING, true); material.setFlag(video::EMF_BILINEAR_FILTER, m_bilinear_filter); material.setFlag(video::EMF_TRILINEAR_FILTER, m_trilinear_filter); - bool animated = (f.tiles[i].animation_frame_count > 1); - if (animated) { - FrameSpec animation_frame = f.tiles[i].frames[0]; - material.setTexture(0, animation_frame.texture); - } else { - material.setTexture(0, f.tiles[i].texture); - } - material.MaterialType = m_material_type; - if (m_enable_shaders) { - if (f.tiles[i].normal_texture) { - if (animated) { - FrameSpec animation_frame = f.tiles[i].frames[0]; - material.setTexture(1, animation_frame.normal_texture); - } else { - material.setTexture(1, f.tiles[i].normal_texture); - } - } - material.setTexture(2, f.tiles[i].flags_texture); - } } return; } else if (def.inventory_image != "") { setExtruded(def.inventory_image, def.wield_scale, tsrc, 1); + m_colors.push_back(ItemPartColor()); return; } @@ -393,11 +376,28 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, IGameDef *gamedef) changeToMesh(NULL); } -void WieldMeshSceneNode::setColor(video::SColor color) +void WieldMeshSceneNode::setColor(video::SColor c) { assert(!m_lighting); - setMeshColor(m_meshnode->getMesh(), color); - shadeMeshFaces(m_meshnode->getMesh()); + scene::IMesh *mesh=m_meshnode->getMesh(); + if (mesh == NULL) + return; + + u8 red = c.getRed(); + u8 green = c.getGreen(); + u8 blue = c.getBlue(); + u32 mc = mesh->getMeshBufferCount(); + for (u32 j = 0; j < mc; j++) { + video::SColor bc(m_base_color); + if ((m_colors.size() > j) && (m_colors[j].override_base)) + bc = m_colors[j].color; + video::SColor buffercolor(255, + bc.getRed() * red / 255, + bc.getGreen() * green / 255, + bc.getBlue() * blue / 255); + scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); + colorizeMeshBuffer(buf, &buffercolor); + } } void WieldMeshSceneNode::render() @@ -414,19 +414,7 @@ void WieldMeshSceneNode::changeToMesh(scene::IMesh *mesh) m_meshnode->setMesh(dummymesh); dummymesh->drop(); // m_meshnode grabbed it } else { - if (m_lighting) { - m_meshnode->setMesh(mesh); - } else { - /* - Lighting is disabled, this means the caller can (and probably will) - call setColor later. We therefore need to clone the mesh so that - setColor will only modify this scene node's mesh, not others'. - */ - scene::IMeshManipulator *meshmanip = SceneManager->getMeshManipulator(); - scene::IMesh *new_mesh = meshmanip->createMeshCopy(mesh); - m_meshnode->setMesh(new_mesh); - new_mesh->drop(); // m_meshnode grabbed it - } + m_meshnode->setMesh(mesh); } m_meshnode->setMaterialFlag(video::EMF_LIGHTING, m_lighting); @@ -435,11 +423,11 @@ void WieldMeshSceneNode::changeToMesh(scene::IMesh *mesh) m_meshnode->setVisible(true); } -scene::IMesh *getItemMesh(IGameDef *gamedef, const ItemStack &item) +void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result) { - ITextureSource *tsrc = gamedef->getTextureSource(); - IItemDefManager *idef = gamedef->getItemDefManager(); - INodeDefManager *ndef = gamedef->getNodeDefManager(); + ITextureSource *tsrc = client->getTextureSource(); + IItemDefManager *idef = client->getItemDefManager(); + INodeDefManager *ndef = client->getNodeDefManager(); const ItemDefinition &def = item.getDefinition(idef); const ContentFeatures &f = ndef->get(def.name); content_t id = ndef->getId(def.name); @@ -450,35 +438,38 @@ scene::IMesh *getItemMesh(IGameDef *gamedef, const ItemStack &item) g_extrusion_mesh_cache->grab(); } - scene::IMesh *mesh; + scene::SMesh *mesh = NULL; + + // Shading is on by default + result->needs_shading = true; // If inventory_image is defined, it overrides everything else if (def.inventory_image != "") { mesh = getExtrudedMesh(tsrc, def.inventory_image); - return mesh; + result->buffer_colors.push_back(ItemPartColor()); + // Items with inventory images do not need shading + result->needs_shading = false; } else if (def.type == ITEM_NODE) { if (f.mesh_ptr[0]) { mesh = cloneMesh(f.mesh_ptr[0]); scaleMesh(mesh, v3f(0.12, 0.12, 0.12)); - setMeshColor(mesh, video::SColor (255, 255, 255, 255)); } else if (f.drawtype == NDT_PLANTLIKE) { mesh = getExtrudedMesh(tsrc, - tsrc->getTextureName(f.tiles[0].texture_id)); - return mesh; + tsrc->getTextureName(f.tiles[0].layers[0].texture_id)); } else if (f.drawtype == NDT_NORMAL || f.drawtype == NDT_ALLFACES || f.drawtype == NDT_LIQUID || f.drawtype == NDT_FLOWINGLIQUID) { - mesh = cloneMesh(g_extrusion_mesh_cache->createCube()); + scene::IMesh *cube = g_extrusion_mesh_cache->createCube(); + mesh = cloneMesh(cube); + cube->drop(); scaleMesh(mesh, v3f(1.2, 1.2, 1.2)); } else { - MeshMakeData mesh_make_data(gamedef, false); + MeshMakeData mesh_make_data(client, false); MapNode mesh_make_node(id, 255, 0); mesh_make_data.fillSingleNode(&mesh_make_node); MapBlockMesh mapblock_mesh(&mesh_make_data, v3s16(0, 0, 0)); mesh = cloneMesh(mapblock_mesh.getMesh()); translateMesh(mesh, v3f(-BS, -BS, -BS)); scaleMesh(mesh, v3f(0.12, 0.12, 0.12)); - rotateMeshXZby(mesh, -45); - rotateMeshYZby(mesh, -30); u32 mc = mesh->getMeshBufferCount(); for (u32 i = 0; i < mc; ++i) { @@ -492,34 +483,31 @@ scene::IMesh *getItemMesh(IGameDef *gamedef, const ItemStack &item) material1.setTexture(3, material2.getTexture(3)); material1.MaterialType = material2.MaterialType; } - return mesh; } - shadeMeshFaces(mesh); - rotateMeshXZby(mesh, -45); - rotateMeshYZby(mesh, -30); - u32 mc = mesh->getMeshBufferCount(); for (u32 i = 0; i < mc; ++i) { - video::SMaterial &material = mesh->getMeshBuffer(i)->getMaterial(); + scene::IMeshBuffer *buf = mesh->getMeshBuffer(i); + video::SMaterial &material = buf->getMaterial(); material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; material.setFlag(video::EMF_BILINEAR_FILTER, false); material.setFlag(video::EMF_TRILINEAR_FILTER, false); material.setFlag(video::EMF_BACK_FACE_CULLING, true); material.setFlag(video::EMF_LIGHTING, false); - if (f.tiles[i].animation_frame_count > 1) { - FrameSpec animation_frame = f.tiles[i].frames[0]; - material.setTexture(0, animation_frame.texture); - } else { - material.setTexture(0, f.tiles[i].texture); - } } - return mesh; + + rotateMeshXZby(mesh, -45); + rotateMeshYZby(mesh, -30); + + postProcessNodeMesh(mesh, f, false, false, NULL, + &result->buffer_colors); } - return NULL; + result->mesh = mesh; } -scene::IMesh * getExtrudedMesh(ITextureSource *tsrc, + + +scene::SMesh * getExtrudedMesh(ITextureSource *tsrc, const std::string &imagename) { video::ITexture *texture = tsrc->getTextureForMesh(imagename); @@ -528,7 +516,9 @@ scene::IMesh * getExtrudedMesh(ITextureSource *tsrc, } core::dimension2d<u32> dim = texture->getSize(); - scene::IMesh *mesh = cloneMesh(g_extrusion_mesh_cache->create(dim)); + scene::IMesh *original = g_extrusion_mesh_cache->create(dim); + scene::SMesh *mesh = cloneMesh(original); + original->drop(); // Customize material video::SMaterial &material = mesh->getMeshBuffer(0)->getMaterial(); @@ -544,3 +534,57 @@ scene::IMesh * getExtrudedMesh(ITextureSource *tsrc, return mesh; } + +void postProcessNodeMesh(scene::SMesh *mesh, const ContentFeatures &f, + bool use_shaders, bool set_material, video::E_MATERIAL_TYPE *mattype, + std::vector<ItemPartColor> *colors) +{ + u32 mc = mesh->getMeshBufferCount(); + // Allocate colors for existing buffers + colors->clear(); + for (u32 i = 0; i < mc; ++i) + colors->push_back(ItemPartColor()); + + for (u32 i = 0; i < mc; ++i) { + const TileSpec *tile = &(f.tiles[i]); + scene::IMeshBuffer *buf = mesh->getMeshBuffer(i); + for (int layernum = 0; layernum < MAX_TILE_LAYERS; layernum++) { + const TileLayer *layer = &tile->layers[layernum]; + if (layer->texture_id == 0) + continue; + if (layernum != 0) { + scene::IMeshBuffer *copy = cloneMeshBuffer(buf); + copy->getMaterial() = buf->getMaterial(); + mesh->addMeshBuffer(copy); + copy->drop(); + buf = copy; + colors->push_back( + ItemPartColor(layer->has_color, layer->color)); + } else { + (*colors)[i] = ItemPartColor(layer->has_color, layer->color); + } + video::SMaterial &material = buf->getMaterial(); + if (set_material) + layer->applyMaterialOptions(material); + if (mattype) { + material.MaterialType = *mattype; + } + if (layer->animation_frame_count > 1) { + FrameSpec animation_frame = layer->frames[0]; + material.setTexture(0, animation_frame.texture); + } else { + material.setTexture(0, layer->texture); + } + if (use_shaders) { + if (layer->normal_texture) { + if (layer->animation_frame_count > 1) { + FrameSpec animation_frame = layer->frames[0]; + material.setTexture(1, animation_frame.normal_texture); + } else + material.setTexture(1, layer->normal_texture); + } + material.setTexture(2, layer->flags_texture); + } + } + } +} diff --git a/src/wieldmesh.h b/src/wieldmesh.h index 0b3136bc1..faedce484 100644 --- a/src/wieldmesh.h +++ b/src/wieldmesh.h @@ -20,41 +20,78 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef WIELDMESH_HEADER #define WIELDMESH_HEADER -#include "irrlichttypes_extrabloated.h" #include <string> +#include "irrlichttypes_extrabloated.h" struct ItemStack; -class IGameDef; +class Client; class ITextureSource; -struct TileSpec; +struct ContentFeatures; + +/*! + * Holds color information of an item mesh's buffer. + */ +struct ItemPartColor +{ + /*! + * If this is false, the global base color of the item + * will be used instead of the specific color of the + * buffer. + */ + bool override_base; + /*! + * The color of the buffer. + */ + video::SColor color; + + ItemPartColor() : override_base(false), color(0) {} + + ItemPartColor(bool override, video::SColor color) + : override_base(override), color(color) + { + } +}; + +struct ItemMesh +{ + scene::IMesh *mesh; + /*! + * Stores the color of each mesh buffer. + */ + std::vector<ItemPartColor> buffer_colors; + /*! + * If false, all faces of the item should have the same brightness. + * Disables shading based on normal vectors. + */ + bool needs_shading; + + ItemMesh() : mesh(NULL), buffer_colors(), needs_shading(true) {} +}; /* Wield item scene node, renders the wield mesh of some item */ -class WieldMeshSceneNode: public scene::ISceneNode +class WieldMeshSceneNode : public scene::ISceneNode { public: WieldMeshSceneNode(scene::ISceneNode *parent, scene::ISceneManager *mgr, s32 id = -1, bool lighting = false); virtual ~WieldMeshSceneNode(); - void setCube(const TileSpec tiles[6], - v3f wield_scale, ITextureSource *tsrc); - void setExtruded(const std::string &imagename, - v3f wield_scale, ITextureSource *tsrc, u8 num_frames); - void setItem(const ItemStack &item, IGameDef *gamedef); + void setCube(const ContentFeatures &f, v3f wield_scale, ITextureSource *tsrc); + void setExtruded(const std::string &imagename, v3f wield_scale, + ITextureSource *tsrc, u8 num_frames); + void setItem(const ItemStack &item, Client *client); // Sets the vertex color of the wield mesh. // Must only be used if the constructor was called with lighting = false void setColor(video::SColor color); - scene::IMesh *getMesh() - { return m_meshnode->getMesh(); } + scene::IMesh *getMesh() { return m_meshnode->getMesh(); } virtual void render(); - virtual const aabb3f &getBoundingBox() const - { return m_bounding_box; } + virtual const aabb3f &getBoundingBox() const { return m_bounding_box; } private: void changeToMesh(scene::IMesh *mesh); @@ -70,6 +107,16 @@ private: bool m_anisotropic_filter; bool m_bilinear_filter; bool m_trilinear_filter; + /*! + * Stores the colors of the mesh's mesh buffers. + * This does not include lighting. + */ + std::vector<ItemPartColor> m_colors; + /*! + * The base color of this mesh. This is the default + * for all mesh buffers. + */ + video::SColor m_base_color; // Bounding box culling is disabled for this type of scene node, // so this variable is just required so we can implement @@ -77,8 +124,18 @@ private: aabb3f m_bounding_box; }; -scene::IMesh *getItemMesh(IGameDef *gamedef, const ItemStack &item); +void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result); + +scene::SMesh *getExtrudedMesh(ITextureSource *tsrc, const std::string &imagename); -scene::IMesh *getExtrudedMesh(ITextureSource *tsrc, - const std::string &imagename); +/*! + * Applies overlays, textures and optionally materials to the given mesh and + * extracts tile colors for colorization. + * \param mattype overrides the buffer's material type, but can also + * be NULL to leave the original material. + * \param colors returns the colors of the mesh buffers in the mesh. + */ +void postProcessNodeMesh(scene::SMesh *mesh, const ContentFeatures &f, bool use_shaders, + bool set_material, video::E_MATERIAL_TYPE *mattype, + std::vector<ItemPartColor> *colors); #endif diff --git a/textures/base/pack/air.png b/textures/base/pack/air.png Binary files differnew file mode 100644 index 000000000..e2c487214 --- /dev/null +++ b/textures/base/pack/air.png diff --git a/textures/base/pack/ignore.png b/textures/base/pack/ignore.png Binary files differnew file mode 100644 index 000000000..a73d2222d --- /dev/null +++ b/textures/base/pack/ignore.png diff --git a/textures/base/pack/progress_bar.png b/textures/base/pack/progress_bar.png Binary files differnew file mode 100644 index 000000000..e80367191 --- /dev/null +++ b/textures/base/pack/progress_bar.png diff --git a/textures/base/pack/progress_bar_bg.png b/textures/base/pack/progress_bar_bg.png Binary files differnew file mode 100644 index 000000000..4e30ae889 --- /dev/null +++ b/textures/base/pack/progress_bar_bg.png diff --git a/textures/base/pack/server_ping_1.png b/textures/base/pack/server_ping_1.png Binary files differnew file mode 100644 index 000000000..ba5bba1e3 --- /dev/null +++ b/textures/base/pack/server_ping_1.png diff --git a/textures/base/pack/server_ping_2.png b/textures/base/pack/server_ping_2.png Binary files differnew file mode 100644 index 000000000..8dca0be0d --- /dev/null +++ b/textures/base/pack/server_ping_2.png diff --git a/textures/base/pack/server_ping_3.png b/textures/base/pack/server_ping_3.png Binary files differnew file mode 100644 index 000000000..c2cab017e --- /dev/null +++ b/textures/base/pack/server_ping_3.png diff --git a/textures/base/pack/server_ping_4.png b/textures/base/pack/server_ping_4.png Binary files differnew file mode 100644 index 000000000..03b4b5b83 --- /dev/null +++ b/textures/base/pack/server_ping_4.png diff --git a/util/buildbot/buildwin32.sh b/util/buildbot/buildwin32.sh index e58c25ccc..d807003d2 100755 --- a/util/buildbot/buildwin32.sh +++ b/util/buildbot/buildwin32.sh @@ -17,7 +17,7 @@ irrlicht_version=1.8.4 ogg_version=1.3.2 vorbis_version=1.3.5 curl_version=7.50.3 -gettext_version=0.14.4 +gettext_version=0.19.8.1 freetype_version=2.7 sqlite3_version=3.14.2 luajit_version=2.1.0-beta2 @@ -40,7 +40,7 @@ cd $builddir -c -O $packagedir/libvorbis-$vorbis_version.zip [ -e $packagedir/curl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/curl-$curl_version-win32.zip \ -c -O $packagedir/curl-$curl_version.zip -[ -e $packagedir/gettext-$gettext_version.zip ] || wget http://minetest.kitsunemimi.pw/gettext-$gettext_version.zip \ +[ -e $packagedir/gettext-$gettext_version.zip ] || wget http://minetest.kitsunemimi.pw/gettext-$gettext_version-win32.zip \ -c -O $packagedir/gettext-$gettext_version.zip [ -e $packagedir/freetype2-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/freetype2-$freetype_version-win32.zip \ -c -O $packagedir/freetype2-$freetype_version.zip @@ -130,10 +130,9 @@ cmake .. \ -DCURL_INCLUDE_DIR=$libdir/libcurl/include \ -DCURL_LIBRARY=$libdir/libcurl/lib/libcurl.dll.a \ \ - -DCUSTOM_GETTEXT_PATH=$libdir/gettext \ -DGETTEXT_MSGFMT=`which msgfmt` \ - -DGETTEXT_DLL=$libdir/gettext/bin/libintl3.dll \ - -DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv2.dll \ + -DGETTEXT_DLL=$libdir/gettext/bin/libintl-8.dll \ + -DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv-2.dll \ -DGETTEXT_INCLUDE_DIR=$libdir/gettext/include \ -DGETTEXT_LIBRARY=$libdir/gettext/lib/libintl.dll.a \ \ diff --git a/util/buildbot/buildwin64.sh b/util/buildbot/buildwin64.sh index 1c31fe4bd..3d6965f1e 100755 --- a/util/buildbot/buildwin64.sh +++ b/util/buildbot/buildwin64.sh @@ -17,7 +17,7 @@ irrlicht_version=1.8.4 ogg_version=1.3.2 vorbis_version=1.3.5 curl_version=7.50.3 -gettext_version=0.18.2 +gettext_version=0.19.8.1 freetype_version=2.7 sqlite3_version=3.14.2 luajit_version=2.1.0-beta2 @@ -131,7 +131,6 @@ cmake .. \ -DCURL_INCLUDE_DIR=$libdir/libcurl/include \ -DCURL_LIBRARY=$libdir/libcurl/lib/libcurl.dll.a \ \ - -DCUSTOM_GETTEXT_PATH=$libdir/gettext \ -DGETTEXT_MSGFMT=`which msgfmt` \ -DGETTEXT_DLL=$libdir/gettext/bin/libintl-8.dll \ -DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv-2.dll \ diff --git a/util/travis/before_install.sh b/util/travis/before_install.sh index 891371984..a4328fa46 100755 --- a/util/travis/before_install.sh +++ b/util/travis/before_install.sh @@ -1,7 +1,15 @@ #!/bin/bash -e echo "Preparing for $TRAVIS_COMMIT_RANGE" -. util/travis/common.sh +if [[ "$LINT" == "1" ]]; then + curl http://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + sudo add-apt-repository "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-3.9 main" + sudo apt-get -yq update + sudo apt-get install clang-format-3.9 + exit 0 +fi + +. util/travis/common.sh needs_compile || exit 0 if [[ $TRAVIS_OS_NAME == "linux" ]]; then @@ -11,6 +19,7 @@ fi if [[ $PLATFORM == "Unix" ]]; then if [[ $TRAVIS_OS_NAME == "linux" ]]; then + sudo apt-get update sudo apt-get install libirrlicht-dev cmake libbz2-dev libpng12-dev \ libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev \ libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev \ @@ -18,6 +27,10 @@ if [[ $PLATFORM == "Unix" ]]; then # Linking to LevelDB is broken, use a custom build wget http://minetest.kitsunemimi.pw/libleveldb-1.18-ubuntu12.04.7z sudo 7z x -o/usr libleveldb-1.18-ubuntu12.04.7z + if [[ "$VALGRIND" == "1" ]]; then + sudo apt-get install valgrind + fi + else brew update brew install freetype gettext hiredis irrlicht jpeg leveldb libogg libvorbis luajit diff --git a/util/travis/clang-format-whitelist.txt b/util/travis/clang-format-whitelist.txt new file mode 100644 index 000000000..932f59978 --- /dev/null +++ b/util/travis/clang-format-whitelist.txt @@ -0,0 +1,389 @@ +src/activeobject.h +src/ban.cpp +src/camera.cpp +src/camera.h +src/cavegen.cpp +src/cguittfont/CGUITTFont.cpp +src/cguittfont/CGUITTFont.h +src/cguittfont/irrUString.h +src/cguittfont/xCGUITTFont.h +src/chat.cpp +src/chat.h +src/chat_interface.h +src/client/clientlauncher.cpp +src/client/clientlauncher.h +src/client.cpp +src/clientenvironment.cpp +src/clientenvironment.h +src/client.h +src/clientiface.cpp +src/clientiface.h +src/client/joystick_controller.cpp +src/client/joystick_controller.h +src/clientmap.cpp +src/clientmap.h +src/clientmedia.cpp +src/clientmedia.h +src/clientobject.cpp +src/clientobject.h +src/client/tile.cpp +src/client/tile.h +src/clouds.cpp +src/clouds.h +src/collision.cpp +src/collision.h +src/config.h +src/content_cao.cpp +src/content_cao.h +src/content_cso.cpp +src/content_cso.h +src/content_mapblock.cpp +src/content_mapblock.h +src/content_mapnode.cpp +src/content_nodemeta.cpp +src/content_nodemeta.h +src/content_sao.cpp +src/content_sao.h +src/convert_json.cpp +src/convert_json.h +src/craftdef.cpp +src/craftdef.h +src/database.cpp +src/database-dummy.cpp +src/database-files.cpp +src/database-leveldb.cpp +src/database-postgresql.cpp +src/database-postgresql.h +src/database-redis.cpp +src/database-sqlite3.cpp +src/database-sqlite3.h +src/daynightratio.h +src/debug.cpp +src/debug.h +src/defaultsettings.cpp +src/drawscene.cpp +src/drawscene.h +src/dungeongen.cpp +src/dungeongen.h +src/emerge.cpp +src/emerge.h +src/environment.cpp +src/event.h +src/event_manager.h +src/exceptions.h +src/face_position_cache.cpp +src/face_position_cache.h +src/filecache.cpp +src/filesys.cpp +src/filesys.h +src/fontengine.cpp +src/fontengine.h +src/game.cpp +src/gamedef.h +src/game.h +src/genericobject.cpp +src/genericobject.h +src/gettext.cpp +src/gettext.h +src/guiChatConsole.cpp +src/guiChatConsole.h +src/guiEngine.cpp +src/guiEngine.h +src/guiFileSelectMenu.cpp +src/guiFormSpecMenu.cpp +src/guiFormSpecMenu.h +src/guiKeyChangeMenu.cpp +src/guiMainMenu.h +src/guiPasswordChange.cpp +src/guiscalingfilter.cpp +src/guiscalingfilter.h +src/guiTable.cpp +src/guiTable.h +src/guiVolumeChange.cpp +src/guiVolumeChange.h +src/httpfetch.cpp +src/hud.cpp +src/hud.h +src/imagefilters.cpp +src/imagefilters.h +src/intlGUIEditBox.cpp +src/intlGUIEditBox.h +src/inventory.cpp +src/inventory.h +src/inventorymanager.cpp +src/inventorymanager.h +src/irrlicht_changes/static_text.cpp +src/irrlicht_changes/static_text.h +src/irrlichttypes.h +src/itemdef.cpp +src/itemdef.h +src/itemstackmetadata.cpp +src/keycode.cpp +src/light.cpp +src/localplayer.cpp +src/log.cpp +src/log.h +src/main.cpp +src/mainmenumanager.h +src/mapblock.cpp +src/mapblock.h +src/mapblock_mesh.cpp +src/mapblock_mesh.h +src/map.cpp +src/mapgen.cpp +src/mapgen_flat.cpp +src/mapgen_fractal.cpp +src/mapgen.h +src/mapgen_singlenode.cpp +src/mapgen_v5.cpp +src/mapgen_v6.cpp +src/mapgen_v6.h +src/mapgen_v7.cpp +src/mapgen_v7.h +src/mapgen_valleys.cpp +src/mapgen_valleys.h +src/map.h +src/mapnode.cpp +src/mapnode.h +src/mapsector.cpp +src/mapsector.h +src/map_settings_manager.cpp +src/map_settings_manager.h +src/mesh.cpp +src/mesh.h +src/mesh_generator_thread.cpp +src/metadata.h +src/mg_biome.cpp +src/mg_biome.h +src/mg_decoration.cpp +src/mg_decoration.h +src/mg_ore.cpp +src/mg_ore.h +src/mg_schematic.cpp +src/mg_schematic.h +src/minimap.cpp +src/minimap.h +src/modalMenu.h +src/mods.cpp +src/mods.h +src/network/clientopcodes.cpp +src/network/clientopcodes.h +src/network/clientpackethandler.cpp +src/network/connection.cpp +src/network/connection.h +src/network/networkpacket.cpp +src/network/networkpacket.h +src/network/networkprotocol.h +src/network/serveropcodes.cpp +src/network/serveropcodes.h +src/network/serverpackethandler.cpp +src/nodedef.cpp +src/nodedef.h +src/nodemetadata.cpp +src/nodemetadata.h +src/nodetimer.cpp +src/nodetimer.h +src/noise.cpp +src/noise.h +src/objdef.cpp +src/objdef.h +src/object_properties.cpp +src/object_properties.h +src/particles.cpp +src/particles.h +src/pathfinder.cpp +src/pathfinder.h +src/player.cpp +src/player.h +src/porting_android.cpp +src/porting_android.h +src/porting.cpp +src/porting.h +src/profiler.h +src/quicktune.cpp +src/quicktune.h +src/quicktune_shortcutter.h +src/raycast.cpp +src/raycast.h +src/reflowscan.cpp +src/reflowscan.h +src/remoteplayer.cpp +src/rollback.cpp +src/rollback.h +src/rollback_interface.cpp +src/rollback_interface.h +src/script/common/c_content.cpp +src/script/common/c_content.h +src/script/common/c_converter.cpp +src/script/common/c_converter.h +src/script/common/c_internal.cpp +src/script/common/c_internal.h +src/script/common/c_types.cpp +src/script/common/c_types.h +src/script/cpp_api/s_async.cpp +src/script/cpp_api/s_async.h +src/script/cpp_api/s_base.cpp +src/script/cpp_api/s_base.h +src/script/cpp_api/s_client.cpp +src/script/cpp_api/s_entity.cpp +src/script/cpp_api/s_entity.h +src/script/cpp_api/s_env.cpp +src/script/cpp_api/s_env.h +src/script/cpp_api/s_internal.h +src/script/cpp_api/s_inventory.cpp +src/script/cpp_api/s_inventory.h +src/script/cpp_api/s_item.cpp +src/script/cpp_api/s_item.h +src/script/cpp_api/s_mainmenu.h +src/script/cpp_api/s_node.cpp +src/script/cpp_api/s_node.h +src/script/cpp_api/s_nodemeta.cpp +src/script/cpp_api/s_nodemeta.h +src/script/cpp_api/s_player.cpp +src/script/cpp_api/s_security.cpp +src/script/cpp_api/s_security.h +src/script/cpp_api/s_server.cpp +src/script/cpp_api/s_server.h +src/script/lua_api/l_areastore.cpp +src/script/lua_api/l_base.cpp +src/script/lua_api/l_base.h +src/script/lua_api/l_craft.cpp +src/script/lua_api/l_craft.h +src/script/lua_api/l_env.cpp +src/script/lua_api/l_env.h +src/script/lua_api/l_http.cpp +src/script/lua_api/l_http.h +src/script/lua_api/l_internal.h +src/script/lua_api/l_inventory.cpp +src/script/lua_api/l_inventory.h +src/script/lua_api/l_item.cpp +src/script/lua_api/l_item.h +src/script/lua_api/l_itemstackmeta.cpp +src/script/lua_api/l_itemstackmeta.h +src/script/lua_api/l_localplayer.cpp +src/script/lua_api/l_mainmenu.cpp +src/script/lua_api/l_mainmenu.h +src/script/lua_api/l_mapgen.cpp +src/script/lua_api/l_metadata.cpp +src/script/lua_api/l_minimap.cpp +src/script/lua_api/l_nodemeta.cpp +src/script/lua_api/l_nodemeta.h +src/script/lua_api/l_nodetimer.cpp +src/script/lua_api/l_noise.cpp +src/script/lua_api/l_object.cpp +src/script/lua_api/l_object.h +src/script/lua_api/l_particles.cpp +src/script/lua_api/l_particles.h +src/script/lua_api/l_rollback.cpp +src/script/lua_api/l_rollback.h +src/script/lua_api/l_server.cpp +src/script/lua_api/l_settings.cpp +src/script/lua_api/l_sound.cpp +src/script/lua_api/l_storage.cpp +src/script/lua_api/l_util.cpp +src/script/lua_api/l_vmanip.cpp +src/script/scripting_client.cpp +src/script/scripting_client.h +src/script/scripting_mainmenu.cpp +src/script/scripting_mainmenu.h +src/script/scripting_server.cpp +src/script/scripting_server.h +src/serialization.cpp +src/serialization.h +src/server.cpp +src/serverenvironment.cpp +src/serverenvironment.h +src/server.h +src/serverlist.cpp +src/serverlist.h +src/serverobject.cpp +src/serverobject.h +src/settings.cpp +src/settings.h +src/settings_translation_file.cpp +src/shader.cpp +src/shader.h +src/sky.cpp +src/socket.cpp +src/socket.h +src/sound.cpp +src/sound_openal.cpp +src/sound_openal.h +src/staticobject.cpp +src/staticobject.h +src/subgame.cpp +src/subgame.h +src/terminal_chat_console.cpp +src/terminal_chat_console.h +src/threading/atomic.h +src/threading/event.cpp +src/threading/mutex_auto_lock.h +src/threading/mutex.cpp +src/threading/mutex.h +src/threading/semaphore.cpp +src/threading/thread.cpp +src/threading/thread.h +src/threads.h +src/tileanimation.cpp +src/tool.cpp +src/tool.h +src/touchscreengui.cpp +src/treegen.cpp +src/treegen.h +src/unittest/test_areastore.cpp +src/unittest/test_collision.cpp +src/unittest/test_compression.cpp +src/unittest/test_connection.cpp +src/unittest/test.cpp +src/unittest/test_filepath.cpp +src/unittest/test.h +src/unittest/test_inventory.cpp +src/unittest/test_keycode.cpp +src/unittest/test_map_settings_manager.cpp +src/unittest/test_noderesolver.cpp +src/unittest/test_noise.cpp +src/unittest/test_random.cpp +src/unittest/test_schematic.cpp +src/unittest/test_serialization.cpp +src/unittest/test_settings.cpp +src/unittest/test_socket.cpp +src/unittest/test_threading.cpp +src/unittest/test_utilities.cpp +src/unittest/test_voxelalgorithms.cpp +src/unittest/test_voxelmanipulator.cpp +src/util/areastore.cpp +src/util/areastore.h +src/util/auth.cpp +src/util/auth.h +src/util/base64.cpp +src/util/base64.h +src/util/basic_macros.h +src/util/container.h +src/util/directiontables.cpp +src/util/directiontables.h +src/util/enriched_string.cpp +src/util/enriched_string.h +src/util/md32_common.h +src/util/numeric.cpp +src/util/numeric.h +src/util/pointedthing.cpp +src/util/pointedthing.h +src/util/pointer.h +src/util/serialize.cpp +src/util/serialize.h +src/util/sha1.cpp +src/util/srp.cpp +src/util/srp.h +src/util/strfnd.h +src/util/string.cpp +src/util/string.h +src/util/thread.h +src/util/timetaker.cpp +src/util/timetaker.h +src/version.cpp +src/version.h +src/voxelalgorithms.cpp +src/voxelalgorithms.h +src/voxel.cpp +src/voxel.h +src/wieldmesh.cpp diff --git a/util/travis/common.sh b/util/travis/common.sh index 16c7db324..35ceec08d 100644 --- a/util/travis/common.sh +++ b/util/travis/common.sh @@ -1,8 +1,9 @@ #!/bin/bash -e # Relative to git-repository root: -TRIGGER_COMPILE_PATHS="src/|CMakeLists.txt|cmake/Modules/|util/travis/|util/buildbot/" +TRIGGER_COMPILE_PATHS="src/.*\.(c|cpp|h)|CMakeLists.txt|cmake/Modules/|util/travis/|util/buildbot/" needs_compile() { git diff --name-only $TRAVIS_COMMIT_RANGE | egrep -q "^($TRIGGER_COMPILE_PATHS)" } + diff --git a/util/travis/lint.sh b/util/travis/lint.sh new file mode 100644 index 000000000..cd5f41779 --- /dev/null +++ b/util/travis/lint.sh @@ -0,0 +1,45 @@ +#! /bin/bash +function perform_lint() { + echo "Performing LINT..." + if hash clang-format-3.9 2>/dev/null; then + CLANG_FORMAT=clang-format-3.9 + else + CLANG_FORMAT=clang-format + fi + echo "LINT: Using binary $CLANG_FORMAT" + CLANG_FORMAT_WHITELIST="util/travis/clang-format-whitelist.txt" + + files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')" + + local errorcount=0 + local fail=0 + for f in ${files_to_lint}; do + d=$(diff -u "$f" <(${CLANG_FORMAT} "$f") || true) + + if ! [ -z "$d" ]; then + whitelisted=$(awk '$1 == "'$f'" { print 1 }' "$CLANG_FORMAT_WHITELIST") + + # If file is not whitelisted, mark a failure + if [ -z ${whitelisted} ]; then + errorcount=$((errorcount+1)) + + printf "The file %s is not compliant with the coding style" "$f" + if [ ${errorcount} -gt 50 ]; then + printf "\nToo many errors encountered previously, this diff is hidden.\n" + else + printf ":\n%s\n" "$d" + fi + + fail=1 + fi + fi + done + + if [ "$fail" = 1 ]; then + echo "LINT reports failure." + exit 1 + fi + + echo "LINT OK" +} + diff --git a/util/travis/script.sh b/util/travis/script.sh index 1bafb26cd..14b8dfb73 100755 --- a/util/travis/script.sh +++ b/util/travis/script.sh @@ -1,30 +1,49 @@ #!/bin/bash -e . util/travis/common.sh +. util/travis/lint.sh needs_compile || exit 0 +if [[ "$LINT" == "1" ]]; then + # Lint with exit CI + perform_lint + exit 0 +fi + if [[ $PLATFORM == "Unix" ]]; then mkdir -p travisbuild cd travisbuild || exit 1 + CMAKE_FLAGS='' if [[ $COMPILER == "g++-6" ]]; then export CC=gcc-6 export CXX=g++-6 fi + # Clang builds with FreeType fail on Travis if [[ $CC == "clang" ]]; then CMAKE_FLAGS+=' -DENABLE_FREETYPE=FALSE' fi + if [[ $TRAVIS_OS_NAME == "osx" ]]; then CMAKE_FLAGS+=' -DCUSTOM_GETTEXT_PATH=/usr/local/opt/gettext' fi + cmake -DCMAKE_BUILD_TYPE=Debug \ -DRUN_IN_PLACE=TRUE \ -DENABLE_GETTEXT=TRUE \ + -DBUILD_SERVER=TRUE \ $CMAKE_FLAGS .. make -j2 + echo "Running unit tests." - ../bin/minetest --run-unittests && exit 0 + CMD="../bin/minetest --run-unittests" + if [[ "$VALGRIND" == "1" ]]; then + valgrind --leak-check=full --leak-check-heuristics=all --undef-value-errors=no --error-exitcode=9 ${CMD} && exit 0 + else + ${CMD} && exit 0 + fi + elif [[ $PLATFORM == Win* ]]; then [[ $CC == "clang" ]] && exit 1 # Not supposed to happen # We need to have our build directory outside of the minetest directory because |