summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.clang-format28
-rw-r--r--.gitignore14
-rw-r--r--.gitlab-ci.yml223
-rw-r--r--.travis.yml8
-rw-r--r--CMakeLists.txt21
-rw-r--r--CONTRIBUTING.md1
-rw-r--r--README.txt37
-rw-r--r--build/android/Makefile29
-rw-r--r--build/android/build.gradle7
-rw-r--r--build/android/gradle/wrapper/gradle-wrapper.jarbin0 -> 49896 bytes
-rw-r--r--build/android/gradle/wrapper/gradle-wrapper.properties6
-rwxr-xr-xbuild/android/gradlew164
-rw-r--r--build/android/gradlew.bat90
-rw-r--r--build/android/jni/Android.mk89
-rw-r--r--build/android/patches/sqlite3-readonly-fix.patch17
-rw-r--r--builtin/client/chatcommands.lua65
-rw-r--r--builtin/client/init.lua23
-rw-r--r--builtin/client/register.lua73
-rw-r--r--builtin/common/after.lua33
-rw-r--r--builtin/common/chatcommands.lua112
-rw-r--r--builtin/common/filterlist.lua3
-rw-r--r--builtin/common/misc_helpers.lua106
-rw-r--r--builtin/common/serialize.lua4
-rw-r--r--builtin/common/strict.lua5
-rw-r--r--builtin/common/vector.lua5
-rw-r--r--builtin/fstk/tabview.lua2
-rw-r--r--builtin/game/auth.lua6
-rw-r--r--builtin/game/chatcommands.lua244
-rw-r--r--builtin/game/deprecated.lua21
-rw-r--r--builtin/game/falling.lua50
-rw-r--r--builtin/game/features.lua2
-rw-r--r--builtin/game/forceloading.lua2
-rw-r--r--builtin/game/init.lua4
-rw-r--r--builtin/game/item.lua53
-rw-r--r--builtin/game/item_entity.lua33
-rw-r--r--builtin/game/misc.lua93
-rw-r--r--builtin/game/register.lua8
-rw-r--r--builtin/game/statbars.lua10
-rw-r--r--builtin/game/static_spawn.lua4
-rw-r--r--builtin/init.lua11
-rw-r--r--builtin/mainmenu/common.lua40
-rw-r--r--builtin/mainmenu/dlg_config_world.lua134
-rw-r--r--builtin/mainmenu/dlg_create_world.lua14
-rw-r--r--builtin/mainmenu/dlg_settings_advanced.lua162
-rw-r--r--builtin/mainmenu/gamemgr.lua4
-rw-r--r--builtin/mainmenu/init.lua27
-rw-r--r--builtin/mainmenu/modmgr.lua60
-rw-r--r--builtin/mainmenu/store.lua6
-rw-r--r--builtin/mainmenu/tab_credits.lua85
-rw-r--r--builtin/mainmenu/tab_local.lua (renamed from builtin/mainmenu/tab_singleplayer.lua)137
-rw-r--r--builtin/mainmenu/tab_mods.lua9
-rw-r--r--builtin/mainmenu/tab_online.lua (renamed from builtin/mainmenu/tab_multiplayer.lua)179
-rw-r--r--builtin/mainmenu/tab_server.lua195
-rw-r--r--builtin/mainmenu/tab_settings.lua134
-rw-r--r--builtin/mainmenu/tab_simple_main.lua39
-rw-r--r--builtin/mainmenu/tab_texturepacks.lua8
-rw-r--r--builtin/mainmenu/textures.lua6
-rw-r--r--builtin/profiler/init.lua12
-rw-r--r--builtin/profiler/instrumentation.lua18
-rw-r--r--builtin/profiler/reporter.lua6
-rw-r--r--builtin/profiler/sampling.lua2
-rw-r--r--builtin/settingtypes.txt411
-rw-r--r--client/shaders/nodes_shader/opengl_fragment.glsl33
-rw-r--r--client/shaders/nodes_shader/opengl_vertex.glsl43
-rw-r--r--client/shaders/water_surface_shader/opengl_fragment.glsl176
-rw-r--r--client/shaders/water_surface_shader/opengl_vertex.glsl142
-rw-r--r--client/shaders/wielded_shader/opengl_fragment.glsl31
-rw-r--r--client/shaders/wielded_shader/opengl_vertex.glsl1
-rw-r--r--clientmods/preview/init.lua152
-rw-r--r--cmake/Modules/FindGMP.cmake5
-rw-r--r--cmake/Modules/FindJson.cmake5
-rw-r--r--cmake/Modules/FindLua.cmake28
-rw-r--r--doc/client_lua_api.md1149
-rw-r--r--doc/lua_api.txt825
-rw-r--r--doc/menu_lua_api.txt2
-rw-r--r--doc/texture_packs.txt3
-rw-r--r--doc/world_format.txt36
-rw-r--r--fonts/Arimo-LICENSE.txt2
-rw-r--r--fonts/Arimo-Regular.ttfbin0 -> 436876 bytes
-rw-r--r--fonts/Cousine-LICENSE.txt2
-rw-r--r--fonts/Cousine-Regular.ttfbin0 -> 309040 bytes
-rw-r--r--fonts/DroidSansFallbackFull-LICENSE.txt13
-rw-r--r--fonts/liberationmono.ttfbin333636 -> 0 bytes
-rw-r--r--fonts/liberationsans.ttfbin133828 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_10.xmlbin156248 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_100.pngbin12012 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_11.xmlbin157272 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_110.pngbin14739 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_12.xmlbin157058 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_120.pngbin16295 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_14.xmlbin159272 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_140.pngbin42429 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_16.xmlbin160744 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_160.pngbin48106 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_18.xmlbin162284 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_180.pngbin56766 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_20.xmlbin162438 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_200.pngbin69059 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_22.xmlbin162936 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_220.pngbin74427 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_24.xmlbin166358 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_240.pngbin83532 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_26.xmlbin167054 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_260.pngbin93958 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_28.xmlbin167156 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_280.pngbin101952 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_36.xmlbin169606 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_360.pngbin143453 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_4.xmlbin136910 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_40.pngbin7642 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_48.xmlbin171972 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_480.pngbin205578 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_56.xmlbin174174 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_560.pngbin246505 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_6.xmlbin140552 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_60.pngbin13992 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_8.xmlbin154564 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_80.pngbin9740 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_9.xmlbin154830 -> 0 bytes
-rwxr-xr-xfonts/lucida_sans_90.pngbin10704 -> 0 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_10.xmlbin257014 -> 257014 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_100.pngbin56121 -> 56121 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_11.xmlbin263644 -> 263644 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_110.pngbin67613 -> 67613 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_12.xmlbin268932 -> 268932 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_120.pngbin73938 -> 73938 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_14.xmlbin269188 -> 269188 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_140.pngbin89073 -> 89073 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_16.xmlbin275642 -> 275642 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_160.pngbin101939 -> 101939 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_18.xmlbin279962 -> 279962 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_180.pngbin122274 -> 122274 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_20.xmlbin282588 -> 282588 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_200.pngbin138662 -> 138662 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_22.xmlbin283950 -> 283950 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_220.pngbin152844 -> 152844 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_24.xmlbin286626 -> 286626 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_240.pngbin170247 -> 170247 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_26.xmlbin289710 -> 289710 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_260.pngbin190156 -> 190156 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_28.xmlbin292596 -> 292596 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_280.pngbin200848 -> 200848 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_4.xmlbin237740 -> 237740 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_40.pngbin15668 -> 15668 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_6.xmlbin245472 -> 245472 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_60.pngbin29291 -> 29291 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_8.xmlbin251876 -> 251876 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_80.pngbin45552 -> 45552 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_9.xmlbin254016 -> 254016 bytes
-rw-r--r--[-rwxr-xr-x]fonts/mono_dejavu_sans_90.pngbin50995 -> 50995 bytes
-rw-r--r--games/minimal/mods/default/init.lua181
-rw-r--r--games/minimal/mods/default/mapgen.lua1
-rw-r--r--games/minimal/mods/default/textures/default_chest.pngbin0 -> 263 bytes
-rw-r--r--games/minimal/mods/default/textures/default_chest_front.pngbin114 -> 0 bytes
-rw-r--r--games/minimal/mods/default/textures/default_chest_lock.pngbin145 -> 0 bytes
-rw-r--r--games/minimal/mods/default/textures/default_chest_side.pngbin98 -> 0 bytes
-rw-r--r--games/minimal/mods/default/textures/default_chest_top.pngbin93 -> 0 bytes
-rw-r--r--games/minimal/mods/default/textures/default_lava_source_animated.pngbin2902 -> 3145 bytes
-rw-r--r--games/minimal/mods/default/textures/default_river_water.pngbin0 -> 716 bytes
-rw-r--r--games/minimal/mods/errorhandler_test/init.lua106
-rw-r--r--games/minimal/mods/experimental/init.lua53
-rw-r--r--games/minimal/mods/stairs/init.lua4
-rw-r--r--lib/gmp/CMakeLists.txt (renamed from src/gmp/CMakeLists.txt)0
-rw-r--r--lib/gmp/mini-gmp.c (renamed from src/gmp/mini-gmp.c)0
-rw-r--r--lib/gmp/mini-gmp.h (renamed from src/gmp/mini-gmp.h)0
-rw-r--r--lib/jsoncpp/CMakeLists.txt (renamed from src/jsoncpp/json/CMakeLists.txt)0
-rw-r--r--lib/jsoncpp/json/UPDATING (renamed from src/jsoncpp/json/UPDATING)0
-rw-r--r--lib/jsoncpp/json/json.h1981
-rw-r--r--lib/jsoncpp/jsoncpp.cpp4937
-rw-r--r--lib/lua/CMakeLists.txt (renamed from src/lua/CMakeLists.txt)0
-rw-r--r--lib/lua/COPYRIGHT (renamed from src/lua/COPYRIGHT)0
-rw-r--r--lib/lua/src/CMakeLists.txt (renamed from src/lua/src/CMakeLists.txt)0
-rw-r--r--lib/lua/src/lapi.c (renamed from src/lua/src/lapi.c)0
-rw-r--r--lib/lua/src/lapi.h (renamed from src/lua/src/lapi.h)0
-rw-r--r--lib/lua/src/lauxlib.c (renamed from src/lua/src/lauxlib.c)0
-rw-r--r--lib/lua/src/lauxlib.h (renamed from src/lua/src/lauxlib.h)0
-rw-r--r--lib/lua/src/lbaselib.c (renamed from src/lua/src/lbaselib.c)0
-rw-r--r--lib/lua/src/lcode.c (renamed from src/lua/src/lcode.c)0
-rw-r--r--lib/lua/src/lcode.h (renamed from src/lua/src/lcode.h)0
-rw-r--r--lib/lua/src/ldblib.c (renamed from src/lua/src/ldblib.c)0
-rw-r--r--lib/lua/src/ldebug.c (renamed from src/lua/src/ldebug.c)0
-rw-r--r--lib/lua/src/ldebug.h (renamed from src/lua/src/ldebug.h)0
-rw-r--r--lib/lua/src/ldo.c (renamed from src/lua/src/ldo.c)0
-rw-r--r--lib/lua/src/ldo.h (renamed from src/lua/src/ldo.h)0
-rw-r--r--lib/lua/src/ldump.c (renamed from src/lua/src/ldump.c)0
-rw-r--r--lib/lua/src/lfunc.c (renamed from src/lua/src/lfunc.c)0
-rw-r--r--lib/lua/src/lfunc.h (renamed from src/lua/src/lfunc.h)0
-rw-r--r--lib/lua/src/lgc.c (renamed from src/lua/src/lgc.c)0
-rw-r--r--lib/lua/src/lgc.h (renamed from src/lua/src/lgc.h)0
-rw-r--r--lib/lua/src/linit.c (renamed from src/lua/src/linit.c)0
-rw-r--r--lib/lua/src/liolib.c (renamed from src/lua/src/liolib.c)0
-rw-r--r--lib/lua/src/llex.c (renamed from src/lua/src/llex.c)0
-rw-r--r--lib/lua/src/llex.h (renamed from src/lua/src/llex.h)0
-rw-r--r--lib/lua/src/llimits.h (renamed from src/lua/src/llimits.h)0
-rw-r--r--lib/lua/src/lmathlib.c (renamed from src/lua/src/lmathlib.c)0
-rw-r--r--lib/lua/src/lmem.c (renamed from src/lua/src/lmem.c)0
-rw-r--r--lib/lua/src/lmem.h (renamed from src/lua/src/lmem.h)0
-rw-r--r--lib/lua/src/loadlib.c (renamed from src/lua/src/loadlib.c)0
-rw-r--r--lib/lua/src/lobject.c (renamed from src/lua/src/lobject.c)0
-rw-r--r--lib/lua/src/lobject.h (renamed from src/lua/src/lobject.h)0
-rw-r--r--lib/lua/src/lopcodes.c (renamed from src/lua/src/lopcodes.c)0
-rw-r--r--lib/lua/src/lopcodes.h (renamed from src/lua/src/lopcodes.h)0
-rw-r--r--lib/lua/src/loslib.c (renamed from src/lua/src/loslib.c)0
-rw-r--r--lib/lua/src/lparser.c (renamed from src/lua/src/lparser.c)0
-rw-r--r--lib/lua/src/lparser.h (renamed from src/lua/src/lparser.h)0
-rw-r--r--lib/lua/src/lstate.c (renamed from src/lua/src/lstate.c)0
-rw-r--r--lib/lua/src/lstate.h (renamed from src/lua/src/lstate.h)0
-rw-r--r--lib/lua/src/lstring.c (renamed from src/lua/src/lstring.c)0
-rw-r--r--lib/lua/src/lstring.h (renamed from src/lua/src/lstring.h)0
-rw-r--r--lib/lua/src/lstrlib.c (renamed from src/lua/src/lstrlib.c)0
-rw-r--r--lib/lua/src/ltable.c (renamed from src/lua/src/ltable.c)0
-rw-r--r--lib/lua/src/ltable.h (renamed from src/lua/src/ltable.h)0
-rw-r--r--lib/lua/src/ltablib.c (renamed from src/lua/src/ltablib.c)0
-rw-r--r--lib/lua/src/ltm.c (renamed from src/lua/src/ltm.c)0
-rw-r--r--lib/lua/src/ltm.h (renamed from src/lua/src/ltm.h)0
-rw-r--r--lib/lua/src/lua.c (renamed from src/lua/src/lua.c)0
-rw-r--r--lib/lua/src/lua.h (renamed from src/lua/src/lua.h)0
-rw-r--r--lib/lua/src/luac.c (renamed from src/lua/src/luac.c)0
-rw-r--r--lib/lua/src/luaconf.h (renamed from src/lua/src/luaconf.h)0
-rw-r--r--lib/lua/src/lualib.h (renamed from src/lua/src/lualib.h)0
-rw-r--r--lib/lua/src/lundump.c (renamed from src/lua/src/lundump.c)0
-rw-r--r--lib/lua/src/lundump.h (renamed from src/lua/src/lundump.h)0
-rw-r--r--lib/lua/src/lvm.c (renamed from src/lua/src/lvm.c)0
-rw-r--r--lib/lua/src/lvm.h (renamed from src/lua/src/lvm.h)0
-rw-r--r--lib/lua/src/lzio.c (renamed from src/lua/src/lzio.c)0
-rw-r--r--lib/lua/src/lzio.h (renamed from src/lua/src/lzio.h)0
-rw-r--r--lib/lua/src/print.c (renamed from src/lua/src/print.c)0
-rw-r--r--minetest.conf.example302
-rw-r--r--minetest.conf.example.extra63
-rw-r--r--misc/debpkg-control36
-rw-r--r--misc/net.minetest.minetest.appdata.xml (renamed from misc/minetest.appdata.xml)26
-rw-r--r--misc/net.minetest.minetest.desktop (renamed from misc/minetest.desktop)0
-rw-r--r--po/be/minetest.po3512
-rw-r--r--po/ca/minetest.po1547
-rw-r--r--po/cs/minetest.po1525
-rw-r--r--po/da/minetest.po1706
-rw-r--r--po/de/minetest.po2009
-rw-r--r--po/dv/minetest.po4688
-rw-r--r--po/eo/minetest.po1618
-rw-r--r--po/es/minetest.po1641
-rw-r--r--po/et/minetest.po1527
-rw-r--r--po/fr/minetest.po1807
-rw-r--r--po/he/minetest.po1384
-rw-r--r--po/hu/minetest.po1634
-rw-r--r--po/id/minetest.po2253
-rw-r--r--po/it/minetest.po1970
-rw-r--r--po/ja/minetest.po1688
-rw-r--r--po/jbo/minetest.po1423
-rw-r--r--po/ko/minetest.po1973
-rw-r--r--po/ky/minetest.po1451
-rw-r--r--po/lt/minetest.po1500
-rw-r--r--po/minetest.pot1110
-rw-r--r--po/ms/minetest.po5356
-rw-r--r--po/nb/minetest.po1398
-rw-r--r--po/nl/minetest.po2069
-rw-r--r--po/pl/minetest.po1921
-rw-r--r--po/pt/minetest.po1664
-rw-r--r--po/pt_BR/minetest.po1865
-rw-r--r--po/ro/minetest.po1541
-rw-r--r--po/ru/minetest.po2458
-rw-r--r--po/sl/minetest.po4684
-rw-r--r--po/sr_Cyrl/minetest.po1702
-rw-r--r--po/sv/minetest.po4702
-rw-r--r--po/sw/minetest.po1782
-rw-r--r--po/tr/minetest.po3502
-rw-r--r--po/uk/minetest.po1561
-rw-r--r--po/zh_CN/minetest.po1670
-rw-r--r--po/zh_TW/minetest.po1780
-rw-r--r--src/CMakeLists.txt51
-rw-r--r--src/activeobject.h14
-rw-r--r--src/ban.h2
-rw-r--r--src/camera.cpp48
-rw-r--r--src/camera.h32
-rw-r--r--src/cavegen.cpp146
-rw-r--r--src/cavegen.h71
-rw-r--r--src/cguittfont/CGUITTFont.cpp4
-rw-r--r--src/cguittfont/CGUITTFont.h7
-rw-r--r--src/chat.cpp27
-rw-r--r--src/chat.h11
-rw-r--r--src/client.cpp597
-rw-r--r--src/client.h250
-rw-r--r--src/client/CMakeLists.txt1
-rw-r--r--src/client/clientlauncher.cpp108
-rw-r--r--src/client/clientlauncher.h37
-rw-r--r--src/client/inputhandler.cpp119
-rw-r--r--src/client/inputhandler.h360
-rw-r--r--src/client/joystick_controller.cpp108
-rw-r--r--src/client/joystick_controller.h9
-rw-r--r--src/client/keys.h15
-rw-r--r--src/client/tile.cpp224
-rw-r--r--src/client/tile.h137
-rw-r--r--src/clientenvironment.cpp847
-rw-r--r--src/clientenvironment.h195
-rw-r--r--src/clientiface.cpp45
-rw-r--r--src/clientiface.h29
-rw-r--r--src/clientmap.cpp193
-rw-r--r--src/clientmap.h21
-rw-r--r--src/clientmedia.cpp16
-rw-r--r--src/clientmedia.h7
-rw-r--r--src/clientobject.cpp9
-rw-r--r--src/clientobject.h40
-rw-r--r--src/clientsimpleobject.h7
-rw-r--r--src/cloudparams.h33
-rw-r--r--src/clouds.cpp90
-rw-r--r--src/clouds.h54
-rw-r--r--src/collision.cpp8
-rw-r--r--src/constants.h8
-rw-r--r--src/content_abm.cpp8
-rw-r--r--src/content_abm.h1
-rw-r--r--src/content_cao.cpp194
-rw-r--r--src/content_cao.h30
-rw-r--r--src/content_cso.cpp16
-rw-r--r--src/content_mapblock.cpp2897
-rw-r--r--src/content_mapblock.h123
-rw-r--r--src/content_sao.cpp751
-rw-r--r--src/content_sao.h202
-rw-r--r--src/craftdef.cpp3
-rw-r--r--src/craftdef.h11
-rw-r--r--src/database-dummy.h10
-rw-r--r--src/database-files.cpp179
-rw-r--r--src/database-files.h46
-rw-r--r--src/database-leveldb.h7
-rw-r--r--src/database-postgresql.cpp471
-rw-r--r--src/database-postgresql.h115
-rw-r--r--src/database-redis.cpp15
-rw-r--r--src/database-redis.h5
-rw-r--r--src/database-sqlite3.cpp401
-rw-r--r--src/database-sqlite3.h163
-rw-r--r--src/database.cpp4
-rw-r--r--src/database.h32
-rw-r--r--src/defaultsettings.cpp253
-rw-r--r--src/defaultsettings.h1
-rw-r--r--src/drawscene.cpp125
-rw-r--r--src/drawscene.h6
-rw-r--r--src/dungeongen.cpp126
-rw-r--r--src/dungeongen.h8
-rw-r--r--src/emerge.cpp23
-rw-r--r--src/emerge.h3
-rw-r--r--src/environment.cpp2733
-rw-r--r--src/environment.h542
-rw-r--r--src/exceptions.h9
-rw-r--r--src/face_position_cache.cpp110
-rw-r--r--src/face_position_cache.h44
-rw-r--r--src/filecache.h10
-rw-r--r--src/fontengine.cpp26
-rw-r--r--src/game.cpp2021
-rw-r--r--src/game.h129
-rw-r--r--src/gamedef.h41
-rw-r--r--src/gameparams.h3
-rw-r--r--src/genericobject.cpp26
-rw-r--r--src/genericobject.h12
-rw-r--r--src/gettime.h29
-rw-r--r--src/guiChatConsole.cpp22
-rw-r--r--src/guiChatConsole.h4
-rw-r--r--src/guiEngine.cpp40
-rw-r--r--src/guiEngine.h14
-rw-r--r--src/guiFileSelectMenu.cpp21
-rw-r--r--src/guiFileSelectMenu.h29
-rw-r--r--src/guiFormSpecMenu.cpp363
-rw-r--r--src/guiFormSpecMenu.h177
-rw-r--r--src/guiKeyChangeMenu.cpp26
-rw-r--r--src/guiKeyChangeMenu.h18
-rw-r--r--src/guiPasswordChange.cpp173
-rw-r--r--src/guiPasswordChange.h23
-rw-r--r--src/guiTable.cpp2
-rw-r--r--src/guiTable.h11
-rw-r--r--src/guiVolumeChange.cpp63
-rw-r--r--src/httpfetch.cpp22
-rw-r--r--src/httpfetch.h23
-rw-r--r--src/hud.cpp73
-rw-r--r--src/hud.h14
-rw-r--r--src/intlGUIEditBox.cpp39
-rw-r--r--src/intlGUIEditBox.h2
-rw-r--r--src/inventory.cpp114
-rw-r--r--src/inventory.h21
-rw-r--r--src/inventorymanager.cpp7
-rw-r--r--src/irr_aabb3d.h1
-rw-r--r--src/irr_v2d.h1
-rw-r--r--src/irr_v3d.h1
-rw-r--r--src/irrlicht_changes/static_text.cpp4
-rw-r--r--src/irrlichttypes_bloated.h1
-rw-r--r--src/irrlichttypes_extrabloated.h1
-rw-r--r--src/itemdef.cpp117
-rw-r--r--src/itemdef.h35
-rw-r--r--src/itemgroup.h6
-rw-r--r--src/itemstackmetadata.cpp43
-rw-r--r--src/itemstackmetadata.h35
-rw-r--r--src/jsoncpp/json/json.h1914
-rw-r--r--src/jsoncpp/json/jsoncpp.cpp4367
-rw-r--r--src/keycode.cpp8
-rw-r--r--src/keycode.h7
-rw-r--r--src/light.cpp351
-rw-r--r--src/light.h31
-rw-r--r--src/localplayer.cpp638
-rw-r--r--src/localplayer.h77
-rw-r--r--src/main.cpp69
-rw-r--r--src/mainmenumanager.h6
-rw-r--r--src/map.cpp934
-rw-r--r--src/map.h72
-rw-r--r--src/map_settings_manager.cpp13
-rw-r--r--src/mapblock.cpp39
-rw-r--r--src/mapblock.h123
-rw-r--r--src/mapblock_mesh.cpp827
-rw-r--r--src/mapblock_mesh.h120
-rw-r--r--src/mapgen.cpp204
-rw-r--r--src/mapgen.h33
-rw-r--r--src/mapgen_flat.cpp19
-rw-r--r--src/mapgen_flat.h11
-rw-r--r--src/mapgen_fractal.cpp5
-rw-r--r--src/mapgen_fractal.h11
-rw-r--r--src/mapgen_singlenode.cpp4
-rw-r--r--src/mapgen_singlenode.h10
-rw-r--r--src/mapgen_v5.cpp91
-rw-r--r--src/mapgen_v5.h22
-rw-r--r--src/mapgen_v6.cpp117
-rw-r--r--src/mapgen_v6.h3
-rw-r--r--src/mapgen_v7.cpp120
-rw-r--r--src/mapgen_v7.h17
-rw-r--r--src/mapgen_valleys.cpp32
-rw-r--r--src/mapgen_valleys.h9
-rw-r--r--src/mapnode.cpp66
-rw-r--r--src/mapnode.h25
-rw-r--r--src/mesh.cpp162
-rw-r--r--src/mesh.h31
-rw-r--r--src/mesh_generator_thread.cpp335
-rw-r--r--src/mesh_generator_thread.h135
-rw-r--r--src/metadata.cpp108
-rw-r--r--src/metadata.h61
-rw-r--r--src/mg_biome.cpp15
-rw-r--r--src/mg_biome.h8
-rw-r--r--src/mg_decoration.cpp5
-rw-r--r--src/mg_decoration.h3
-rw-r--r--src/mg_ore.cpp6
-rw-r--r--src/mg_ore.h3
-rw-r--r--src/mg_schematic.cpp23
-rw-r--r--src/mg_schematic.h12
-rw-r--r--src/minimap.cpp223
-rw-r--r--src/minimap.h28
-rw-r--r--src/modalMenu.h10
-rw-r--r--src/modifiedstate.h1
-rw-r--r--src/mods.cpp295
-rw-r--r--src/mods.h85
-rw-r--r--src/nameidmapping.cpp12
-rw-r--r--src/nameidmapping.h34
-rw-r--r--src/network/clientopcodes.cpp12
-rw-r--r--src/network/clientopcodes.h2
-rw-r--r--src/network/clientpackethandler.cpp127
-rw-r--r--src/network/connection.cpp22
-rw-r--r--src/network/connection.h18
-rw-r--r--src/network/networkpacket.cpp8
-rw-r--r--src/network/networkpacket.h11
-rw-r--r--src/network/networkprotocol.h45
-rw-r--r--src/network/serveropcodes.cpp8
-rw-r--r--src/network/serveropcodes.h2
-rw-r--r--src/network/serverpackethandler.cpp180
-rw-r--r--src/nodedef.cpp746
-rw-r--r--src/nodedef.h221
-rw-r--r--src/nodemetadata.cpp103
-rw-r--r--src/nodemetadata.h35
-rw-r--r--src/object_properties.cpp6
-rw-r--r--src/object_properties.h2
-rw-r--r--src/particles.cpp278
-rw-r--r--src/particles.h33
-rw-r--r--src/pathfinder.cpp76
-rw-r--r--src/player.h1
-rw-r--r--src/porting.cpp63
-rw-r--r--src/porting.h168
-rw-r--r--src/profiler.cpp30
-rw-r--r--src/profiler.h77
-rw-r--r--src/raycast.cpp89
-rw-r--r--src/raycast.h38
-rw-r--r--src/reflowscan.cpp5
-rw-r--r--src/remoteplayer.cpp88
-rw-r--r--src/remoteplayer.h36
-rw-r--r--src/rollback_interface.cpp12
-rw-r--r--src/script/CMakeLists.txt7
-rw-r--r--src/script/common/c_content.cpp472
-rw-r--r--src/script/common/c_content.h35
-rw-r--r--src/script/common/c_converter.cpp4
-rw-r--r--src/script/common/c_converter.h2
-rw-r--r--src/script/cpp_api/CMakeLists.txt1
-rw-r--r--src/script/cpp_api/s_async.cpp33
-rw-r--r--src/script/cpp_api/s_async.h25
-rw-r--r--src/script/cpp_api/s_base.cpp45
-rw-r--r--src/script/cpp_api/s_base.h17
-rw-r--r--src/script/cpp_api/s_client.cpp230
-rw-r--r--src/script/cpp_api/s_client.h63
-rw-r--r--src/script/cpp_api/s_entity.cpp22
-rw-r--r--src/script/cpp_api/s_entity.h4
-rw-r--r--src/script/cpp_api/s_env.cpp12
-rw-r--r--src/script/cpp_api/s_item.cpp35
-rw-r--r--src/script/cpp_api/s_mainmenu.cpp8
-rw-r--r--src/script/cpp_api/s_node.cpp27
-rw-r--r--src/script/cpp_api/s_node.h1
-rw-r--r--src/script/cpp_api/s_player.h14
-rw-r--r--src/script/cpp_api/s_security.cpp187
-rw-r--r--src/script/cpp_api/s_security.h2
-rw-r--r--src/script/lua_api/CMakeLists.txt10
-rw-r--r--src/script/lua_api/l_areastore.cpp4
-rw-r--r--src/script/lua_api/l_areastore.h7
-rw-r--r--src/script/lua_api/l_base.cpp26
-rw-r--r--src/script/lua_api/l_base.h16
-rw-r--r--src/script/lua_api/l_camera.cpp202
-rw-r--r--src/script/lua_api/l_camera.h44
-rw-r--r--src/script/lua_api/l_client.cpp356
-rw-r--r--src/script/lua_api/l_client.h98
-rw-r--r--src/script/lua_api/l_craft.cpp2
-rw-r--r--src/script/lua_api/l_env.cpp109
-rw-r--r--src/script/lua_api/l_env.h14
-rw-r--r--src/script/lua_api/l_internal.h14
-rw-r--r--src/script/lua_api/l_inventory.cpp12
-rw-r--r--src/script/lua_api/l_inventory.h2
-rw-r--r--src/script/lua_api/l_item.cpp66
-rw-r--r--src/script/lua_api/l_item.h7
-rw-r--r--src/script/lua_api/l_itemstackmeta.cpp120
-rw-r--r--src/script/lua_api/l_itemstackmeta.h59
-rw-r--r--src/script/lua_api/l_localplayer.cpp358
-rw-r--r--src/script/lua_api/l_localplayer.h85
-rw-r--r--src/script/lua_api/l_mainmenu.cpp76
-rw-r--r--src/script/lua_api/l_mainmenu.h10
-rw-r--r--src/script/lua_api/l_mapgen.cpp20
-rw-r--r--src/script/lua_api/l_mapgen.h3
-rw-r--r--src/script/lua_api/l_metadata.cpp266
-rw-r--r--src/script/lua_api/l_metadata.h75
-rw-r--r--src/script/lua_api/l_minimap.cpp227
-rw-r--r--src/script/lua_api/l_minimap.h65
-rw-r--r--src/script/lua_api/l_nodemeta.cpp330
-rw-r--r--src/script/lua_api/l_nodemeta.h48
-rw-r--r--src/script/lua_api/l_nodetimer.cpp4
-rw-r--r--src/script/lua_api/l_nodetimer.h9
-rw-r--r--src/script/lua_api/l_noise.cpp10
-rw-r--r--src/script/lua_api/l_noise.h37
-rw-r--r--src/script/lua_api/l_object.cpp271
-rw-r--r--src/script/lua_api/l_object.h67
-rw-r--r--src/script/lua_api/l_particles.cpp29
-rw-r--r--src/script/lua_api/l_server.cpp79
-rw-r--r--src/script/lua_api/l_server.h17
-rw-r--r--src/script/lua_api/l_settings.cpp85
-rw-r--r--src/script/lua_api/l_settings.h43
-rw-r--r--src/script/lua_api/l_sound.cpp53
-rw-r--r--src/script/lua_api/l_sound.h36
-rw-r--r--src/script/lua_api/l_storage.cpp147
-rw-r--r--src/script/lua_api/l_storage.h63
-rw-r--r--src/script/lua_api/l_util.cpp137
-rw-r--r--src/script/lua_api/l_util.h24
-rw-r--r--src/script/lua_api/l_vmanip.cpp49
-rw-r--r--src/script/lua_api/l_vmanip.h9
-rw-r--r--src/script/scripting_client.cpp88
-rw-r--r--src/script/scripting_client.h46
-rw-r--r--src/script/scripting_mainmenu.cpp29
-rw-r--r--src/script/scripting_mainmenu.h7
-rw-r--r--src/script/scripting_server.cpp (renamed from src/script/scripting_game.cpp)37
-rw-r--r--src/script/scripting_server.h (renamed from src/script/scripting_game.h)12
-rw-r--r--src/serialization.h6
-rw-r--r--src/server.cpp601
-rw-r--r--src/server.h91
-rw-r--r--src/serverenvironment.cpp2317
-rw-r--r--src/serverenvironment.h438
-rw-r--r--src/serverlist.cpp22
-rw-r--r--src/serverlist.h39
-rw-r--r--src/serverobject.h12
-rw-r--r--src/settings.cpp29
-rw-r--r--src/settings.h37
-rw-r--r--src/settings_translation_file.cpp269
-rw-r--r--src/shader.cpp6
-rw-r--r--src/sky.cpp10
-rw-r--r--src/sky.h77
-rw-r--r--src/sound.h82
-rw-r--r--src/sound_openal.cpp97
-rw-r--r--src/threading/event.cpp2
-rw-r--r--src/threading/event.h10
-rw-r--r--src/threading/mutex.cpp9
-rw-r--r--src/threading/mutex.h2
-rw-r--r--src/threading/semaphore.h14
-rw-r--r--src/threading/thread.cpp17
-rw-r--r--src/threading/thread.h1
-rw-r--r--src/tileanimation.cpp131
-rw-r--r--src/tileanimation.h62
-rw-r--r--src/tool.cpp29
-rw-r--r--src/tool.h8
-rw-r--r--src/touchscreengui.cpp6
-rw-r--r--src/touchscreengui.h115
-rw-r--r--src/treegen.cpp12
-rw-r--r--src/treegen.h2
-rw-r--r--src/unittest/test.cpp20
-rw-r--r--src/unittest/test.h4
-rw-r--r--src/unittest/test_connection.cpp2
-rw-r--r--src/unittest/test_mapnode.cpp3
-rw-r--r--src/unittest/test_nodedef.cpp5
-rw-r--r--src/unittest/test_noderesolver.cpp2
-rw-r--r--src/unittest/test_objdef.cpp4
-rw-r--r--src/unittest/test_player.cpp52
-rw-r--r--src/unittest/test_profiler.cpp3
-rw-r--r--src/unittest/test_threading.cpp2
-rw-r--r--src/unittest/test_voxelalgorithms.cpp59
-rw-r--r--src/util/basic_macros.h12
-rw-r--r--src/util/cpp11.h32
-rw-r--r--src/util/cpp11_container.h16
-rw-r--r--src/util/directiontables.h56
-rw-r--r--src/util/hex.h13
-rw-r--r--src/util/mathconstants.h7
-rw-r--r--src/util/numeric.cpp94
-rw-r--r--src/util/numeric.h104
-rw-r--r--src/util/pointedthing.cpp75
-rw-r--r--src/util/pointedthing.h40
-rw-r--r--src/util/serialize.cpp49
-rw-r--r--src/util/serialize.h7
-rw-r--r--src/util/sha1.h33
-rw-r--r--src/util/sha2.h107
-rw-r--r--src/util/sha256.c5
-rw-r--r--src/util/srp.cpp2
-rw-r--r--src/util/string.cpp8
-rw-r--r--src/util/string.h38
-rw-r--r--src/util/thread.h21
-rw-r--r--src/util/timetaker.cpp27
-rw-r--r--src/util/timetaker.h14
-rw-r--r--src/voxel.cpp12
-rw-r--r--src/voxel.h4
-rw-r--r--src/voxelalgorithms.cpp739
-rw-r--r--src/voxelalgorithms.h100
-rw-r--r--src/wieldmesh.cpp244
-rw-r--r--src/wieldmesh.h89
-rw-r--r--textures/base/pack/air.pngbin0 -> 225 bytes
-rw-r--r--textures/base/pack/ignore.pngbin0 -> 234 bytes
-rw-r--r--textures/base/pack/progress_bar.pngbin0 -> 413 bytes
-rw-r--r--textures/base/pack/progress_bar_bg.pngbin0 -> 354 bytes
-rw-r--r--textures/base/pack/server_ping_1.pngbin0 -> 251 bytes
-rw-r--r--textures/base/pack/server_ping_2.pngbin0 -> 244 bytes
-rw-r--r--textures/base/pack/server_ping_3.pngbin0 -> 245 bytes
-rw-r--r--textures/base/pack/server_ping_4.pngbin0 -> 213 bytes
-rwxr-xr-xutil/buildbot/buildwin32.sh9
-rwxr-xr-xutil/buildbot/buildwin64.sh3
-rwxr-xr-xutil/travis/before_install.sh15
-rw-r--r--util/travis/clang-format-whitelist.txt389
-rw-r--r--util/travis/common.sh3
-rw-r--r--util/travis/lint.sh45
-rwxr-xr-xutil/travis/script.sh21
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
new file mode 100644
index 000000000..8c0fb64a8
--- /dev/null
+++ b/build/android/gradle/wrapper/gradle-wrapper.jar
Binary files differ
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
new file mode 100644
index 000000000..9be443c7d
--- /dev/null
+++ b/fonts/Arimo-Regular.ttf
Binary files differ
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
new file mode 100644
index 000000000..4d6990a25
--- /dev/null
+++ b/fonts/Cousine-Regular.ttf
Binary files differ
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
deleted file mode 100644
index 7260bd65e..000000000
--- a/fonts/liberationmono.ttf
+++ /dev/null
Binary files differ
diff --git a/fonts/liberationsans.ttf b/fonts/liberationsans.ttf
deleted file mode 100644
index 59d2e251b..000000000
--- a/fonts/liberationsans.ttf
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_10.xml b/fonts/lucida_sans_10.xml
deleted file mode 100755
index d54e9f6a6..000000000
--- a/fonts/lucida_sans_10.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_100.png b/fonts/lucida_sans_100.png
deleted file mode 100755
index 9f3dc25c8..000000000
--- a/fonts/lucida_sans_100.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_11.xml b/fonts/lucida_sans_11.xml
deleted file mode 100755
index 33d06c376..000000000
--- a/fonts/lucida_sans_11.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_110.png b/fonts/lucida_sans_110.png
deleted file mode 100755
index 1c98efcca..000000000
--- a/fonts/lucida_sans_110.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_12.xml b/fonts/lucida_sans_12.xml
deleted file mode 100755
index 382981dcf..000000000
--- a/fonts/lucida_sans_12.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_120.png b/fonts/lucida_sans_120.png
deleted file mode 100755
index c106feb27..000000000
--- a/fonts/lucida_sans_120.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_14.xml b/fonts/lucida_sans_14.xml
deleted file mode 100755
index 99398d792..000000000
--- a/fonts/lucida_sans_14.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_140.png b/fonts/lucida_sans_140.png
deleted file mode 100755
index d314dc5b3..000000000
--- a/fonts/lucida_sans_140.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_16.xml b/fonts/lucida_sans_16.xml
deleted file mode 100755
index b07c1119f..000000000
--- a/fonts/lucida_sans_16.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_160.png b/fonts/lucida_sans_160.png
deleted file mode 100755
index 233ee9d42..000000000
--- a/fonts/lucida_sans_160.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_18.xml b/fonts/lucida_sans_18.xml
deleted file mode 100755
index 881aff18d..000000000
--- a/fonts/lucida_sans_18.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_180.png b/fonts/lucida_sans_180.png
deleted file mode 100755
index 68cbe3bc8..000000000
--- a/fonts/lucida_sans_180.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_20.xml b/fonts/lucida_sans_20.xml
deleted file mode 100755
index 329c226c0..000000000
--- a/fonts/lucida_sans_20.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_200.png b/fonts/lucida_sans_200.png
deleted file mode 100755
index 7b57632b8..000000000
--- a/fonts/lucida_sans_200.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_22.xml b/fonts/lucida_sans_22.xml
deleted file mode 100755
index 14d0cc2b9..000000000
--- a/fonts/lucida_sans_22.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_220.png b/fonts/lucida_sans_220.png
deleted file mode 100755
index 4f385f4d4..000000000
--- a/fonts/lucida_sans_220.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_24.xml b/fonts/lucida_sans_24.xml
deleted file mode 100755
index 5956f46e6..000000000
--- a/fonts/lucida_sans_24.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_240.png b/fonts/lucida_sans_240.png
deleted file mode 100755
index 8fc4e9d6b..000000000
--- a/fonts/lucida_sans_240.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_26.xml b/fonts/lucida_sans_26.xml
deleted file mode 100755
index ae10ff8d7..000000000
--- a/fonts/lucida_sans_26.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_260.png b/fonts/lucida_sans_260.png
deleted file mode 100755
index 9bae8de5b..000000000
--- a/fonts/lucida_sans_260.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_28.xml b/fonts/lucida_sans_28.xml
deleted file mode 100755
index c1b3361d3..000000000
--- a/fonts/lucida_sans_28.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_280.png b/fonts/lucida_sans_280.png
deleted file mode 100755
index 527fa3734..000000000
--- a/fonts/lucida_sans_280.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_36.xml b/fonts/lucida_sans_36.xml
deleted file mode 100755
index ca300d6de..000000000
--- a/fonts/lucida_sans_36.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_360.png b/fonts/lucida_sans_360.png
deleted file mode 100755
index eecf35e33..000000000
--- a/fonts/lucida_sans_360.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_4.xml b/fonts/lucida_sans_4.xml
deleted file mode 100755
index edc5af951..000000000
--- a/fonts/lucida_sans_4.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_40.png b/fonts/lucida_sans_40.png
deleted file mode 100755
index 5c10c1ed3..000000000
--- a/fonts/lucida_sans_40.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_48.xml b/fonts/lucida_sans_48.xml
deleted file mode 100755
index c8c75974d..000000000
--- a/fonts/lucida_sans_48.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_480.png b/fonts/lucida_sans_480.png
deleted file mode 100755
index 928a0d723..000000000
--- a/fonts/lucida_sans_480.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_56.xml b/fonts/lucida_sans_56.xml
deleted file mode 100755
index 9f2cc831e..000000000
--- a/fonts/lucida_sans_56.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_560.png b/fonts/lucida_sans_560.png
deleted file mode 100755
index 7afb09912..000000000
--- a/fonts/lucida_sans_560.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_6.xml b/fonts/lucida_sans_6.xml
deleted file mode 100755
index 069c9aa80..000000000
--- a/fonts/lucida_sans_6.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_60.png b/fonts/lucida_sans_60.png
deleted file mode 100755
index 0efcd9e32..000000000
--- a/fonts/lucida_sans_60.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_8.xml b/fonts/lucida_sans_8.xml
deleted file mode 100755
index 44f0e6a74..000000000
--- a/fonts/lucida_sans_8.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_80.png b/fonts/lucida_sans_80.png
deleted file mode 100755
index 287c65663..000000000
--- a/fonts/lucida_sans_80.png
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_9.xml b/fonts/lucida_sans_9.xml
deleted file mode 100755
index 99aa6447c..000000000
--- a/fonts/lucida_sans_9.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/lucida_sans_90.png b/fonts/lucida_sans_90.png
deleted file mode 100755
index 822a465f2..000000000
--- a/fonts/lucida_sans_90.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_10.xml b/fonts/mono_dejavu_sans_10.xml
index 0276cedb6..0276cedb6 100755..100644
--- a/fonts/mono_dejavu_sans_10.xml
+++ b/fonts/mono_dejavu_sans_10.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_100.png b/fonts/mono_dejavu_sans_100.png
index 45a312542..45a312542 100755..100644
--- a/fonts/mono_dejavu_sans_100.png
+++ b/fonts/mono_dejavu_sans_100.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_11.xml b/fonts/mono_dejavu_sans_11.xml
index f727ed2bb..f727ed2bb 100755..100644
--- a/fonts/mono_dejavu_sans_11.xml
+++ b/fonts/mono_dejavu_sans_11.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_110.png b/fonts/mono_dejavu_sans_110.png
index c90c0e242..c90c0e242 100755..100644
--- a/fonts/mono_dejavu_sans_110.png
+++ b/fonts/mono_dejavu_sans_110.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_12.xml b/fonts/mono_dejavu_sans_12.xml
index 38f6427be..38f6427be 100755..100644
--- a/fonts/mono_dejavu_sans_12.xml
+++ b/fonts/mono_dejavu_sans_12.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_120.png b/fonts/mono_dejavu_sans_120.png
index 0cebd70e8..0cebd70e8 100755..100644
--- a/fonts/mono_dejavu_sans_120.png
+++ b/fonts/mono_dejavu_sans_120.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_14.xml b/fonts/mono_dejavu_sans_14.xml
index b90a34960..b90a34960 100755..100644
--- a/fonts/mono_dejavu_sans_14.xml
+++ b/fonts/mono_dejavu_sans_14.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_140.png b/fonts/mono_dejavu_sans_140.png
index a413759ea..a413759ea 100755..100644
--- a/fonts/mono_dejavu_sans_140.png
+++ b/fonts/mono_dejavu_sans_140.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_16.xml b/fonts/mono_dejavu_sans_16.xml
index 3f7d2c2a2..3f7d2c2a2 100755..100644
--- a/fonts/mono_dejavu_sans_16.xml
+++ b/fonts/mono_dejavu_sans_16.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_160.png b/fonts/mono_dejavu_sans_160.png
index bd8a2f40a..bd8a2f40a 100755..100644
--- a/fonts/mono_dejavu_sans_160.png
+++ b/fonts/mono_dejavu_sans_160.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_18.xml b/fonts/mono_dejavu_sans_18.xml
index 92865cbfc..92865cbfc 100755..100644
--- a/fonts/mono_dejavu_sans_18.xml
+++ b/fonts/mono_dejavu_sans_18.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_180.png b/fonts/mono_dejavu_sans_180.png
index a299afcbe..a299afcbe 100755..100644
--- a/fonts/mono_dejavu_sans_180.png
+++ b/fonts/mono_dejavu_sans_180.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_20.xml b/fonts/mono_dejavu_sans_20.xml
index acd8c77d0..acd8c77d0 100755..100644
--- a/fonts/mono_dejavu_sans_20.xml
+++ b/fonts/mono_dejavu_sans_20.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_200.png b/fonts/mono_dejavu_sans_200.png
index 68ee62681..68ee62681 100755..100644
--- a/fonts/mono_dejavu_sans_200.png
+++ b/fonts/mono_dejavu_sans_200.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_22.xml b/fonts/mono_dejavu_sans_22.xml
index eafb4def6..eafb4def6 100755..100644
--- a/fonts/mono_dejavu_sans_22.xml
+++ b/fonts/mono_dejavu_sans_22.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_220.png b/fonts/mono_dejavu_sans_220.png
index 042d7e094..042d7e094 100755..100644
--- a/fonts/mono_dejavu_sans_220.png
+++ b/fonts/mono_dejavu_sans_220.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_24.xml b/fonts/mono_dejavu_sans_24.xml
index fc8b6232e..fc8b6232e 100755..100644
--- a/fonts/mono_dejavu_sans_24.xml
+++ b/fonts/mono_dejavu_sans_24.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_240.png b/fonts/mono_dejavu_sans_240.png
index d2d68c5bb..d2d68c5bb 100755..100644
--- a/fonts/mono_dejavu_sans_240.png
+++ b/fonts/mono_dejavu_sans_240.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_26.xml b/fonts/mono_dejavu_sans_26.xml
index 829f09948..829f09948 100755..100644
--- a/fonts/mono_dejavu_sans_26.xml
+++ b/fonts/mono_dejavu_sans_26.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_260.png b/fonts/mono_dejavu_sans_260.png
index 3a8cb6c57..3a8cb6c57 100755..100644
--- a/fonts/mono_dejavu_sans_260.png
+++ b/fonts/mono_dejavu_sans_260.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_28.xml b/fonts/mono_dejavu_sans_28.xml
index b5b25bd07..b5b25bd07 100755..100644
--- a/fonts/mono_dejavu_sans_28.xml
+++ b/fonts/mono_dejavu_sans_28.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_280.png b/fonts/mono_dejavu_sans_280.png
index ccf62ba48..ccf62ba48 100755..100644
--- a/fonts/mono_dejavu_sans_280.png
+++ b/fonts/mono_dejavu_sans_280.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_4.xml b/fonts/mono_dejavu_sans_4.xml
index cfebb39b3..cfebb39b3 100755..100644
--- a/fonts/mono_dejavu_sans_4.xml
+++ b/fonts/mono_dejavu_sans_4.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_40.png b/fonts/mono_dejavu_sans_40.png
index 24ed693f7..24ed693f7 100755..100644
--- a/fonts/mono_dejavu_sans_40.png
+++ b/fonts/mono_dejavu_sans_40.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_6.xml b/fonts/mono_dejavu_sans_6.xml
index d0e1de21d..d0e1de21d 100755..100644
--- a/fonts/mono_dejavu_sans_6.xml
+++ b/fonts/mono_dejavu_sans_6.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_60.png b/fonts/mono_dejavu_sans_60.png
index 326af996f..326af996f 100755..100644
--- a/fonts/mono_dejavu_sans_60.png
+++ b/fonts/mono_dejavu_sans_60.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_8.xml b/fonts/mono_dejavu_sans_8.xml
index c48bf7ccc..c48bf7ccc 100755..100644
--- a/fonts/mono_dejavu_sans_8.xml
+++ b/fonts/mono_dejavu_sans_8.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_80.png b/fonts/mono_dejavu_sans_80.png
index 04326dbb2..04326dbb2 100755..100644
--- a/fonts/mono_dejavu_sans_80.png
+++ b/fonts/mono_dejavu_sans_80.png
Binary files differ
diff --git a/fonts/mono_dejavu_sans_9.xml b/fonts/mono_dejavu_sans_9.xml
index 74e841034..74e841034 100755..100644
--- a/fonts/mono_dejavu_sans_9.xml
+++ b/fonts/mono_dejavu_sans_9.xml
Binary files differ
diff --git a/fonts/mono_dejavu_sans_90.png b/fonts/mono_dejavu_sans_90.png
index 65ac51858..65ac51858 100755..100644
--- a/fonts/mono_dejavu_sans_90.png
+++ b/fonts/mono_dejavu_sans_90.png
Binary files differ
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
new file mode 100644
index 000000000..9746a3fd9
--- /dev/null
+++ b/games/minimal/mods/default/textures/default_chest.png
Binary files differ
diff --git a/games/minimal/mods/default/textures/default_chest_front.png b/games/minimal/mods/default/textures/default_chest_front.png
deleted file mode 100644
index 55b076c35..000000000
--- a/games/minimal/mods/default/textures/default_chest_front.png
+++ /dev/null
Binary files differ
diff --git a/games/minimal/mods/default/textures/default_chest_lock.png b/games/minimal/mods/default/textures/default_chest_lock.png
deleted file mode 100644
index 4b2d1af6c..000000000
--- a/games/minimal/mods/default/textures/default_chest_lock.png
+++ /dev/null
Binary files differ
diff --git a/games/minimal/mods/default/textures/default_chest_side.png b/games/minimal/mods/default/textures/default_chest_side.png
deleted file mode 100644
index ae4847cb6..000000000
--- a/games/minimal/mods/default/textures/default_chest_side.png
+++ /dev/null
Binary files differ
diff --git a/games/minimal/mods/default/textures/default_chest_top.png b/games/minimal/mods/default/textures/default_chest_top.png
deleted file mode 100644
index ac41551b0..000000000
--- a/games/minimal/mods/default/textures/default_chest_top.png
+++ /dev/null
Binary files differ
diff --git a/games/minimal/mods/default/textures/default_lava_source_animated.png b/games/minimal/mods/default/textures/default_lava_source_animated.png
index 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
Binary files differ
diff --git a/games/minimal/mods/default/textures/default_river_water.png b/games/minimal/mods/default/textures/default_river_water.png
new file mode 100644
index 000000000..3b55c5f66
--- /dev/null
+++ b/games/minimal/mods/default/textures/default_river_water.png
Binary files differ
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_ = &currentValue();
+ }
+
+ --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_ = &currentValue();
+ }
+
+ --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"
};
diff --git a/src/ban.h b/src/ban.h
index d1a49cb15..e35bd0e10 100644
--- a/src/ban.h
+++ b/src/ban.h
@@ -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 &params);
- // 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,
+ &current_intersection, &current_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 = &copy.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 &times,
- 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> &current_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> &current_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 &times,
- 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> &current_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> &current_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> &current_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(&current_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(&current_formspec, client, gamedef, texture_src,
- device, &input->joystick, fs_src, txt_dst, client);
+ create_formspec_menu(&current_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(&current_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(&current_formspec, client, gamedef,
- texture_src, device, &input->joystick,
- fs_src, txt_dst, client);
+ create_formspec_menu(&current_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(&current_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(&current_formspec, client, gamedef,
- texture_src, device, &input->joystick, fs_src, txt_dst, client);
+ create_formspec_menu(&current_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(&current_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> &current_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 &current_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;
diff --git a/src/hud.h b/src/hud.h
index a4d7990e9..15c115d89 100644
--- a/src/hud.h
+++ b/src/hud.h
@@ -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 &current );
-#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 &current );
-#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 &current );
-#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 &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_;
- };
-
- /** \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 *&current )
-{
- *--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_ = &currentValue();
- }
-
- 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 &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];
- 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 &current )
- : 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 &current )
- : 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 &current )
- : 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 &sectordir, 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 &sectordir, 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)
diff --git a/src/map.h b/src/map.h
index e8d40e982..4b6e08f96 100644
--- a/src/map.h
+++ b/src/map.h
@@ -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 &sectordir, 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 &sectordir, 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(&params->np_terrain, seed, csize.X, csize.Z);
+ // 2D noise
noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
+ if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS))
+ noise_terrain = new Noise(&params->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(&params->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(&params->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(&params->np_terrain_base, seed, csize.X, csize.Z);
- noise_terrain_alt = new Noise(&params->np_terrain_alt, seed, csize.X, csize.Z);
- noise_terrain_persist = new Noise(&params->np_terrain_persist, seed, csize.X, csize.Z);
- noise_height_select = new Noise(&params->np_height_select, seed, csize.X, csize.Z);
- noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
- noise_mount_height = new Noise(&params->np_mount_height, seed, csize.X, csize.Z);
- noise_ridge_uwater = new Noise(&params->np_ridge_uwater, seed, csize.X, csize.Z);
- noise_floatland_base = new Noise(&params->np_floatland_base, seed, csize.X, csize.Z);
- noise_float_base_height = new Noise(&params->np_float_base_height, seed, csize.X, csize.Z);
-
- //// 3d terrain noise
- // 1-up 1-down overgeneration
- noise_mountain = new Noise(&params->np_mountain, seed, csize.X, csize.Y + 2, csize.Z);
- noise_ridge = new Noise(&params->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(&params->np_terrain_base, seed, csize.X, csize.Z);
+ noise_terrain_alt = new Noise(&params->np_terrain_alt, seed, csize.X, csize.Z);
+ noise_terrain_persist = new Noise(&params->np_terrain_persist, seed, csize.X, csize.Z);
+ noise_height_select = new Noise(&params->np_height_select, seed, csize.X, csize.Z);
+ noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
+
+ if (spflags & MGV7_MOUNTAINS)
+ noise_mount_height = new Noise(&params->np_mount_height, seed, csize.X, csize.Z);
+
+ if (spflags & MGV7_FLOATLANDS) {
+ noise_floatland_base = new Noise(&params->np_floatland_base, seed, csize.X, csize.Z);
+ noise_float_base_height = new Noise(&params->np_float_base_height, seed, csize.X, csize.Z);
+ }
+
+ if (spflags & MGV7_RIDGES) {
+ noise_ridge_uwater = new Noise(&params->np_ridge_uwater, seed, csize.X, csize.Z);
+ // 3D noise, 1-up 1-down overgeneration
+ noise_ridge = new Noise(&params->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(&params->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> &params)
+ const std::vector<std::string> &params, 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 &params)
@@ -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 &params);
-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 &params)
{
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 &params);
/**
* 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, &params);
+ player->getSky(&bgcolor, &type, &params, &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> &params)
+ const std::string &type, const std::vector<std::string> &params,
+ 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> &params)
+ const std::string &type, const std::vector<std::string> &params,
+ 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 &params);
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> &params);
+ const std::string &type, const std::vector<std::string> &params,
+ 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> &params);
+ const std::string &type, const std::vector<std::string> &params,
+ 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 &times,
+ 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> &current_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> &current_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 &times,
+ 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> &current_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> &current_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)
diff --git a/src/sky.h b/src/sky.h
index f19891773..a014a920b 100644
--- a/src/sky.h
+++ b/src/sky.h
@@ -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
new file mode 100644
index 000000000..e2c487214
--- /dev/null
+++ b/textures/base/pack/air.png
Binary files differ
diff --git a/textures/base/pack/ignore.png b/textures/base/pack/ignore.png
new file mode 100644
index 000000000..a73d2222d
--- /dev/null
+++ b/textures/base/pack/ignore.png
Binary files differ
diff --git a/textures/base/pack/progress_bar.png b/textures/base/pack/progress_bar.png
new file mode 100644
index 000000000..e80367191
--- /dev/null
+++ b/textures/base/pack/progress_bar.png
Binary files differ
diff --git a/textures/base/pack/progress_bar_bg.png b/textures/base/pack/progress_bar_bg.png
new file mode 100644
index 000000000..4e30ae889
--- /dev/null
+++ b/textures/base/pack/progress_bar_bg.png
Binary files differ
diff --git a/textures/base/pack/server_ping_1.png b/textures/base/pack/server_ping_1.png
new file mode 100644
index 000000000..ba5bba1e3
--- /dev/null
+++ b/textures/base/pack/server_ping_1.png
Binary files differ
diff --git a/textures/base/pack/server_ping_2.png b/textures/base/pack/server_ping_2.png
new file mode 100644
index 000000000..8dca0be0d
--- /dev/null
+++ b/textures/base/pack/server_ping_2.png
Binary files differ
diff --git a/textures/base/pack/server_ping_3.png b/textures/base/pack/server_ping_3.png
new file mode 100644
index 000000000..c2cab017e
--- /dev/null
+++ b/textures/base/pack/server_ping_3.png
Binary files differ
diff --git a/textures/base/pack/server_ping_4.png b/textures/base/pack/server_ping_4.png
new file mode 100644
index 000000000..03b4b5b83
--- /dev/null
+++ b/textures/base/pack/server_ping_4.png
Binary files differ
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