aboutsummaryrefslogtreecommitdiff
path: root/src/script/cpp_api
ModeNameSize
-rw-r--r--CMakeLists.txt563logplain
-rw-r--r--s_base.cpp6755logplain
-rw-r--r--s_base.h2426logplain
-rw-r--r--s_entity.cpp7526logplain
-rw-r--r--s_entity.h1542logplain
-rw-r--r--s_env.cpp4532logplain
-rw-r--r--s_env.h1312logplain
-rw-r--r--s_internal.h2282logplain
-rw-r--r--s_inventory.cpp7144logplain
-rw-r--r--s_inventory.h2342logplain
-rw-r--r--s_item.cpp4484logplain
-rw-r--r--s_item.h1558logplain
-rw-r--r--s_mainmenu.cpp2368logplain
-rw-r--r--s_mainmenu.h1442logplain
-rw-r--r--s_node.cpp6392logplain
-rw-r--r--s_node.h1949logplain
-rw-r--r--s_nodemeta.cpp7254logplain
-rw-r--r--s_nodemeta.h2220logplain
-rw-r--r--s_player.cpp3885logplain
-rw-r--r--s_player.h1463logplain
-rw-r--r--s_server.cpp4243logplain
-rw-r--r--s_server.h1559logplain
ies3
-rwxr-xr-xandroid/gradlew2
-rw-r--r--android/icons/aux_btn.svg411
-rw-r--r--android/native/build.gradle51
-rw-r--r--android/native/jni/Android.mk123
-rw-r--r--android/native/jni/Application.mk16
-rw-r--r--builtin/async/init.lua10
-rw-r--r--builtin/client/chatcommands.lua9
-rw-r--r--builtin/client/death_formspec.lua1
-rw-r--r--builtin/client/init.lua1
-rw-r--r--builtin/common/after.lua9
-rw-r--r--builtin/common/chatcommands.lua142
-rw-r--r--builtin/common/information_formspecs.lua60
-rw-r--r--builtin/common/misc_helpers.lua46
-rw-r--r--builtin/common/tests/misc_helpers_spec.lua5
-rw-r--r--builtin/common/tests/serialize_spec.lua13
-rw-r--r--builtin/common/tests/vector_spec.lua303
-rw-r--r--builtin/common/vector.lua250
-rw-r--r--builtin/fstk/tabview.lua50
-rw-r--r--builtin/fstk/ui.lua2
-rw-r--r--builtin/game/auth.lua7
-rw-r--r--builtin/game/chat.lua853
-rw-r--r--builtin/game/falling.lua93
-rw-r--r--builtin/game/features.lua3
-rw-r--r--builtin/game/forceloading.lua9
-rw-r--r--builtin/game/init.lua2
-rw-r--r--builtin/game/item.lua164
-rw-r--r--builtin/game/misc.lua86
-rw-r--r--builtin/game/privileges.lua47
-rw-r--r--builtin/game/register.lua12
-rw-r--r--builtin/game/voxelarea.lua14
-rw-r--r--builtin/init.lua1
-rw-r--r--builtin/locale/__builtin.de.tr245
-rw-r--r--builtin/locale/__builtin.it.tr258
-rw-r--r--builtin/locale/template.txt245
-rw-r--r--builtin/mainmenu/common.lua134
-rw-r--r--builtin/mainmenu/dlg_contentstore.lua135
-rw-r--r--builtin/mainmenu/dlg_create_world.lua266
-rw-r--r--builtin/mainmenu/dlg_settings_advanced.lua6
-rw-r--r--builtin/mainmenu/game_theme.lua (renamed from builtin/mainmenu/textures.lua)98
-rw-r--r--builtin/mainmenu/init.lua12
-rw-r--r--builtin/mainmenu/pkgmgr.lua88
-rw-r--r--builtin/mainmenu/tab_about.lua (renamed from builtin/mainmenu/tab_credits.lua)61
-rw-r--r--builtin/mainmenu/tab_content.lua15
-rw-r--r--builtin/mainmenu/tab_local.lua180
-rw-r--r--builtin/mainmenu/tab_online.lua456
-rw-r--r--builtin/mainmenu/tab_settings.lua64
-rw-r--r--builtin/mainmenu/tests/serverlistmgr_spec.lua1
-rw-r--r--builtin/profiler/init.lua18
-rw-r--r--builtin/profiler/instrumentation.lua5
-rw-r--r--builtin/profiler/reporter.lua19
-rw-r--r--builtin/settingtypes.txt170
-rw-r--r--client/shaders/3d_interlaced_merge/opengl_fragment.glsl2
-rw-r--r--client/shaders/3d_interlaced_merge/opengl_vertex.glsl2
-rw-r--r--client/shaders/default_shader/opengl_vertex.glsl4
-rw-r--r--client/shaders/minimap_shader/opengl_vertex.glsl4
-rw-r--r--client/shaders/nodes_shader/opengl_fragment.glsl463
-rw-r--r--client/shaders/nodes_shader/opengl_vertex.glsl67
-rw-r--r--client/shaders/object_shader/opengl_fragment.glsl310
-rw-r--r--client/shaders/object_shader/opengl_vertex.glsl50
-rw-r--r--client/shaders/selection_shader/opengl_vertex.glsl4
-rw-r--r--client/shaders/shadow_shaders/pass1_fragment.glsl13
-rw-r--r--client/shaders/shadow_shaders/pass1_trans_fragment.glsl42
-rw-r--r--client/shaders/shadow_shaders/pass1_trans_vertex.glsl33
-rw-r--r--client/shaders/shadow_shaders/pass1_vertex.glsl26
-rw-r--r--client/shaders/shadow_shaders/pass2_fragment.glsl23
-rw-r--r--client/shaders/shadow_shaders/pass2_vertex.glsl9
-rw-r--r--clientmods/preview/mod.conf1
-rw-r--r--cmake/Modules/FindGMP.cmake2
-rw-r--r--cmake/Modules/FindGettextLib.cmake9
-rw-r--r--cmake/Modules/FindIrrlicht.cmake77
-rw-r--r--cmake/Modules/FindJson.cmake23
-rw-r--r--cmake/Modules/FindLuaJIT.cmake17
-rw-r--r--cmake/Modules/FindOpenGLES2.cmake3
-rw-r--r--cmake/Modules/FindZstd.cmake25
-rw-r--r--cmake/Modules/MinetestFindIrrlichtHeaders.cmake26
-rw-r--r--doc/Doxyfile.in1
-rw-r--r--doc/client_lua_api.txt23
-rw-r--r--doc/direction.md69
-rw-r--r--doc/lua_api.txt776
-rw-r--r--doc/menu_lua_api.txt17
-rw-r--r--doc/minetest.67
-rw-r--r--doc/texture_packs.txt3
-rw-r--r--doc/world_format.txt91
-rw-r--r--fonts/mono_dejavu_sans_10.xmlbin257014 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_100.pngbin56121 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_11.xmlbin263644 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_110.pngbin67613 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_12.xmlbin268932 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_120.pngbin73938 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_14.xmlbin269188 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_140.pngbin89073 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_16.xmlbin275642 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_160.pngbin101939 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_18.xmlbin279962 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_180.pngbin122274 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_20.xmlbin282588 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_200.pngbin138662 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_22.xmlbin283950 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_220.pngbin152844 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_24.xmlbin286626 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_240.pngbin170247 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_26.xmlbin289710 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_260.pngbin190156 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_28.xmlbin292596 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_280.pngbin200848 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_4.xmlbin237740 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_40.pngbin15668 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_6.xmlbin245472 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_60.pngbin29291 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_8.xmlbin251876 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_80.pngbin45552 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_9.xmlbin254016 -> 0 bytes-rw-r--r--fonts/mono_dejavu_sans_90.pngbin50995 -> 0 bytes-rw-r--r--games/devtest/menu/background.pngbin152 -> 160 bytes-rw-r--r--games/devtest/mods/basetools/init.lua44
-rw-r--r--games/devtest/mods/basetools/textures/basetools_dirtpick.pngbin307 -> 0 bytes-rw-r--r--games/devtest/mods/broken/init.lua11
-rw-r--r--games/devtest/mods/broken/mod.conf2
-rw-r--r--games/devtest/mods/experimental/commands.lua10
-rw-r--r--games/devtest/mods/testformspec/formspec.lua100
-rw-r--r--games/devtest/mods/testhud/init.lua81
-rw-r--r--games/devtest/mods/testhud/mod.conf2
-rw-r--r--games/devtest/mods/testnodes/drawtypes.lua130
-rw-r--r--games/devtest/mods/testnodes/liquids.lua55
-rw-r--r--games/devtest/mods/testnodes/properties.lua108
-rw-r--r--games/devtest/mods/testnodes/settingtypes.txt4
-rw-r--r--games/devtest/mods/testnodes/textures.lua106
-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_climbable_resistance_side.pngbin0 -> 295 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_move_resistance.pngbin0 -> 221 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.pngbin0 -> 224 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.pngbin0 -> 268 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.pngbin0 -> 268 bytes-rw-r--r--games/devtest/mods/testtools/README.md21
-rw-r--r--games/devtest/mods/testtools/init.lua196
-rw-r--r--games/devtest/mods/testtools/light.lua31
-rw-r--r--games/devtest/mods/testtools/textures/testtools_children_getter.pngbin0 -> 281 bytes-rw-r--r--games/devtest/mods/testtools/textures/testtools_node_meta_editor.pngbin0 -> 135 bytes-rw-r--r--games/devtest/mods/unittests/crafting.lua18
-rw-r--r--games/devtest/mods/unittests/init.lua199
-rw-r--r--games/devtest/mods/unittests/itemdescription.lua3
-rw-r--r--games/devtest/mods/unittests/misc.lua38
-rw-r--r--games/devtest/mods/unittests/player.lua46
-rw-r--r--games/devtest/mods/unittests/random.lua10
-rw-r--r--games/devtest/mods/util_commands/init.lua53
-rw-r--r--games/devtest/settingtypes.txt5
-rw-r--r--lib/bitop/CMakeLists.txt4
-rw-r--r--lib/bitop/bit.c189
-rw-r--r--lib/bitop/bit.h34
-rw-r--r--minetest.conf.example177
-rw-r--r--misc/Info.plist6
-rw-r--r--misc/debpkg-control11
-rw-r--r--misc/net.minetest.minetest.appdata.xml2
-rw-r--r--po/ar/minetest.po1097
-rw-r--r--po/be/minetest.po854
-rw-r--r--po/bg/minetest.po1450
-rw-r--r--po/ca/minetest.po784
-rw-r--r--po/cs/minetest.po1799
-rw-r--r--po/da/minetest.po834
-rw-r--r--po/de/minetest.po1009
-rw-r--r--po/dv/minetest.po717
-rw-r--r--po/el/minetest.po801
-rw-r--r--po/eo/minetest.po1122
-rw-r--r--po/es/minetest.po999
-rw-r--r--po/et/minetest.po868
-rw-r--r--po/eu/minetest.po729
-rw-r--r--po/fi/minetest.po1027
-rw-r--r--po/fil/minetest.po6638
-rw-r--r--po/fr/minetest.po2706
-rw-r--r--po/gd/minetest.po734
-rw-r--r--po/gl/minetest.po687
-rw-r--r--po/he/minetest.po844
-rw-r--r--po/hi/minetest.po754
-rw-r--r--po/hu/minetest.po1987
-rw-r--r--po/id/minetest.po950
-rw-r--r--po/it/minetest.po958
-rw-r--r--po/ja/minetest.po1135
-rw-r--r--po/jbo/minetest.po733
-rw-r--r--po/kk/minetest.po694
-rw-r--r--po/kn/minetest.po692
-rw-r--r--po/ko/minetest.po819
-rw-r--r--po/ky/minetest.po747
-rw-r--r--po/lt/minetest.po775
-rw-r--r--po/lv/minetest.po753
-rw-r--r--po/lzh/minetest.po6641
-rw-r--r--po/minetest.pot683
-rw-r--r--po/mr/minetest.po6649
-rw-r--r--po/ms/minetest.po1079
-rw-r--r--po/ms_Arab/minetest.po844
-rw-r--r--po/nb/minetest.po884
-rw-r--r--po/nl/minetest.po1052
-rw-r--r--po/nn/minetest.po761
-rw-r--r--po/pl/minetest.po1381
-rw-r--r--po/pt/minetest.po1318
-rw-r--r--po/pt_BR/minetest.po1045
-rw-r--r--po/ro/minetest.po885
-rw-r--r--po/ru/minetest.po1218
-rw-r--r--po/sk/minetest.po966
-rw-r--r--po/sl/minetest.po767
-rw-r--r--po/sr_Cyrl/minetest.po975
-rw-r--r--po/sr_Latn/minetest.po692
-rw-r--r--po/sv/minetest.po1818
-rw-r--r--po/sw/minetest.po848
-rw-r--r--po/th/minetest.po821
-rw-r--r--po/tr/minetest.po998
-rw-r--r--po/tt/minetest.po6645
-rw-r--r--po/uk/minetest.po1510
-rw-r--r--po/vi/minetest.po1254
-rw-r--r--po/yue/minetest.po6638
-rw-r--r--po/zh_CN/minetest.po969
-rw-r--r--po/zh_TW/minetest.po1137
-rw-r--r--src/CMakeLists.txt234
-rw-r--r--src/chat.cpp151
-rw-r--r--src/chat.h22
-rw-r--r--src/client/CMakeLists.txt4
-rw-r--r--src/client/camera.cpp90
-rw-r--r--src/client/camera.h12
-rw-r--r--src/client/client.cpp243
-rw-r--r--src/client/client.h30
-rw-r--r--src/client/clientenvironment.cpp65
-rw-r--r--src/client/clientevent.h55
-rw-r--r--src/client/clientlauncher.cpp92
-rw-r--r--src/client/clientlauncher.h2
-rw-r--r--src/client/clientmap.cpp383
-rw-r--r--src/client/clientmap.h42
-rw-r--r--src/client/clientmedia.cpp260
-rw-r--r--src/client/clientmedia.h166
-rw-r--r--src/client/clientobject.h2
-rw-r--r--src/client/clouds.cpp4
-rw-r--r--src/client/clouds.h5
-rw-r--r--src/client/content_cao.cpp147
-rw-r--r--src/client/content_cao.h4
-rw-r--r--src/client/content_mapblock.cpp80
-rw-r--r--src/client/content_mapblock.h7
-rw-r--r--src/client/fontengine.cpp284
-rw-r--r--src/client/fontengine.h22
-rw-r--r--src/client/game.cpp891
-rw-r--r--src/client/game.h6
-rw-r--r--src/client/gameui.cpp68
-rw-r--r--src/client/gameui.h9
-rw-r--r--src/client/guiscalingfilter.cpp7
-rw-r--r--src/client/hud.cpp173
-rw-r--r--src/client/hud.h26
-rw-r--r--src/client/imagefilters.cpp113
-rw-r--r--src/client/imagefilters.h6
-rw-r--r--src/client/inputhandler.cpp47
-rw-r--r--src/client/inputhandler.h95
-rw-r--r--src/client/joystick_controller.cpp80
-rw-r--r--src/client/joystick_controller.h5
-rw-r--r--src/client/keycode.cpp2
-rw-r--r--src/client/keys.h3
-rw-r--r--src/client/localplayer.cpp50
-rw-r--r--src/client/localplayer.h6
-rw-r--r--src/client/mapblock_mesh.cpp24
-rw-r--r--src/client/mesh.cpp597
-rw-r--r--src/client/mesh.h7
-rw-r--r--src/client/mesh_generator_thread.cpp53
-rw-r--r--src/client/mesh_generator_thread.h5
-rw-r--r--src/client/minimap.cpp5
-rw-r--r--src/client/particles.cpp4
-rw-r--r--src/client/render/anaglyph.cpp3
-rw-r--r--src/client/render/core.cpp19
-rw-r--r--src/client/render/core.h5
-rw-r--r--src/client/render/interlaced.cpp4
-rw-r--r--src/client/renderingengine.cpp168
-rw-r--r--src/client/renderingengine.h100
-rw-r--r--src/client/shader.cpp84
-rw-r--r--src/client/shader.h5
-rw-r--r--src/client/shadows/dynamicshadows.cpp165
-rw-r--r--src/client/shadows/dynamicshadows.h109
-rw-r--r--src/client/shadows/dynamicshadowsrender.cpp630
-rw-r--r--src/client/shadows/dynamicshadowsrender.h147
-rw-r--r--src/client/shadows/shadowsScreenQuad.cpp61
-rw-r--r--src/client/shadows/shadowsScreenQuad.h54
-rw-r--r--src/client/shadows/shadowsshadercallbacks.cpp (renamed from src/unittest/test_player.cpp)29
-rw-r--r--src/client/shadows/shadowsshadercallbacks.h48
-rw-r--r--src/client/sky.cpp224
-rw-r--r--src/client/sky.h18
-rw-r--r--src/client/sound_openal.cpp12
-rw-r--r--src/client/tile.cpp231
-rw-r--r--src/client/tile.h3
-rw-r--r--src/client/wieldmesh.cpp79
-rw-r--r--src/client/wieldmesh.h3
-rw-r--r--src/clientiface.cpp25
-rw-r--r--src/clientiface.h2
-rw-r--r--src/cmake_config.h.in1
-rw-r--r--src/constants.h3
-rw-r--r--src/content/mods.cpp146
-rw-r--r--src/content/mods.h15
-rw-r--r--src/content/subgames.cpp32
-rw-r--r--src/content/subgames.h2
-rw-r--r--src/convert_json.cpp54
-rw-r--r--src/convert_json.h4
-rw-r--r--src/database/database-dummy.cpp38
-rw-r--r--src/database/database-dummy.h9
-rw-r--r--src/database/database-files.cpp125
-rw-r--r--src/database/database-files.h26
-rw-r--r--src/database/database-leveldb.cpp16
-rw-r--r--src/database/database-postgresql.cpp41
-rw-r--r--src/database/database-postgresql.h2
-rw-r--r--src/database/database-redis.cpp6
-rw-r--r--src/database/database-sqlite3.cpp135
-rw-r--r--src/database/database-sqlite3.h25
-rw-r--r--src/database/database.h13
-rw-r--r--src/defaultsettings.cpp60
-rw-r--r--src/emerge.cpp90
-rw-r--r--src/emerge.h18
-rw-r--r--src/environment.cpp6
-rw-r--r--src/filesys.cpp139
-rw-r--r--src/filesys.h20
-rw-r--r--src/gamedef.h3
-rw-r--r--src/gettext.cpp4
-rw-r--r--src/gettext.h50
-rw-r--r--src/gui/CMakeLists.txt7
-rw-r--r--src/gui/guiButton.cpp86
-rw-r--r--src/gui/guiButton.h43
-rw-r--r--src/gui/guiChatConsole.cpp131
-rw-r--r--src/gui/guiChatConsole.h10
-rw-r--r--src/gui/guiConfirmRegistration.cpp19
-rw-r--r--src/gui/guiEditBox.cpp169
-rw-r--r--src/gui/guiEditBox.h9
-rw-r--r--src/gui/guiEditBoxWithScrollbar.cpp35
-rw-r--r--src/gui/guiEditBoxWithScrollbar.h6
-rw-r--r--src/gui/guiEngine.cpp79
-rw-r--r--src/gui/guiEngine.h7
-rw-r--r--src/gui/guiFormSpecMenu.cpp2305
-rw-r--r--src/gui/guiFormSpecMenu.h13
-rw-r--r--src/gui/guiHyperText.cpp23
-rw-r--r--src/gui/guiHyperText.h11
-rw-r--r--src/gui/guiKeyChangeMenu.cpp72
-rw-r--r--src/gui/guiPasswordChange.cpp8
-rw-r--r--src/gui/guiScene.cpp16
-rw-r--r--src/gui/guiScene.h1
-rw-r--r--src/gui/guiSkin.cpp42
-rw-r--r--src/gui/guiSkin.h10
-rw-r--r--src/gui/guiTable.cpp5
-rw-r--r--src/gui/guiVolumeChange.cpp15
-rw-r--r--src/gui/intlGUIEditBox.cpp626
-rw-r--r--src/gui/intlGUIEditBox.h68
-rw-r--r--src/gui/modalMenu.cpp13
-rw-r--r--src/gui/modalMenu.h4
-rw-r--r--src/gui/profilergraph.cpp15
-rw-r--r--src/gui/touchscreengui.cpp47
-rw-r--r--src/gui/touchscreengui.h14
-rw-r--r--src/httpfetch.cpp80
-rw-r--r--src/httpfetch.h27
-rw-r--r--src/hud.cpp1
-rw-r--r--src/hud.h6
-rw-r--r--src/inventory.cpp23
-rw-r--r--src/inventory.h4
-rw-r--r--src/inventorymanager.cpp16
-rw-r--r--src/irrlicht_changes/CGUITTFont.cpp117
-rw-r--r--src/irrlicht_changes/CGUITTFont.h12
-rw-r--r--src/irrlicht_changes/CMakeLists.txt7
-rw-r--r--src/irrlicht_changes/irrUString.h3891
-rw-r--r--src/irrlicht_changes/static_text.cpp74
-rw-r--r--src/irrlicht_changes/static_text.h49
-rw-r--r--src/irrlichttypes.h26
-rw-r--r--src/itemdef.cpp14
-rw-r--r--src/itemdef.h1
-rw-r--r--src/itemstackmetadata.cpp2
-rw-r--r--src/main.cpp111
-rw-r--r--src/map.cpp23
-rw-r--r--src/map.h5
-rw-r--r--src/map_settings_manager.cpp40
-rw-r--r--src/map_settings_manager.h6
-rw-r--r--src/mapblock.cpp191
-rw-r--r--src/mapblock.h20
-rw-r--r--src/mapgen/mapgen.cpp11
-rw-r--r--src/mapgen/mapgen_v6.cpp13
-rw-r--r--src/mapgen/mapgen_v6.h4
-rw-r--r--src/mapgen/mapgen_valleys.cpp3
-rw-r--r--src/mapgen/mg_biome.cpp90
-rw-r--r--src/mapgen/mg_biome.h27
-rw-r--r--src/mapgen/mg_ore.h12
-rw-r--r--src/mapgen/mg_schematic.cpp143
-rw-r--r--src/mapgen/mg_schematic.h17
-rw-r--r--src/mapnode.cpp58
-rw-r--r--src/mapnode.h8
-rw-r--r--src/network/address.cpp119
-rw-r--r--src/network/address.h35
-rw-r--r--src/network/clientopcodes.cpp2
-rw-r--r--src/network/clientpackethandler.cpp250
-rw-r--r--src/network/connection.cpp477
-rw-r--r--src/network/connection.h446
-rw-r--r--src/network/connectionthreads.cpp190
-rw-r--r--src/network/connectionthreads.h31
-rw-r--r--src/network/networkpacket.h2
-rw-r--r--src/network/networkprotocol.h17
-rw-r--r--src/network/serveropcodes.cpp4
-rw-r--r--src/network/serverpackethandler.cpp128
-rw-r--r--src/network/socket.cpp74
-rw-r--r--src/network/socket.h14
-rw-r--r--src/nodedef.cpp82
-rw-r--r--src/nodedef.h43
-rw-r--r--src/nodemetadata.cpp6
-rw-r--r--src/nodemetadata.h2
-rw-r--r--src/noise.cpp51
-rw-r--r--src/noise.h15
-rw-r--r--src/object_properties.cpp36
-rw-r--r--src/object_properties.h2
-rw-r--r--src/player.cpp59
-rw-r--r--src/player.h52
-rw-r--r--src/porting.cpp13
-rw-r--r--src/porting.h6
-rw-r--r--src/remoteplayer.cpp30
-rw-r--r--src/remoteplayer.h3
-rw-r--r--src/rollback.cpp6
-rw-r--r--src/rollback.h1
-rw-r--r--src/script/common/c_content.cpp83
-rw-r--r--src/script/common/c_content.h14
-rw-r--r--src/script/common/c_converter.cpp30
-rw-r--r--src/script/common/c_internal.cpp84
-rw-r--r--src/script/common/c_internal.h18
-rw-r--r--src/script/cpp_api/s_async.cpp108
-rw-r--r--src/script/cpp_api/s_async.h39
-rw-r--r--src/script/cpp_api/s_base.cpp11
-rw-r--r--src/script/cpp_api/s_base.h17
-rw-r--r--src/script/cpp_api/s_client.cpp88
-rw-r--r--src/script/cpp_api/s_entity.cpp2
-rw-r--r--src/script/cpp_api/s_entity.h2
-rw-r--r--src/script/cpp_api/s_env.cpp63
-rw-r--r--src/script/cpp_api/s_env.h5
-rw-r--r--src/script/cpp_api/s_item.cpp36
-rw-r--r--src/script/cpp_api/s_item.h14
-rw-r--r--src/script/cpp_api/s_mainmenu.h2
-rw-r--r--src/script/cpp_api/s_node.cpp1
-rw-r--r--src/script/cpp_api/s_node.h1
-rw-r--r--src/script/cpp_api/s_nodemeta.cpp18
-rw-r--r--src/script/cpp_api/s_player.cpp2
-rw-r--r--src/script/cpp_api/s_player.h2
-rw-r--r--src/script/cpp_api/s_security.cpp131
-rw-r--r--src/script/cpp_api/s_security.h15
-rw-r--r--src/script/cpp_api/s_server.cpp64
-rw-r--r--src/script/cpp_api/s_server.h6
-rw-r--r--src/script/lua_api/l_areastore.cpp2
-rw-r--r--src/script/lua_api/l_auth.cpp5
-rw-r--r--src/script/lua_api/l_camera.cpp2
-rw-r--r--src/script/lua_api/l_env.cpp65
-rw-r--r--src/script/lua_api/l_env.h22
-rw-r--r--src/script/lua_api/l_http.cpp66
-rw-r--r--src/script/lua_api/l_http.h3
-rw-r--r--src/script/lua_api/l_inventory.cpp15
-rw-r--r--src/script/lua_api/l_inventory.h2
-rw-r--r--src/script/lua_api/l_item.cpp2
-rw-r--r--src/script/lua_api/l_itemstackmeta.cpp2
-rw-r--r--src/script/lua_api/l_localplayer.cpp36
-rw-r--r--src/script/lua_api/l_localplayer.h3
-rw-r--r--src/script/lua_api/l_mainmenu.cpp247
-rw-r--r--src/script/lua_api/l_mainmenu.h4
-rw-r--r--src/script/lua_api/l_mapgen.cpp125
-rw-r--r--src/script/lua_api/l_metadata.cpp5
-rw-r--r--src/script/lua_api/l_minimap.cpp2
-rw-r--r--src/script/lua_api/l_modchannels.cpp2
-rw-r--r--src/script/lua_api/l_nodemeta.cpp9
-rw-r--r--src/script/lua_api/l_nodetimer.cpp2
-rw-r--r--src/script/lua_api/l_noise.cpp10
-rw-r--r--src/script/lua_api/l_object.cpp207
-rw-r--r--src/script/lua_api/l_playermeta.cpp2
-rw-r--r--src/script/lua_api/l_server.cpp102
-rw-r--r--src/script/lua_api/l_server.h15
-rw-r--r--src/script/lua_api/l_settings.cpp80
-rw-r--r--src/script/lua_api/l_storage.cpp20
-rw-r--r--src/script/lua_api/l_util.cpp209
-rw-r--r--src/script/lua_api/l_util.h28
-rw-r--r--src/script/lua_api/l_vmanip.cpp2
-rw-r--r--src/script/scripting_mainmenu.cpp6
-rw-r--r--src/script/scripting_mainmenu.h5
-rw-r--r--src/serialization.cpp160
-rw-r--r--src/serialization.h14
-rw-r--r--src/server.cpp472
-rw-r--r--src/server.h43
-rw-r--r--src/server/luaentity_sao.cpp13
-rw-r--r--src/server/luaentity_sao.h5
-rw-r--r--src/server/mods.cpp8
-rw-r--r--src/server/player_sao.cpp45
-rw-r--r--src/server/player_sao.h10
-rw-r--r--src/server/serveractiveobject.h7
-rw-r--r--src/server/serverinventorymgr.cpp32
-rw-r--r--src/server/unit_sao.cpp31
-rw-r--r--src/serverenvironment.cpp23
-rw-r--r--src/serverenvironment.h15
-rw-r--r--src/serverlist.cpp1
-rw-r--r--src/settings.cpp133
-rw-r--r--src/settings.h52
-rw-r--r--src/settings_translation_file.cpp119
-rw-r--r--src/skyparams.h45
-rw-r--r--src/staticobject.cpp24
-rw-r--r--src/tool.cpp106
-rw-r--r--src/tool.h20
-rw-r--r--src/translation.cpp8
-rw-r--r--src/unittest/CMakeLists.txt5
-rw-r--r--src/unittest/test.cpp6
-rw-r--r--src/unittest/test_areastore.cpp4
-rw-r--r--src/unittest/test_clientactiveobjectmgr.cpp1
-rw-r--r--src/unittest/test_compression.cpp42
-rw-r--r--src/unittest/test_config.h.in1
-rw-r--r--src/unittest/test_connection.cpp10
-rw-r--r--src/unittest/test_gettext.cpp43
-rw-r--r--src/unittest/test_irrptr.cpp10
-rw-r--r--src/unittest/test_map.cpp68
-rw-r--r--src/unittest/test_map_settings_manager.cpp5
-rw-r--r--src/unittest/test_mod/test_mod/init.lua1
-rw-r--r--src/unittest/test_mod/test_mod/mod.conf2
-rw-r--r--src/unittest/test_modmetadatadatabase.cpp253
-rw-r--r--src/unittest/test_noderesolver.cpp2
-rw-r--r--src/unittest/test_schematic.cpp40
-rw-r--r--src/unittest/test_servermodmanager.cpp21
-rw-r--r--src/unittest/test_socket.cpp18
-rw-r--r--src/unittest/test_utilities.cpp99
-rw-r--r--src/unittest/test_voxelarea.cpp18
-rw-r--r--src/util/CMakeLists.txt1
-rw-r--r--src/util/Optional.h32
-rw-r--r--src/util/base64.cpp29
-rw-r--r--src/util/numeric.cpp19
-rw-r--r--src/util/numeric.h4
-rwxr-xr-xsrc/util/png.cpp68
-rwxr-xr-x[-rw-r--r--]src/util/png.h (renamed from src/cloudparams.h)17
-rw-r--r--src/util/pointer.h58
-rw-r--r--src/util/serialize.cpp5
-rw-r--r--src/util/string.cpp450
-rw-r--r--src/util/string.h43
-rw-r--r--src/version.cpp1
-rw-r--r--textures/base/pack/aux1_btn.pngbin0 -> 1652 bytes-rw-r--r--textures/base/pack/aux_btn.pngbin1900 -> 0 bytes-rw-r--r--textures/base/pack/no_texture.pngbin0 -> 281 bytes-rw-r--r--textures/base/pack/server_favorite.png (renamed from textures/base/pack/server_flags_favorite.png)bin916 -> 916 bytes-rw-r--r--textures/base/pack/server_incompatible.pngbin0 -> 385 bytes-rw-r--r--textures/base/pack/server_public.pngbin0 -> 492 bytes-rwxr-xr-xutil/buildbot/buildwin32.sh182
-rwxr-xr-xutil/buildbot/buildwin64.sh184
-rw-r--r--util/buildbot/toolchain_i686-w64-mingw32-posix.cmake (renamed from util/buildbot/toolchain_i586-mingw32msvc.cmake)10
-rw-r--r--util/buildbot/toolchain_i686-w64-mingw32.cmake (renamed from util/buildbot/toolchain_i646-w64-mingw32.cmake)0
-rw-r--r--util/buildbot/toolchain_x86_64-w64-mingw32-posix.cmake19
-rw-r--r--util/ci/clang-format-whitelist.txt2
-rwxr-xr-xutil/ci/clang-format.sh (renamed from util/ci/lint.sh)25
-rw-r--r--util/ci/common.sh16
-rwxr-xr-xutil/fix_format.sh5
-rwxr-xr-xutil/test_multiplayer.sh105
-rwxr-xr-xutil/updatepo.sh5
-rw-r--r--util/wireshark/minetest.lua4
563 files changed, 89270 insertions, 32675 deletions
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 000000000..bda43ebc0
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,4 @@
+./cmake-build-*
+./build/*
+./cache/*
+Dockerfile
diff --git a/.editorconfig b/.editorconfig
new file mode 100755
index 000000000..ec0645241
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,9 @@
+[*]
+end_of_line = lf
+
+[*.{cpp,h,lua,txt,glsl,md,c,cmake,java,gradle}]
+charset = utf8
+indent_size = 4
+indent_style = tab
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index b01a89509..f60f584f9 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -10,13 +10,31 @@ Contributions are welcome! Here's how you can help:
## Code
-1. [Fork](https://help.github.com/articles/fork-a-repo/) the repository and [clone](https://help.github.com/articles/cloning-a-repository/) your fork.
+1. [Fork](https://help.github.com/articles/fork-a-repo/) the repository and
+ [clone](https://help.github.com/articles/cloning-a-repository/) your fork.
-2. Before you start coding, consider opening an [issue at Github](https://github.com/minetest/minetest/issues) to discuss the suitability and implementation of your intended contribution with the core developers. If you are planning to start some very significant coding, you would benefit from first discussing on our IRC development channel [#minetest-dev](http://www.minetest.net/irc/). Note that a proper IRC client is required to speak on this channel.
+2. Before you start coding, consider opening an
+ [issue at Github](https://github.com/minetest/minetest/issues) to discuss the
+ suitability and implementation of your intended contribution with the core
+ developers.
+
+ Any Pull Request that isn't a bug fix and isn't covered by
+ [the roadmap](../doc/direction.md) will be closed within a week unless it
+ receives a concept approval from a Core Developer. For this reason, it is
+ recommended that you open an issue for any such pull requests before doing
+ the work, to avoid disappointment.
+
+ You may also benefit from discussing on our IRC development channel
+ [#minetest-dev](http://www.minetest.net/irc/). Note that a proper IRC client
+ is required to speak on this channel.
3. Start coding!
- - Refer to the [Lua API](https://github.com/minetest/minetest/blob/master/doc/lua_api.txt), [Developer Wiki](http://dev.minetest.net/Main_Page) and other [documentation](https://github.com/minetest/minetest/tree/master/doc).
- - Follow the [C/C++](http://dev.minetest.net/Code_style_guidelines) and [Lua](http://dev.minetest.net/Lua_code_style_guidelines) code style guidelines.
+ - Refer to the
+ [Lua API](https://github.com/minetest/minetest/blob/master/doc/lua_api.txt),
+ [Developer Wiki](http://dev.minetest.net/Main_Page) and other
+ [documentation](https://github.com/minetest/minetest/tree/master/doc).
+ - Follow the [C/C++](http://dev.minetest.net/Code_style_guidelines) and
+ [Lua](http://dev.minetest.net/Lua_code_style_guidelines) code style guidelines.
- Check your code works as expected and document any changes to the Lua API.
4. Commit & [push](https://help.github.com/articles/pushing-to-a-remote/) your changes to a new branch (not `master`, one change per branch)
@@ -33,67 +51,115 @@ Contributions are welcome! Here's how you can help:
5. Once you are happy with your changes, submit a pull request.
- Open the [pull-request form](https://github.com/minetest/minetest/pull/new/master).
- - Add a description explaining what you've done (or if it's a work-in-progress - what you need to do).
+ - Add a description explaining what you've done (or if it's a
+ work-in-progress - what you need to do).
+ - Make sure to fill out the pull request template.
### A pull-request is considered merge-able when:
-1. It follows the roadmap in some way and fits the whole picture of the project: [roadmap introduction](http://c55.me/blog/?p=1491), [roadmap continued](https://forum.minetest.net/viewtopic.php?t=9177)
+1. It follows [the roadmap](../doc/direction.md) in some way and fits the whole
+ picture of the project.
2. It works.
-3. It follows the code style for [C/C++](http://dev.minetest.net/Code_style_guidelines) or [Lua](http://dev.minetest.net/Lua_code_style_guidelines).
-4. The code's interfaces are well designed, regardless of other aspects that might need more work in the future.
+3. It follows the code style for
+ [C/C++](http://dev.minetest.net/Code_style_guidelines) or
+ [Lua](http://dev.minetest.net/Lua_code_style_guidelines).
+4. The code's interfaces are well designed, regardless of other aspects that
+ might need more work in the future.
5. It uses protocols and formats which include the required compatibility.
### Important note about automated GitHub checks
-When you submit a pull request, GitHub automatically runs checks on the Minetest Engine combined with your changes. One of these checks is called 'cpp lint / clang format', which checks code formatting. Because formatting for readability requires human judgement this check often fails and often makes unsuitable formatting requests which make code readability worse.
+When you submit a pull request, GitHub automatically runs checks on the Minetest
+Engine combined with your changes. One of these checks is called 'cpp lint /
+clang format', which checks code formatting. Because formatting for readability
+requires human judgement this check often fails and often makes unsuitable
+formatting requests which make code readability worse.
-If this check fails, look at the details to check for any clear mistakes and correct those. However, you should not apply everything ClangFormat requests. Ignore requests that make code readability worse and any other clearly unsuitable requests. Discuss in the pull request with a core developer about how to progress.
+If this check fails, look at the details to check for any clear mistakes and
+correct those. However, you should not apply everything ClangFormat requests.
+Ignore requests that make code readability worse and any other clearly
+unsuitable requests. Discuss in the pull request with a core developer about how
+to progress.
## Issues
-If you experience an issue, we would like to know the details - especially when a stable release is on the way.
+If you experience an issue, we would like to know the details - especially when
+a stable release is on the way.
1. Do a quick search on GitHub to check if the issue has already been reported.
-2. Is it an issue with the Minetest *engine*? If not, report it [elsewhere](http://www.minetest.net/development/#reporting-issues).
-3. [Open an issue](https://github.com/minetest/minetest/issues/new) and describe the issue you are having - you could include:
+2. Is it an issue with the Minetest *engine*? If not, report it
+ [elsewhere](http://www.minetest.net/development/#reporting-issues).
+3. [Open an issue](https://github.com/minetest/minetest/issues/new) and describe
+ the issue you are having - you could include:
- Error logs (check the bottom of the `debug.txt` file).
- Screenshots.
- Ways you have tried to solve the issue, and whether they worked or not.
- Your Minetest version and the content (games, mods or texture packs) you have installed.
- Your platform (e.g. Windows 10 or Ubuntu 15.04 x64).
-After reporting you should aim to answer questions or clarifications as this helps pinpoint the cause of the issue (if you don't do this your issue may be closed after 1 month).
+After reporting you should aim to answer questions or clarifications as this
+helps pinpoint the cause of the issue (if you don't do this your issue may be
+closed after 1 month).
## Feature requests
-Feature requests are welcome but take a moment to see if your idea follows the roadmap in some way and fits the whole picture of the project: [roadmap introduction](http://c55.me/blog/?p=1491), [roadmap continued](https://forum.minetest.net/viewtopic.php?t=9177). You should provide a clear explanation with as much detail as possible.
+Feature requests are welcome but take a moment to see if your idea follows
+[the roadmap](../doc/direction.md) in some way and fits the whole picture of
+the project. You should provide a clear explanation with as much detail as
+possible.
## Translations
-Translations of Minetest are performed using Weblate. You can access the project page with a list of current languages [here](https://hosted.weblate.org/projects/minetest/minetest/).
+The core translations of Minetest are performed using Weblate. You can access
+the project page with a list of current languages
+[here](https://hosted.weblate.org/projects/minetest/minetest/).
+
+Builtin (the component which contains things like server messages, chat command
+descriptions, privilege descriptions) is translated separately; it needs to be
+translated by editing a `.tr` text file. See
+[Translation](https://dev.minetest.net/Translation) for more information.
## Donations
-If you'd like to monetarily support Minetest development, you can find donation methods on [our website](http://www.minetest.net/development/#donate).
+If you'd like to monetarily support Minetest development, you can find donation
+methods on [our website](http://www.minetest.net/development/#donate).
# Maintaining
-*This is a concise version of the [Rules & Guidelines](http://dev.minetest.net/Category:Rules_and_Guidelines) on the developer wiki.*
+* This is a concise version of the
+ [Rules & Guidelines](http://dev.minetest.net/Category:Rules_and_Guidelines) on the developer wiki.*
These notes are for those who have push access Minetest (core developers / maintainers).
- See the [project organisation](http://dev.minetest.net/Organisation) for the people involved.
+## Concept approvals and roadmaps
+
+If a Pull Request is not a bug fix:
+
+* If it matches a goal in [the roadmap](../doc/direction.md), then the PR should
+ be labelled as "Roadmap" and the goal stated by number in the description.
+* If it doesn't match a goal, then it needs to receive a concept approval within
+ a week of being opened to remain open. This 1 week deadline does not apply to
+ PRs opened before the roadmap was adopted; instead, they may remain open or be
+ closed as needed. Use the "Concept Approved" label. Issues can be marked as
+ "Concept Approved" to give preapproval to future PRs.
+
## Reviewing pull requests
-Pull requests should be reviewed and, if appropriate, checked if they achieve their intended purpose. You can show that you are in the process of, or will review the pull request by commenting *"Looks good"* or something similar.
+Pull requests should be reviewed and, if appropriate, checked if they achieve
+their intended purpose. You can show that you are in the process of, or will
+review the pull request by commenting *"Looks good"* or something similar.
**If the pull-request is not [merge-able](#a-pull-request-is-considered-merge-able-when):**
-Submit a comment explaining to the author what they need to change to make the pull-request merge-able.
+Submit a comment explaining to the author what they need to change to make the
+pull-request merge-able.
-- If the author comments or makes changes to the pull-request, it can be reviewed again.
-- If no response is made from the author within 1 month (when improvements are suggested or a question is asked), it can be closed.
+- If the author comments or makes changes to the pull-request, it can be
+ reviewed again.
+- If no response is made from the author within 1 month (when improvements are
+ suggested or a question is asked), it can be closed.
**If the pull-request is [merge-able](#a-pull-request-is-considered-merge-able-when):**
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index ccec99bc5..4132826cd 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -3,6 +3,7 @@ Add compact, short information about your PR for easier understanding:
- Goal of the PR
- How does the PR work?
- Does it resolve any reported issue?
+- Does this relate to a goal in [the roadmap](../doc/direction.md)?
- If not a bug fix, why is this PR needed? What usecases does it solve?
## To do
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index 47ab64d11..cc5fe83ef 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -21,13 +21,13 @@ on:
jobs:
build:
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- - name: Set up JDK 1.8
- uses: actions/setup-java@v1
- with:
- java-version: 1.8
+ - name: Install deps
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y --no-install-recommends gettext openjdk-11-jdk-headless
- name: Build with Gradle
run: cd android; ./gradlew assemblerelease
- name: Save armeabi artifact
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index a3cc92a8e..79f9af5c7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -13,6 +13,8 @@ on:
- 'util/buildbot/**'
- 'util/ci/**'
- '.github/workflows/**.yml'
+ - 'Dockerfile'
+ - '.dockerignore'
pull_request:
paths:
- 'lib/**.[ch]'
@@ -24,51 +26,53 @@ on:
- 'util/buildbot/**'
- 'util/ci/**'
- '.github/workflows/**.yml'
+ - 'Dockerfile'
+ - '.dockerignore'
jobs:
- # This is our minor gcc compiler
- gcc_6:
+ # Older gcc version (should be close to our minimum supported version)
+ gcc_5:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- name: Install deps
run: |
source ./util/ci/common.sh
- install_linux_deps g++-6
+ install_linux_deps g++-5
- name: Build
run: |
./util/ci/build.sh
env:
- CC: gcc-6
- CXX: g++-6
+ CC: gcc-5
+ CXX: g++-5
- name: Test
run: |
./bin/minetest --run-unittests
- # This is the current gcc compiler (available in bionic)
- gcc_8:
- runs-on: ubuntu-18.04
+ # Current gcc version
+ gcc_10:
+ runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Install deps
run: |
source ./util/ci/common.sh
- install_linux_deps g++-8
+ install_linux_deps g++-10
- name: Build
run: |
./util/ci/build.sh
env:
- CC: gcc-8
- CXX: g++-8
+ CC: gcc-10
+ CXX: g++-10
- name: Test
run: |
./bin/minetest --run-unittests
- # This is our minor clang compiler
+ # Older clang version (should be close to our minimum supported version)
clang_3_9:
runs-on: ubuntu-18.04
steps:
@@ -76,7 +80,7 @@ jobs:
- name: Install deps
run: |
source ./util/ci/common.sh
- install_linux_deps clang-3.9
+ install_linux_deps clang-3.9 gdb
- name: Build
run: |
@@ -85,26 +89,30 @@ jobs:
CC: clang-3.9
CXX: clang++-3.9
- - name: Test
+ - name: Unittest
run: |
./bin/minetest --run-unittests
- # This is the current clang version
- clang_9:
- runs-on: ubuntu-18.04
+ - name: Integration test + devtest
+ run: |
+ ./util/test_multiplayer.sh
+
+ # Current clang version
+ clang_10:
+ runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Install deps
run: |
source ./util/ci/common.sh
- install_linux_deps clang-9 valgrind libluajit-5.1-dev
+ install_linux_deps clang-10 valgrind libluajit-5.1-dev
- name: Build
run: |
./util/ci/build.sh
env:
- CC: clang-9
- CXX: clang++-9
+ CC: clang-10
+ CXX: clang++-10
CMAKE_FLAGS: "-DREQUIRE_LUAJIT=1"
- name: Test
@@ -124,7 +132,7 @@ jobs:
- name: Install deps
run: |
source ./util/ci/common.sh
- install_linux_deps clang-9
+ install_linux_deps --old-irr clang-9
- name: Build prometheus-cpp
run: |
@@ -142,29 +150,6 @@ jobs:
run: |
./bin/minetestserver --run-unittests
- # Build without freetype (client-only)
- clang_9_no_freetype:
- name: "clang_9 (FREETYPE=0)"
- runs-on: ubuntu-18.04
- steps:
- - uses: actions/checkout@v2
- - name: Install deps
- run: |
- source ./util/ci/common.sh
- install_linux_deps clang-9
-
- - name: Build
- run: |
- ./util/ci/build.sh
- env:
- CC: clang-9
- CXX: clang++-9
- CMAKE_FLAGS: "-DENABLE_FREETYPE=0 -DBUILD_SERVER=0"
-
- - name: Test
- run: |
- ./bin/minetest --run-unittests
-
docker:
name: "Docker image"
runs-on: ubuntu-18.04
@@ -172,7 +157,8 @@ jobs:
- uses: actions/checkout@v2
- name: Build docker image
run: |
- docker build .
+ docker build . -t minetest:latest
+ docker run --rm minetest:latest /usr/local/bin/minetestserver --version
win32:
name: "MinGW cross-compiler (32-bit)"
@@ -212,11 +198,14 @@ jobs:
msvc:
name: VS 2019 ${{ matrix.config.arch }}-${{ matrix.type }}
- runs-on: windows-2019
+ runs-on: windows-2019
+ #### Disabled due to Irrlicht switch
+ if: false
+ #### Disabled due to Irrlicht switch
env:
VCPKG_VERSION: 0bf3923f9fab4001c00f0f429682a0853b5749e0
# 2020.11
- vcpkg_packages: irrlicht zlib curl[winssl] openal-soft libvorbis libogg sqlite3 freetype luajit
+ vcpkg_packages: irrlicht zlib zstd curl[winssl] openal-soft libvorbis libogg sqlite3 freetype luajit
strategy:
fail-fast: false
matrix:
diff --git a/.github/workflows/cpp_lint.yml b/.github/workflows/cpp_lint.yml
index 1f97d105a..2bd884c7a 100644
--- a/.github/workflows/cpp_lint.yml
+++ b/.github/workflows/cpp_lint.yml
@@ -24,20 +24,21 @@ on:
- '.github/workflows/**.yml'
jobs:
- clang_format:
- runs-on: ubuntu-18.04
- steps:
- - uses: actions/checkout@v2
- - name: Install clang-format
- run: |
- sudo apt-get install clang-format-9 -qyy
- - name: Run clang-format
- run: |
- source ./util/ci/lint.sh
- perform_lint
- env:
- CLANG_FORMAT: clang-format-9
+# clang_format:
+# runs-on: ubuntu-18.04
+# steps:
+# - uses: actions/checkout@v2
+# - name: Install clang-format
+# run: |
+# sudo apt-get install clang-format-9 -qyy
+#
+# - name: Run clang-format
+# run: |
+# source ./util/ci/clang-format.sh
+# check_format
+# env:
+# CLANG_FORMAT: clang-format-9
clang_tidy:
runs-on: ubuntu-18.04
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
new file mode 100644
index 000000000..69253b70a
--- /dev/null
+++ b/.github/workflows/macos.yml
@@ -0,0 +1,66 @@
+name: macos
+
+# build on c/cpp changes or workflow changes
+on:
+ push:
+ paths:
+ - 'lib/**.[ch]'
+ - 'lib/**.cpp'
+ - 'src/**.[ch]'
+ - 'src/**.cpp'
+ - '**/CMakeLists.txt'
+ - 'cmake/Modules/**'
+ - '.github/workflows/macos.yml'
+ pull_request:
+ paths:
+ - 'lib/**.[ch]'
+ - 'lib/**.cpp'
+ - 'src/**.[ch]'
+ - 'src/**.cpp'
+ - '**/CMakeLists.txt'
+ - 'cmake/Modules/**'
+ - '.github/workflows/macos.yml'
+
+env:
+ IRRLICHT_TAG: 1.9.0mt4
+ MINETEST_GAME_REPO: https://github.com/minetest/minetest_game.git
+ MINETEST_GAME_BRANCH: master
+ MINETEST_GAME_NAME: minetest_game
+
+jobs:
+ build:
+ runs-on: macos-10.15
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install deps
+ run: |
+ pkgs=(cmake freetype gettext gmp hiredis jpeg jsoncpp leveldb libogg libpng libvorbis luajit zstd)
+ brew update
+ brew install ${pkgs[@]}
+ brew unlink $(brew ls --formula)
+ brew link ${pkgs[@]}
+
+ - name: Build
+ run: |
+ git clone -b $MINETEST_GAME_BRANCH $MINETEST_GAME_REPO games/$MINETEST_GAME_NAME
+ rm -rvf games/$MINETEST_GAME_NAME/.git
+ git clone https://github.com/minetest/irrlicht -b $IRRLICHT_TAG lib/irrlichtmt
+ mkdir cmakebuild
+ cd cmakebuild
+ cmake .. \
+ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.14 \
+ -DCMAKE_FIND_FRAMEWORK=LAST \
+ -DCMAKE_INSTALL_PREFIX=../build/macos/ \
+ -DRUN_IN_PLACE=FALSE \
+ -DENABLE_FREETYPE=TRUE -DENABLE_GETTEXT=TRUE
+ make -j2
+ make install
+
+ - name: Test
+ run: |
+ ./build/macos/minetest.app/Contents/MacOS/minetest --run-unittests
+
+ - uses: actions/upload-artifact@v2
+ with:
+ name: minetest-macos
+ path: ./build/macos/
diff --git a/.gitignore b/.gitignore
index 31e938ce4..bb5e0a0cd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -87,8 +87,8 @@ src/test_config.h
src/cmake_config.h
src/cmake_config_githash.h
src/unittest/test_world/world.mt
-src/lua/build/
-locale/
+games/devtest/mods/testnodes/textures/testnodes_generated_*.png
+/locale/
.directory
*.cbp
*.layout
@@ -107,3 +107,13 @@ CMakeDoxy*
compile_commands.json
*.apk
*.zip
+# Visual Studio
+*.vcxproj*
+*.sln
+.vs/
+
+# Optional user provided library folder
+lib/irrlichtmt
+
+# Generated mod storage database
+client/mod_storage.sqlite
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0441aeaa1..5d2600364 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -9,16 +9,20 @@ stages:
- deploy
variables:
+ IRRLICHT_TAG: "1.9.0mt4"
MINETEST_GAME_REPO: "https://github.com/minetest/minetest_game.git"
CONTAINER_IMAGE: registry.gitlab.com/$CI_PROJECT_PATH
.build_template:
stage: build
+ before_script:
+ - apt-get update
+ - DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential git cmake libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libleveldb-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev libzstd-dev
script:
+ - git clone https://github.com/minetest/irrlicht -b $IRRLICHT_TAG lib/irrlichtmt
- 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 -DENABLE_SYSTEM_JSONCPP=TRUE -DBUILD_SERVER=TRUE ..
+ - 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:
@@ -30,7 +34,7 @@ variables:
.debpkg_template:
stage: package
before_script:
- - apt-get update -y
+ - apt-get update
- apt-get install -y git
- mkdir -p build/deb/minetest/DEBIAN/
- cp misc/debpkg-control build/deb/minetest/DEBIAN/control
@@ -39,7 +43,9 @@ variables:
- git clone $MINETEST_GAME_REPO build/deb/minetest/usr/share/minetest/games/minetest_game
- 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/JPEG_PLACEHOLDER/'$JPEG_PKG'/g' build/deb/minetest/DEBIAN/control
- sed -i 's/LEVELDB_PLACEHOLDER/'$LEVELDB_PKG'/g' build/deb/minetest/DEBIAN/control
+ - sed -i 's/JSONCPP_PLACEHOLDER/'$JSONCPP_PKG'/g' build/deb/minetest/DEBIAN/control
- cd build/deb/ && dpkg-deb -b minetest/ && mv minetest.deb ../../
artifacts:
expire_in: 90 day
@@ -49,7 +55,7 @@ variables:
.debpkg_install:
stage: deploy
before_script:
- - apt-get update -y
+ - apt-get update -qy
script:
- apt-get install -y ./*.deb
- minetest --version
@@ -63,9 +69,6 @@ variables:
build:debian-9:
extends: .build_template
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:
extends: .debpkg_template
@@ -73,7 +76,9 @@ package:debian-9:
needs:
- build:debian-9
variables:
+ JSONCPP_PKG: libjsoncpp1
LEVELDB_PKG: libleveldb1v5
+ JPEG_PKG: libjpeg62-turbo
deploy:debian-9:
extends: .debpkg_install
@@ -86,9 +91,6 @@ deploy:debian-9:
build:debian-10:
extends: .build_template
image: debian:10
- 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-10:
extends: .debpkg_template
@@ -96,7 +98,9 @@ package:debian-10:
needs:
- build:debian-10
variables:
+ JSONCPP_PKG: libjsoncpp1
LEVELDB_PKG: libleveldb1d
+ JPEG_PKG: libjpeg62-turbo
deploy:debian-10:
extends: .debpkg_install
@@ -104,41 +108,37 @@ deploy:debian-10:
needs:
- package:debian-10
-##
-## Ubuntu
-##
-
-# Xenial
+# Bullseye
-build:ubuntu-16.04:
- extends: .build_template
- 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
+build:debian-11:
+ extends: .build_template
+ image: debian:11
-package:ubuntu-16.04:
+package:debian-11:
extends: .debpkg_template
- image: ubuntu:xenial
+ image: debian:11
needs:
- - build:ubuntu-16.04
+ - build:debian-11
variables:
- LEVELDB_PKG: libleveldb1v5
+ JSONCPP_PKG: libjsoncpp24
+ LEVELDB_PKG: libleveldb1d
+ JPEG_PKG: libjpeg62-turbo
-deploy:ubuntu-16.04:
+deploy:debian-11:
extends: .debpkg_install
- image: ubuntu:xenial
+ image: debian:11
needs:
- - package:ubuntu-16.04
+ - package:debian-11
+
+##
+## Ubuntu
+##
# Bionic
build:ubuntu-18.04:
extends: .build_template
image: ubuntu:bionic
- 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-18.04:
extends: .debpkg_template
@@ -146,7 +146,9 @@ package:ubuntu-18.04:
needs:
- build:ubuntu-18.04
variables:
+ JSONCPP_PKG: libjsoncpp1
LEVELDB_PKG: libleveldb1v5
+ JPEG_PKG: libjpeg-turbo8
deploy:ubuntu-18.04:
extends: .debpkg_install
@@ -154,6 +156,28 @@ deploy:ubuntu-18.04:
needs:
- package:ubuntu-18.04
+# Focal
+
+build:ubuntu-20.04:
+ extends: .build_template
+ image: ubuntu:focal
+
+package:ubuntu-20.04:
+ extends: .debpkg_template
+ image: ubuntu:focal
+ needs:
+ - build:ubuntu-20.04
+ variables:
+ JSONCPP_PKG: libjsoncpp1
+ LEVELDB_PKG: libleveldb1d
+ JPEG_PKG: libjpeg-turbo8
+
+deploy:ubuntu-20.04:
+ extends: .debpkg_install
+ image: ubuntu:focal
+ needs:
+ - package:ubuntu-20.04
+
##
## Fedora
##
@@ -163,17 +187,17 @@ build:fedora-28:
extends: .build_template
image: fedora:28
before_script:
- - dnf -y install make automake gcc gcc-c++ kernel-devel cmake libcurl-devel openal-soft-devel libvorbis-devel libXxf86vm-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel irrlicht-devel gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel spatialindex-devel
+ - dnf -y install make git gcc gcc-c++ kernel-devel cmake libjpeg-devel libpng-devel libcurl-devel openal-soft-devel libvorbis-devel libXxf86vm-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel spatialindex-devel libzstd-devel
##
## MinGW for Windows
##
.generic_win_template:
- image: ubuntu:bionic
+ image: ubuntu:focal
before_script:
- - apt-get update -y
- - apt-get install -y wget xz-utils unzip git cmake gettext
+ - apt-get update
+ - DEBIAN_FRONTEND=noninteractive apt-get install -y wget xz-utils unzip git cmake gettext
- wget -nv http://minetest.kitsunemimi.pw/mingw-w64-${WIN_ARCH}_9.2.0_ubuntu18.04.tar.xz -O mingw.tar.xz
- tar -xaf mingw.tar.xz -C /usr
@@ -181,19 +205,6 @@ build:fedora-28:
extends: .generic_win_template
stage: build
artifacts:
- expire_in: 1h
- paths:
- - build/minetest/_build/*
-
-.package_win_template:
- extends: .generic_win_template
- stage: package
- script:
- - unzip build/minetest/_build/minetest-*.zip
- - cp -p /usr/${WIN_ARCH}-w64-mingw32/bin/libgcc*.dll minetest-*-win*/bin/
- - cp -p /usr/${WIN_ARCH}-w64-mingw32/bin/libstdc++*.dll minetest-*-win*/bin/
- - cp -p /usr/${WIN_ARCH}-w64-mingw32/bin/libwinpthread*.dll minetest-*-win*/bin/
- artifacts:
expire_in: 90 day
paths:
- minetest-*-win*/*
@@ -201,29 +212,16 @@ build:fedora-28:
build:win32:
extends: .build_win_template
script:
- - ./util/buildbot/buildwin32.sh build
- variables:
- WIN_ARCH: "i686"
-
-package:win32:
- extends: .package_win_template
- needs:
- - build:win32
+ - EXISTING_MINETEST_DIR=$PWD ./util/buildbot/buildwin32.sh build
+ - unzip -q build/build/*.zip
variables:
WIN_ARCH: "i686"
-
build:win64:
extends: .build_win_template
script:
- - ./util/buildbot/buildwin64.sh build
- variables:
- WIN_ARCH: "x86_64"
-
-package:win64:
- extends: .package_win_template
- needs:
- - build:win64
+ - EXISTING_MINETEST_DIR=$PWD ./util/buildbot/buildwin64.sh build
+ - unzip -q build/build/*.zip
variables:
WIN_ARCH: "x86_64"
@@ -274,7 +272,7 @@ package:appimage-client:
- build:ubuntu-18.04
before_script:
- apt-get update -y
- - apt-get install -y git wget
+ - apt-get install -y git
# Collect files
- mkdir AppDir
- cp -a artifact/minetest/usr/ AppDir/usr/
diff --git a/.luacheckrc b/.luacheckrc
index e010ab95c..a922bdea9 100644
--- a/.luacheckrc
+++ b/.luacheckrc
@@ -20,7 +20,7 @@ read_globals = {
string = {fields = {"split", "trim"}},
table = {fields = {"copy", "getn", "indexof", "insert_all"}},
- math = {fields = {"hypot"}},
+ math = {fields = {"hypot", "round"}},
}
globals = {
diff --git a/AppImageBuilder.yml b/AppImageBuilder.yml
index 9ecad5d8e..5788e246b 100644
--- a/AppImageBuilder.yml
+++ b/AppImageBuilder.yml
@@ -24,18 +24,21 @@ AppDir:
- sourceline: deb http://archive.ubuntu.com/ubuntu/ bionic-security main universe
include:
- - libirrlicht1.8
- - libxxf86vm1
- - libgl1-mesa-glx
- - libsqlite3-0
- - libogg0
- - libvorbis0a
- - libopenal1
+ - libc6
- libcurl3-gnutls
- libfreetype6
- - zlib1g
- - libgmp10
+ - libgl1
+ - libjpeg-turbo8
- libjsoncpp1
+ - libleveldb1v5
+ - libopenal1
+ - libpng16-16
+ - libsqlite3-0
+ - libstdc++6
+ - libvorbisfile3
+ - libx11-6
+ - libxxf86vm1
+ - zlib1g
files:
exclude:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5629cbe70..40a9ce15f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,19 +1,24 @@
cmake_minimum_required(VERSION 3.5)
-cmake_policy(SET CMP0025 OLD)
+# Set policies up to 3.9 since we want to enable the IPO option
+if(${CMAKE_VERSION} VERSION_LESS 3.9)
+ cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
+else()
+ cmake_policy(VERSION 3.9)
+endif()
# This can be read from ${PROJECT_NAME} after project() is called
project(minetest)
set(PROJECT_NAME_CAPITALIZED "Minetest")
set(CMAKE_CXX_STANDARD 11)
-set(GCC_MINIMUM_VERSION "4.8")
-set(CLANG_MINIMUM_VERSION "3.4")
+set(GCC_MINIMUM_VERSION "5.1")
+set(CLANG_MINIMUM_VERSION "3.5")
# Also remember to set PROTOCOL_VERSION in network/networkprotocol.h when releasing
set(VERSION_MAJOR 5)
-set(VERSION_MINOR 4)
-set(VERSION_PATCH 2)
+set(VERSION_MINOR 5)
+set(VERSION_PATCH 0)
set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string")
# Change to false for releases
@@ -21,7 +26,7 @@ set(DEVELOPMENT_BUILD FALSE)
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
if(VERSION_EXTRA)
- set(VERSION_STRING ${VERSION_STRING}-${VERSION_EXTRA})
+ set(VERSION_STRING "${VERSION_STRING}-${VERSION_EXTRA}")
elseif(DEVELOPMENT_BUILD)
set(VERSION_STRING "${VERSION_STRING}-dev")
endif()
@@ -47,7 +52,6 @@ set(BUILD_CLIENT TRUE CACHE BOOL "Build client")
set(BUILD_SERVER FALSE CACHE BOOL "Build server")
set(BUILD_UNITTESTS TRUE CACHE BOOL "Build unittests")
-
set(WARN_ALL TRUE CACHE BOOL "Enable -Wall for Release build")
if(NOT CMAKE_BUILD_TYPE)
@@ -59,8 +63,62 @@ endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
+set(IRRLICHTMT_BUILD_DIR "" CACHE PATH "Path to IrrlichtMt build directory.")
+if(NOT "${IRRLICHTMT_BUILD_DIR}" STREQUAL "")
+ find_package(IrrlichtMt QUIET
+ PATHS "${IRRLICHTMT_BUILD_DIR}"
+ NO_DEFAULT_PATH
+)
+
+ if(NOT TARGET IrrlichtMt::IrrlichtMt)
+ # find_package() searches certain subdirectories. ${PATH}/cmake is not
+ # the only one, but it is the one where IrrlichtMt is supposed to export
+ # IrrlichtMtConfig.cmake
+ message(FATAL_ERROR "Could not find IrrlichtMtConfig.cmake in ${IRRLICHTMT_BUILD_DIR}/cmake.")
+ endif()
# This is done here so that relative search paths are more reasonable
-find_package(Irrlicht)
+elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/lib/irrlichtmt")
+ message(STATUS "Using user-provided IrrlichtMt at subdirectory 'lib/irrlichtmt'")
+ if(BUILD_CLIENT)
+ # tell IrrlichtMt to create a static library
+ set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared library" FORCE)
+ add_subdirectory(lib/irrlichtmt EXCLUDE_FROM_ALL)
+ unset(BUILD_SHARED_LIBS CACHE)
+
+ if(NOT TARGET IrrlichtMt)
+ message(FATAL_ERROR "IrrlichtMt project is missing a CMake target?!")
+ endif()
+ else()
+ add_library(IrrlichtMt::IrrlichtMt INTERFACE IMPORTED)
+ set_target_properties(IrrlichtMt::IrrlichtMt PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/irrlichtmt/include")
+ endif()
+else()
+ find_package(IrrlichtMt QUIET)
+ if(NOT TARGET IrrlichtMt::IrrlichtMt)
+ string(CONCAT explanation_msg
+ "The Minetest team has forked Irrlicht to make their own customizations. "
+ "It can be found here: https://github.com/minetest/irrlicht\n"
+ "For example use: git clone --depth=1 https://github.com/minetest/irrlicht lib/irrlichtmt\n")
+ if(BUILD_CLIENT)
+ message(FATAL_ERROR "IrrlichtMt is required to build the client, but it was not found.\n${explanation_msg}")
+ endif()
+
+ include(MinetestFindIrrlichtHeaders)
+ if(NOT IRRLICHT_INCLUDE_DIR)
+ message(FATAL_ERROR "Irrlicht or IrrlichtMt headers are required to build the server, but none found.\n${explanation_msg}")
+ endif()
+ message(STATUS "Found Irrlicht headers: ${IRRLICHT_INCLUDE_DIR}")
+ add_library(IrrlichtMt::IrrlichtMt INTERFACE IMPORTED)
+ # Note that we can't use target_include_directories() since that doesn't work for IMPORTED targets before CMake 3.11
+ set_target_properties(IrrlichtMt::IrrlichtMt PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${IRRLICHT_INCLUDE_DIR}")
+ endif()
+endif()
+
+if(TARGET IrrlichtMt::IrrlichtMt)
+ message(STATUS "Found IrrlichtMt ${IrrlichtMt_VERSION}")
+endif()
# Installation
@@ -91,15 +149,16 @@ elseif(UNIX) # Linux, BSD etc
set(ICONDIR "unix/icons")
set(LOCALEDIR "locale")
else()
- set(SHAREDIR "${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}")
- set(BINDIR "${CMAKE_INSTALL_PREFIX}/bin")
- set(DOCDIR "${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME}")
- set(MANDIR "${CMAKE_INSTALL_PREFIX}/share/man")
+ include(GNUInstallDirs)
+ set(SHAREDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}")
+ set(BINDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}")
+ set(DOCDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DOCDIR}")
+ set(MANDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_MANDIR}")
set(EXAMPLE_CONF_DIR ${DOCDIR})
- set(XDG_APPS_DIR "${CMAKE_INSTALL_PREFIX}/share/applications")
- set(APPDATADIR "${CMAKE_INSTALL_PREFIX}/share/metainfo")
- set(ICONDIR "${CMAKE_INSTALL_PREFIX}/share/icons")
- set(LOCALEDIR "${CMAKE_INSTALL_PREFIX}/share/locale")
+ set(XDG_APPS_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/applications")
+ set(APPDATADIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/metainfo")
+ set(ICONDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/icons")
+ set(LOCALEDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LOCALEDIR}")
endif()
endif()
@@ -169,7 +228,6 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/games/devtest" DESTINATION "${SHA
if(BUILD_CLIENT)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/client/shaders" DESTINATION "${SHAREDIR}/client")
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/textures/base/pack" DESTINATION "${SHAREDIR}/textures/base")
- install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/fonts" DESTINATION "${SHAREDIR}")
if(RUN_IN_PLACE)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/clientmods" DESTINATION "${SHAREDIR}")
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/client/serverlist" DESTINATION "${SHAREDIR}/client")
@@ -203,10 +261,10 @@ endif()
find_package(GMP REQUIRED)
find_package(Json REQUIRED)
find_package(Lua REQUIRED)
-
-# JsonCPP doesn't compile well on GCC 4.8
-if(NOT ENABLE_SYSTEM_JSONCPP)
- set(GCC_MINIMUM_VERSION "4.9")
+if(NOT USE_LUAJIT)
+ set(LUA_BIT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/bitop)
+ set(LUA_BIT_LIBRARY bitop)
+ add_subdirectory(lib/bitop)
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
@@ -214,7 +272,7 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
message(FATAL_ERROR "Insufficient gcc version, found ${CMAKE_CXX_COMPILER_VERSION}. "
"Version ${GCC_MINIMUM_VERSION} or higher is required.")
endif()
-elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+elseif(CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?Clang")
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "${CLANG_MINIMUM_VERSION}")
message(FATAL_ERROR "Insufficient clang version, found ${CMAKE_CXX_COMPILER_VERSION}. "
"Version ${CLANG_MINIMUM_VERSION} or higher is required.")
@@ -223,7 +281,6 @@ endif()
# Subdirectories
# Be sure to add all relevant definitions above this
-
add_subdirectory(src)
diff --git a/Dockerfile b/Dockerfile
index 871ca9825..8d1008fa2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,8 @@
-FROM alpine:3.11
+ARG DOCKER_IMAGE=alpine:3.14
+FROM $DOCKER_IMAGE AS builder
ENV MINETEST_GAME_VERSION master
+ENV IRRLICHT_VERSION master
COPY .git /usr/src/minetest/.git
COPY CMakeLists.txt /usr/src/minetest/CMakeLists.txt
@@ -18,10 +20,8 @@ COPY textures /usr/src/minetest/textures
WORKDIR /usr/src/minetest
-RUN apk add --no-cache git build-base irrlicht-dev cmake bzip2-dev libpng-dev \
- jpeg-dev libxxf86vm-dev mesa-dev sqlite-dev libogg-dev \
- libvorbis-dev openal-soft-dev curl-dev freetype-dev zlib-dev \
- gmp-dev jsoncpp-dev postgresql-dev luajit-dev ca-certificates && \
+RUN apk add --no-cache git build-base cmake sqlite-dev curl-dev zlib-dev zstd-dev \
+ gmp-dev jsoncpp-dev postgresql-dev ninja luajit-dev ca-certificates && \
git clone --depth=1 -b ${MINETEST_GAME_VERSION} https://github.com/minetest/minetest_game.git ./games/minetest_game && \
rm -fr ./games/minetest_game/.git
@@ -32,9 +32,13 @@ RUN git clone --recursive https://github.com/jupp0r/prometheus-cpp/ && \
cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DCMAKE_BUILD_TYPE=Release \
- -DENABLE_TESTING=0 && \
- make -j2 && \
- make install
+ -DENABLE_TESTING=0 \
+ -GNinja && \
+ ninja && \
+ ninja install
+
+RUN git clone --depth=1 https://github.com/minetest/irrlicht/ -b ${IRRLICHT_VERSION} && \
+ cp -r irrlicht/include /usr/include/irrlichtmt
WORKDIR /usr/src/minetest
RUN mkdir build && \
@@ -45,21 +49,23 @@ RUN mkdir build && \
-DBUILD_SERVER=TRUE \
-DENABLE_PROMETHEUS=TRUE \
-DBUILD_UNITTESTS=FALSE \
- -DBUILD_CLIENT=FALSE && \
- make -j2 && \
- make install
+ -DBUILD_CLIENT=FALSE \
+ -GNinja && \
+ ninja && \
+ ninja install
-FROM alpine:3.11
+ARG DOCKER_IMAGE=alpine:3.14
+FROM $DOCKER_IMAGE AS runtime
-RUN apk add --no-cache sqlite-libs curl gmp libstdc++ libgcc libpq luajit && \
+RUN apk add --no-cache sqlite-libs curl gmp libstdc++ libgcc libpq luajit jsoncpp zstd-libs && \
adduser -D minetest --uid 30000 -h /var/lib/minetest && \
chown -R minetest:minetest /var/lib/minetest
WORKDIR /var/lib/minetest
-COPY --from=0 /usr/local/share/minetest /usr/local/share/minetest
-COPY --from=0 /usr/local/bin/minetestserver /usr/local/bin/minetestserver
-COPY --from=0 /usr/local/share/doc/minetest/minetest.conf.example /etc/minetest/minetest.conf
+COPY --from=builder /usr/local/share/minetest /usr/local/share/minetest
+COPY --from=builder /usr/local/bin/minetestserver /usr/local/bin/minetestserver
+COPY --from=builder /usr/local/share/doc/minetest/minetest.conf.example /etc/minetest/minetest.conf
USER minetest:minetest
diff --git a/LICENSE.txt b/LICENSE.txt
index 9b8ee851a..ab44488a7 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -14,6 +14,9 @@ https://www.apache.org/licenses/LICENSE-2.0.html
Textures by Zughy are under CC BY-SA 4.0
https://creativecommons.org/licenses/by-sa/4.0/
+textures/base/pack/server_public.png is under CC-BY 4.0, taken from Twitter's Twemoji set
+https://creativecommons.org/licenses/by/4.0/
+
Authors of media files
-----------------------
Everything not listed in here:
@@ -39,10 +42,10 @@ erlehmann:
misc/minetest.svg
textures/base/pack/logo.png
-JRottm
+JRottm:
textures/base/pack/player_marker.png
-srifqi
+srifqi:
textures/base/pack/chat_hide_btn.png
textures/base/pack/chat_show_btn.png
textures/base/pack/joystick_bg.png
@@ -58,6 +61,9 @@ Zughy:
textures/base/pack/cdb_update.png
textures/base/pack/cdb_viewonline.png
+appgurueu:
+ textures/base/pack/server_incompatible.png
+
License of Minetest source code
-------------------------------
@@ -81,7 +87,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
Irrlicht
---------------
-This program uses the Irrlicht Engine. http://irrlicht.sourceforge.net/
+This program uses IrrlichtMt, Minetest's fork of
+the Irrlicht Engine. http://irrlicht.sourceforge.net/
The Irrlicht Engine License
diff --git a/README.md b/README.md
index 58ec0c821..b3d2981f6 100644
--- a/README.md
+++ b/README.md
@@ -68,7 +68,7 @@ Some can be changed in the key config dialog in the settings tab.
| P | Enable/disable pitch move mode |
| J | Enable/disable fast mode (needs fast privilege) |
| H | Enable/disable noclip mode (needs noclip privilege) |
-| E | Move fast in fast mode |
+| E | Aux1 (Move fast in fast mode. Games may add special features) |
| C | Cycle through camera modes |
| V | Cycle through minimap modes |
| Shift + V | Change minimap orientation |
@@ -132,29 +132,31 @@ Compiling
| Dependency | Version | Commentary |
|------------|---------|------------|
-| GCC | 4.9+ | Can be replaced with Clang 3.4+ |
-| CMake | 2.6+ | |
-| Irrlicht | 1.7.3+ | |
-| SQLite3 | 3.0+ | |
+| GCC | 5.1+ | or Clang 3.5+ |
+| CMake | 3.5+ | |
+| IrrlichtMt | - | Custom version of Irrlicht, see https://github.com/minetest/irrlicht |
+| Freetype | 2.0+ | |
+| SQLite3 | 3+ | |
+| Zstd | 1.0+ | |
| LuaJIT | 2.0+ | Bundled Lua 5.1 is used if not present |
| GMP | 5.0.0+ | Bundled mini-GMP is used if not present |
| JsonCPP | 1.0.0+ | Bundled JsonCPP is used if not present |
For Debian/Ubuntu users:
- sudo apt install g++ make libc6-dev 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
+ sudo apt install g++ make libc6-dev cmake 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 libzstd-dev libluajit-5.1-dev
For Fedora users:
- sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl-devel openal-soft-devel libvorbis-devel 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
-
+ sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl-devel openal-soft-devel libvorbis-devel libXxf86vm-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel spatialindex-devel libzstd-devel
+
For Arch users:
- sudo pacman -S base-devel libcurl-gnutls cmake libxxf86vm irrlicht libpng sqlite libogg libvorbis openal freetype2 jsoncpp gmp luajit leveldb ncurses
+ sudo pacman -S base-devel libcurl-gnutls cmake libxxf86vm libpng sqlite libogg libvorbis openal freetype2 jsoncpp gmp luajit leveldb ncurses zstd
For Alpine users:
- sudo apk add build-base irrlicht-dev cmake bzip2-dev libpng-dev jpeg-dev libxxf86vm-dev mesa-dev sqlite-dev libogg-dev libvorbis-dev openal-soft-dev curl-dev freetype-dev zlib-dev gmp-dev jsoncpp-dev luajit-dev
+ sudo apk add build-base cmake libpng-dev jpeg-dev libxxf86vm-dev mesa-dev sqlite-dev libogg-dev libvorbis-dev openal-soft-dev curl-dev freetype-dev zlib-dev gmp-dev jsoncpp-dev luajit-dev zstd-dev
#### Download
@@ -177,6 +179,10 @@ Download minetest_game (otherwise only the "Development Test" game is available)
git clone --depth 1 https://github.com/minetest/minetest_game.git games/minetest_game
+Download IrrlichtMt to `lib/irrlichtmt`, it will be used to satisfy the IrrlichtMt dependency that way:
+
+ git clone --depth 1 https://github.com/minetest/irrlicht.git lib/irrlichtmt
+
Download source, without using Git:
wget https://github.com/minetest/minetest/archive/master.tar.gz
@@ -191,6 +197,14 @@ Download minetest_game, without using Git:
mv minetest_game-master minetest_game
cd ..
+Download IrrlichtMt, without using Git:
+
+ cd lib/
+ wget https://github.com/minetest/irrlicht/archive/master.tar.gz
+ tar xf master.tar.gz
+ mv irrlicht-master irrlichtmt
+ cd ..
+
#### Build
Build a version that runs directly from the source directory:
@@ -209,8 +223,15 @@ Run it:
- You can disable the client build by specifying `-DBUILD_CLIENT=FALSE`.
- You can select between Release and Debug build by `-DCMAKE_BUILD_TYPE=<Debug or Release>`.
- Debug build is slower, but gives much more useful output in a debugger.
-- If you build a bare server you don't need to have Irrlicht installed.
- - In that case use `-DIRRLICHT_SOURCE_DIR=/the/irrlicht/source`.
+- If you build a bare server you don't need to have the Irrlicht or IrrlichtMt library installed.
+ - In that case use `-DIRRLICHT_INCLUDE_DIR=/some/where/irrlicht/include`.
+
+- Minetest will use the IrrlichtMt package that is found first, given by the following order:
+ 1. Specified `IRRLICHTMT_BUILD_DIR` CMake variable
+ 2. `${PROJECT_SOURCE_DIR}/lib/irrlichtmt` (if existent)
+ 3. Installation of IrrlichtMt in the system-specific library paths
+ 4. For server builds with disabled `BUILD_CLIENT` variable, the headers from `IRRLICHT_INCLUDE_DIR` will be used.
+ - NOTE: Changing the IrrlichtMt build directory (includes system installs) requires regenerating the CMake cache (`rm CMakeCache.txt`)
### CMake options
@@ -227,9 +248,8 @@ General options and their default values:
MinSizeRel - Release build with -Os passed to compiler to make executable as small as possible
ENABLE_CURL=ON - Build with cURL; Enables use of online mod repo, public serverlist and remote media fetching via http
ENABLE_CURSES=ON - Build with (n)curses; Enables a server side terminal (command line option: --terminal)
- ENABLE_FREETYPE=ON - Build with FreeType2; Allows using TTF fonts
ENABLE_GETTEXT=ON - Build with Gettext; Allows using translations
- ENABLE_GLES=OFF - Build for OpenGL ES instead of OpenGL (requires support by Irrlicht)
+ ENABLE_GLES=OFF - Build for OpenGL ES instead of OpenGL (requires support by IrrlichtMt)
ENABLE_LEVELDB=ON - Build with LevelDB; Enables use of LevelDB map backend
ENABLE_POSTGRESQL=ON - Build with libpq; Enables use of PostgreSQL map backend (PostgreSQL 9.5 or greater recommended)
ENABLE_REDIS=ON - Build with libhiredis; Enables use of Redis map backend
@@ -238,33 +258,31 @@ General options and their default values:
ENABLE_LUAJIT=ON - Build with LuaJIT (much faster than non-JIT Lua)
ENABLE_PROMETHEUS=OFF - Build with Prometheus metrics exporter (listens on tcp/30000 by default)
ENABLE_SYSTEM_GMP=ON - Use GMP from system (much faster than bundled mini-gmp)
- ENABLE_SYSTEM_JSONCPP=OFF - Use JsonCPP from system
+ ENABLE_SYSTEM_JSONCPP=ON - Use JsonCPP from system
OPENGL_GL_PREFERENCE=LEGACY - Linux client build only; See CMake Policy CMP0072 for reference
RUN_IN_PLACE=FALSE - Create a portable install (worlds, settings etc. in current directory)
USE_GPROF=FALSE - Enable profiling using GProf
VERSION_EXTRA= - Text to append to version (e.g. VERSION_EXTRA=foobar -> Minetest 0.4.9-foobar)
+ ENABLE_TOUCH=FALSE - Enable Touchscreen support (requires support by IrrlichtMt)
Library specific options:
- BZIP2_INCLUDE_DIR - Linux only; directory where bzlib.h is located
- BZIP2_LIBRARY - Linux only; path to libbz2.a/libbz2.so
CURL_DLL - Only if building with cURL on Windows; path to libcurl.dll
CURL_INCLUDE_DIR - Only if building with cURL; directory where curl.h is located
CURL_LIBRARY - Only if building with cURL; path to libcurl.a/libcurl.so/libcurl.lib
EGL_INCLUDE_DIR - Only if building with GLES; directory that contains egl.h
EGL_LIBRARY - Only if building with GLES; path to libEGL.a/libEGL.so
- FREETYPE_INCLUDE_DIR_freetype2 - Only if building with FreeType 2; directory that contains an freetype directory with files such as ftimage.h in it
- FREETYPE_INCLUDE_DIR_ft2build - Only if building with FreeType 2; directory that contains ft2build.h
- FREETYPE_LIBRARY - Only if building with FreeType 2; path to libfreetype.a/libfreetype.so/freetype.lib
- FREETYPE_DLL - Only if building with FreeType 2 on Windows; path to libfreetype.dll
- GETTEXT_DLL - Only when building with gettext on Windows; path to libintl3.dll
- GETTEXT_ICONV_DLL - Only when building with gettext on Windows; path to libiconv2.dll
+ EXTRA_DLL - Only on Windows; optional paths to additional DLLs that should be packaged
+ FREETYPE_INCLUDE_DIR_freetype2 - Directory that contains files such as ftimage.h
+ FREETYPE_INCLUDE_DIR_ft2build - Directory that contains ft2build.h
+ FREETYPE_LIBRARY - Path to libfreetype.a/libfreetype.so/freetype.lib
+ FREETYPE_DLL - Only on Windows; path to libfreetype-6.dll
+ GETTEXT_DLL - Only when building with gettext on Windows; paths to libintl + libiconv DLLs
GETTEXT_INCLUDE_DIR - Only when building with gettext; directory that contains iconv.h
GETTEXT_LIBRARY - Only when building with gettext on Windows; path to libintl.dll.a
GETTEXT_MSGFMT - Only when building with gettext; path to msgfmt/msgfmt.exe
- IRRLICHT_DLL - Only on Windows; path to Irrlicht.dll
- IRRLICHT_INCLUDE_DIR - Directory that contains IrrCompileConfig.h
- IRRLICHT_LIBRARY - Path to libIrrlicht.a/libIrrlicht.so/libIrrlicht.dll.a/Irrlicht.lib
+ IRRLICHT_DLL - Only on Windows; path to IrrlichtMt.dll
+ IRRLICHT_INCLUDE_DIR - Directory that contains IrrCompileConfig.h (usable for server build only)
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
@@ -276,7 +294,6 @@ Library specific options:
SPATIAL_LIBRARY - Only when building with LibSpatial; path to libspatialindex_c.so/spatialindex-32.lib
LUA_INCLUDE_DIR - Only if you want to use LuaJIT; directory where luajit.h is located
LUA_LIBRARY - Only if you want to use LuaJIT; path to libluajit.a/libluajit.so
- MINGWM10_DLL - Only if compiling with MinGW; path to mingwm10.dll
OGG_DLL - Only if building with sound on Windows; path to libogg.dll
OGG_INCLUDE_DIR - Only if building with sound; directory that contains an ogg directory which contains ogg.h
OGG_LIBRARY - Only if building with sound; path to libogg.a/libogg.so/libogg.dll.a
@@ -287,17 +304,19 @@ Library specific options:
OPENGLES2_LIBRARY - Only if building with GLES; path to libGLESv2.a/libGLESv2.so
SQLITE3_INCLUDE_DIR - Directory that contains sqlite3.h
SQLITE3_LIBRARY - Path to libsqlite3.a/libsqlite3.so/sqlite3.lib
- VORBISFILE_DLL - Only if building with sound on Windows; path to libvorbisfile-3.dll
VORBISFILE_LIBRARY - Only if building with sound; path to libvorbisfile.a/libvorbisfile.so/libvorbisfile.dll.a
- VORBIS_DLL - Only if building with sound on Windows; path to libvorbis-0.dll
+ VORBIS_DLL - Only if building with sound on Windows; paths to vorbis DLLs
VORBIS_INCLUDE_DIR - Only if building with sound; directory that contains a directory vorbis with vorbisenc.h inside
VORBIS_LIBRARY - Only if building with sound; path to libvorbis.a/libvorbis.so/libvorbis.dll.a
XXF86VM_LIBRARY - Only on Linux; path to libXXf86vm.a/libXXf86vm.so
ZLIB_DLL - Only on Windows; path to zlib1.dll
ZLIB_INCLUDE_DIR - Directory that contains zlib.h
ZLIB_LIBRARY - Path to libz.a/libz.so/zlib.lib
+ ZSTD_DLL - Only on Windows; path to libzstd.dll
+ ZSTD_INCLUDE_DIR - Directory that contains zstd.h
+ ZSTD_LIBRARY - Path to libzstd.a/libzstd.so/ztd.lib
-### Compiling on Windows
+### Compiling on Windows using MSVC
### Requirements
@@ -310,16 +329,14 @@ Library specific options:
It is highly recommended to use vcpkg as package manager.
-#### a) Using vcpkg to install dependencies
-
After you successfully built vcpkg you can easily install the required libraries:
```powershell
-vcpkg install irrlicht zlib curl[winssl] openal-soft libvorbis libogg sqlite3 freetype luajit gmp jsoncpp --triplet x64-windows
+vcpkg install zlib zstd curl[winssl] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp opengl-registry --triplet x64-windows
```
+- **Don't forget about IrrlichtMt.** The easiest way is to clone it to `lib/irrlichtmt` as described in the Linux section.
- `curl` is optional, but required to read the serverlist, `curl[winssl]` is required to use the content store.
- `openal-soft`, `libvorbis` and `libogg` are optional, but required to use sound.
-- `freetype` is optional, it allows true-type font rendering.
- `luajit` is optional, it replaces the integrated Lua interpreter with a faster just-in-time interpreter.
- `gmp` and `jsoncpp` are optional, otherwise the bundled versions will be compiled
@@ -327,10 +344,6 @@ There are other optional libraries, but they are not tested if they can build an
Use `--triplet` to specify the target triplet, e.g. `x64-windows` or `x86-windows`.
-#### b) Compile the dependencies on your own
-
-This is outdated and not recommended. Follow the instructions on https://dev.minetest.net/Build_Win32_Minetest_including_all_required_libraries#VS2012_Build
-
### Compile Minetest
#### a) Using the vcpkg toolchain and CMake GUI
@@ -354,17 +367,11 @@ This is outdated and not recommended. Follow the instructions on https://dev.min
Run the following script in PowerShell:
```powershell
-cmake . -G"Visual Studio 15 2017 Win64" -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GETTEXT=OFF -DENABLE_CURSES=OFF -DENABLE_SYSTEM_JSONCPP=ON
+cmake . -G"Visual Studio 15 2017 Win64" -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GETTEXT=OFF -DENABLE_CURSES=OFF
cmake --build . --config Release
```
Make sure that the right compiler is selected and the path to the vcpkg toolchain is correct.
-#### c) Using your own compiled libraries
-
-**This is outdated and not recommended**
-
-Follow the instructions on https://dev.minetest.net/Build_Win32_Minetest_including_all_required_libraries#VS2012_Build
-
### Windows Installer using WiX Toolset
Requirements:
@@ -378,6 +385,60 @@ Build the binaries as described above, but make sure you unselect `RUN_IN_PLACE`
Open the generated project file with Visual Studio. Right-click **Package** and choose **Generate**.
It may take some minutes to generate the installer.
+### Compiling on MacOS
+
+#### Requirements
+- [Homebrew](https://brew.sh/)
+- [Git](https://git-scm.com/downloads)
+
+Install dependencies with homebrew:
+
+```
+brew install cmake freetype gettext gmp hiredis jpeg jsoncpp leveldb libogg libpng libvorbis luajit zstd
+```
+
+#### Download
+
+Download source (this is the URL to the latest of source repository, which might not work at all times) using Git:
+
+```bash
+git clone --depth 1 https://github.com/minetest/minetest.git
+cd minetest
+```
+
+Download minetest_game (otherwise only the "Development Test" game is available) using Git:
+
+```
+git clone --depth 1 https://github.com/minetest/minetest_game.git games/minetest_game
+```
+
+Download Minetest's fork of Irrlicht:
+
+```
+git clone --depth 1 https://github.com/minetest/irrlicht.git lib/irrlichtmt
+```
+
+#### Build
+
+```bash
+mkdir cmakebuild
+cd cmakebuild
+
+cmake .. \
+ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.14 \
+ -DCMAKE_FIND_FRAMEWORK=LAST \
+ -DCMAKE_INSTALL_PREFIX=../build/macos/ \
+ -DRUN_IN_PLACE=FALSE -DENABLE_GETTEXT=TRUE
+
+make -j$(nproc)
+make install
+```
+
+#### Run
+
+```
+open ./build/macos/minetest.app
+```
Docker
------
diff --git a/android/app/build.gradle b/android/app/build.gradle
index b7d93ef0f..e8ba95722 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -1,12 +1,12 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 29
+ compileSdkVersion 30
buildToolsVersion '30.0.3'
- ndkVersion '22.0.7026061'
+ ndkVersion "$ndk_version"
defaultConfig {
applicationId 'net.minetest.minetest'
minSdkVersion 16
- targetSdkVersion 29
+ targetSdkVersion 30
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
versionCode project.versionCode
}
@@ -68,7 +68,7 @@ task prepareAssets() {
from "${projRoot}/client/shaders" into "${assetsFolder}/client/shaders"
}
copy {
- from "../native/deps/Android/Irrlicht/shaders" into "${assetsFolder}/client/shaders/Irrlicht"
+ from "../native/deps/armeabi-v7a/Irrlicht/Shaders" into "${assetsFolder}/client/shaders/Irrlicht"
}
copy {
from "${projRoot}/fonts" include "*.ttf" into "${assetsFolder}/fonts"
@@ -76,10 +76,13 @@ task prepareAssets() {
copy {
from "${projRoot}/games/${gameToCopy}" into "${assetsFolder}/games/${gameToCopy}"
}
- /*copy {
- // ToDo: fix broken locales
- from "${projRoot}/po" into "${assetsFolder}/po"
- }*/
+ fileTree("${projRoot}/po").include("**/*.po").forEach { poFile ->
+ def moPath = "${assetsFolder}/locale/${poFile.parentFile.name}/LC_MESSAGES/"
+ file(moPath).mkdirs()
+ exec {
+ commandLine 'msgfmt', '-o', "${moPath}/minetest.mo", poFile
+ }
+ }
copy {
from "${projRoot}/textures" into "${assetsFolder}/textures"
}
@@ -109,5 +112,5 @@ android.applicationVariants.all { variant ->
dependencies {
implementation project(':native')
- implementation 'androidx.appcompat:appcompat:1.2.0'
+ implementation 'androidx.appcompat:appcompat:1.3.1'
}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 314a38b5c..6ea677cb9 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -19,8 +19,6 @@
android:label="@string/label"
android:requestLegacyExternalStorage="true"
android:resizeableActivity="false"
- android:hasFragileUserData="true"
- android:isGame="true"
tools:ignore="UnusedAttribute">
<meta-data
@@ -32,7 +30,8 @@
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:maxAspectRatio="3.0"
android:screenOrientation="sensorLandscape"
- android:theme="@style/AppTheme">
+ android:theme="@style/AppTheme"
+ android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
@@ -46,7 +45,8 @@
android:launchMode="singleTask"
android:maxAspectRatio="3.0"
android:screenOrientation="sensorLandscape"
- android:theme="@style/AppTheme">
+ android:theme="@style/AppTheme"
+ android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
diff --git a/android/app/src/main/java/net/minetest/minetest/GameActivity.java b/android/app/src/main/java/net/minetest/minetest/GameActivity.java
index dc2e564be..46fc9b1de 100644
--- a/android/app/src/main/java/net/minetest/minetest/GameActivity.java
+++ b/android/app/src/main/java/net/minetest/minetest/GameActivity.java
@@ -30,7 +30,9 @@ import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
import android.widget.EditText;
+import android.widget.LinearLayout;
import androidx.appcompat.app.AlertDialog;
@@ -85,9 +87,19 @@ public class GameActivity extends NativeActivity {
private void showDialogUI(String hint, String current, int editType) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
- EditText editText = new CustomEditText(this);
- builder.setView(editText);
+ LinearLayout container = new LinearLayout(this);
+ container.setOrientation(LinearLayout.VERTICAL);
+ builder.setView(container);
AlertDialog alertDialog = builder.create();
+ EditText editText;
+ // For multi-line, do not close the dialog after pressing back button
+ if (editType == 1) {
+ editText = new EditText(this);
+ } else {
+ editText = new CustomEditText(this);
+ }
+ container.addView(editText);
+ editText.setMaxLines(8);
editText.requestFocus();
editText.setHint(hint);
editText.setText(current);
@@ -103,8 +115,9 @@ public class GameActivity extends NativeActivity {
else
editText.setInputType(InputType.TYPE_CLASS_TEXT);
editText.setSelection(editText.getText().length());
- editText.setOnKeyListener((view, KeyCode, event) -> {
- if (KeyCode == KeyEvent.KEYCODE_ENTER) {
+ editText.setOnKeyListener((view, keyCode, event) -> {
+ // For multi-line, do not submit the text after pressing Enter key
+ if (keyCode == KeyEvent.KEYCODE_ENTER && editType != 1) {
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
messageReturnCode = 0;
messageReturnValue = editText.getText().toString();
@@ -113,6 +126,18 @@ public class GameActivity extends NativeActivity {
}
return false;
});
+ // For multi-line, add Done button since Enter key does not submit text
+ if (editType == 1) {
+ Button doneButton = new Button(this);
+ container.addView(doneButton);
+ doneButton.setText(R.string.ime_dialog_done);
+ doneButton.setOnClickListener((view -> {
+ imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
+ messageReturnCode = 0;
+ messageReturnValue = editText.getText().toString();
+ alertDialog.dismiss();
+ }));
+ }
alertDialog.show();
alertDialog.setOnCancelListener(dialog -> {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
diff --git a/android/app/src/main/java/net/minetest/minetest/MainActivity.java b/android/app/src/main/java/net/minetest/minetest/MainActivity.java
index 56615fca7..b6567b4b7 100644
--- a/android/app/src/main/java/net/minetest/minetest/MainActivity.java
+++ b/android/app/src/main/java/net/minetest/minetest/MainActivity.java
@@ -101,7 +101,8 @@ public class MainActivity extends AppCompatActivity {
mTextView = findViewById(R.id.textView);
sharedPreferences = getSharedPreferences(SETTINGS, Context.MODE_PRIVATE);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
+ Build.VERSION.SDK_INT < Build.VERSION_CODES.R)
checkPermission();
else
checkAppVersion();
diff --git a/android/app/src/main/java/net/minetest/minetest/UnzipService.java b/android/app/src/main/java/net/minetest/minetest/UnzipService.java
index b513a7fe0..a61a49139 100644
--- a/android/app/src/main/java/net/minetest/minetest/UnzipService.java
+++ b/android/app/src/main/java/net/minetest/minetest/UnzipService.java
@@ -32,6 +32,7 @@ import android.os.Environment;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.StringRes;
import java.io.File;
@@ -200,6 +201,10 @@ public class UnzipService extends IntentService {
* Migrates user data from deprecated external storage to app scoped storage
*/
private void migrate(Notification.Builder notificationBuilder, File newLocation) throws IOException {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ return;
+ }
+
File oldLocation = new File(Environment.getExternalStorageDirectory(), "Minetest");
if (!oldLocation.isDirectory())
return;
diff --git a/android/build.gradle b/android/build.gradle
index b3118af21..71e995e48 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,21 +1,22 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
project.ext.set("versionMajor", 5) // Version Major
-project.ext.set("versionMinor", 4) // Version Minor
-project.ext.set("versionPatch", 2) // Version Patch
+project.ext.set("versionMinor", 5) // Version Minor
+project.ext.set("versionPatch", 0) // Version Patch
project.ext.set("versionExtra", "") // Version Extra
-project.ext.set("versionCode", 36) // Android Version Code
+project.ext.set("versionCode", 38) // Android Version Code
// NOTE: +2 after each release!
// +1 for ARM and +1 for ARM64 APK's, because
// each APK must have a larger `versionCode` than the previous
buildscript {
+ ext.ndk_version = '23.0.7599858'
repositories {
google()
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.1.1'
+ classpath 'com.android.tools.build:gradle:7.0.3'
classpath 'de.undercouch:gradle-download-task:4.1.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index 7fd9307d7..8ad73a75c 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Fri Jan 08 17:52:00 UTC 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
diff --git a/android/gradlew b/android/gradlew
index 83f2acfdc..25e0c1148 100755
--- a/android/gradlew
+++ b/android/gradlew
@@ -98,7 +98,7 @@ 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.
+ command -v java >/dev/null || 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."
diff --git a/android/icons/aux_btn.svg b/android/icons/aux_btn.svg
deleted file mode 100644
index 6bbefff67..000000000
--- a/android/icons/aux_btn.svg
+++ /dev/null
@@ -1,411 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="512"
- height="512"
- viewBox="0 0 135.46666 135.46667"
- version="1.1"
- id="svg8"
- inkscape:version="0.92.1 r15371"
- sodipodi:docname="aux_btn.svg"
- inkscape:export-filename="/home/stu/Desktop/icons/png/aux_btn.png"
- inkscape:export-xdpi="24.000002"
- inkscape:export-ydpi="24.000002">
- <defs
- id="defs2">
- <filter
- style="color-interpolation-filters:sRGB;"
- inkscape:label="Colorize"
- id="filter4628">
- <feComposite
- in2="SourceGraphic"
- operator="arithmetic"
- k1="0"
- k2="1"
- result="composite1"
- id="feComposite4614" />
- <feColorMatrix
- in="composite1"
- values="1"
- type="saturate"
- result="colormatrix1"
- id="feColorMatrix4616" />
- <feFlood
- flood-opacity="1"
- flood-color="rgb(158,0,0)"
- result="flood1"
- id="feFlood4618" />
- <feBlend
- in="flood1"
- in2="colormatrix1"
- mode="multiply"
- result="blend1"
- id="feBlend4620" />
- <feBlend
- in2="blend1"
- mode="screen"
- result="blend2"
- id="feBlend4622" />
- <feColorMatrix
- in="blend2"
- values="1"
- type="saturate"
- result="colormatrix2"
- id="feColorMatrix4624" />
- <feComposite
- in="colormatrix2"
- in2="SourceGraphic"
- operator="in"
- k2="1"
- result="composite2"
- id="feComposite4626" />
- </filter>
- <filter
- style="color-interpolation-filters:sRGB;"
- inkscape:label="Sharpen More"
- id="filter5109"
- inkscape:menu="Image Effects"
- inkscape:menu-tooltip="Sharpen edges and boundaries within the object, force=0.3">
- <feComposite
- in2="SourceGraphic"
- operator="arithmetic"
- k1="0"
- k2="1"
- result="composite1"
- id="feComposite5095" />
- <feColorMatrix
- in="composite1"
- values="1"
- type="saturate"
- result="colormatrix1"
- id="feColorMatrix5097" />
- <feFlood
- flood-opacity="1"
- flood-color="rgb(158,67,0)"
- result="flood1"
- id="feFlood5099" />
- <feBlend
- in="flood1"
- in2="colormatrix1"
- mode="multiply"
- result="blend1"
- id="feBlend5101" />
- <feBlend
- in2="blend1"
- mode="screen"
- result="blend2"
- id="feBlend5103" />
- <feColorMatrix
- in="blend2"
- values="1"
- type="saturate"
- result="colormatrix2"
- id="feColorMatrix5105" />
- <feComposite
- in="colormatrix2"
- in2="SourceGraphic"
- operator="in"
- k2="1"
- result="fbSourceGraphic"
- id="feComposite5107" />
- <feColorMatrix
- result="fbSourceGraphicAlpha"
- in="fbSourceGraphic"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
- id="feColorMatrix5111" />
- <feComposite
- in2="fbSourceGraphic"
- id="feComposite5113"
- operator="arithmetic"
- k1="0"
- k2="1"
- result="composite1"
- in="fbSourceGraphic" />
- <feColorMatrix
- id="feColorMatrix5115"
- in="composite1"
- values="1"
- type="saturate"
- result="colormatrix1" />
- <feFlood
- id="feFlood5117"
- flood-opacity="1"
- flood-color="rgb(158,0,0)"
- result="flood1" />
- <feBlend
- in2="colormatrix1"
- id="feBlend5119"
- in="flood1"
- mode="multiply"
- result="blend1" />
- <feBlend
- in2="blend1"
- id="feBlend5121"
- mode="screen"
- result="blend2" />
- <feColorMatrix
- id="feColorMatrix5123"
- in="blend2"
- values="1"
- type="saturate"
- result="colormatrix2" />
- <feComposite
- in2="fbSourceGraphic"
- id="feComposite5125"
- in="colormatrix2"
- operator="in"
- k2="1"
- result="fbSourceGraphic" />
- <feColorMatrix
- result="fbSourceGraphicAlpha"
- in="fbSourceGraphic"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
- id="feColorMatrix7007" />
- <feConvolveMatrix
- id="feConvolveMatrix7009"
- order="3 3"
- kernelMatrix="0 -0.15 0 -0.15 1.6 -0.15 0 -0.15 0"
- divisor="1"
- in="fbSourceGraphic"
- targetX="1"
- targetY="1"
- result="fbSourceGraphic" />
- <feColorMatrix
- result="fbSourceGraphicAlpha"
- in="fbSourceGraphic"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
- id="feColorMatrix7011" />
- <feConvolveMatrix
- id="feConvolveMatrix7013"
- targetY="1"
- targetX="1"
- in="fbSourceGraphic"
- divisor="1"
- kernelMatrix="0 -0.3 0 -0.3 2.2 -0.3 0 -0.3 0"
- order="3 3"
- result="result1" />
- <feBlend
- in2="fbSourceGraphic"
- id="feBlend7015"
- mode="normal"
- result="result2" />
- </filter>
- <marker
- style="overflow:visible"
- refY="0.0"
- refX="0.0"
- orient="auto"
- id="DistanceX">
- <path
- id="path7410"
- style="stroke:#000000; stroke-width:0.5"
- d="M 3,-3 L -3,3 M 0,-5 L 0,5" />
- </marker>
- <pattern
- y="0"
- x="0"
- width="8"
- patternUnits="userSpaceOnUse"
- id="Hatch"
- height="8">
- <path
- id="path7413"
- stroke-width="0.25"
- stroke="#000000"
- linecap="square"
- d="M8 4 l-4,4" />
- <path
- id="path7415"
- stroke-width="0.25"
- stroke="#000000"
- linecap="square"
- d="M6 2 l-4,4" />
- <path
- id="path7417"
- stroke-width="0.25"
- stroke="#000000"
- linecap="square"
- d="M4 0 l-4,4" />
- </pattern>
- <symbol
- id="*Model_Space" />
- <symbol
- id="*Paper_Space" />
- <symbol
- id="*Paper_Space0" />
- <filter
- style="color-interpolation-filters:sRGB;"
- inkscape:label="Colorize"
- id="filter4883">
- <feComposite
- in2="SourceGraphic"
- operator="arithmetic"
- k1="0"
- k2="1"
- result="composite1"
- id="feComposite4869" />
- <feColorMatrix
- in="composite1"
- values="1"
- type="saturate"
- result="colormatrix1"
- id="feColorMatrix4871" />
- <feFlood
- flood-opacity="1"
- flood-color="rgb(158,21,0)"
- result="flood1"
- id="feFlood4873" />
- <feBlend
- in="flood1"
- in2="colormatrix1"
- mode="multiply"
- result="blend1"
- id="feBlend4875" />
- <feBlend
- in2="blend1"
- mode="screen"
- result="blend2"
- id="feBlend4877" />
- <feColorMatrix
- in="blend2"
- values="1"
- type="saturate"
- result="colormatrix2"
- id="feColorMatrix4879" />
- <feComposite
- in="colormatrix2"
- in2="SourceGraphic"
- operator="in"
- k2="1"
- result="composite2"
- id="feComposite4881" />
- </filter>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#404040"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:zoom="0.98994949"
- inkscape:cx="-341.34157"
- inkscape:cy="210.02973"
- inkscape:document-units="mm"
- inkscape:current-layer="layer2"
- showgrid="true"
- units="px"
- inkscape:window-width="1920"
- inkscape:window-height="1023"
- inkscape:window-x="0"
- inkscape:window-y="34"
- inkscape:window-maximized="1"
- inkscape:pagecheckerboard="false"
- inkscape:snap-grids="false"
- inkscape:snap-page="true"
- showguides="true"
- inkscape:snap-bbox="true"
- inkscape:snap-to-guides="true"
- inkscape:snap-object-midpoints="false"
- inkscape:snap-others="true"
- inkscape:snap-bbox-midpoints="true">
- <inkscape:grid
- type="xygrid"
- id="grid16"
- spacingx="0.26458333"
- spacingy="0.26458333"
- empspacing="4"
- color="#40ff40"
- opacity="0.1254902"
- empcolor="#40ff40"
- empopacity="0.25098039" />
- </sodipodi:namedview>
- <metadata
- id="metadata5">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- <cc:license
- rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
- </cc:Work>
- <cc:License
- rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
- <cc:permits
- rdf:resource="http://creativecommons.org/ns#Reproduction" />
- <cc:permits
- rdf:resource="http://creativecommons.org/ns#Distribution" />
- <cc:requires
- rdf:resource="http://creativecommons.org/ns#Notice" />
- <cc:requires
- rdf:resource="http://creativecommons.org/ns#Attribution" />
- <cc:permits
- rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
- <cc:requires
- rdf:resource="http://creativecommons.org/ns#ShareAlike" />
- </cc:License>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="Layer 2"
- style="display:inline">
- <path
- style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d=""
- id="path7055"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d=""
- id="path7035"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d=""
- id="path7005"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d=""
- id="path5127"
- inkscape:connector-curvature="0" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48.47851181px;line-height:1.25;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#d9d9d9;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- x="67.78315"
- y="85.59491"
- id="text4716"
- transform="scale(1.0078883,0.99217343)"><tspan
- sodipodi:role="line"
- id="tspan4714"
- x="67.78315"
- y="85.59491"
- style="fill:#d9d9d9;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">AUX</tspan></text>
- <flowRoot
- xml:space="preserve"
- id="flowRoot4718"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1"
- transform="scale(0.26458333)"><flowRegion
- id="flowRegion4720"
- style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1"><rect
- id="rect4722"
- width="157.5838"
- height="136.37059"
- x="264.65997"
- y="124.10143"
- style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1" /></flowRegion><flowPara
- id="flowPara4724" /></flowRoot> </g>
-</svg>
diff --git a/android/native/build.gradle b/android/native/build.gradle
index d58a2dcc5..2ddc77135 100644
--- a/android/native/build.gradle
+++ b/android/native/build.gradle
@@ -2,12 +2,12 @@ apply plugin: 'com.android.library'
apply plugin: 'de.undercouch.download'
android {
- compileSdkVersion 29
+ compileSdkVersion 30
buildToolsVersion '30.0.3'
- ndkVersion '22.0.7026061'
+ ndkVersion "$ndk_version"
defaultConfig {
minSdkVersion 16
- targetSdkVersion 29
+ targetSdkVersion 30
externalNativeBuild {
ndkBuild {
arguments '-j' + Runtime.getRuntime().availableProcessors(),
@@ -50,54 +50,19 @@ android {
}
// get precompiled deps
-def folder = 'minetest_android_deps_binaries'
-def deps_ref = "342eb18b7512462585a33bc9eef0b68298087151"
-
task downloadDeps(type: Download) {
- src 'https://github.com/minetest/' + folder + '/archive/' + deps_ref + '.zip'
+ src 'https://github.com/minetest/minetest_android_deps/releases/download/latest/deps.zip'
dest new File(buildDir, 'deps.zip')
overwrite false
}
task getDeps(dependsOn: downloadDeps, type: Copy) {
- def deps = file('deps')
- def f = file("$buildDir/" + folder + "-" + deps_ref)
-
- if (!deps.exists() && !f.exists()) {
+ def deps = new File(buildDir.parent, 'deps')
+ if (!deps.exists()) {
+ deps.mkdir()
from zipTree(downloadDeps.dest)
- into buildDir
- }
-
- doLast {
- if (!deps.exists()) {
- file(f).renameTo(file(deps))
- }
- }
-}
-
-// get sqlite
-def sqlite_ver = '3340000'
-task downloadSqlite(dependsOn: getDeps, type: Download) {
- src 'https://www.sqlite.org/2020/sqlite-amalgamation-' + sqlite_ver + '.zip'
- dest new File(buildDir, 'sqlite.zip')
- overwrite false
-}
-
-task getSqlite(dependsOn: downloadSqlite, type: Copy) {
- def sqlite = file('deps/Android/sqlite')
- def f = file("$buildDir/sqlite-amalgamation-" + sqlite_ver)
-
- if (!sqlite.exists() && !f.exists()) {
- from zipTree(downloadSqlite.dest)
- into buildDir
- }
-
- doLast {
- if (!sqlite.exists()) {
- file(f).renameTo(file(sqlite))
- }
+ into deps
}
}
preBuild.dependsOn getDeps
-preBuild.dependsOn getSqlite
diff --git a/android/native/jni/Android.mk b/android/native/jni/Android.mk
index 73df04945..f8ca74d3c 100644
--- a/android/native/jni/Android.mk
+++ b/android/native/jni/Android.mk
@@ -4,64 +4,82 @@ LOCAL_PATH := $(call my-dir)/..
include $(CLEAR_VARS)
LOCAL_MODULE := Curl
-LOCAL_SRC_FILES := deps/Android/Curl/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libcurl.a
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Curl/libcurl.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
-LOCAL_MODULE := Freetype
-LOCAL_SRC_FILES := deps/Android/Freetype/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libfreetype.a
+LOCAL_MODULE := libmbedcrypto
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Curl/libmbedcrypto.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
-LOCAL_MODULE := Irrlicht
-LOCAL_SRC_FILES := deps/Android/Irrlicht/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libIrrlicht.a
+LOCAL_MODULE := libmbedtls
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Curl/libmbedtls.a
include $(PREBUILT_STATIC_LIBRARY)
-#include $(CLEAR_VARS)
-#LOCAL_MODULE := LevelDB
-#LOCAL_SRC_FILES := deps/Android/LevelDB/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libleveldb.a
-#include $(PREBUILT_STATIC_LIBRARY)
+include $(CLEAR_VARS)
+LOCAL_MODULE := libmbedx509
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Curl/libmbedx509.a
+include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
-LOCAL_MODULE := LuaJIT
-LOCAL_SRC_FILES := deps/Android/LuaJIT/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libluajit.a
+LOCAL_MODULE := Freetype
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Freetype/libfreetype.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := Iconv
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Iconv/libiconv.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
-LOCAL_MODULE := mbedTLS
-LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedtls.a
+LOCAL_MODULE := libcharset
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Iconv/libcharset.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
-LOCAL_MODULE := mbedx509
-LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedx509.a
+LOCAL_MODULE := Irrlicht
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Irrlicht/libIrrlichtMt.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
-LOCAL_MODULE := mbedcrypto
-LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedcrypto.a
+LOCAL_MODULE := LuaJIT
+LOCAL_SRC_FILES := deps/$(APP_ABI)/LuaJIT/libluajit.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := OpenAL
-LOCAL_SRC_FILES := deps/Android/OpenAL-Soft/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libopenal.a
+LOCAL_SRC_FILES := deps/$(APP_ABI)/OpenAL-Soft/libopenal.a
include $(PREBUILT_STATIC_LIBRARY)
-# You can use `OpenSSL and Crypto` instead `mbedTLS mbedx509 mbedcrypto`,
-#but it increase APK size on ~0.7MB
-#include $(CLEAR_VARS)
-#LOCAL_MODULE := OpenSSL
-#LOCAL_SRC_FILES := deps/Android/OpenSSL/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libssl.a
-#include $(PREBUILT_STATIC_LIBRARY)
+include $(CLEAR_VARS)
+LOCAL_MODULE := Gettext
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Gettext/libintl.a
+include $(PREBUILT_STATIC_LIBRARY)
-#include $(CLEAR_VARS)
-#LOCAL_MODULE := Crypto
-#LOCAL_SRC_FILES := deps/Android/OpenSSL/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libcrypto.a
-#include $(PREBUILT_STATIC_LIBRARY)
+include $(CLEAR_VARS)
+LOCAL_MODULE := SQLite3
+LOCAL_SRC_FILES := deps/$(APP_ABI)/SQLite/libsqlite3.a
+include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := Vorbis
-LOCAL_SRC_FILES := deps/Android/Vorbis/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libvorbis.a
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Vorbis/libvorbis.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libvorbisfile
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Vorbis/libvorbisfile.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libogg
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Vorbis/libogg.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := Zstd
+LOCAL_SRC_FILES := deps/$(APP_ABI)/Zstd/libzstd.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
@@ -73,9 +91,9 @@ LOCAL_CFLAGS += \
-DENABLE_GLES=1 \
-DUSE_CURL=1 \
-DUSE_SOUND=1 \
- -DUSE_FREETYPE=1 \
-DUSE_LEVELDB=0 \
-DUSE_LUAJIT=1 \
+ -DUSE_GETTEXT=1 \
-DVERSION_MAJOR=${versionMajor} \
-DVERSION_MINOR=${versionMinor} \
-DVERSION_PATCH=${versionPatch} \
@@ -97,16 +115,16 @@ LOCAL_C_INCLUDES := \
../../src/script \
../../lib/gmp \
../../lib/jsoncpp \
- deps/Android/Curl/include \
- deps/Android/Freetype/include \
- deps/Android/Irrlicht/include \
- deps/Android/LevelDB/include \
- deps/Android/libiconv/include \
- deps/Android/libiconv/libcharset/include \
- deps/Android/LuaJIT/src \
- deps/Android/OpenAL-Soft/include \
- deps/Android/sqlite \
- deps/Android/Vorbis/include
+ deps/$(APP_ABI)/Curl/include \
+ deps/$(APP_ABI)/Freetype/include/freetype2 \
+ deps/$(APP_ABI)/Irrlicht/include \
+ deps/$(APP_ABI)/Gettext/include \
+ deps/$(APP_ABI)/Iconv/include \
+ deps/$(APP_ABI)/LuaJIT/include \
+ deps/$(APP_ABI)/OpenAL-Soft/include \
+ deps/$(APP_ABI)/SQLite/include \
+ deps/$(APP_ABI)/Vorbis/include \
+ deps/$(APP_ABI)/Zstd/include
LOCAL_SRC_FILES := \
$(wildcard ../../src/client/*.cpp) \
@@ -189,25 +207,24 @@ LOCAL_SRC_FILES := \
../../src/voxel.cpp \
../../src/voxelalgorithms.cpp
-# LevelDB backend is disabled
-# ../../src/database/database-leveldb.cpp
-
# GMP
LOCAL_SRC_FILES += ../../lib/gmp/mini-gmp.c
# JSONCPP
LOCAL_SRC_FILES += ../../lib/jsoncpp/jsoncpp.cpp
-# iconv
-LOCAL_SRC_FILES += \
- deps/Android/libiconv/lib/iconv.c \
- deps/Android/libiconv/libcharset/lib/localcharset.c
-
-# SQLite3
-LOCAL_SRC_FILES += deps/Android/sqlite/sqlite3.c
-
-LOCAL_STATIC_LIBRARIES += Curl Freetype Irrlicht OpenAL mbedTLS mbedx509 mbedcrypto Vorbis LuaJIT android_native_app_glue $(PROFILER_LIBS) #LevelDB
-#OpenSSL Crypto
+LOCAL_STATIC_LIBRARIES += \
+ Curl libmbedcrypto libmbedtls libmbedx509 \
+ Freetype \
+ Iconv libcharset \
+ Irrlicht \
+ LuaJIT \
+ OpenAL \
+ Gettext \
+ SQLite3 \
+ Vorbis libvorbisfile libogg \
+ Zstd
+LOCAL_STATIC_LIBRARIES += android_native_app_glue $(PROFILER_LIBS)
LOCAL_LDLIBS := -lEGL -lGLESv1_CM -lGLESv2 -landroid -lOpenSLES
diff --git a/android/native/jni/Application.mk b/android/native/jni/Application.mk
index 82f0148f0..e21bca61c 100644
--- a/android/native/jni/Application.mk
+++ b/android/native/jni/Application.mk
@@ -5,22 +5,22 @@ NDK_TOOLCHAIN_VERSION := clang
APP_SHORT_COMMANDS := true
APP_MODULES := Minetest
-APP_CPPFLAGS := -Ofast -fvisibility=hidden -fexceptions -Wno-deprecated-declarations -Wno-extra-tokens
+APP_CPPFLAGS := -O2 -fvisibility=hidden
ifeq ($(APP_ABI),armeabi-v7a)
-APP_CPPFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb
+APP_CPPFLAGS += -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb
endif
-#ifeq ($(APP_ABI),x86)
-#APP_CPPFLAGS += -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -funroll-loops
-#endif
+ifeq ($(APP_ABI),x86)
+APP_CPPFLAGS += -mssse3 -mfpmath=sse -funroll-loops
+endif
ifndef NDEBUG
-APP_CPPFLAGS := -g -D_DEBUG -O0 -fno-omit-frame-pointer -fexceptions
+APP_CPPFLAGS := -g -Og -fno-omit-frame-pointer
endif
-APP_CFLAGS := $(APP_CPPFLAGS) -Wno-parentheses-equality #-Werror=shorten-64-to-32
-APP_CXXFLAGS := $(APP_CPPFLAGS) -frtti -std=gnu++17
+APP_CFLAGS := $(APP_CPPFLAGS) -Wno-inconsistent-missing-override -Wno-parentheses-equality
+APP_CXXFLAGS := $(APP_CPPFLAGS) -fexceptions -frtti -std=gnu++17
APP_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections,--icf=safe
ifeq ($(APP_ABI),arm64-v8a)
diff --git a/builtin/async/init.lua b/builtin/async/init.lua
index 1b2549685..3803994d6 100644
--- a/builtin/async/init.lua
+++ b/builtin/async/init.lua
@@ -1,16 +1,10 @@
core.log("info", "Initializing Asynchronous environment")
-function core.job_processor(serialized_func, serialized_param)
- local func = loadstring(serialized_func)
+function core.job_processor(func, serialized_param)
local param = core.deserialize(serialized_param)
- local retval = nil
- if type(func) == "function" then
- retval = core.serialize(func(param))
- else
- core.log("error", "ASYNC WORKER: Unable to deserialize function")
- end
+ local retval = core.serialize(func(param))
return retval or core.serialize(nil)
end
diff --git a/builtin/client/chatcommands.lua b/builtin/client/chatcommands.lua
index 0e8d4dd03..a563a6627 100644
--- a/builtin/client/chatcommands.lua
+++ b/builtin/client/chatcommands.lua
@@ -1,6 +1,5 @@
-- Minetest: builtin/client/chatcommands.lua
-
core.register_on_sending_chat_message(function(message)
if message:sub(1,2) == ".." then
return false
@@ -8,7 +7,7 @@ core.register_on_sending_chat_message(function(message)
local first_char = message:sub(1,1)
if first_char == "/" or first_char == "." then
- core.display_chat_message(core.gettext("issued command: ") .. message)
+ core.display_chat_message(core.gettext("Issued command: ") .. message)
end
if first_char ~= "." then
@@ -19,7 +18,7 @@ core.register_on_sending_chat_message(function(message)
param = param or ""
if not cmd then
- core.display_chat_message(core.gettext("-!- Empty command"))
+ core.display_chat_message("-!- " .. core.gettext("Empty command."))
return true
end
@@ -36,7 +35,7 @@ core.register_on_sending_chat_message(function(message)
core.display_chat_message(result)
end
else
- core.display_chat_message(core.gettext("-!- Invalid command: ") .. cmd)
+ core.display_chat_message("-!- " .. core.gettext("Invalid command: ") .. cmd)
end
return true
@@ -66,7 +65,7 @@ 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")
+ return true, core.gettext("The out chat queue is now empty.")
end,
})
diff --git a/builtin/client/death_formspec.lua b/builtin/client/death_formspec.lua
index e755ac5c1..c25c799ab 100644
--- a/builtin/client/death_formspec.lua
+++ b/builtin/client/death_formspec.lua
@@ -2,7 +2,6 @@
-- handled by the engine.
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") .."]"
diff --git a/builtin/client/init.lua b/builtin/client/init.lua
index 9633a7c71..589fe8f24 100644
--- a/builtin/client/init.lua
+++ b/builtin/client/init.lua
@@ -7,5 +7,4 @@ dofile(clientpath .. "register.lua")
dofile(commonpath .. "after.lua")
dofile(commonpath .. "chatcommands.lua")
dofile(clientpath .. "chatcommands.lua")
-dofile(commonpath .. "vector.lua")
dofile(clientpath .. "death_formspec.lua")
diff --git a/builtin/common/after.lua b/builtin/common/after.lua
index e20f292f0..bce262537 100644
--- a/builtin/common/after.lua
+++ b/builtin/common/after.lua
@@ -37,7 +37,14 @@ function core.after(after, func, ...)
arg = {...},
mod_origin = core.get_last_run_mod(),
}
+
jobs[#jobs + 1] = new_job
time_next = math.min(time_next, expire)
- return { cancel = function() new_job.func = function() end end }
+
+ return {
+ cancel = function()
+ new_job.func = function() end
+ new_job.args = {}
+ end
+ }
end
diff --git a/builtin/common/chatcommands.lua b/builtin/common/chatcommands.lua
index 52edda659..7c3da0601 100644
--- a/builtin/common/chatcommands.lua
+++ b/builtin/common/chatcommands.lua
@@ -1,7 +1,47 @@
-- Minetest: builtin/common/chatcommands.lua
+-- For server-side translations (if INIT == "game")
+-- Otherwise, use core.gettext
+local S = core.get_translator("__builtin")
+
core.registered_chatcommands = {}
+-- Interpret the parameters of a command, separating options and arguments.
+-- Input: command, param
+-- command: name of command
+-- param: parameters of command
+-- Returns: opts, args
+-- opts is a string of option letters, or false on error
+-- args is an array with the non-option arguments in order, or an error message
+-- Example: for this command line:
+-- /command a b -cd e f -g
+-- the function would receive:
+-- a b -cd e f -g
+-- and it would return:
+-- "cdg", {"a", "b", "e", "f"}
+-- Negative numbers are taken as arguments. Long options (--option) are
+-- currently rejected as reserved.
+local function getopts(command, param)
+ local opts = ""
+ local args = {}
+ for match in param:gmatch("%S+") do
+ if match:byte(1) == 45 then -- 45 = '-'
+ local second = match:byte(2)
+ if second == 45 then
+ return false, S("Invalid parameters (see /help @1).", command)
+ elseif second and (second < 48 or second > 57) then -- 48 = '0', 57 = '9'
+ opts = opts .. match:sub(2)
+ else
+ -- numeric, add it to args
+ args[#args + 1] = match
+ end
+ else
+ args[#args + 1] = match
+ end
+ end
+ return opts, args
+end
+
function core.register_chatcommand(cmd, def)
def = def or {}
def.params = def.params or ""
@@ -29,35 +69,30 @@ function core.override_chatcommand(name, redefinition)
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
+local function format_help_line(cmd, def)
+ local cmd_marker = INIT == "client" and "." or "/"
+ 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
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
+ local opts, args = getopts("help", param)
+ if not opts then
+ return false, args
+ end
+ if #args > 1 then
+ return false, S("Too many arguments, try using just /help <command>")
end
- if param == "" then
+ local use_gui = INIT ~= "client" and core.get_player_by_name(name)
+ use_gui = use_gui and not opts:find("t")
+
+ if #args == 0 and not use_gui then
local cmds = {}
for cmd, def in pairs(core.registered_chatcommands) do
if INIT == "client" or core.check_player_privs(name, def.privs) then
@@ -65,10 +100,25 @@ local function do_help_cmd(name, param)
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 msg
+ if INIT == "game" then
+ msg = S("Available commands: @1",
+ table.concat(cmds, " ")) .. "\n"
+ .. S("Use '/help <cmd>' to get more "
+ .. "information, or '/help all' to list "
+ .. "everything.")
+ else
+ msg = core.gettext("Available commands: ")
+ .. table.concat(cmds, " ") .. "\n"
+ .. core.gettext("Use '.help <cmd>' to get more "
+ .. "information, or '.help all' to list "
+ .. "everything.")
+ end
+ return true, msg
+ elseif #args == 0 or (args[1] == "all" and use_gui) then
+ core.show_general_help_formspec(name)
+ return true
+ elseif args[1] == "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
@@ -76,19 +126,35 @@ local function do_help_cmd(name, param)
end
end
table.sort(cmds)
- return true, gettext("Available commands:").."\n"..table.concat(cmds, "\n")
- elseif INIT == "game" and param == "privs" then
+ local msg
+ if INIT == "game" then
+ msg = S("Available commands:")
+ else
+ msg = core.gettext("Available commands:")
+ end
+ return true, msg.."\n"..table.concat(cmds, "\n")
+ elseif INIT == "game" and args[1] == "privs" then
+ if use_gui then
+ core.show_privs_help_formspec(name)
+ return true
+ end
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")
+ return true, S("Available privileges:").."\n"..table.concat(privs, "\n")
else
- local cmd = param
+ local cmd = args[1]
local def = core.registered_chatcommands[cmd]
if not def then
- return false, gettext("Command not available: ")..cmd
+ local msg
+ if INIT == "game" then
+ msg = S("Command not available: @1", cmd)
+ else
+ msg = core.gettext("Command not available: ") .. cmd
+ end
+ return false, msg
else
return true, format_help_line(cmd, def)
end
@@ -97,16 +163,16 @@ end
if INIT == "client" then
core.register_chatcommand("help", {
- params = gettext("[all | <cmd>]"),
- description = gettext("Get help for commands"),
+ params = core.gettext("[all | <cmd>]"),
+ description = core.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",
+ params = S("[all | privs | <cmd>] [-t]"),
+ description = S("Get help for commands or list privileges (-t: output in chat)"),
func = do_help_cmd,
})
end
diff --git a/builtin/common/information_formspecs.lua b/builtin/common/information_formspecs.lua
index 3e2f1f079..3405263bf 100644
--- a/builtin/common/information_formspecs.lua
+++ b/builtin/common/information_formspecs.lua
@@ -20,7 +20,8 @@ local LIST_FORMSPEC_DESCRIPTION = [[
button_exit[5,7;3,1;quit;%s]
]]
-local formspec_escape = core.formspec_escape
+local F = core.formspec_escape
+local S = core.get_translator("__builtin")
local check_player_privs = core.check_player_privs
@@ -51,22 +52,23 @@ core.after(0, load_mod_command_tree)
local function build_chatcommands_formspec(name, sel, copy)
local rows = {}
- rows[1] = "#FFF,0,Command,Parameters"
+ rows[1] = "#FFF,0,"..F(S("Command"))..","..F(S("Parameters"))
- local description = "For more information, click on any entry in the list.\n" ..
- "Double-click to copy the entry to the chat history."
+ local description = S("For more information, click on "
+ .. "any entry in the list.").. "\n" ..
+ S("Double-click to copy the entry to the chat history.")
for i, data in ipairs(mod_cmds) do
- rows[#rows + 1] = COLOR_BLUE .. ",0," .. formspec_escape(data[1]) .. ","
+ rows[#rows + 1] = COLOR_BLUE .. ",0," .. F(data[1]) .. ","
for j, cmds in ipairs(data[2]) do
local has_priv = check_player_privs(name, cmds[2].privs)
rows[#rows + 1] = ("%s,1,%s,%s"):format(
has_priv and COLOR_GREEN or COLOR_GRAY,
- cmds[1], formspec_escape(cmds[2].params))
+ cmds[1], F(cmds[2].params))
if sel == #rows then
description = cmds[2].description
if copy then
- core.chat_send_player(name, ("Command: %s %s"):format(
+ core.chat_send_player(name, S("Command: @1 @2",
core.colorize("#0FF", "/" .. cmds[1]), cmds[2].params))
end
end
@@ -74,9 +76,9 @@ local function build_chatcommands_formspec(name, sel, copy)
end
return LIST_FORMSPEC_DESCRIPTION:format(
- "Available commands: (see also: /help <cmd>)",
+ F(S("Available commands: (see also: /help <cmd>)")),
table.concat(rows, ","), sel or 0,
- description, "Close"
+ F(description), F(S("Close"))
)
end
@@ -91,19 +93,19 @@ local function build_privs_formspec(name)
table.sort(privs, function(a, b) return a[1] < b[1] end)
local rows = {}
- rows[1] = "#FFF,0,Privilege,Description"
+ rows[1] = "#FFF,0,"..F(S("Privilege"))..","..F(S("Description"))
local player_privs = core.get_player_privs(name)
for i, data in ipairs(privs) do
rows[#rows + 1] = ("%s,0,%s,%s"):format(
player_privs[data[1]] and COLOR_GREEN or COLOR_GRAY,
- data[1], formspec_escape(data[2].description))
+ data[1], F(data[2].description))
end
return LIST_FORMSPEC:format(
- "Available privileges:",
+ F(S("Available privileges:")),
table.concat(rows, ","),
- "Close"
+ F(S("Close"))
)
end
@@ -123,30 +125,12 @@ core.register_on_player_receive_fields(function(player, formname, fields)
end
end)
-
-local help_command = core.registered_chatcommands["help"]
-local old_help_func = help_command.func
-
-help_command.func = function(name, param)
- local admin = core.settings:get("name")
-
- -- If the admin ran help, put the output in the chat buffer as well to
- -- work with the server terminal
- if param == "privs" then
- core.show_formspec(name, "__builtin:help_privs",
- build_privs_formspec(name))
- if name ~= admin then
- return true
- end
- end
- if param == "" or param == "all" then
- core.show_formspec(name, "__builtin:help_cmds",
- build_chatcommands_formspec(name))
- if name ~= admin then
- return true
- end
- end
-
- return old_help_func(name, param)
+function core.show_general_help_formspec(name)
+ core.show_formspec(name, "__builtin:help_cmds",
+ build_chatcommands_formspec(name))
end
+function core.show_privs_help_formspec(name)
+ core.show_formspec(name, "__builtin:help_privs",
+ build_privs_formspec(name))
+end
diff --git a/builtin/common/misc_helpers.lua b/builtin/common/misc_helpers.lua
index 0f3897f47..f5f89acd7 100644
--- a/builtin/common/misc_helpers.lua
+++ b/builtin/common/misc_helpers.lua
@@ -209,14 +209,7 @@ end
--------------------------------------------------------------------------------
function math.hypot(x, y)
- local t
- x = math.abs(x)
- y = math.abs(y)
- t = math.min(x, y)
- x = math.max(x, y)
- if x == 0 then return 0 end
- t = t / x
- return x * math.sqrt(1 + t * t)
+ return math.sqrt(x * x + y * y)
end
--------------------------------------------------------------------------------
@@ -244,6 +237,15 @@ function math.factorial(x)
return v
end
+
+function math.round(x)
+ if x >= 0 then
+ return math.floor(x + 0.5)
+ end
+ return math.ceil(x - 0.5)
+end
+
+
function core.formspec_escape(text)
if text ~= nil then
text = string.gsub(text,"\\","\\\\")
@@ -423,21 +425,19 @@ function core.string_to_pos(value)
return nil
end
- local p = {}
- p.x, p.y, p.z = string.match(value, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
- if p.x and p.y and p.z then
- p.x = tonumber(p.x)
- p.y = tonumber(p.y)
- p.z = tonumber(p.z)
- return p
+ local x, y, z = string.match(value, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
+ if x and y and z then
+ x = tonumber(x)
+ y = tonumber(y)
+ z = tonumber(z)
+ return vector.new(x, y, z)
end
- p = {}
- p.x, p.y, p.z = string.match(value, "^%( *([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+) *%)$")
- if p.x and p.y and p.z then
- p.x = tonumber(p.x)
- p.y = tonumber(p.y)
- p.z = tonumber(p.z)
- return p
+ x, y, z = string.match(value, "^%( *([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+) *%)$")
+ if x and y and z then
+ x = tonumber(x)
+ y = tonumber(y)
+ z = tonumber(z)
+ return vector.new(x, y, z)
end
return nil
end
@@ -532,7 +532,7 @@ if INIT == "mainmenu" then
end
end
-if INIT == "client" or INIT == "mainmenu" then
+if core.gettext then -- for client and mainmenu
function fgettext_ne(text, ...)
text = core.gettext(text)
local arg = {n=select('#', ...), ...}
diff --git a/builtin/common/tests/misc_helpers_spec.lua b/builtin/common/tests/misc_helpers_spec.lua
index bb9d13e7f..b16987f0b 100644
--- a/builtin/common/tests/misc_helpers_spec.lua
+++ b/builtin/common/tests/misc_helpers_spec.lua
@@ -1,4 +1,5 @@
_G.core = {}
+dofile("builtin/common/vector.lua")
dofile("builtin/common/misc_helpers.lua")
describe("string", function()
@@ -55,8 +56,8 @@ end)
describe("pos", function()
it("from string", function()
- assert.same({ x = 10, y = 5.1, z = -2}, core.string_to_pos("10.0, 5.1, -2"))
- assert.same({ x = 10, y = 5.1, z = -2}, core.string_to_pos("( 10.0, 5.1, -2)"))
+ assert.equal(vector.new(10, 5.1, -2), core.string_to_pos("10.0, 5.1, -2"))
+ assert.equal(vector.new(10, 5.1, -2), core.string_to_pos("( 10.0, 5.1, -2)"))
assert.is_nil(core.string_to_pos("asd, 5, -2)"))
end)
diff --git a/builtin/common/tests/serialize_spec.lua b/builtin/common/tests/serialize_spec.lua
index 17c6a60f7..e46b7dcc5 100644
--- a/builtin/common/tests/serialize_spec.lua
+++ b/builtin/common/tests/serialize_spec.lua
@@ -3,6 +3,7 @@ _G.core = {}
_G.setfenv = require 'busted.compatibility'.setfenv
dofile("builtin/common/serialize.lua")
+dofile("builtin/common/vector.lua")
describe("serialize", function()
it("works", function()
@@ -53,4 +54,16 @@ describe("serialize", function()
assert.is_nil(test_out.func)
assert.equals(test_out.foo, "bar")
end)
+
+ it("vectors work", function()
+ local v = vector.new(1, 2, 3)
+ assert.same({{x = 1, y = 2, z = 3}}, core.deserialize(core.serialize({v})))
+ assert.same({x = 1, y = 2, z = 3}, core.deserialize(core.serialize(v)))
+
+ -- abuse
+ v = vector.new(1, 2, 3)
+ v.a = "bla"
+ assert.same({x = 1, y = 2, z = 3, a = "bla"},
+ core.deserialize(core.serialize(v)))
+ end)
end)
diff --git a/builtin/common/tests/vector_spec.lua b/builtin/common/tests/vector_spec.lua
index 0f287363a..2f72f3383 100644
--- a/builtin/common/tests/vector_spec.lua
+++ b/builtin/common/tests/vector_spec.lua
@@ -4,14 +4,20 @@ dofile("builtin/common/vector.lua")
describe("vector", function()
describe("new()", function()
it("constructs", function()
- assert.same({ x = 0, y = 0, z = 0 }, vector.new())
- assert.same({ x = 1, y = 2, z = 3 }, vector.new(1, 2, 3))
- assert.same({ x = 3, y = 2, z = 1 }, vector.new({ x = 3, y = 2, z = 1 }))
+ assert.same({x = 0, y = 0, z = 0}, vector.new())
+ assert.same({x = 1, y = 2, z = 3}, vector.new(1, 2, 3))
+ assert.same({x = 3, y = 2, z = 1}, vector.new({x = 3, y = 2, z = 1}))
+
+ assert.is_true(vector.check(vector.new()))
+ assert.is_true(vector.check(vector.new(1, 2, 3)))
+ assert.is_true(vector.check(vector.new({x = 3, y = 2, z = 1})))
local input = vector.new({ x = 3, y = 2, z = 1 })
local output = vector.new(input)
assert.same(input, output)
- assert.are_not.equal(input, output)
+ assert.equal(input, output)
+ assert.is_false(rawequal(input, output))
+ assert.equal(input, input:new())
end)
it("throws on invalid input", function()
@@ -25,27 +31,286 @@ describe("vector", function()
end)
end)
- it("equal()", function()
- local function assertE(a, b)
- assert.is_true(vector.equals(a, b))
- end
- local function assertNE(a, b)
- assert.is_false(vector.equals(a, b))
- end
+ it("zero()", function()
+ assert.same({x = 0, y = 0, z = 0}, vector.zero())
+ assert.same(vector.new(), vector.zero())
+ assert.equal(vector.new(), vector.zero())
+ assert.is_true(vector.check(vector.zero()))
+ end)
- assertE({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
- assertE({x = -1, y = 0, z = 1}, {x = -1, y = 0, z = 1})
- local a = { x = 2, y = 4, z = -10 }
- assertE(a, a)
- assertNE({x = -1, y = 0, z = 1}, a)
+ it("copy()", function()
+ local v = vector.new(1, 2, 3)
+ assert.same(v, vector.copy(v))
+ assert.same(vector.new(v), vector.copy(v))
+ assert.equal(vector.new(v), vector.copy(v))
+ assert.is_true(vector.check(vector.copy(v)))
end)
- it("add()", function()
- assert.same({ x = 2, y = 4, z = 6 }, vector.add(vector.new(1, 2, 3), { x = 1, y = 2, z = 3 }))
+ it("indexes", function()
+ local some_vector = vector.new(24, 42, 13)
+ assert.equal(24, some_vector[1])
+ assert.equal(24, some_vector.x)
+ assert.equal(42, some_vector[2])
+ assert.equal(42, some_vector.y)
+ assert.equal(13, some_vector[3])
+ assert.equal(13, some_vector.z)
+
+ some_vector[1] = 100
+ assert.equal(100, some_vector.x)
+ some_vector.x = 101
+ assert.equal(101, some_vector[1])
+
+ some_vector[2] = 100
+ assert.equal(100, some_vector.y)
+ some_vector.y = 102
+ assert.equal(102, some_vector[2])
+
+ some_vector[3] = 100
+ assert.equal(100, some_vector.z)
+ some_vector.z = 103
+ assert.equal(103, some_vector[3])
+ end)
+
+ it("direction()", function()
+ local a = vector.new(1, 0, 0)
+ local b = vector.new(1, 42, 0)
+ assert.equal(vector.new(0, 1, 0), vector.direction(a, b))
+ assert.equal(vector.new(0, 1, 0), a:direction(b))
+ end)
+
+ it("distance()", function()
+ local a = vector.new(1, 0, 0)
+ local b = vector.new(3, 42, 9)
+ assert.is_true(math.abs(43 - vector.distance(a, b)) < 1.0e-12)
+ assert.is_true(math.abs(43 - a:distance(b)) < 1.0e-12)
+ assert.equal(0, vector.distance(a, a))
+ assert.equal(0, b:distance(b))
+ end)
+
+ it("length()", function()
+ local a = vector.new(0, 0, -23)
+ assert.equal(0, vector.length(vector.new()))
+ assert.equal(23, vector.length(a))
+ assert.equal(23, a:length())
+ end)
+
+ it("normalize()", function()
+ local a = vector.new(0, 0, -23)
+ assert.equal(vector.new(0, 0, -1), vector.normalize(a))
+ assert.equal(vector.new(0, 0, -1), a:normalize())
+ assert.equal(vector.new(), vector.normalize(vector.new()))
+ end)
+
+ it("floor()", function()
+ local a = vector.new(0.1, 0.9, -0.5)
+ assert.equal(vector.new(0, 0, -1), vector.floor(a))
+ assert.equal(vector.new(0, 0, -1), a:floor())
+ end)
+
+ it("round()", function()
+ local a = vector.new(0.1, 0.9, -0.5)
+ assert.equal(vector.new(0, 1, -1), vector.round(a))
+ assert.equal(vector.new(0, 1, -1), a:round())
+ end)
+
+ it("apply()", function()
+ local i = 0
+ local f = function(x)
+ i = i + 1
+ return x + i
+ end
+ local a = vector.new(0.1, 0.9, -0.5)
+ assert.equal(vector.new(1, 1, 0), vector.apply(a, math.ceil))
+ assert.equal(vector.new(1, 1, 0), a:apply(math.ceil))
+ assert.equal(vector.new(0.1, 0.9, 0.5), vector.apply(a, math.abs))
+ assert.equal(vector.new(0.1, 0.9, 0.5), a:apply(math.abs))
+ assert.equal(vector.new(1.1, 2.9, 2.5), vector.apply(a, f))
+ assert.equal(vector.new(4.1, 5.9, 5.5), a:apply(f))
+ end)
+
+ it("equals()", function()
+ local function assertE(a, b)
+ assert.is_true(vector.equals(a, b))
+ end
+ local function assertNE(a, b)
+ assert.is_false(vector.equals(a, b))
+ end
+
+ assertE({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
+ assertE({x = -1, y = 0, z = 1}, {x = -1, y = 0, z = 1})
+ assertE({x = -1, y = 0, z = 1}, vector.new(-1, 0, 1))
+ local a = {x = 2, y = 4, z = -10}
+ assertE(a, a)
+ assertNE({x = -1, y = 0, z = 1}, a)
+
+ assert.equal(vector.new(1, 2, 3), vector.new(1, 2, 3))
+ assert.is_true(vector.new(1, 2, 3):equals(vector.new(1, 2, 3)))
+ assert.not_equal(vector.new(1, 2, 3), vector.new(1, 2, 4))
+ assert.is_true(vector.new(1, 2, 3) == vector.new(1, 2, 3))
+ assert.is_false(vector.new(1, 2, 3) == vector.new(1, 3, 3))
+ end)
+
+ it("metatable is same", function()
+ local a = vector.new()
+ local b = vector.new(1, 2, 3)
+
+ assert.equal(true, vector.check(a))
+ assert.equal(true, vector.check(b))
+
+ assert.equal(vector.metatable, getmetatable(a))
+ assert.equal(vector.metatable, getmetatable(b))
+ assert.equal(vector.metatable, a.metatable)
+ end)
+
+ it("sort()", function()
+ local a = vector.new(1, 2, 3)
+ local b = vector.new(0.5, 232, -2)
+ local sorted = {vector.new(0.5, 2, -2), vector.new(1, 232, 3)}
+ assert.same(sorted, {vector.sort(a, b)})
+ assert.same(sorted, {a:sort(b)})
+ end)
+
+ it("angle()", function()
+ assert.equal(math.pi, vector.angle(vector.new(-1, -2, -3), vector.new(1, 2, 3)))
+ assert.equal(math.pi/2, vector.new(0, 1, 0):angle(vector.new(1, 0, 0)))
+ end)
+
+ it("dot()", function()
+ assert.equal(-14, vector.dot(vector.new(-1, -2, -3), vector.new(1, 2, 3)))
+ assert.equal(0, vector.new():dot(vector.new(1, 2, 3)))
+ end)
+
+ it("cross()", function()
+ local a = vector.new(-1, -2, 0)
+ local b = vector.new(1, 2, 3)
+ assert.equal(vector.new(-6, 3, 0), vector.cross(a, b))
+ assert.equal(vector.new(-6, 3, 0), a:cross(b))
end)
it("offset()", function()
- assert.same({ x = 41, y = 52, z = 63 }, vector.offset(vector.new(1, 2, 3), 40, 50, 60))
+ assert.same({x = 41, y = 52, z = 63}, vector.offset(vector.new(1, 2, 3), 40, 50, 60))
+ assert.equal(vector.new(41, 52, 63), vector.offset(vector.new(1, 2, 3), 40, 50, 60))
+ assert.equal(vector.new(41, 52, 63), vector.new(1, 2, 3):offset(40, 50, 60))
+ end)
+
+ it("is()", function()
+ local some_table1 = {foo = 13, [42] = 1, "bar", 2}
+ local some_table2 = {1, 2, 3}
+ local some_table3 = {x = 1, 2, 3}
+ local some_table4 = {1, 2, z = 3}
+ local old = {x = 1, y = 2, z = 3}
+ local real = vector.new(1, 2, 3)
+
+ assert.is_false(vector.check(nil))
+ assert.is_false(vector.check(1))
+ assert.is_false(vector.check(true))
+ assert.is_false(vector.check("foo"))
+ assert.is_false(vector.check(some_table1))
+ assert.is_false(vector.check(some_table2))
+ assert.is_false(vector.check(some_table3))
+ assert.is_false(vector.check(some_table4))
+ assert.is_false(vector.check(old))
+ assert.is_true(vector.check(real))
+ assert.is_true(real:check())
+ end)
+
+ it("global pairs", function()
+ local out = {}
+ local vec = vector.new(10, 20, 30)
+ for k, v in pairs(vec) do
+ out[k] = v
+ end
+ assert.same({x = 10, y = 20, z = 30}, out)
+ end)
+
+ it("abusing works", function()
+ local v = vector.new(1, 2, 3)
+ v.a = 1
+ assert.equal(1, v.a)
+
+ local a_is_there = false
+ for key, value in pairs(v) do
+ if key == "a" then
+ a_is_there = true
+ assert.equal(value, 1)
+ break
+ end
+ end
+ assert.is_true(a_is_there)
+ end)
+
+ it("add()", function()
+ local a = vector.new(1, 2, 3)
+ local b = vector.new(1, 4, 3)
+ local c = vector.new(2, 6, 6)
+ assert.equal(c, vector.add(a, {x = 1, y = 4, z = 3}))
+ assert.equal(c, vector.add(a, b))
+ assert.equal(c, a:add(b))
+ assert.equal(c, a + b)
+ assert.equal(c, b + a)
+ end)
+
+ it("subtract()", function()
+ local a = vector.new(1, 2, 3)
+ local b = vector.new(2, 4, 3)
+ local c = vector.new(-1, -2, 0)
+ assert.equal(c, vector.subtract(a, {x = 2, y = 4, z = 3}))
+ assert.equal(c, vector.subtract(a, b))
+ assert.equal(c, a:subtract(b))
+ assert.equal(c, a - b)
+ assert.equal(c, -b + a)
+ end)
+
+ it("multiply()", function()
+ local a = vector.new(1, 2, 3)
+ local b = vector.new(2, 4, 3)
+ local c = vector.new(2, 8, 9)
+ local s = 2
+ local d = vector.new(2, 4, 6)
+ assert.equal(c, vector.multiply(a, {x = 2, y = 4, z = 3}))
+ assert.equal(c, vector.multiply(a, b))
+ assert.equal(d, vector.multiply(a, s))
+ assert.equal(d, a:multiply(s))
+ assert.equal(d, a * s)
+ assert.equal(d, s * a)
+ assert.equal(-a, -1 * a)
+ end)
+
+ it("divide()", function()
+ local a = vector.new(1, 2, 3)
+ local b = vector.new(2, 4, 3)
+ local c = vector.new(0.5, 0.5, 1)
+ local s = 2
+ local d = vector.new(0.5, 1, 1.5)
+ assert.equal(c, vector.divide(a, {x = 2, y = 4, z = 3}))
+ assert.equal(c, vector.divide(a, b))
+ assert.equal(d, vector.divide(a, s))
+ assert.equal(d, a:divide(s))
+ assert.equal(d, a / s)
+ assert.equal(d, 1/s * a)
+ assert.equal(-a, a / -1)
+ end)
+
+ it("to_string()", function()
+ local v = vector.new(1, 2, 3.14)
+ assert.same("(1, 2, 3.14)", vector.to_string(v))
+ assert.same("(1, 2, 3.14)", v:to_string())
+ assert.same("(1, 2, 3.14)", tostring(v))
+ end)
+
+ it("from_string()", function()
+ local v = vector.new(1, 2, 3.14)
+ assert.is_true(vector.check(vector.from_string("(1, 2, 3.14)")))
+ assert.same({v, 13}, {vector.from_string("(1, 2, 3.14)")})
+ assert.same({v, 12}, {vector.from_string("(1,2 ,3.14)")})
+ assert.same({v, 12}, {vector.from_string("(1,2,3.14,)")})
+ assert.same({v, 11}, {vector.from_string("(1 2 3.14)")})
+ assert.same({v, 15}, {vector.from_string("( 1, 2, 3.14 )")})
+ assert.same({v, 15}, {vector.from_string(" ( 1, 2, 3.14) ")})
+ assert.same({vector.new(), 8}, {vector.from_string("(0,0,0) ( 1, 2, 3.14) ")})
+ assert.same({v, 22}, {vector.from_string("(0,0,0) ( 1, 2, 3.14) ", 8)})
+ assert.same({v, 22}, {vector.from_string("(0,0,0) ( 1, 2, 3.14) ", 9)})
+ assert.same(nil, vector.from_string("nothing"))
end)
-- This function is needed because of floating point imprecision.
diff --git a/builtin/common/vector.lua b/builtin/common/vector.lua
index d6437deda..581d014e0 100644
--- a/builtin/common/vector.lua
+++ b/builtin/common/vector.lua
@@ -1,73 +1,126 @@
+--[[
+Vector helpers
+Note: The vector.*-functions must be able to accept old vectors that had no metatables
+]]
+
+-- localize functions
+local setmetatable = setmetatable
vector = {}
+local metatable = {}
+vector.metatable = metatable
+
+local xyz = {"x", "y", "z"}
+
+-- only called when rawget(v, key) returns nil
+function metatable.__index(v, key)
+ return rawget(v, xyz[key]) or vector[key]
+end
+
+-- only called when rawget(v, key) returns nil
+function metatable.__newindex(v, key, value)
+ rawset(v, xyz[key] or key, value)
+end
+
+-- constructors
+
+local function fast_new(x, y, z)
+ return setmetatable({x = x, y = y, z = z}, metatable)
+end
+
function vector.new(a, b, c)
+ if a and b and c then
+ return fast_new(a, b, c)
+ end
+
+ -- deprecated, use vector.copy and vector.zero directly
if type(a) == "table" then
- assert(a.x and a.y and a.z, "Invalid vector passed to vector.new()")
- return {x=a.x, y=a.y, z=a.z}
- elseif a then
- assert(b and c, "Invalid arguments for vector.new()")
- return {x=a, y=b, z=c}
+ return vector.copy(a)
+ else
+ assert(not a, "Invalid arguments for vector.new()")
+ return vector.zero()
+ end
+end
+
+function vector.zero()
+ return fast_new(0, 0, 0)
+end
+
+function vector.copy(v)
+ assert(v.x and v.y and v.z, "Invalid vector passed to vector.copy()")
+ return fast_new(v.x, v.y, v.z)
+end
+
+function vector.from_string(s, init)
+ local x, y, z, np = string.match(s, "^%s*%(%s*([^%s,]+)%s*[,%s]%s*([^%s,]+)%s*[,%s]" ..
+ "%s*([^%s,]+)%s*[,%s]?%s*%)()", init)
+ x = tonumber(x)
+ y = tonumber(y)
+ z = tonumber(z)
+ if not (x and y and z) then
+ return nil
end
- return {x=0, y=0, z=0}
+ return fast_new(x, y, z), np
+end
+
+function vector.to_string(v)
+ return string.format("(%g, %g, %g)", v.x, v.y, v.z)
end
+metatable.__tostring = vector.to_string
function vector.equals(a, b)
return a.x == b.x and
a.y == b.y and
a.z == b.z
end
+metatable.__eq = vector.equals
+
+-- unary operations
function vector.length(v)
- return math.hypot(v.x, math.hypot(v.y, v.z))
+ return math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z)
end
+-- Note: we can not use __len because it is already used for primitive table length
function vector.normalize(v)
local len = vector.length(v)
if len == 0 then
- return {x=0, y=0, z=0}
+ return fast_new(0, 0, 0)
else
return vector.divide(v, len)
end
end
function vector.floor(v)
- return {
- x = math.floor(v.x),
- y = math.floor(v.y),
- z = math.floor(v.z)
- }
+ return vector.apply(v, math.floor)
end
function vector.round(v)
- return {
- x = math.floor(v.x + 0.5),
- y = math.floor(v.y + 0.5),
- z = math.floor(v.z + 0.5)
- }
+ return fast_new(
+ math.round(v.x),
+ math.round(v.y),
+ math.round(v.z)
+ )
end
function vector.apply(v, func)
- return {
- x = func(v.x),
- y = func(v.y),
- z = func(v.z)
- }
+ return fast_new(
+ func(v.x),
+ func(v.y),
+ func(v.z)
+ )
end
function vector.distance(a, b)
local x = a.x - b.x
local y = a.y - b.y
local z = a.z - b.z
- return math.hypot(x, math.hypot(y, z))
+ return math.sqrt(x * x + y * y + z * z)
end
function vector.direction(pos1, pos2)
- return vector.normalize({
- x = pos2.x - pos1.x,
- y = pos2.y - pos1.y,
- z = pos2.z - pos1.z
- })
+ return vector.subtract(pos2, pos1):normalize()
end
function vector.angle(a, b)
@@ -82,70 +135,137 @@ function vector.dot(a, b)
end
function vector.cross(a, b)
- return {
- x = a.y * b.z - a.z * b.y,
- y = a.z * b.x - a.x * b.z,
- z = a.x * b.y - a.y * b.x
- }
+ return fast_new(
+ a.y * b.z - a.z * b.y,
+ a.z * b.x - a.x * b.z,
+ a.x * b.y - a.y * b.x
+ )
end
+function metatable.__unm(v)
+ return fast_new(-v.x, -v.y, -v.z)
+end
+
+-- add, sub, mul, div operations
+
function vector.add(a, b)
if type(b) == "table" then
- return {x = a.x + b.x,
- y = a.y + b.y,
- z = a.z + b.z}
+ return fast_new(
+ a.x + b.x,
+ a.y + b.y,
+ a.z + b.z
+ )
else
- return {x = a.x + b,
- y = a.y + b,
- z = a.z + b}
+ return fast_new(
+ a.x + b,
+ a.y + b,
+ a.z + b
+ )
end
end
+function metatable.__add(a, b)
+ return fast_new(
+ a.x + b.x,
+ a.y + b.y,
+ a.z + b.z
+ )
+end
function vector.subtract(a, b)
if type(b) == "table" then
- return {x = a.x - b.x,
- y = a.y - b.y,
- z = a.z - b.z}
+ return fast_new(
+ a.x - b.x,
+ a.y - b.y,
+ a.z - b.z
+ )
else
- return {x = a.x - b,
- y = a.y - b,
- z = a.z - b}
+ return fast_new(
+ a.x - b,
+ a.y - b,
+ a.z - b
+ )
end
end
+function metatable.__sub(a, b)
+ return fast_new(
+ a.x - b.x,
+ a.y - b.y,
+ a.z - b.z
+ )
+end
function vector.multiply(a, b)
if type(b) == "table" then
- return {x = a.x * b.x,
- y = a.y * b.y,
- z = a.z * b.z}
+ return fast_new(
+ a.x * b.x,
+ a.y * b.y,
+ a.z * b.z
+ )
+ else
+ return fast_new(
+ a.x * b,
+ a.y * b,
+ a.z * b
+ )
+ end
+end
+function metatable.__mul(a, b)
+ if type(a) == "table" then
+ return fast_new(
+ a.x * b,
+ a.y * b,
+ a.z * b
+ )
else
- return {x = a.x * b,
- y = a.y * b,
- z = a.z * b}
+ return fast_new(
+ a * b.x,
+ a * b.y,
+ a * b.z
+ )
end
end
function vector.divide(a, b)
if type(b) == "table" then
- return {x = a.x / b.x,
- y = a.y / b.y,
- z = a.z / b.z}
+ return fast_new(
+ a.x / b.x,
+ a.y / b.y,
+ a.z / b.z
+ )
else
- return {x = a.x / b,
- y = a.y / b,
- z = a.z / b}
+ return fast_new(
+ a.x / b,
+ a.y / b,
+ a.z / b
+ )
end
end
+function metatable.__div(a, b)
+ -- scalar/vector makes no sense
+ return fast_new(
+ a.x / b,
+ a.y / b,
+ a.z / b
+ )
+end
+
+-- misc stuff
function vector.offset(v, x, y, z)
- return {x = v.x + x,
- y = v.y + y,
- z = v.z + z}
+ return fast_new(
+ v.x + x,
+ v.y + y,
+ v.z + z
+ )
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)}
+ return fast_new(math.min(a.x, b.x), math.min(a.y, b.y), math.min(a.z, b.z)),
+ fast_new(math.max(a.x, b.x), math.max(a.y, b.y), math.max(a.z, b.z))
+end
+
+function vector.check(v)
+ return getmetatable(v) == metatable
end
local function sin(x)
@@ -213,7 +333,7 @@ end
function vector.dir_to_rotation(forward, up)
forward = vector.normalize(forward)
- local rot = {x = math.asin(forward.y), y = -math.atan2(forward.x, forward.z), z = 0}
+ local rot = vector.new(math.asin(forward.y), -math.atan2(forward.x, forward.z), 0)
if not up then
return rot
end
@@ -221,7 +341,7 @@ function vector.dir_to_rotation(forward, up)
"Invalid vectors passed to vector.dir_to_rotation().")
up = vector.normalize(up)
-- Calculate vector pointing up with roll = 0, just based on forward vector.
- local forwup = vector.rotate({x = 0, y = 1, z = 0}, rot)
+ local forwup = vector.rotate(vector.new(0, 1, 0), rot)
-- 'forwup' and 'up' are now in a plane with 'forward' as normal.
-- The angle between them is the absolute of the roll value we're looking for.
rot.z = vector.angle(forwup, up)
diff --git a/builtin/fstk/tabview.lua b/builtin/fstk/tabview.lua
index 3715e231b..424d329fb 100644
--- a/builtin/fstk/tabview.lua
+++ b/builtin/fstk/tabview.lua
@@ -58,26 +58,20 @@ end
--------------------------------------------------------------------------------
local function get_formspec(self)
- local formspec = ""
+ if self.hidden or (self.parent ~= nil and self.parent.hidden) then
+ return ""
+ end
+ local tab = self.tablist[self.last_tab_index]
- if not self.hidden and (self.parent == nil or not self.parent.hidden) then
+ local content, prepend = tab.get_formspec(self, tab.name, tab.tabdata, tab.tabsize)
- if self.parent == nil then
- local tsize = self.tablist[self.last_tab_index].tabsize or
- {width=self.width, height=self.height}
- formspec = formspec ..
- string.format("size[%f,%f,%s]",tsize.width,tsize.height,
- dump(self.fixed_size))
- end
- formspec = formspec .. self:tab_header()
- formspec = formspec ..
- self.tablist[self.last_tab_index].get_formspec(
- self,
- self.tablist[self.last_tab_index].name,
- self.tablist[self.last_tab_index].tabdata,
- self.tablist[self.last_tab_index].tabsize
- )
+ if self.parent == nil and not prepend then
+ local tsize = tab.tabsize or {width=self.width, height=self.height}
+ prepend = string.format("size[%f,%f,%s]", tsize.width, tsize.height,
+ dump(self.fixed_size))
end
+
+ local formspec = (prepend or "") .. self:tab_header() .. content
return formspec
end
@@ -97,14 +91,9 @@ local function handle_buttons(self,fields)
return true
end
- if self.tablist[self.last_tab_index].button_handler ~= nil then
- return
- self.tablist[self.last_tab_index].button_handler(
- self,
- fields,
- self.tablist[self.last_tab_index].name,
- self.tablist[self.last_tab_index].tabdata
- )
+ local tab = self.tablist[self.last_tab_index]
+ if tab.button_handler ~= nil then
+ return tab.button_handler(self, fields, tab.name, tab.tabdata)
end
return false
@@ -122,14 +111,9 @@ local function handle_events(self,event)
return true
end
- if self.tablist[self.last_tab_index].evt_handler ~= nil then
- return
- self.tablist[self.last_tab_index].evt_handler(
- self,
- event,
- self.tablist[self.last_tab_index].name,
- self.tablist[self.last_tab_index].tabdata
- )
+ local tab = self.tablist[self.last_tab_index]
+ if tab.evt_handler ~= nil then
+ return tab.evt_handler(self, event, tab.name, tab.tabdata)
end
return false
diff --git a/builtin/fstk/ui.lua b/builtin/fstk/ui.lua
index 976659ed3..13f9cbec2 100644
--- a/builtin/fstk/ui.lua
+++ b/builtin/fstk/ui.lua
@@ -63,7 +63,7 @@ function ui.update()
-- handle errors
if gamedata ~= nil and gamedata.reconnect_requested then
local error_message = core.formspec_escape(
- gamedata.errormessage or "<none available>")
+ gamedata.errormessage or fgettext("<none available>"))
formspec = {
"size[14,8]",
"real_coordinates[true]",
diff --git a/builtin/game/auth.lua b/builtin/game/auth.lua
index fc061666c..e7d502bb3 100644
--- a/builtin/game/auth.lua
+++ b/builtin/game/auth.lua
@@ -87,6 +87,10 @@ core.builtin_auth_handler = {
core.settings:get("default_password")))
end
+ auth_entry.privileges = privileges
+
+ core_auth.save(auth_entry)
+
-- Run grant callbacks
for priv, _ in pairs(privileges) do
if not auth_entry.privileges[priv] then
@@ -100,9 +104,6 @@ core.builtin_auth_handler = {
core.run_priv_callbacks(name, priv, nil, "revoke")
end
end
-
- auth_entry.privileges = privileges
- core_auth.save(auth_entry)
core.notify_authentication_modified(name)
end,
reload = function()
diff --git a/builtin/game/chat.lua b/builtin/game/chat.lua
index 945707623..b73e32876 100644
--- a/builtin/game/chat.lua
+++ b/builtin/game/chat.lua
@@ -1,5 +1,7 @@
-- Minetest: builtin/game/chat.lua
+local S = core.get_translator("__builtin")
+
-- Helper function that implements search and replace without pattern matching
-- Returns the string and a boolean indicating whether or not the string was modified
local function safe_gsub(s, replace, with)
@@ -45,6 +47,8 @@ end
core.chatcommands = core.registered_chatcommands -- BACKWARDS COMPATIBILITY
+local msg_time_threshold =
+ tonumber(core.settings:get("chatcommand_msg_time_threshold")) or 0.1
core.register_on_chat_message(function(name, message)
if message:sub(1,1) ~= "/" then
return
@@ -52,7 +56,7 @@ core.register_on_chat_message(function(name, message)
local cmd, param = string.match(message, "^/([^ ]+) *(.*)")
if not cmd then
- core.chat_send_player(name, "-!- Empty command")
+ core.chat_send_player(name, "-!- "..S("Empty command."))
return true
end
@@ -65,15 +69,17 @@ core.register_on_chat_message(function(name, message)
local cmd_def = core.registered_chatcommands[cmd]
if not cmd_def then
- core.chat_send_player(name, "-!- Invalid command: " .. cmd)
+ core.chat_send_player(name, "-!- "..S("Invalid command: @1", cmd))
return true
end
local has_privs, missing_privs = core.check_player_privs(name, cmd_def.privs)
if has_privs then
core.set_last_run_mod(cmd_def.mod_origin)
+ local t_before = core.get_us_time()
local success, result = cmd_def.func(name, param)
+ local delay = (core.get_us_time() - t_before) / 1000000
if success == false and result == nil then
- core.chat_send_player(name, "-!- Invalid command usage")
+ core.chat_send_player(name, "-!- "..S("Invalid command usage."))
local help_def = core.registered_chatcommands["help"]
if help_def then
local _, helpmsg = help_def.func(name, cmd)
@@ -81,13 +87,27 @@ core.register_on_chat_message(function(name, message)
core.chat_send_player(name, helpmsg)
end
end
- elseif result then
- core.chat_send_player(name, result)
+ else
+ if delay > msg_time_threshold then
+ -- Show how much time it took to execute the command
+ if result then
+ result = result .. core.colorize("#f3d2ff", S(" (@1 s)",
+ string.format("%.5f", delay)))
+ else
+ result = core.colorize("#f3d2ff", S(
+ "Command execution took @1 s",
+ string.format("%.5f", delay)))
+ end
+ end
+ if result then
+ core.chat_send_player(name, result)
+ end
end
else
- core.chat_send_player(name, "You don't have permission"
- .. " to run this command (missing privileges: "
- .. table.concat(missing_privs, ", ") .. ")")
+ core.chat_send_player(name,
+ S("You don't have permission to run this command "
+ .. "(missing privileges: @1).",
+ table.concat(missing_privs, ", ")))
end
return true -- Handled chat message
end)
@@ -107,12 +127,13 @@ local function parse_range_str(player_name, str)
if args[1] == "here" then
p1, p2 = core.get_player_radius_area(player_name, tonumber(args[2]))
if p1 == nil then
- return false, "Unable to get player " .. player_name .. " position"
+ return false, S("Unable to get position of player @1.", player_name)
end
else
p1, p2 = core.string_to_area(str)
if p1 == nil then
- return false, "Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)"
+ return false, S("Incorrect area format. "
+ .. "Expected: (x1,y1,z1) (x2,y2,z2)")
end
end
@@ -123,9 +144,9 @@ end
-- Chat commands
--
core.register_chatcommand("me", {
- params = "<action>",
- description = "Show chat action (e.g., '/me orders a pizza' displays"
- .. " '<player name> orders a pizza')",
+ params = S("<action>"),
+ description = S("Show 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)
@@ -134,43 +155,54 @@ core.register_chatcommand("me", {
})
core.register_chatcommand("admin", {
- description = "Show the name of the server owner",
+ description = S("Show the name of the server owner"),
func = function(name)
local admin = core.settings:get("name")
if admin then
- return true, "The administrator of this server is " .. admin .. "."
+ return true, S("The administrator of this server is @1.", admin)
else
- return false, "There's no administrator named in the config file."
+ return false, S("There's no administrator named "
+ .. "in the config file.")
end
end,
})
+local function privileges_of(name, privs)
+ if not privs then
+ privs = core.get_player_privs(name)
+ end
+ local privstr = core.privs_to_string(privs, ", ")
+ if privstr == "" then
+ return S("@1 does not have any privileges.", name)
+ else
+ return S("Privileges of @1: @2", name, privstr)
+ end
+end
+
core.register_chatcommand("privs", {
- params = "[<name>]",
- description = "Show privileges of yourself or another player",
+ params = S("[<name>]"),
+ description = S("Show privileges of yourself or another player"),
func = function(caller, param)
param = param:trim()
local name = (param ~= "" and param or caller)
if not core.player_exists(name) then
- return false, "Player " .. name .. " does not exist."
+ return false, S("Player @1 does not exist.", name)
end
- return true, "Privileges of " .. name .. ": "
- .. core.privs_to_string(
- core.get_player_privs(name), ", ")
+ return true, privileges_of(name)
end,
})
core.register_chatcommand("haspriv", {
- params = "<privilege>",
- description = "Return list of all online players with privilege.",
+ params = S("<privilege>"),
+ description = S("Return list of all online players with privilege"),
privs = {basic_privs = true},
func = function(caller, param)
param = param:trim()
if param == "" then
- return false, "Invalid parameters (see /help haspriv)"
+ return false, S("Invalid parameters (see /help haspriv).")
end
if not core.registered_privileges[param] then
- return false, "Unknown privilege!"
+ return false, S("Unknown privilege!")
end
local privs = core.string_to_privs(param)
local players_with_priv = {}
@@ -180,19 +212,25 @@ core.register_chatcommand("haspriv", {
table.insert(players_with_priv, player_name)
end
end
- return true, "Players online with the \"" .. param .. "\" privilege: " ..
- table.concat(players_with_priv, ", ")
+ if #players_with_priv == 0 then
+ return true, S("No online player has the \"@1\" privilege.",
+ param)
+ else
+ return true, S("Players online with the \"@1\" privilege: @2",
+ param,
+ table.concat(players_with_priv, ", "))
+ end
end
})
local function handle_grant_command(caller, grantname, grantprivstr)
local caller_privs = core.get_player_privs(caller)
if not (caller_privs.privs or caller_privs.basic_privs) then
- return false, "Your privileges are insufficient."
+ return false, S("Your privileges are insufficient.")
end
if not core.get_auth_handler().get_auth(grantname) then
- return false, "Player " .. grantname .. " does not exist."
+ return false, S("Player @1 does not exist.", grantname)
end
local grantprivs = core.string_to_privs(grantprivstr)
if grantprivstr == "all" then
@@ -204,50 +242,51 @@ local function handle_grant_command(caller, grantname, grantprivstr)
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."
+ return false, S("Your privileges are insufficient. "..
+ "'@1' only allows you to grant: @2",
+ "basic_privs",
+ core.privs_to_string(basic_privs, ', '))
end
if not core.registered_privileges[priv] then
- privs_unknown = privs_unknown .. "Unknown privilege: " .. priv .. "\n"
+ privs_unknown = privs_unknown .. S("Unknown privilege: @1", priv) .. "\n"
end
privs[priv] = true
end
if privs_unknown ~= "" then
return false, privs_unknown
end
+ core.set_player_privs(grantname, privs)
for priv, _ in pairs(grantprivs) do
-- call the on_grant callbacks
core.run_priv_callbacks(grantname, priv, caller, "grant")
end
- core.set_player_privs(grantname, privs)
core.log("action", caller..' granted ('..core.privs_to_string(grantprivs, ', ')..') privileges to '..grantname)
if grantname ~= caller then
- core.chat_send_player(grantname, caller
- .. " granted you privileges: "
- .. core.privs_to_string(grantprivs, ' '))
+ core.chat_send_player(grantname,
+ S("@1 granted you privileges: @2", caller,
+ core.privs_to_string(grantprivs, ', ')))
end
- return true, "Privileges of " .. grantname .. ": "
- .. core.privs_to_string(
- core.get_player_privs(grantname), ' ')
+ return true, privileges_of(grantname)
end
core.register_chatcommand("grant", {
- params = "<name> (<privilege> | all)",
- description = "Give privileges to player",
+ params = S("<name> (<privilege> [, <privilege2> [<...>]] | all)"),
+ description = S("Give privileges to player"),
func = function(name, param)
local grantname, grantprivstr = string.match(param, "([^ ]+) (.+)")
if not grantname or not grantprivstr then
- return false, "Invalid parameters (see /help grant)"
+ return false, S("Invalid parameters (see /help grant).")
end
return handle_grant_command(name, grantname, grantprivstr)
end,
})
core.register_chatcommand("grantme", {
- params = "<privilege> | all",
- description = "Grant privileges to yourself",
+ params = S("<privilege> [, <privilege2> [<...>]] | all"),
+ description = S("Grant privileges to yourself"),
func = function(name, param)
if param == "" then
- return false, "Invalid parameters (see /help grantme)"
+ return false, S("Invalid parameters (see /help grantme).")
end
return handle_grant_command(name, name, param)
end,
@@ -256,23 +295,20 @@ core.register_chatcommand("grantme", {
local function handle_revoke_command(caller, revokename, revokeprivstr)
local caller_privs = core.get_player_privs(caller)
if not (caller_privs.privs or caller_privs.basic_privs) then
- return false, "Your privileges are insufficient."
+ return false, S("Your privileges are insufficient.")
end
if not core.get_auth_handler().get_auth(revokename) then
- return false, "Player " .. revokename .. " does not exist."
+ return false, S("Player @1 does not exist.", revokename)
end
- local revokeprivs = core.string_to_privs(revokeprivstr)
local privs = core.get_player_privs(revokename)
- local basic_privs =
- core.string_to_privs(core.settings:get("basic_privs") or "interact,shout")
- for priv, _ in pairs(revokeprivs) do
- if not basic_privs[priv] and not caller_privs.privs then
- return false, "Your privileges are insufficient."
- end
- end
+ local revokeprivs = core.string_to_privs(revokeprivstr)
+ local is_singleplayer = core.is_singleplayer()
+ local is_admin = not is_singleplayer
+ and revokename == core.settings:get("name")
+ and revokename ~= ""
if revokeprivstr == "all" then
revokeprivs = privs
privs = {}
@@ -282,53 +318,99 @@ local function handle_revoke_command(caller, revokename, revokeprivstr)
end
end
+ local privs_unknown = ""
+ local basic_privs =
+ core.string_to_privs(core.settings:get("basic_privs") or "interact,shout")
+ local irrevokable = {}
+ local has_irrevokable_priv = false
+ for priv, _ in pairs(revokeprivs) do
+ if not basic_privs[priv] and not caller_privs.privs then
+ return false, S("Your privileges are insufficient. "..
+ "'@1' only allows you to revoke: @2",
+ "basic_privs",
+ core.privs_to_string(basic_privs, ', '))
+ end
+ local def = core.registered_privileges[priv]
+ if not def then
+ privs_unknown = privs_unknown .. S("Unknown privilege: @1", priv) .. "\n"
+ elseif is_singleplayer and def.give_to_singleplayer then
+ irrevokable[priv] = true
+ elseif is_admin and def.give_to_admin then
+ irrevokable[priv] = true
+ end
+ end
+ for priv, _ in pairs(irrevokable) do
+ revokeprivs[priv] = nil
+ has_irrevokable_priv = true
+ end
+ if privs_unknown ~= "" then
+ return false, privs_unknown
+ end
+ if has_irrevokable_priv then
+ if is_singleplayer then
+ core.chat_send_player(caller,
+ S("Note: Cannot revoke in singleplayer: @1",
+ core.privs_to_string(irrevokable, ', ')))
+ elseif is_admin then
+ core.chat_send_player(caller,
+ S("Note: Cannot revoke from admin: @1",
+ core.privs_to_string(irrevokable, ', ')))
+ end
+ end
+
+ local revokecount = 0
+
+ core.set_player_privs(revokename, privs)
for priv, _ in pairs(revokeprivs) do
-- call the on_revoke callbacks
core.run_priv_callbacks(revokename, priv, caller, "revoke")
+ revokecount = revokecount + 1
+ end
+ local new_privs = core.get_player_privs(revokename)
+
+ if revokecount == 0 then
+ return false, S("No privileges were revoked.")
end
- core.set_player_privs(revokename, privs)
core.log("action", caller..' revoked ('
..core.privs_to_string(revokeprivs, ', ')
..') privileges from '..revokename)
if revokename ~= caller then
- core.chat_send_player(revokename, caller
- .. " revoked privileges from you: "
- .. core.privs_to_string(revokeprivs, ' '))
+ core.chat_send_player(revokename,
+ S("@1 revoked privileges from you: @2", caller,
+ core.privs_to_string(revokeprivs, ', ')))
end
- return true, "Privileges of " .. revokename .. ": "
- .. core.privs_to_string(
- core.get_player_privs(revokename), ' ')
+ return true, privileges_of(revokename, new_privs)
end
core.register_chatcommand("revoke", {
- params = "<name> (<privilege> | all)",
- description = "Remove privileges from player",
+ params = S("<name> (<privilege> [, <privilege2> [<...>]] | all)"),
+ description = S("Remove privileges from player"),
privs = {},
func = function(name, param)
local revokename, revokeprivstr = string.match(param, "([^ ]+) (.+)")
if not revokename or not revokeprivstr then
- return false, "Invalid parameters (see /help revoke)"
+ return false, S("Invalid parameters (see /help revoke).")
end
return handle_revoke_command(name, revokename, revokeprivstr)
end,
})
core.register_chatcommand("revokeme", {
- params = "<privilege> | all",
- description = "Revoke privileges from yourself",
+ params = S("<privilege> [, <privilege2> [<...>]] | all"),
+ description = S("Revoke privileges from yourself"),
privs = {},
func = function(name, param)
if param == "" then
- return false, "Invalid parameters (see /help revokeme)"
+ return false, S("Invalid parameters (see /help revokeme).")
end
return handle_revoke_command(name, name, param)
end,
})
core.register_chatcommand("setpassword", {
- params = "<name> <password>",
- description = "Set player's password",
+ params = S("<name> <password>"),
+ description = S("Set player's password"),
privs = {password=true},
func = function(name, param)
local toname, raw_password = string.match(param, "^([^ ]+) +(.+)$")
@@ -338,207 +420,197 @@ core.register_chatcommand("setpassword", {
end
if not toname then
- return false, "Name field required"
+ return false, S("Name field required.")
end
- local act_str_past, act_str_pres
+ local msg_chat, msg_log, msg_ret
if not raw_password then
core.set_player_password(toname, "")
- act_str_past = "cleared"
- act_str_pres = "clears"
+ msg_chat = S("Your password was cleared by @1.", name)
+ msg_log = name .. " clears password of " .. toname .. "."
+ msg_ret = S("Password of player \"@1\" cleared.", toname)
else
core.set_player_password(toname,
core.get_password_hash(toname,
raw_password))
- act_str_past = "set"
- act_str_pres = "sets"
+ msg_chat = S("Your password was set by @1.", name)
+ msg_log = name .. " sets password of " .. toname .. "."
+ msg_ret = S("Password of player \"@1\" set.", toname)
end
if toname ~= name then
- core.chat_send_player(toname, "Your password was "
- .. act_str_past .. " by " .. name)
+ core.chat_send_player(toname, msg_chat)
end
- core.log("action", name .. " " .. act_str_pres ..
- " password of " .. toname .. ".")
+ core.log("action", msg_log)
- return true, "Password of player \"" .. toname .. "\" " .. act_str_past
+ return true, msg_ret
end,
})
core.register_chatcommand("clearpassword", {
- params = "<name>",
- description = "Set empty password for a player",
+ params = S("<name>"),
+ description = S("Set empty password for a player"),
privs = {password=true},
func = function(name, param)
local toname = param
if toname == "" then
- return false, "Name field required"
+ return false, S("Name field required.")
end
core.set_player_password(toname, '')
core.log("action", name .. " clears password of " .. toname .. ".")
- return true, "Password of player \"" .. toname .. "\" cleared"
+ return true, S("Password of player \"@1\" cleared.", toname)
end,
})
core.register_chatcommand("auth_reload", {
params = "",
- description = "Reload authentication data",
+ description = S("Reload authentication data"),
privs = {server=true},
func = function(name, param)
local done = core.auth_reload()
- return done, (done and "Done." or "Failed.")
+ return done, (done and S("Done.") or S("Failed."))
end,
})
core.register_chatcommand("remove_player", {
- params = "<name>",
- description = "Remove a player's data",
+ params = S("<name>"),
+ description = S("Remove a player's data"),
privs = {server=true},
func = function(name, param)
local toname = param
if toname == "" then
- return false, "Name field required"
+ return false, S("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."
+ return true, S("Player \"@1\" removed.", toname)
elseif rc == 1 then
- return true, "No such player \"" .. toname .. "\" to remove."
+ return true, S("No such player \"@1\" to remove.", toname)
elseif rc == 2 then
- return true, "Player \"" .. toname .. "\" is connected, cannot remove."
+ return true, S("Player \"@1\" is connected, cannot remove.", toname)
end
- return false, "Unhandled remove_player return code " .. rc .. ""
+ return false, S("Unhandled remove_player return code @1.", tostring(rc))
end,
})
-core.register_chatcommand("teleport", {
- params = "<X>,<Y>,<Z> | <to_name> | (<name> <X>,<Y>,<Z>) | (<name> <to_name>)",
- description = "Teleport to position or player",
- privs = {teleport=true},
- func = function(name, param)
- -- Returns (pos, true) if found, otherwise (pos, false)
- local function find_free_position_near(pos)
- local tries = {
- {x=1,y=0,z=0},
- {x=-1,y=0,z=0},
- {x=0,y=0,z=1},
- {x=0,y=0,z=-1},
- }
- for _, d in ipairs(tries) do
- local p = {x = pos.x+d.x, y = pos.y+d.y, z = pos.z+d.z}
- local n = core.get_node_or_nil(p)
- if n and n.name then
- local def = core.registered_nodes[n.name]
- if def and not def.walkable then
- return p, true
- end
- end
+
+-- pos may be a non-integer position
+local function find_free_position_near(pos)
+ local tries = {
+ vector.new( 1, 0, 0),
+ vector.new(-1, 0, 0),
+ vector.new( 0, 0, 1),
+ vector.new( 0, 0, -1),
+ }
+ for _, d in ipairs(tries) do
+ local p = vector.add(pos, d)
+ local n = core.get_node_or_nil(p)
+ if n then
+ local def = core.registered_nodes[n.name]
+ if def and not def.walkable then
+ return p
end
- return pos, false
end
+ end
+ return pos
+end
+
+-- Teleports player <name> to <p> if possible
+local function teleport_to_pos(name, p)
+ local lm = 31007 -- equals MAX_MAP_GENERATION_LIMIT in C++
+ 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, S("Cannot teleport out of map bounds!")
+ end
+ local teleportee = core.get_player_by_name(name)
+ if not teleportee then
+ return false, S("Cannot get player with name @1.", name)
+ end
+ if teleportee:get_attach() then
+ return false, S("Cannot teleport, @1 " ..
+ "is attached to an object!", name)
+ end
+ teleportee:set_pos(p)
+ return true, S("Teleporting @1 to @2.", name, core.pos_to_string(p, 1))
+end
+-- Teleports player <name> next to player <target_name> if possible
+local function teleport_to_player(name, target_name)
+ if name == target_name then
+ return false, S("One does not teleport to oneself.")
+ end
+ local teleportee = core.get_player_by_name(name)
+ if not teleportee then
+ return false, S("Cannot get teleportee with name @1.", name)
+ end
+ if teleportee:get_attach() then
+ return false, S("Cannot teleport, @1 " ..
+ "is attached to an object!", name)
+ end
+ local target = core.get_player_by_name(target_name)
+ if not target then
+ return false, S("Cannot get target player with name @1.", target_name)
+ end
+ local p = find_free_position_near(target:get_pos())
+ teleportee:set_pos(p)
+ return true, S("Teleporting @1 to @2 at @3.", name, target_name,
+ core.pos_to_string(p, 1))
+end
+
+core.register_chatcommand("teleport", {
+ params = S("<X>,<Y>,<Z> | <to_name> | <name> <X>,<Y>,<Z> | <name> <to_name>"),
+ description = S("Teleport to position or player"),
+ privs = {teleport=true},
+ func = function(name, param)
local p = {}
- p.x, p.y, p.z = string.match(param, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
- p.x = tonumber(p.x)
- p.y = tonumber(p.y)
- p.z = tonumber(p.z)
+ p.x, p.y, p.z = param:match("^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
+ p = vector.apply(p, tonumber)
if p.x and p.y and p.z then
-
- 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
- local teleportee = core.get_player_by_name(name)
- if teleportee then
- if teleportee:get_attach() then
- return false, "Can't teleport, you're attached to an object!"
- end
- teleportee:set_pos(p)
- return true, "Teleporting to "..core.pos_to_string(p)
- end
+ return teleport_to_pos(name, p)
end
local target_name = param:match("^([^ ]+)$")
- local teleportee = core.get_player_by_name(name)
-
- p = nil
if target_name then
- local target = core.get_player_by_name(target_name)
- if target then
- p = target:get_pos()
- end
+ return teleport_to_player(name, target_name)
end
- if teleportee and p then
- if teleportee:get_attach() then
- return false, "Can't teleport, you're attached to an object!"
- end
- p = find_free_position_near(p)
- teleportee:set_pos(p)
- return true, "Teleporting to " .. target_name
- .. " at "..core.pos_to_string(p)
- end
+ local has_bring_priv = core.check_player_privs(name, {bring=true})
+ local missing_bring_msg = S("You don't have permission to teleport " ..
+ "other players (missing privilege: @1).", "bring")
- if not core.check_player_privs(name, {bring=true}) then
- return false, "You don't have permission to teleport other players (missing bring privilege)"
- end
-
- teleportee = nil
- p = {}
local teleportee_name
teleportee_name, p.x, p.y, p.z = param:match(
"^([^ ]+) +([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
- p.x, p.y, p.z = tonumber(p.x), tonumber(p.y), tonumber(p.z)
- if teleportee_name then
- teleportee = core.get_player_by_name(teleportee_name)
- end
- if teleportee and p.x and p.y and p.z then
- if teleportee:get_attach() then
- return false, "Can't teleport, player is attached to an object!"
+ p = vector.apply(p, tonumber)
+ if teleportee_name and p.x and p.y and p.z then
+ if not has_bring_priv then
+ return false, missing_bring_msg
end
- teleportee:set_pos(p)
- return true, "Teleporting " .. teleportee_name
- .. " to " .. core.pos_to_string(p)
+ return teleport_to_pos(teleportee_name, p)
end
- teleportee = nil
- p = nil
teleportee_name, target_name = string.match(param, "^([^ ]+) +([^ ]+)$")
- if teleportee_name then
- teleportee = core.get_player_by_name(teleportee_name)
- end
- if target_name then
- local target = core.get_player_by_name(target_name)
- if target then
- p = target:get_pos()
- end
- end
- if teleportee and p then
- if teleportee:get_attach() then
- return false, "Can't teleport, player is attached to an object!"
+ if teleportee_name and target_name then
+ if not has_bring_priv then
+ return false, missing_bring_msg
end
- p = find_free_position_near(p)
- teleportee:set_pos(p)
- return true, "Teleporting " .. teleportee_name
- .. " to " .. target_name
- .. " at " .. core.pos_to_string(p)
+ return teleport_to_player(teleportee_name, target_name)
end
- return false, 'Invalid parameters ("' .. param
- .. '") or player not found (see /help teleport)'
+ return false
end,
})
core.register_chatcommand("set", {
- params = "([-n] <name> <value>) | <name>",
- description = "Set or read server configuration setting",
+ params = S("([-n] <name> <value>) | <name>"),
+ description = S("Set or read server configuration setting"),
privs = {server=true},
func = function(name, param)
local arg, setname, setvalue = string.match(param, "(-[n]) ([^ ]+) (.+)")
@@ -550,22 +622,23 @@ core.register_chatcommand("set", {
setname, setvalue = string.match(param, "([^ ]+) (.+)")
if setname and setvalue then
if not core.settings:get(setname) then
- return false, "Failed. Use '/set -n <name> <value>' to create a new setting."
+ return false, S("Failed. Use '/set -n <name> <value>' "
+ .. "to create a new setting.")
end
core.settings:set(setname, setvalue)
- return true, setname .. " = " .. setvalue
+ return true, S("@1 = @2", setname, setvalue)
end
setname = string.match(param, "([^ ]+)")
if setname then
setvalue = core.settings:get(setname)
if not setvalue then
- setvalue = "<not set>"
+ setvalue = S("<not set>")
end
- return true, setname .. " = " .. setvalue
+ return true, S("@1 = @2", setname, setvalue)
end
- return false, "Invalid parameters (see /help set)."
+ return false, S("Invalid parameters (see /help set).")
end,
})
@@ -578,26 +651,27 @@ local function emergeblocks_callback(pos, action, num_calls_remaining, ctx)
if ctx.current_blocks == ctx.total_blocks then
core.chat_send_player(ctx.requestor_name,
- string.format("Finished emerging %d blocks in %.2fms.",
- ctx.total_blocks, (os.clock() - ctx.start_time) * 1000))
+ S("Finished emerging @1 blocks in @2ms.",
+ ctx.total_blocks,
+ string.format("%.2f", (os.clock() - ctx.start_time) * 1000)))
end
end
local function emergeblocks_progress_update(ctx)
if ctx.current_blocks ~= ctx.total_blocks then
core.chat_send_player(ctx.requestor_name,
- string.format("emergeblocks update: %d/%d blocks emerged (%.1f%%)",
+ S("emergeblocks update: @1/@2 blocks emerged (@3%)",
ctx.current_blocks, ctx.total_blocks,
- (ctx.current_blocks / ctx.total_blocks) * 100))
+ string.format("%.1f", (ctx.current_blocks / ctx.total_blocks) * 100)))
core.after(2, emergeblocks_progress_update, ctx)
end
end
core.register_chatcommand("emergeblocks", {
- params = "(here [<radius>]) | (<pos1> <pos2>)",
- description = "Load (or, if nonexistent, generate) map blocks "
- .. "contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)",
+ params = S("(here [<radius>]) | (<pos1> <pos2>)"),
+ description = S("Load (or, if nonexistent, generate) map blocks contained in "
+ .. "area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)"),
privs = {server=true},
func = function(name, param)
local p1, p2 = parse_range_str(name, param)
@@ -615,15 +689,15 @@ core.register_chatcommand("emergeblocks", {
core.emerge_area(p1, p2, emergeblocks_callback, context)
core.after(2, emergeblocks_progress_update, context)
- return true, "Started emerge of area ranging from " ..
- core.pos_to_string(p1, 1) .. " to " .. core.pos_to_string(p2, 1)
+ return true, S("Started emerge of area ranging from @1 to @2.",
+ core.pos_to_string(p1, 1), core.pos_to_string(p2, 1))
end,
})
core.register_chatcommand("deleteblocks", {
- params = "(here [<radius>]) | (<pos1> <pos2>)",
- description = "Delete map blocks contained in area pos1 to pos2 "
- .. "(<pos1> and <pos2> must be in parentheses)",
+ params = S("(here [<radius>]) | (<pos1> <pos2>)"),
+ description = S("Delete map blocks contained in area pos1 to pos2 "
+ .. "(<pos1> and <pos2> must be in parentheses)"),
privs = {server=true},
func = function(name, param)
local p1, p2 = parse_range_str(name, param)
@@ -632,18 +706,20 @@ core.register_chatcommand("deleteblocks", {
end
if core.delete_area(p1, p2) then
- return true, "Successfully cleared area ranging from " ..
- core.pos_to_string(p1, 1) .. " to " .. core.pos_to_string(p2, 1)
+ return true, S("Successfully cleared area "
+ .. "ranging from @1 to @2.",
+ core.pos_to_string(p1, 1), core.pos_to_string(p2, 1))
else
- return false, "Failed to clear one or more blocks in area"
+ return false, S("Failed to clear one or more "
+ .. "blocks in area.")
end
end,
})
core.register_chatcommand("fixlight", {
- params = "(here [<radius>]) | (<pos1> <pos2>)",
- description = "Resets lighting in the area between pos1 and pos2 "
- .. "(<pos1> and <pos2> must be in parentheses)",
+ params = S("(here [<radius>]) | (<pos1> <pos2>)"),
+ description = S("Resets lighting in the area between pos1 and pos2 "
+ .. "(<pos1> and <pos2> must be in parentheses)"),
privs = {server = true},
func = function(name, param)
local p1, p2 = parse_range_str(name, param)
@@ -652,20 +728,26 @@ core.register_chatcommand("fixlight", {
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)
+ return true, S("Successfully reset light in the area "
+ .. "ranging from @1 to @2.",
+ core.pos_to_string(p1, 1), core.pos_to_string(p2, 1))
else
- return false, "Failed to load one or more blocks in area"
+ return false, S("Failed to load one or more blocks in area.")
end
end,
})
core.register_chatcommand("mods", {
params = "",
- description = "List mods installed on the server",
+ description = S("List mods installed on the server"),
privs = {},
func = function(name, param)
- return true, table.concat(core.get_modnames(), ", ")
+ local mods = core.get_modnames()
+ if #mods == 0 then
+ return true, S("No mods installed.")
+ else
+ return true, table.concat(core.get_modnames(), ", ")
+ end
end,
})
@@ -674,117 +756,136 @@ local function handle_give_command(cmd, giver, receiver, stackstring)
.. ', stackstring="' .. stackstring .. '"')
local itemstack = ItemStack(stackstring)
if itemstack:is_empty() then
- return false, "Cannot give an empty item"
+ return false, S("Cannot give an empty item.")
elseif (not itemstack:is_known()) or (itemstack:get_name() == "unknown") then
- return false, "Cannot give an unknown item"
+ return false, S("Cannot give an unknown item.")
-- Forbid giving 'ignore' due to unwanted side effects
elseif itemstack:get_name() == "ignore" then
- return false, "Giving 'ignore' is not allowed"
+ return false, S("Giving 'ignore' is not allowed.")
end
local receiverref = core.get_player_by_name(receiver)
if receiverref == nil then
- return false, receiver .. " is not a known player"
+ return false, S("@1 is not a known player.", receiver)
end
local leftover = receiverref:get_inventory():add_item("main", itemstack)
local partiality
if leftover:is_empty() then
- partiality = ""
+ partiality = nil
elseif leftover:get_count() == itemstack:get_count() then
- partiality = "could not be "
+ partiality = false
else
- partiality = "partially "
+ partiality = true
end
-- The actual item stack string may be different from what the "giver"
-- entered (e.g. big numbers are always interpreted as 2^16-1).
stackstring = itemstack:to_string()
+ local msg
+ if partiality == true then
+ msg = S("@1 partially added to inventory.", stackstring)
+ elseif partiality == false then
+ msg = S("@1 could not be added to inventory.", stackstring)
+ else
+ msg = S("@1 added to inventory.", stackstring)
+ end
if giver == receiver then
- local msg = "%q %sadded to inventory."
- return true, msg:format(stackstring, partiality)
+ return true, msg
else
- core.chat_send_player(receiver, ("%q %sadded to inventory.")
- :format(stackstring, partiality))
- local msg = "%q %sadded to %s's inventory."
- return true, msg:format(stackstring, partiality, receiver)
+ core.chat_send_player(receiver, msg)
+ local msg_other
+ if partiality == true then
+ msg_other = S("@1 partially added to inventory of @2.",
+ stackstring, receiver)
+ elseif partiality == false then
+ msg_other = S("@1 could not be added to inventory of @2.",
+ stackstring, receiver)
+ else
+ msg_other = S("@1 added to inventory of @2.",
+ stackstring, receiver)
+ end
+ return true, msg_other
end
end
core.register_chatcommand("give", {
- params = "<name> <ItemString> [<count> [<wear>]]",
- description = "Give item to player",
+ params = S("<name> <ItemString> [<count> [<wear>]]"),
+ description = S("Give item to player"),
privs = {give=true},
func = function(name, param)
local toname, itemstring = string.match(param, "^([^ ]+) +(.+)$")
if not toname or not itemstring then
- return false, "Name and ItemString required"
+ return false, S("Name and ItemString required.")
end
return handle_give_command("/give", name, toname, itemstring)
end,
})
core.register_chatcommand("giveme", {
- params = "<ItemString> [<count> [<wear>]]",
- description = "Give item to yourself",
+ params = S("<ItemString> [<count> [<wear>]]"),
+ description = S("Give item to yourself"),
privs = {give=true},
func = function(name, param)
local itemstring = string.match(param, "(.+)$")
if not itemstring then
- return false, "ItemString required"
+ return false, S("ItemString required.")
end
return handle_give_command("/giveme", name, name, itemstring)
end,
})
core.register_chatcommand("spawnentity", {
- params = "<EntityName> [<X>,<Y>,<Z>]",
- description = "Spawn entity at given (or your) position",
+ params = S("<EntityName> [<X>,<Y>,<Z>]"),
+ description = S("Spawn entity at given (or your) position"),
privs = {give=true, interact=true},
func = function(name, param)
local entityname, p = string.match(param, "^([^ ]+) *(.*)$")
if not entityname then
- return false, "EntityName required"
+ return false, S("EntityName required.")
end
core.log("action", ("%s invokes /spawnentity, entityname=%q")
:format(name, entityname))
local player = core.get_player_by_name(name)
if player == nil then
core.log("error", "Unable to spawn entity, player is nil")
- return false, "Unable to spawn entity, player is nil"
+ return false, S("Unable to spawn entity, player is nil.")
end
if not core.registered_entities[entityname] then
- return false, "Cannot spawn an unknown entity"
+ return false, S("Cannot spawn an unknown entity.")
end
if p == "" then
p = player:get_pos()
else
p = core.string_to_pos(p)
if p == nil then
- return false, "Invalid parameters ('" .. param .. "')"
+ return false, S("Invalid parameters (@1).", param)
end
end
p.y = p.y + 1
local obj = core.add_entity(p, entityname)
- local msg = obj and "%q spawned." or "%q failed to spawn."
- return true, msg:format(entityname)
+ if obj then
+ return true, S("@1 spawned.", entityname)
+ else
+ return true, S("@1 failed to spawn.", entityname)
+ end
end,
})
core.register_chatcommand("pulverize", {
params = "",
- description = "Destroy item in hand",
+ description = S("Destroy item in hand"),
func = function(name, param)
local player = core.get_player_by_name(name)
if not player then
core.log("error", "Unable to pulverize, no player.")
- return false, "Unable to pulverize, no player."
+ return false, S("Unable to pulverize, no player.")
end
local wielded_item = player:get_wielded_item()
if wielded_item:is_empty() then
- return false, "Unable to pulverize, no item in hand."
+ return false, S("Unable to pulverize, no item in hand.")
end
core.log("action", name .. " pulverized \"" ..
wielded_item:get_name() .. " " .. wielded_item:get_count() .. "\"")
player:set_wielded_item(nil)
- return true, "An item was pulverized."
+ return true, S("An item was pulverized.")
end,
})
@@ -800,14 +901,15 @@ core.register_on_punchnode(function(pos, node, puncher)
end)
core.register_chatcommand("rollback_check", {
- params = "[<range>] [<seconds>] [<limit>]",
- 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. Set <seconds> to inf for no time limit",
+ params = S("[<range>] [<seconds>] [<limit>]"),
+ description = S("Check who last touched a node or a node near it "
+ .. "within the time specified by <seconds>. "
+ .. "Default: range = 0, seconds = 86400 = 24h, limit = 5. "
+ .. "Set <seconds> to inf for no time limit"),
privs = {rollback=true},
func = function(name, param)
if not core.settings:get_bool("enable_rollback_recording") then
- return false, "Rollback functions are disabled."
+ return false, S("Rollback functions are disabled.")
end
local range, seconds, limit =
param:match("(%d+) *(%d*) *(%d*)")
@@ -815,30 +917,30 @@ core.register_chatcommand("rollback_check", {
seconds = tonumber(seconds) or 86400
limit = tonumber(limit) or 5
if limit > 100 then
- return false, "That limit is too high!"
+ return false, S("That limit is too high!")
end
core.rollback_punch_callbacks[name] = function(pos, node, puncher)
local name = puncher:get_player_name()
- core.chat_send_player(name, "Checking " .. core.pos_to_string(pos) .. "...")
+ core.chat_send_player(name, S("Checking @1 ...", core.pos_to_string(pos)))
local actions = core.rollback_get_node_actions(pos, range, seconds, limit)
if not actions then
- core.chat_send_player(name, "Rollback functions are disabled")
+ core.chat_send_player(name, S("Rollback functions are disabled."))
return
end
local num_actions = #actions
if num_actions == 0 then
- core.chat_send_player(name, "Nobody has touched"
- .. " the specified location in "
- .. seconds .. " seconds")
+ core.chat_send_player(name,
+ S("Nobody has touched the specified "
+ .. "location in @1 seconds.",
+ seconds))
return
end
local time = os.time()
for i = num_actions, 1, -1 do
local action = actions[i]
core.chat_send_player(name,
- ("%s %s %s -> %s %d seconds ago.")
- :format(
+ S("@1 @2 @3 -> @4 @5 seconds ago.",
core.pos_to_string(action.pos),
action.actor,
action.oldnode.name,
@@ -847,189 +949,235 @@ core.register_chatcommand("rollback_check", {
end
end
- return true, "Punch a node (range=" .. range .. ", seconds="
- .. seconds .. "s, limit=" .. limit .. ")"
+ return true, S("Punch a node (range=@1, seconds=@2, limit=@3).",
+ range, seconds, limit)
end,
})
core.register_chatcommand("rollback", {
- params = "(<name> [<seconds>]) | (:<actor> [<seconds>])",
- description = "Revert actions of a player. Default for <seconds> is 60. Set <seconds> to inf for no time limit",
+ params = S("(<name> [<seconds>]) | (:<actor> [<seconds>])"),
+ description = S("Revert actions of a player. "
+ .. "Default for <seconds> is 60. "
+ .. "Set <seconds> to inf for no time limit"),
privs = {rollback=true},
func = function(name, param)
if not core.settings:get_bool("enable_rollback_recording") then
- return false, "Rollback functions are disabled."
+ return false, S("Rollback functions are disabled.")
end
local target_name, seconds = string.match(param, ":([^ ]+) *(%d*)")
+ local rev_msg
if not target_name then
local player_name
player_name, seconds = string.match(param, "([^ ]+) *(%d*)")
if not player_name then
- return false, "Invalid parameters. See /help rollback"
- .. " and /help rollback_check."
+ return false, S("Invalid parameters. "
+ .. "See /help rollback and "
+ .. "/help rollback_check.")
end
+ seconds = tonumber(seconds) or 60
target_name = "player:"..player_name
+ rev_msg = S("Reverting actions of player '@1' since @2 seconds.",
+ player_name, seconds)
+ else
+ seconds = tonumber(seconds) or 60
+ rev_msg = S("Reverting actions of @1 since @2 seconds.",
+ target_name, seconds)
end
- seconds = tonumber(seconds) or 60
- core.chat_send_player(name, "Reverting actions of "
- .. target_name .. " since "
- .. seconds .. " seconds.")
+ core.chat_send_player(name, rev_msg)
local success, log = core.rollback_revert_actions_by(
target_name, seconds)
local response = ""
if #log > 100 then
- response = "(log is too long to show)\n"
+ response = S("(log is too long to show)").."\n"
else
for _, line in pairs(log) do
response = response .. line .. "\n"
end
end
- response = response .. "Reverting actions "
- .. (success and "succeeded." or "FAILED.")
+ if success then
+ response = response .. S("Reverting actions succeeded.")
+ else
+ response = response .. S("Reverting actions FAILED.")
+ end
return success, response
end,
})
core.register_chatcommand("status", {
- description = "Show server status",
+ description = S("Show server status"),
func = function(name, param)
local status = core.get_server_status(name, false)
if status and status ~= "" then
return true, status
end
- return false, "This command was disabled by a mod or game"
+ return false, S("This command was disabled by a mod or game.")
end,
})
core.register_chatcommand("time", {
- params = "[<0..23>:<0..59> | <0..24000>]",
- description = "Show or set time of day",
+ params = S("[<0..23>:<0..59> | <0..24000>]"),
+ description = S("Show or set time of day"),
privs = {},
func = function(name, param)
if param == "" then
local current_time = math.floor(core.get_timeofday() * 1440)
local minutes = current_time % 60
local hour = (current_time - minutes) / 60
- return true, ("Current time is %d:%02d"):format(hour, minutes)
+ return true, S("Current time is @1:@2.",
+ string.format("%d", hour),
+ string.format("%02d", minutes))
end
local player_privs = core.get_player_privs(name)
if not player_privs.settime then
- return false, "You don't have permission to run this command " ..
- "(missing privilege: settime)."
+ return false, S("You don't have permission to run "
+ .. "this command (missing privilege: @1).", "settime")
end
local hour, minute = param:match("^(%d+):(%d+)$")
if not hour then
- local new_time = tonumber(param)
- if not new_time then
- return false, "Invalid time."
+ local new_time = tonumber(param) or -1
+ if new_time ~= new_time or new_time < 0 or new_time > 24000 then
+ return false, S("Invalid time (must be between 0 and 24000).")
end
- -- Backward compatibility.
- core.set_timeofday((new_time % 24000) / 24000)
+ core.set_timeofday(new_time / 24000)
core.log("action", name .. " sets time to " .. new_time)
- return true, "Time of day changed."
+ return true, S("Time of day changed.")
end
hour = tonumber(hour)
minute = tonumber(minute)
if hour < 0 or hour > 23 then
- return false, "Invalid hour (must be between 0 and 23 inclusive)."
+ return false, S("Invalid hour (must be between 0 and 23 inclusive).")
elseif minute < 0 or minute > 59 then
- return false, "Invalid minute (must be between 0 and 59 inclusive)."
+ return false, S("Invalid minute (must be between 0 and 59 inclusive).")
end
core.set_timeofday((hour * 60 + minute) / 1440)
core.log("action", ("%s sets time to %d:%02d"):format(name, hour, minute))
- return true, "Time of day changed."
+ return true, S("Time of day changed.")
end,
})
core.register_chatcommand("days", {
- description = "Show day count since world creation",
+ description = S("Show day count since world creation"),
func = function(name, param)
- return true, "Current day is " .. core.get_day_count()
+ return true, S("Current day is @1.", core.get_day_count())
end
})
+local function parse_shutdown_param(param)
+ local delay, reconnect, message
+ local one, two, three
+ one, two, three = param:match("^(%S+) +(%-r) +(.*)")
+ if one and two and three then
+ -- 3 arguments: delay, reconnect and message
+ return one, two, three
+ end
+ -- 2 arguments
+ one, two = param:match("^(%S+) +(.*)")
+ if one and two then
+ if tonumber(one) then
+ delay = one
+ if two == "-r" then
+ reconnect = two
+ else
+ message = two
+ end
+ elseif one == "-r" then
+ reconnect, message = one, two
+ end
+ return delay, reconnect, message
+ end
+ -- 1 argument
+ one = param:match("(.*)")
+ if tonumber(one) then
+ delay = one
+ elseif one == "-r" then
+ reconnect = one
+ else
+ message = one
+ end
+ return delay, reconnect, message
+end
+
core.register_chatcommand("shutdown", {
- params = "[<delay_in_seconds> | -1] [reconnect] [<message>]",
- description = "Shutdown server (-1 cancels a delayed shutdown)",
+ params = S("[<delay_in_seconds> | -1] [-r] [<message>]"),
+ description = S("Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)"),
privs = {server=true},
func = function(name, param)
- local delay, reconnect, message
- delay, param = param:match("^%s*(%S+)(.*)")
- if param then
- reconnect, param = param:match("^%s*(%S+)(.*)")
+ local delay, reconnect, message = parse_shutdown_param(param)
+ local bool_reconnect = reconnect == "-r"
+ if not message then
+ message = ""
end
- message = param and param:match("^%s*(.+)") or ""
delay = tonumber(delay) or 0
if delay == 0 then
core.log("action", name .. " shuts down server")
- core.chat_send_all("*** Server shutting down (operator request).")
+ core.chat_send_all("*** "..S("Server shutting down (operator request)."))
end
- core.request_shutdown(message:trim(), core.is_yes(reconnect), delay)
+ core.request_shutdown(message:trim(), bool_reconnect, delay)
return true
end,
})
core.register_chatcommand("ban", {
- params = "[<name>]",
- description = "Ban the IP of a player or show the ban list",
+ params = S("[<name>]"),
+ description = S("Ban the IP of a player or show the ban list"),
privs = {ban=true},
func = function(name, param)
if param == "" then
local ban_list = core.get_ban_list()
if ban_list == "" then
- return true, "The ban list is empty."
+ return true, S("The ban list is empty.")
else
- return true, "Ban list: " .. ban_list
+ return true, S("Ban list: @1", ban_list)
end
end
if not core.get_player_by_name(param) then
- return false, "Player is not online."
+ return false, S("Player is not online.")
end
if not core.ban_player(param) then
- return false, "Failed to ban player."
+ return false, S("Failed to ban player.")
end
local desc = core.get_ban_description(param)
core.log("action", name .. " bans " .. desc .. ".")
- return true, "Banned " .. desc .. "."
+ return true, S("Banned @1.", desc)
end,
})
core.register_chatcommand("unban", {
- params = "<name> | <IP_address>",
- description = "Remove IP ban belonging to a player/IP",
+ params = S("<name> | <IP_address>"),
+ description = S("Remove IP ban belonging to a player/IP"),
privs = {ban=true},
func = function(name, param)
if not core.unban_player_or_ip(param) then
- return false, "Failed to unban player/IP."
+ return false, S("Failed to unban player/IP.")
end
core.log("action", name .. " unbans " .. param)
- return true, "Unbanned " .. param
+ return true, S("Unbanned @1.", param)
end,
})
core.register_chatcommand("kick", {
- params = "<name> [<reason>]",
- description = "Kick a player",
+ params = S("<name> [<reason>]"),
+ description = S("Kick a player"),
privs = {kick=true},
func = function(name, param)
local tokick, reason = param:match("([^ ]+) (.+)")
tokick = tokick or param
if not core.kick_player(tokick, reason) then
- return false, "Failed to kick player " .. tokick
+ return false, S("Failed to kick player @1.", tokick)
end
local log_reason = ""
if reason then
log_reason = " with reason \"" .. reason .. "\""
end
core.log("action", name .. " kicks " .. tokick .. log_reason)
- return true, "Kicked " .. tokick
+ return true, S("Kicked @1.", tokick)
end,
})
core.register_chatcommand("clearobjects", {
- params = "[full | quick]",
- description = "Clear all objects in world",
+ params = S("[full | quick]"),
+ description = S("Clear all objects in world"),
privs = {server=true},
func = function(name, param)
local options = {}
@@ -1038,45 +1186,44 @@ core.register_chatcommand("clearobjects", {
elseif param == "full" then
options.mode = "full"
else
- return false, "Invalid usage, see /help clearobjects."
+ return false, S("Invalid usage, see /help clearobjects.")
end
- core.log("action", name .. " clears all objects ("
+ core.log("action", name .. " clears objects ("
.. options.mode .. " mode).")
- core.chat_send_all("Clearing all objects. This may take a long time."
- .. " You may experience a timeout. (by "
- .. name .. ")")
+ if options.mode == "full" then
+ core.chat_send_all(S("Clearing all objects. This may take a long time. "
+ .. "You may experience a timeout. (by @1)", name))
+ end
core.clear_objects(options)
core.log("action", "Object clearing done.")
- core.chat_send_all("*** Cleared all objects.")
+ core.chat_send_all("*** "..S("Cleared all objects."))
return true
end,
})
core.register_chatcommand("msg", {
- params = "<name> <message>",
- description = "Send a direct message to a player",
+ params = S("<name> <message>"),
+ description = S("Send a direct message to a player"),
privs = {shout=true},
func = function(name, param)
local sendto, message = param:match("^(%S+)%s(.+)$")
if not sendto then
- return false, "Invalid usage, see /help msg."
+ return false, S("Invalid usage, see /help msg.")
end
if not core.get_player_by_name(sendto) then
- return false, "The player " .. sendto
- .. " is not online."
+ return false, S("The player @1 is not online.", sendto)
end
core.log("action", "DM from " .. name .. " to " .. sendto
.. ": " .. message)
- core.chat_send_player(sendto, "DM from " .. name .. ": "
- .. message)
- return true, "Message sent."
+ core.chat_send_player(sendto, S("DM from @1: @2", name, message))
+ return true, S("Message sent.")
end,
})
core.register_chatcommand("last-login", {
- params = "[<name>]",
- description = "Get the last login time of a player or yourself",
+ params = S("[<name>]"),
+ description = S("Get the last login time of a player or yourself"),
func = function(name, param)
if param == "" then
param = name
@@ -1084,25 +1231,27 @@ core.register_chatcommand("last-login", {
local pauth = core.get_auth_handler().get_auth(param)
if pauth and pauth.last_login and pauth.last_login ~= -1 then
-- Time in UTC, ISO 8601 format
- return true, param.."'s last login time was " ..
- os.date("!%Y-%m-%dT%H:%M:%SZ", pauth.last_login)
+ return true, S("@1's last login time was @2.",
+ param,
+ os.date("!%Y-%m-%dT%H:%M:%SZ", pauth.last_login))
end
- return false, param.."'s last login time is unknown"
+ return false, S("@1's last login time is unknown.", param)
end,
})
core.register_chatcommand("clearinv", {
- params = "[<name>]",
- description = "Clear the inventory of yourself or another player",
+ params = S("[<name>]"),
+ description = S("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 clear another player's inventory (missing privilege: server)"
+ return false, S("You don't have permission to "
+ .. "clear another player's inventory "
+ .. "(missing privilege: @1).", "server")
end
player = core.get_player_by_name(param)
- core.chat_send_player(param, name.." cleared your inventory.")
+ core.chat_send_player(param, S("@1 cleared your inventory.", name))
else
player = core.get_player_by_name(name)
end
@@ -1112,25 +1261,25 @@ core.register_chatcommand("clearinv", {
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."
+ return true, S("Cleared @1's inventory.", player:get_player_name())
else
- return false, "Player must be online to clear inventory!"
+ return false, S("Player must be online to clear inventory!")
end
end,
})
local function handle_kill_command(killer, victim)
if core.settings:get_bool("enable_damage") == false then
- return false, "Players can't be killed, damage has been disabled."
+ return false, S("Players can't be killed, damage has been disabled.")
end
local victimref = core.get_player_by_name(victim)
if victimref == nil then
- return false, string.format("Player %s is not online.", victim)
+ return false, S("Player @1 is not online.", victim)
elseif victimref:get_hp() <= 0 then
if killer == victim then
- return false, "You are already dead."
+ return false, S("You are already dead.")
else
- return false, string.format("%s is already dead.", victim)
+ return false, S("@1 is already dead.", victim)
end
end
if not killer == victim then
@@ -1138,12 +1287,12 @@ local function handle_kill_command(killer, victim)
end
-- Kill victim
victimref:set_hp(0)
- return true, string.format("%s has been killed.", victim)
+ return true, S("@1 has been killed.", victim)
end
core.register_chatcommand("kill", {
- params = "[<name>]",
- description = "Kill player or yourself",
+ params = S("[<name>]"),
+ description = S("Kill player or yourself"),
privs = {server=true},
func = function(name, param)
return handle_kill_command(name, param == "" and name or param)
diff --git a/builtin/game/falling.lua b/builtin/game/falling.lua
index 057d0d0ed..29cb56aae 100644
--- a/builtin/game/falling.lua
+++ b/builtin/game/falling.lua
@@ -39,7 +39,7 @@ local gravity = tonumber(core.settings:get("movement_gravity")) or 9.81
core.register_entity(":__builtin:falling_node", {
initial_properties = {
visual = "item",
- visual_size = {x = SCALE, y = SCALE, z = SCALE},
+ visual_size = vector.new(SCALE, SCALE, SCALE),
textures = {},
physical = true,
is_visible = false,
@@ -84,9 +84,6 @@ core.register_entity(":__builtin:falling_node", {
local textures
if def.tiles and def.tiles[1] then
local tile = def.tiles[1]
- if def.drawtype == "torchlike" and def.paramtype2 ~= "wallmounted" then
- tile = def.tiles[2] or def.tiles[1]
- end
if type(tile) == "table" then
tile = tile.name
end
@@ -99,7 +96,7 @@ core.register_entity(":__builtin:falling_node", {
local vsize
if def.visual_scale then
local s = def.visual_scale
- vsize = {x = s, y = s, z = s}
+ vsize = vector.new(s, s, s)
end
self.object:set_properties({
is_visible = true,
@@ -114,15 +111,21 @@ core.register_entity(":__builtin:falling_node", {
itemstring = core.itemstring_with_palette(itemstring, node.param2)
end
-- FIXME: solution needed for paramtype2 == "leveled"
- local vsize
- if def.visual_scale then
- local s = def.visual_scale * SCALE
- vsize = {x = s, y = s, z = s}
+ -- Calculate size of falling node
+ local s = {}
+ s.x = (def.visual_scale or 1) * SCALE
+ s.y = s.x
+ s.z = s.x
+ -- Compensate for wield_scale
+ if def.wield_scale then
+ s.x = s.x / def.wield_scale.x
+ s.y = s.y / def.wield_scale.y
+ s.z = s.z / def.wield_scale.z
end
self.object:set_properties({
is_visible = true,
wield_item = itemstring,
- visual_size = vsize,
+ visual_size = s,
glow = def.light_source,
})
end
@@ -147,11 +150,7 @@ core.register_entity(":__builtin:falling_node", {
-- Rotate entity
if def.drawtype == "torchlike" then
- if def.paramtype2 == "wallmounted" then
- self.object:set_yaw(math.pi*0.25)
- else
- self.object:set_yaw(-math.pi*0.25)
- end
+ self.object:set_yaw(math.pi*0.25)
elseif ((node.param2 ~= 0 or def.drawtype == "nodebox" or def.drawtype == "mesh")
and (def.wield_image == "" or def.wield_image == nil))
or def.drawtype == "signlike"
@@ -165,8 +164,13 @@ core.register_entity(":__builtin:falling_node", {
if euler then
self.object:set_rotation(euler)
end
- elseif (def.paramtype2 == "wallmounted" or def.paramtype2 == "colorwallmounted") then
+ elseif (def.drawtype ~= "plantlike" and def.drawtype ~= "plantlike_rooted" and
+ (def.paramtype2 == "wallmounted" or def.paramtype2 == "colorwallmounted" or def.drawtype == "signlike")) then
local rot = node.param2 % 8
+ if (def.drawtype == "signlike" and def.paramtype2 ~= "wallmounted" and def.paramtype2 ~= "colorwallmounted") then
+ -- Change rotation to "floor" by default for non-wallmounted paramtype2
+ rot = 1
+ end
local pitch, yaw, roll = 0, 0, 0
if def.drawtype == "nodebox" or def.drawtype == "mesh" then
if rot == 0 then
@@ -208,6 +212,14 @@ core.register_entity(":__builtin:falling_node", {
end
end
self.object:set_rotation({x=pitch, y=yaw, z=roll})
+ elseif (def.drawtype == "mesh" and def.paramtype2 == "degrotate") then
+ local p2 = (node.param2 - (def.place_param2 or 0)) % 240
+ local yaw = (p2 / 240) * (math.pi * 2)
+ self.object:set_yaw(yaw)
+ elseif (def.drawtype == "mesh" and def.paramtype2 == "colordegrotate") then
+ local p2 = (node.param2 % 32 - (def.place_param2 or 0) % 32) % 24
+ local yaw = (p2 / 24) * (math.pi * 2)
+ self.object:set_yaw(yaw)
end
end
end,
@@ -222,7 +234,7 @@ core.register_entity(":__builtin:falling_node", {
on_activate = function(self, staticdata)
self.object:set_armor_groups({immortal = 1})
- self.object:set_acceleration({x = 0, y = -gravity, z = 0})
+ self.object:set_acceleration(vector.new(0, -gravity, 0))
local ds = core.deserialize(staticdata)
if ds and ds.node then
@@ -298,7 +310,7 @@ core.register_entity(":__builtin:falling_node", {
if self.floats then
local pos = self.object:get_pos()
- local bcp = vector.round({x = pos.x, y = pos.y - 0.7, z = pos.z})
+ local bcp = pos:offset(0, -0.7, 0):round()
local bcn = core.get_node(bcp)
local bcd = core.registered_nodes[bcn.name]
@@ -339,13 +351,12 @@ core.register_entity(":__builtin:falling_node", {
-- TODO: this hack could be avoided in the future if objects
-- could choose who to collide with
local vel = self.object:get_velocity()
- self.object:set_velocity({
- x = vel.x,
- y = player_collision.old_velocity.y,
- z = vel.z
- })
- self.object:set_pos(vector.add(self.object:get_pos(),
- {x = 0, y = -0.5, z = 0}))
+ self.object:set_velocity(vector.new(
+ vel.x,
+ player_collision.old_velocity.y,
+ vel.z
+ ))
+ self.object:set_pos(self.object:get_pos():offset(0, -0.5, 0))
end
return
elseif bcn.name == "ignore" then
@@ -407,7 +418,7 @@ local function convert_to_falling_node(pos, node)
obj:get_luaentity():set_node(node, metatable)
core.remove_node(pos)
- return true
+ return true, obj
end
function core.spawn_falling_node(pos)
@@ -425,7 +436,7 @@ local function drop_attached_node(p)
if def and def.preserve_metadata then
local oldmeta = core.get_meta(p):to_table().fields
-- Copy pos and node because the callback can modify them.
- local pos_copy = {x=p.x, y=p.y, z=p.z}
+ local pos_copy = vector.new(p)
local node_copy = {name=n.name, param1=n.param1, param2=n.param2}
local drop_stacks = {}
for k, v in pairs(drops) do
@@ -450,14 +461,14 @@ end
function builtin_shared.check_attached_node(p, n)
local def = core.registered_nodes[n.name]
- local d = {x = 0, y = 0, z = 0}
+ local d = vector.new()
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.
-- The fallback vector corresponds to param2 = 0.
- d = core.wallmounted_to_dir(n.param2) or {x = 0, y = 1, z = 0}
+ d = core.wallmounted_to_dir(n.param2) or vector.new(0, 1, 0)
else
d.y = -1
end
@@ -477,7 +488,7 @@ end
function core.check_single_for_falling(p)
local n = core.get_node(p)
if core.get_item_group(n.name, "falling_node") ~= 0 then
- local p_bottom = {x = p.x, y = p.y - 1, z = p.z}
+ local p_bottom = vector.offset(p, 0, -1, 0)
-- Only spawn falling node if node below is loaded
local n_bottom = core.get_node_or_nil(p_bottom)
local d_bottom = n_bottom and core.registered_nodes[n_bottom.name]
@@ -516,17 +527,17 @@ end
-- Down first as likely case, but always before self. The same with sides.
-- Up must come last, so that things above self will also fall all at once.
local check_for_falling_neighbors = {
- {x = -1, y = -1, z = 0},
- {x = 1, y = -1, z = 0},
- {x = 0, y = -1, z = -1},
- {x = 0, y = -1, z = 1},
- {x = 0, y = -1, z = 0},
- {x = -1, y = 0, z = 0},
- {x = 1, y = 0, z = 0},
- {x = 0, y = 0, z = 1},
- {x = 0, y = 0, z = -1},
- {x = 0, y = 0, z = 0},
- {x = 0, y = 1, z = 0},
+ vector.new(-1, -1, 0),
+ vector.new( 1, -1, 0),
+ vector.new( 0, -1, -1),
+ vector.new( 0, -1, 1),
+ vector.new( 0, -1, 0),
+ vector.new(-1, 0, 0),
+ vector.new( 1, 0, 0),
+ vector.new( 0, 0, 1),
+ vector.new( 0, 0, -1),
+ vector.new( 0, 0, 0),
+ vector.new( 0, 1, 0),
}
function core.check_for_falling(p)
diff --git a/builtin/game/features.lua b/builtin/game/features.lua
index 36ff1f0b0..583ef5092 100644
--- a/builtin/game/features.lua
+++ b/builtin/game/features.lua
@@ -19,6 +19,9 @@ core.features = {
object_step_has_moveresult = true,
direct_velocity_on_players = true,
use_texture_alpha_string_modes = true,
+ degrotate_240_steps = true,
+ abm_min_max_y = true,
+ dynamic_add_media_table = true,
}
function core.has_feature(arg)
diff --git a/builtin/game/forceloading.lua b/builtin/game/forceloading.lua
index e1e00920c..8043e5dea 100644
--- a/builtin/game/forceloading.lua
+++ b/builtin/game/forceloading.lua
@@ -86,12 +86,6 @@ local function read_file(filename)
return core.deserialize(t) or {}
end
-local function write_file(filename, table)
- local f = io.open(filename, "w")
- f:write(core.serialize(table))
- f:close()
-end
-
blocks_forceloaded = read_file(wpath.."/force_loaded.txt")
for _, __ in pairs(blocks_forceloaded) do
total_forceloaded = total_forceloaded + 1
@@ -106,7 +100,8 @@ end)
-- persists the currently forceloaded blocks to disk
local function persist_forceloaded_blocks()
- write_file(wpath.."/force_loaded.txt", blocks_forceloaded)
+ local data = core.serialize(blocks_forceloaded)
+ core.safe_file_write(wpath.."/force_loaded.txt", data)
end
-- periodical forceload persistence
diff --git a/builtin/game/init.lua b/builtin/game/init.lua
index 1d62be019..bb007fabd 100644
--- a/builtin/game/init.lua
+++ b/builtin/game/init.lua
@@ -7,8 +7,6 @@ local gamepath = scriptpath .. "game".. DIR_DELIM
-- not exposed to outer context
local builtin_shared = {}
-dofile(commonpath .. "vector.lua")
-
dofile(gamepath .. "constants.lua")
assert(loadfile(gamepath .. "item.lua"))(builtin_shared)
dofile(gamepath .. "register.lua")
diff --git a/builtin/game/item.lua b/builtin/game/item.lua
index b68177c22..5a83eafd2 100644
--- a/builtin/game/item.lua
+++ b/builtin/game/item.lua
@@ -92,12 +92,12 @@ end
-- Table of possible dirs
local facedir_to_dir = {
- {x= 0, y=0, z= 1},
- {x= 1, y=0, z= 0},
- {x= 0, y=0, z=-1},
- {x=-1, y=0, z= 0},
- {x= 0, y=-1, z= 0},
- {x= 0, y=1, z= 0},
+ vector.new( 0, 0, 1),
+ vector.new( 1, 0, 0),
+ vector.new( 0, 0, -1),
+ vector.new(-1, 0, 0),
+ vector.new( 0, -1, 0),
+ vector.new( 0, 1, 0),
}
-- Mapping from facedir value to index in facedir_to_dir.
local facedir_to_dir_map = {
@@ -136,12 +136,12 @@ end
-- table of dirs in wallmounted order
local wallmounted_to_dir = {
- [0] = {x = 0, y = 1, z = 0},
- {x = 0, y = -1, z = 0},
- {x = 1, y = 0, z = 0},
- {x = -1, y = 0, z = 0},
- {x = 0, y = 0, z = 1},
- {x = 0, y = 0, z = -1},
+ [0] = vector.new( 0, 1, 0),
+ vector.new( 0, -1, 0),
+ vector.new( 1, 0, 0),
+ vector.new(-1, 0, 0),
+ vector.new( 0, 0, 1),
+ vector.new( 0, 0, -1),
}
function core.wallmounted_to_dir(wallmounted)
return wallmounted_to_dir[wallmounted % 8]
@@ -152,12 +152,12 @@ function core.dir_to_yaw(dir)
end
function core.yaw_to_dir(yaw)
- return {x = -math.sin(yaw), y = 0, z = math.cos(yaw)}
+ return vector.new(-math.sin(yaw), 0, math.cos(yaw))
end
function core.is_colored_paramtype(ptype)
return (ptype == "color") or (ptype == "colorfacedir") or
- (ptype == "colorwallmounted")
+ (ptype == "colorwallmounted") or (ptype == "colordegrotate")
end
function core.strip_param2_color(param2, paramtype2)
@@ -168,11 +168,25 @@ function core.strip_param2_color(param2, paramtype2)
param2 = math.floor(param2 / 32) * 32
elseif paramtype2 == "colorwallmounted" then
param2 = math.floor(param2 / 8) * 8
+ elseif paramtype2 == "colordegrotate" then
+ param2 = math.floor(param2 / 32) * 32
end
-- paramtype2 == "color" requires no modification.
return param2
end
+local function has_all_groups(tbl, required_groups)
+ if type(required_groups) == "string" then
+ return (tbl[required_groups] or 0) ~= 0
+ end
+ for _, group in ipairs(required_groups) do
+ if (tbl[group] or 0) == 0 then
+ return false
+ end
+ end
+ return true
+end
+
function core.get_node_drops(node, toolname)
-- Compatibility, if node is string
local nodename = node
@@ -212,7 +226,7 @@ function core.get_node_drops(node, toolname)
if item.rarity ~= nil then
good_rarity = item.rarity < 1 or math.random(item.rarity) == 1
end
- if item.tools ~= nil then
+ if item.tools ~= nil or item.tool_groups ~= nil then
good_tool = false
end
if item.tools ~= nil and toolname then
@@ -227,6 +241,27 @@ function core.get_node_drops(node, toolname)
end
end
end
+ if item.tool_groups ~= nil and toolname then
+ local tooldef = core.registered_items[toolname]
+ if tooldef ~= nil and type(tooldef.groups) == "table" then
+ if type(item.tool_groups) == "string" then
+ -- tool_groups can be a string which specifies the required group
+ good_tool = core.get_item_group(toolname, item.tool_groups) ~= 0
+ else
+ -- tool_groups can be a list of sufficient requirements.
+ -- i.e. if any item in the list can be satisfied then the tool is good
+ assert(type(item.tool_groups) == "table")
+ for _, required_groups in ipairs(item.tool_groups) do
+ -- required_groups can be either a string (a single group),
+ -- or an array of strings where all must be in tooldef.groups
+ good_tool = has_all_groups(tooldef.groups, required_groups)
+ if good_tool then
+ break
+ end
+ end
+ end
+ end
+ end
if good_rarity and good_tool then
got_count = got_count + 1
for _, add_item in ipairs(item.items) do
@@ -288,12 +323,12 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2,
end
-- Place above pointed node
- local place_to = {x = above.x, y = above.y, z = above.z}
+ local place_to = vector.new(above)
-- If node under is buildable_to, place into it instead (eg. snow)
if olddef_under.buildable_to then
log("info", "node under is buildable to")
- place_to = {x = under.x, y = under.y, z = under.z}
+ place_to = vector.new(under)
end
if core.is_protected(place_to, playername) then
@@ -313,22 +348,14 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2,
newnode.param2 = def.place_param2
elseif (def.paramtype2 == "wallmounted" or
def.paramtype2 == "colorwallmounted") and not param2 then
- local dir = {
- x = under.x - above.x,
- y = under.y - above.y,
- z = under.z - above.z
- }
+ local dir = vector.subtract(under, above)
newnode.param2 = core.dir_to_wallmounted(dir)
-- Calculate the direction for furnaces and chests and stuff
elseif (def.paramtype2 == "facedir" or
def.paramtype2 == "colorfacedir") and not param2 then
local placer_pos = placer and placer:get_pos()
if placer_pos then
- local dir = {
- x = above.x - placer_pos.x,
- y = above.y - placer_pos.y,
- z = above.z - placer_pos.z
- }
+ local dir = vector.subtract(above, placer_pos)
newnode.param2 = core.dir_to_facedir(dir)
log("info", "facedir: " .. newnode.param2)
end
@@ -345,6 +372,8 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2,
color_divisor = 8
elseif def.paramtype2 == "colorfacedir" then
color_divisor = 32
+ elseif def.paramtype2 == "colordegrotate" then
+ color_divisor = 32
end
if color_divisor then
local color = math.floor(metatable.palette_index / color_divisor)
@@ -380,7 +409,7 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2,
-- Run callback
if def.after_place_node and not prevent_after_place then
-- Deepcopy place_to and pointed_thing because callback can modify it
- local place_to_copy = {x=place_to.x, y=place_to.y, z=place_to.z}
+ local place_to_copy = vector.new(place_to)
local pointed_thing_copy = copy_pointed_thing(pointed_thing)
if def.after_place_node(place_to_copy, placer, itemstack,
pointed_thing_copy) then
@@ -391,7 +420,7 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2,
-- Run script hook
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}
+ local place_to_copy = vector.new(place_to)
local newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2}
local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2}
local pointed_thing_copy = copy_pointed_thing(pointed_thing)
@@ -470,34 +499,41 @@ function core.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed
return result
end
end
+ -- read definition before potentially emptying the stack
local def = itemstack:get_definition()
- if itemstack:take_item() ~= nil then
- user:set_hp(user:get_hp() + hp_change)
-
- if def and def.sound and def.sound.eat then
- core.sound_play(def.sound.eat, {
- pos = user:get_pos(),
- max_hear_distance = 16
- }, true)
- end
+ if itemstack:take_item():is_empty() then
+ return itemstack
+ end
+
+ if def and def.sound and def.sound.eat then
+ core.sound_play(def.sound.eat, {
+ pos = user:get_pos(),
+ max_hear_distance = 16
+ }, true)
+ end
- if replace_with_item then
- if itemstack:is_empty() then
- itemstack:add_item(replace_with_item)
+ -- Changing hp might kill the player causing mods to do who-knows-what to the
+ -- inventory, so do this before set_hp().
+ if replace_with_item then
+ if itemstack:is_empty() then
+ itemstack:add_item(replace_with_item)
+ else
+ local inv = user:get_inventory()
+ -- Check if inv is null, since non-players don't have one
+ if inv and inv:room_for_item("main", {name=replace_with_item}) then
+ inv:add_item("main", replace_with_item)
else
- local inv = user:get_inventory()
- -- Check if inv is null, since non-players don't have one
- if inv and inv:room_for_item("main", {name=replace_with_item}) then
- inv:add_item("main", replace_with_item)
- else
- local pos = user:get_pos()
- pos.y = math.floor(pos.y + 0.5)
- core.add_item(pos, replace_with_item)
- end
+ local pos = user:get_pos()
+ pos.y = math.floor(pos.y + 0.5)
+ core.add_item(pos, replace_with_item)
end
end
end
- return itemstack
+ user:set_wielded_item(itemstack)
+
+ user:set_hp(user:get_hp() + hp_change)
+
+ return nil -- don't overwrite wield item a second time
end
function core.item_eat(hp_change, replace_with_item)
@@ -537,11 +573,11 @@ function core.handle_node_drops(pos, drops, digger)
for _, dropped_item in pairs(drops) do
local left = give_item(dropped_item)
if not left:is_empty() then
- local p = {
- x = pos.x + math.random()/2-0.25,
- y = pos.y + math.random()/2-0.25,
- z = pos.z + math.random()/2-0.25,
- }
+ local p = vector.offset(pos,
+ math.random()/2-0.25,
+ math.random()/2-0.25,
+ math.random()/2-0.25
+ )
core.add_item(p, left)
end
end
@@ -578,7 +614,7 @@ function core.node_dig(pos, node, digger)
if wielded then
local wdef = wielded:get_definition()
local tp = wielded:get_tool_capabilities()
- local dp = core.get_dig_params(def and def.groups, tp)
+ local dp = core.get_dig_params(def and def.groups, tp, wielded:get_wear())
if wdef and wdef.after_use then
wielded = wdef.after_use(wielded, digger, node, dp) or wielded
else
@@ -600,7 +636,7 @@ function core.node_dig(pos, node, digger)
if def and def.preserve_metadata then
local oldmeta = core.get_meta(pos):to_table().fields
-- Copy pos and node because the callback can modify them.
- local pos_copy = {x=pos.x, y=pos.y, z=pos.z}
+ local pos_copy = vector.new(pos)
local node_copy = {name=node.name, param1=node.param1, param2=node.param2}
local drop_stacks = {}
for k, v in pairs(drops) do
@@ -632,7 +668,7 @@ function core.node_dig(pos, node, digger)
-- Run callback
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 pos_copy = vector.new(pos)
local node_copy = {name=node.name, param1=node.param1, param2=node.param2}
def.after_dig_node(pos_copy, node_copy, oldmetadata, digger)
end
@@ -645,7 +681,7 @@ function core.node_dig(pos, node, digger)
end
-- Copy pos and node because callback can modify them
- local pos_copy = {x=pos.x, y=pos.y, z=pos.z}
+ local pos_copy = vector.new(pos)
local node_copy = {name=node.name, param1=node.param1, param2=node.param2}
callback(pos_copy, node_copy, digger)
end
@@ -688,7 +724,7 @@ core.nodedef_default = {
groups = {},
inventory_image = "",
wield_image = "",
- wield_scale = {x=1,y=1,z=1},
+ wield_scale = vector.new(1, 1, 1),
stack_max = default_stack_max,
usable = false,
liquids_pointable = false,
@@ -747,7 +783,7 @@ core.craftitemdef_default = {
groups = {},
inventory_image = "",
wield_image = "",
- wield_scale = {x=1,y=1,z=1},
+ wield_scale = vector.new(1, 1, 1),
stack_max = default_stack_max,
liquids_pointable = false,
tool_capabilities = nil,
@@ -766,7 +802,7 @@ core.tooldef_default = {
groups = {},
inventory_image = "",
wield_image = "",
- wield_scale = {x=1,y=1,z=1},
+ wield_scale = vector.new(1, 1, 1),
stack_max = 1,
liquids_pointable = false,
tool_capabilities = nil,
@@ -785,7 +821,7 @@ core.noneitemdef_default = { -- This is used for the hand and unknown items
groups = {},
inventory_image = "",
wield_image = "",
- wield_scale = {x=1,y=1,z=1},
+ wield_scale = vector.new(1, 1, 1),
stack_max = default_stack_max,
liquids_pointable = false,
tool_capabilities = nil,
diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua
index b8c5e16a9..e86efc50c 100644
--- a/builtin/game/misc.lua
+++ b/builtin/game/misc.lua
@@ -1,9 +1,21 @@
-- Minetest: builtin/misc.lua
+local S = core.get_translator("__builtin")
+
--
-- Misc. API functions
--
+-- @spec core.kick_player(String, String) :: Boolean
+function core.kick_player(player_name, reason)
+ if type(reason) == "string" then
+ reason = "Kicked: " .. reason
+ else
+ reason = "Kicked."
+ end
+ return core.disconnect_player(player_name, reason)
+end
+
function core.check_player_privs(name, ...)
if core.is_player(name) then
name = name:get_player_name()
@@ -42,15 +54,15 @@ end
function core.send_join_message(player_name)
if not core.is_singleplayer() then
- core.chat_send_all("*** " .. player_name .. " joined the game.")
+ core.chat_send_all("*** " .. S("@1 joined the game.", player_name))
end
end
function core.send_leave_message(player_name, timed_out)
- local announcement = "*** " .. player_name .. " left the game."
+ local announcement = "*** " .. S("@1 left the game.", player_name)
if timed_out then
- announcement = announcement .. " (timed out)"
+ announcement = "*** " .. S("@1 left the game (timed out).", player_name)
end
core.chat_send_all(announcement)
end
@@ -117,13 +129,12 @@ end
function core.get_position_from_hash(hash)
- local pos = {}
- pos.x = (hash % 65536) - 32768
+ local x = (hash % 65536) - 32768
hash = math.floor(hash / 65536)
- pos.y = (hash % 65536) - 32768
+ local y = (hash % 65536) - 32768
hash = math.floor(hash / 65536)
- pos.z = (hash % 65536) - 32768
- return pos
+ local z = (hash % 65536) - 32768
+ return vector.new(x, y, z)
end
@@ -213,7 +224,7 @@ function core.is_area_protected(minp, maxp, player_name, interval)
local y = math.floor(yf + 0.5)
for xf = minp.x, maxp.x, d.x do
local x = math.floor(xf + 0.5)
- local pos = {x = x, y = y, z = z}
+ local pos = vector.new(x, y, z)
if core.is_protected(pos, player_name) then
return pos
end
@@ -239,7 +250,7 @@ end
-- HTTP callback interface
-function core.http_add_fetch(httpenv)
+core.set_http_api_lua(function(httpenv)
httpenv.fetch = function(req, callback)
local handle = httpenv.fetch_async(req)
@@ -255,7 +266,8 @@ function core.http_add_fetch(httpenv)
end
return httpenv
-end
+end)
+core.set_http_api_lua = nil
function core.close_formspec(player_name, formname)
@@ -268,24 +280,44 @@ function core.cancel_shutdown_requests()
end
--- Callback handling for dynamic_add_media
+-- Used for callback handling with dynamic_add_media
+core.dynamic_media_callbacks = {}
+
-local dynamic_add_media_raw = core.dynamic_add_media_raw
-core.dynamic_add_media_raw = nil
-function core.dynamic_add_media(filepath, callback)
- local ret = dynamic_add_media_raw(filepath)
- if ret == false then
- return ret
+-- PNG encoder safety wrapper
+
+local o_encode_png = core.encode_png
+function core.encode_png(width, height, data, compression)
+ if type(width) ~= "number" then
+ error("Incorrect type for 'width', expected number, got " .. type(width))
end
- if callback == nil then
- core.log("deprecated", "Calling minetest.dynamic_add_media without "..
- "a callback is deprecated and will stop working in future versions.")
- else
- -- At the moment async loading is not actually implemented, so we
- -- immediately call the callback ourselves
- for _, name in ipairs(ret) do
- callback(name)
+ if type(height) ~= "number" then
+ error("Incorrect type for 'height', expected number, got " .. type(height))
+ end
+
+ local expected_byte_count = width * height * 4
+
+ if type(data) ~= "table" and type(data) ~= "string" then
+ error("Incorrect type for 'data', expected table or string, got " .. type(data))
+ end
+
+ local data_length = type(data) == "table" and #data * 4 or string.len(data)
+
+ if data_length ~= expected_byte_count then
+ error(string.format(
+ "Incorrect length of 'data', width and height imply %d bytes but %d were provided",
+ expected_byte_count,
+ data_length
+ ))
+ end
+
+ if type(data) == "table" then
+ local dataBuf = {}
+ for i = 1, #data do
+ dataBuf[i] = core.colorspec_to_bytes(data[i])
end
+ data = table.concat(dataBuf)
end
- return true
+
+ return o_encode_png(width, height, data, compression or 6)
end
diff --git a/builtin/game/privileges.lua b/builtin/game/privileges.lua
index c7417d2f4..2ff4c093c 100644
--- a/builtin/game/privileges.lua
+++ b/builtin/game/privileges.lua
@@ -1,5 +1,7 @@
-- Minetest: builtin/privileges.lua
+local S = core.get_translator("__builtin")
+
--
-- Privileges
--
@@ -15,7 +17,7 @@ function core.register_privilege(name, param)
def.give_to_admin = def.give_to_singleplayer
end
if def.description == nil then
- def.description = "(no description)"
+ def.description = S("(no description)")
end
end
local def
@@ -28,71 +30,76 @@ function core.register_privilege(name, param)
core.registered_privileges[name] = def
end
-core.register_privilege("interact", "Can interact with things and modify the world")
-core.register_privilege("shout", "Can speak in chat")
-core.register_privilege("basic_privs", "Can modify 'shout' and 'interact' privileges")
-core.register_privilege("privs", "Can modify privileges")
+core.register_privilege("interact", S("Can interact with things and modify the world"))
+core.register_privilege("shout", S("Can speak in chat"))
+
+local basic_privs =
+ core.string_to_privs((core.settings:get("basic_privs") or "shout,interact"))
+local basic_privs_desc = S("Can modify basic privileges (@1)",
+ core.privs_to_string(basic_privs, ', '))
+core.register_privilege("basic_privs", basic_privs_desc)
+
+core.register_privilege("privs", S("Can modify privileges"))
core.register_privilege("teleport", {
- description = "Can teleport self",
+ description = S("Can teleport self"),
give_to_singleplayer = false,
})
core.register_privilege("bring", {
- description = "Can teleport other players",
+ description = S("Can teleport other players"),
give_to_singleplayer = false,
})
core.register_privilege("settime", {
- description = "Can set the time of day using /time",
+ description = S("Can set the time of day using /time"),
give_to_singleplayer = false,
})
core.register_privilege("server", {
- description = "Can do server maintenance stuff",
+ description = S("Can do server maintenance stuff"),
give_to_singleplayer = false,
give_to_admin = true,
})
core.register_privilege("protection_bypass", {
- description = "Can bypass node protection in the world",
+ description = S("Can bypass node protection in the world"),
give_to_singleplayer = false,
})
core.register_privilege("ban", {
- description = "Can ban and unban players",
+ description = S("Can ban and unban players"),
give_to_singleplayer = false,
give_to_admin = true,
})
core.register_privilege("kick", {
- description = "Can kick players",
+ description = S("Can kick players"),
give_to_singleplayer = false,
give_to_admin = true,
})
core.register_privilege("give", {
- description = "Can use /give and /giveme",
+ description = S("Can use /give and /giveme"),
give_to_singleplayer = false,
})
core.register_privilege("password", {
- description = "Can use /setpassword and /clearpassword",
+ description = S("Can use /setpassword and /clearpassword"),
give_to_singleplayer = false,
give_to_admin = true,
})
core.register_privilege("fly", {
- description = "Can use fly mode",
+ description = S("Can use fly mode"),
give_to_singleplayer = false,
})
core.register_privilege("fast", {
- description = "Can use fast mode",
+ description = S("Can use fast mode"),
give_to_singleplayer = false,
})
core.register_privilege("noclip", {
- description = "Can fly through solid nodes using noclip mode",
+ description = S("Can fly through solid nodes using noclip mode"),
give_to_singleplayer = false,
})
core.register_privilege("rollback", {
- description = "Can use the rollback functionality",
+ description = S("Can use the rollback functionality"),
give_to_singleplayer = false,
})
core.register_privilege("debug", {
- description = "Allows enabling various debug options that may affect gameplay",
+ description = S("Can enable wireframe"),
give_to_singleplayer = false,
- give_to_admin = true,
})
core.register_can_bypass_userlimit(function(name, ip)
diff --git a/builtin/game/register.lua b/builtin/game/register.lua
index 1cff85813..56e40c75c 100644
--- a/builtin/game/register.lua
+++ b/builtin/game/register.lua
@@ -1,5 +1,7 @@
-- Minetest: builtin/misc_register.lua
+local S = core.get_translator("__builtin")
+
--
-- Make raw registration functions inaccessible to anyone except this file
--
@@ -326,7 +328,7 @@ end
core.register_item(":unknown", {
type = "none",
- description = "Unknown Item",
+ description = S("Unknown Item"),
inventory_image = "unknown_item.png",
on_place = core.item_place,
on_secondary_use = core.item_secondary_use,
@@ -336,7 +338,7 @@ core.register_item(":unknown", {
})
core.register_node(":air", {
- description = "Air",
+ description = S("Air"),
inventory_image = "air.png",
wield_image = "air.png",
drawtype = "airlike",
@@ -353,7 +355,7 @@ core.register_node(":air", {
})
core.register_node(":ignore", {
- description = "Ignore",
+ description = S("Ignore"),
inventory_image = "ignore.png",
wield_image = "ignore.png",
drawtype = "airlike",
@@ -366,11 +368,12 @@ core.register_node(":ignore", {
air_equivalent = true,
drop = "",
groups = {not_in_creative_inventory=1},
+ node_placement_prediction = "",
on_place = function(itemstack, placer, pointed_thing)
core.chat_send_player(
placer:get_player_name(),
core.colorize("#FF0000",
- "You can't place 'ignore' nodes!"))
+ S("You can't place 'ignore' nodes!")))
return ""
end,
})
@@ -607,6 +610,7 @@ core.registered_on_modchannel_message, core.register_on_modchannel_message = mak
core.registered_on_player_inventory_actions, core.register_on_player_inventory_action = make_registration()
core.registered_allow_player_inventory_actions, core.register_allow_player_inventory_action = make_registration()
core.registered_on_rightclickplayers, core.register_on_rightclickplayer = make_registration()
+core.registered_on_liquid_transformed, core.register_on_liquid_transformed = make_registration()
--
-- Compatibility for on_mapgen_init()
diff --git a/builtin/game/voxelarea.lua b/builtin/game/voxelarea.lua
index 724761414..64436bf1a 100644
--- a/builtin/game/voxelarea.lua
+++ b/builtin/game/voxelarea.lua
@@ -1,6 +1,6 @@
VoxelArea = {
- MinEdge = {x=1, y=1, z=1},
- MaxEdge = {x=0, y=0, z=0},
+ MinEdge = vector.new(1, 1, 1),
+ MaxEdge = vector.new(0, 0, 0),
ystride = 0,
zstride = 0,
}
@@ -19,11 +19,11 @@ end
function VoxelArea:getExtent()
local MaxEdge, MinEdge = self.MaxEdge, self.MinEdge
- return {
- x = MaxEdge.x - MinEdge.x + 1,
- y = MaxEdge.y - MinEdge.y + 1,
- z = MaxEdge.z - MinEdge.z + 1,
- }
+ return vector.new(
+ MaxEdge.x - MinEdge.x + 1,
+ MaxEdge.y - MinEdge.y + 1,
+ MaxEdge.z - MinEdge.z + 1
+ )
end
function VoxelArea:getVolume()
diff --git a/builtin/init.lua b/builtin/init.lua
index 89b1fdc64..7a9b5c427 100644
--- a/builtin/init.lua
+++ b/builtin/init.lua
@@ -30,6 +30,7 @@ local clientpath = scriptdir .. "client" .. DIR_DELIM
local commonpath = scriptdir .. "common" .. DIR_DELIM
local asyncpath = scriptdir .. "async" .. DIR_DELIM
+dofile(commonpath .. "vector.lua")
dofile(commonpath .. "strict.lua")
dofile(commonpath .. "serialize.lua")
dofile(commonpath .. "misc_helpers.lua")
diff --git a/builtin/locale/__builtin.de.tr b/builtin/locale/__builtin.de.tr
new file mode 100644
index 000000000..1b29f81e7
--- /dev/null
+++ b/builtin/locale/__builtin.de.tr
@@ -0,0 +1,245 @@
+# textdomain: __builtin
+Empty command.=Leerer Befehl.
+Invalid command: @1=Ungültiger Befehl: @1
+Invalid command usage.=Ungültige Befehlsverwendung.
+ (@1 s)= (@1 s)
+Command execution took @1 s=Befehlsausführung brauchte @1 s
+You don't have permission to run this command (missing privileges: @1).=Sie haben keine Erlaubnis, diesen Befehl auszuführen (fehlende Privilegien: @1).
+Unable to get position of player @1.=Konnte Position vom Spieler @1 nicht ermitteln.
+Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=Ungültiges Gebietsformat. Erwartet: (x1,y1,z1) (x2,y2,z2)
+<action>=<Aktion>
+Show chat action (e.g., '/me orders a pizza' displays '<player name> orders a pizza')=Chataktion zeigen (z.B. wird „/me isst Pizza“ zu „<Spielername> isst Pizza“)
+Show the name of the server owner=Den Namen des Servereigentümers zeigen
+The administrator of this server is @1.=Der Administrator dieses Servers ist @1.
+There's no administrator named in the config file.=In der Konfigurationsdatei wurde kein Administrator angegeben.
+@1 does not have any privileges.=@1 hat keine Privilegien.
+Privileges of @1: @2=Privilegien von @1: @2
+[<name>]=[<Name>]
+Show privileges of yourself or another player=Ihre eigenen Privilegien oder die eines anderen Spielers anzeigen
+Player @1 does not exist.=Spieler @1 existiert nicht.
+<privilege>=<Privileg>
+Return list of all online players with privilege=Liste aller Spieler mit einem Privileg ausgeben
+Invalid parameters (see /help haspriv).=Ungültige Parameter (siehe „/help haspriv“).
+Unknown privilege!=Unbekanntes Privileg!
+No online player has the "@1" privilege.=Kein online spielender Spieler hat das „@1“-Privileg.
+Players online with the "@1" privilege: @2=Derzeit online spielende Spieler mit dem „@1“-Privileg: @2
+Your privileges are insufficient.=Ihre Privilegien sind unzureichend.
+Your privileges are insufficient. '@1' only allows you to grant: @2=Ihre Privilegien sind unzureichend. Mit „@1“ können Sie nur folgendes gewähren: @2
+Unknown privilege: @1=Unbekanntes Privileg: @1
+@1 granted you privileges: @2=@1 gewährte Ihnen Privilegien: @2
+<name> (<privilege> [, <privilege2> [<...>]] | all)=<Name> (<Privileg> [, <Privileg2> [<...>]] | all)
+Give privileges to player=Privileg an Spieler vergeben
+Invalid parameters (see /help grant).=Ungültige Parameter (siehe „/help grant“).
+<privilege> [, <privilege2> [<...>]] | all=<Privileg> [, <Privileg2> [<...>]] | all
+Grant privileges to yourself=Privilegien an Ihnen selbst vergeben
+Invalid parameters (see /help grantme).=Ungültige Parameter (siehe „/help grantme“).
+Your privileges are insufficient. '@1' only allows you to revoke: @2=Ihre Privilegien sind unzureichend. Mit „@1“ können Sie nur folgendes entziehen: @2
+Note: Cannot revoke in singleplayer: @1=Anmerkung: Im Einzelspielermodus kann man folgendes nicht entziehen: @1
+Note: Cannot revoke from admin: @1=Anmerkung: Vom Admin kann man folgendes nicht entziehen: @1
+No privileges were revoked.=Es wurden keine Privilegien entzogen.
+@1 revoked privileges from you: @2=@1 entfernte Privilegien von Ihnen: @2
+Remove privileges from player=Privilegien von Spieler entfernen
+Invalid parameters (see /help revoke).=Ungültige Parameter (siehe „/help revoke“).
+Revoke privileges from yourself=Privilegien von Ihnen selbst entfernen
+Invalid parameters (see /help revokeme).=Ungültige Parameter (siehe „/help revokeme“).
+<name> <password>=<Name> <Passwort>
+Set player's password=Passwort von Spieler setzen
+Name field required.=Namensfeld benötigt.
+Your password was cleared by @1.=Ihr Passwort wurde von @1 geleert.
+Password of player "@1" cleared.=Passwort von Spieler „@1“ geleert.
+Your password was set by @1.=Ihr Passwort wurde von @1 gesetzt.
+Password of player "@1" set.=Passwort von Spieler „@1“ gesetzt.
+<name>=<Name>
+Set empty password for a player=Leeres Passwort für einen Spieler setzen
+Reload authentication data=Authentifizierungsdaten erneut laden
+Done.=Fertig.
+Failed.=Fehlgeschlagen.
+Remove a player's data=Daten eines Spielers löschen
+Player "@1" removed.=Spieler „@1“ gelöscht.
+No such player "@1" to remove.=Es gibt keinen Spieler „@1“, der gelöscht werden könnte.
+Player "@1" is connected, cannot remove.=Spieler „@1“ ist verbunden, er kann nicht gelöscht werden.
+Unhandled remove_player return code @1.=Nicht berücksichtigter remove_player-Rückgabewert @1.
+Cannot teleport out of map bounds!=Eine Teleportation außerhalb der Kartengrenzen ist nicht möglich!
+Cannot get player with name @1.=Spieler mit Namen @1 kann nicht gefunden werden.
+Cannot teleport, @1 is attached to an object!=Teleportation nicht möglich, @1 ist an einem Objekt befestigt!
+Teleporting @1 to @2.=Teleportation von @1 nach @2
+One does not teleport to oneself.=Man teleportiert sich doch nicht zu sich selbst.
+Cannot get teleportee with name @1.=Der zu teleportierende Spieler mit Namen @1 kann nicht gefunden werden.
+Cannot get target player with name @1.=Zielspieler mit Namen @1 kann nicht gefunden werden.
+Teleporting @1 to @2 at @3.=Teleportation von @1 zu @2 bei @3
+<X>,<Y>,<Z> | <to_name> | <name> <X>,<Y>,<Z> | <name> <to_name>=<X>,<Y>,<Z> | <zu_Name> | <Name> <X>,<Y>,<Z> | <Name> <zu_Name>
+Teleport to position or player=Zu Position oder Spieler teleportieren
+You don't have permission to teleport other players (missing privilege: @1).=Sie haben nicht die Erlaubnis, andere Spieler zu teleportieren (fehlendes Privileg: @1).
+([-n] <name> <value>) | <name>=([-n] <Name> <Wert>) | <Name>
+Set or read server configuration setting=Serverkonfigurationseinstellung setzen oder lesen
+Failed. Use '/set -n <name> <value>' to create a new setting.=Fehlgeschlagen. Benutzen Sie „/set -n <Name> <Wert>“, um eine neue Einstellung zu erstellen.
+@1 @= @2=@1 @= @2
+<not set>=<nicht gesetzt>
+Invalid parameters (see /help set).=Ungültige Parameter (siehe „/help set“).
+Finished emerging @1 blocks in @2ms.=Fertig mit Erzeugung von @1 Blöcken in @2 ms.
+emergeblocks update: @1/@2 blocks emerged (@3%)=emergeblocks-Update: @1/@2 Kartenblöcke geladen (@3%)
+(here [<radius>]) | (<pos1> <pos2>)=(here [<Radius>]) | (<Pos1> <Pos2>)
+Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=Lade (oder, wenn nicht existent, generiere) Kartenblöcke im Gebiet zwischen Pos1 und Pos2 (<Pos1> und <Pos2> müssen in Klammern stehen)
+Started emerge of area ranging from @1 to @2.=Start des Ladevorgangs des Gebiets zwischen @1 und @2.
+Delete map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=Kartenblöcke innerhalb des Gebiets zwischen Pos1 und Pos2 löschen (<Pos1> und <Pos2> müssen in Klammern stehen)
+Successfully cleared area ranging from @1 to @2.=Gebiet zwischen @1 und @2 erfolgreich geleert.
+Failed to clear one or more blocks in area.=Fehlgeschlagen: Ein oder mehrere Kartenblöcke im Gebiet konnten nicht geleert werden.
+Resets lighting in the area between pos1 and pos2 (<pos1> and <pos2> must be in parentheses)=Setzt das Licht im Gebiet zwischen Pos1 und Pos2 zurück (<Pos1> und <Pos2> müssen in Klammern stehen)
+Successfully reset light in the area ranging from @1 to @2.=Das Licht im Gebiet zwischen @1 und @2 wurde erfolgreich zurückgesetzt.
+Failed to load one or more blocks in area.=Fehlgeschlagen: Ein oder mehrere Kartenblöcke im Gebiet konnten nicht geladen werden.
+List mods installed on the server=Installierte Mods auf dem Server auflisten
+No mods installed.=Es sind keine Mods installiert.
+Cannot give an empty item.=Ein leerer Gegenstand kann nicht gegeben werden.
+Cannot give an unknown item.=Ein unbekannter Gegenstand kann nicht gegeben werden.
+Giving 'ignore' is not allowed.=„ignore“ darf nicht gegeben werden.
+@1 is not a known player.=@1 ist kein bekannter Spieler.
+@1 partially added to inventory.=@1 teilweise ins Inventar eingefügt.
+@1 could not be added to inventory.=@1 konnte nicht ins Inventar eingefügt werden.
+@1 added to inventory.=@1 zum Inventar hinzugefügt.
+@1 partially added to inventory of @2.=@1 teilweise ins Inventar von @2 eingefügt.
+@1 could not be added to inventory of @2.=@1 konnte nicht ins Inventar von @2 eingefügt werden.
+@1 added to inventory of @2.=@1 ins Inventar von @2 eingefügt.
+<name> <ItemString> [<count> [<wear>]]=<Name> <ItemString> [<Anzahl> [<Abnutzung>]]
+Give item to player=Gegenstand an Spieler geben
+Name and ItemString required.=Name und ItemString benötigt.
+<ItemString> [<count> [<wear>]]=<ItemString> [<Anzahl> [<Abnutzung>]]
+Give item to yourself=Gegenstand Ihnen selbst geben
+ItemString required.=ItemString benötigt.
+<EntityName> [<X>,<Y>,<Z>]=<EntityName> [<X>,<Y>,<Z>]
+Spawn entity at given (or your) position=Entity an angegebener (oder Ihrer eigenen) Position spawnen
+EntityName required.=EntityName benötigt.
+Unable to spawn entity, player is nil.=Entity konnte nicht gespawnt werden, Spieler ist nil.
+Cannot spawn an unknown entity.=Ein unbekanntes Entity kann nicht gespawnt werden.
+Invalid parameters (@1).=Ungültige Parameter (@1).
+@1 spawned.=@1 gespawnt.
+@1 failed to spawn.=@1 konnte nicht gespawnt werden.
+Destroy item in hand=Gegenstand in der Hand zerstören
+Unable to pulverize, no player.=Konnte nicht pulverisieren, kein Spieler.
+Unable to pulverize, no item in hand.=Konnte nicht pulverisieren, kein Gegenstand in der Hand.
+An item was pulverized.=Ein Gegenstand wurde pulverisiert.
+[<range>] [<seconds>] [<limit>]=[<Reichweite>] [<Sekunden>] [<Limit>]
+Check who last touched a node or a node near it within the time specified by <seconds>. Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set <seconds> to inf for no time limit=Überprüfen, wer als letztes einen Node oder einen Node in der Nähe innerhalb der in <Sekunden> angegebenen Zeitspanne angefasst hat. Standard: Reichweite @= 0, Sekunden @= 86400 @= 24h, Limit @= 5. <Sekunden> auf „inf“ setzen, um Zeitlimit zu deaktivieren.
+Rollback functions are disabled.=Rollback-Funktionen sind deaktiviert.
+That limit is too high!=Dieses Limit ist zu hoch!
+Checking @1 ...=Überprüfe @1 ...
+Nobody has touched the specified location in @1 seconds.=Niemand hat die angegebene Position seit @1 Sekunden angefasst.
+@1 @2 @3 -> @4 @5 seconds ago.=@1 @2 @3 -> @4 vor @5 Sekunden.
+Punch a node (range@=@1, seconds@=@2, limit@=@3).=Hauen Sie einen Node (Reichweite@=@1, Sekunden@=@2, Limit@=@3).
+(<name> [<seconds>]) | (:<actor> [<seconds>])=(<Name> [<Sekunden>]) | (:<Akteur> [<Sekunden>])
+Revert actions of a player. Default for <seconds> is 60. Set <seconds> to inf for no time limit=Aktionen eines Spielers zurückrollen. Standard für <Sekunden> ist 60. <Sekunden> auf „inf“ setzen, um Zeitlimit zu deaktivieren
+Invalid parameters. See /help rollback and /help rollback_check.=Ungültige Parameter. Siehe /help rollback und /help rollback_check.
+Reverting actions of player '@1' since @2 seconds.=Die Aktionen des Spielers „@1“ seit @2 Sekunden werden rückgängig gemacht.
+Reverting actions of @1 since @2 seconds.=Die Aktionen von @1 seit @2 Sekunden werden rückgängig gemacht.
+(log is too long to show)=(Protokoll ist zu lang für die Anzeige)
+Reverting actions succeeded.=Die Aktionen wurden erfolgreich rückgängig gemacht.
+Reverting actions FAILED.=FEHLGESCHLAGEN: Die Aktionen konnten nicht rückgängig gemacht werden.
+Show server status=Serverstatus anzeigen
+This command was disabled by a mod or game.=Dieser Befehl wurde von einer Mod oder einem Spiel deaktiviert.
+[<0..23>:<0..59> | <0..24000>]=[<0..23>:<0..59> | <0..24000>]
+Show or set time of day=Tageszeit anzeigen oder setzen
+Current time is @1:@2.=Es ist jetzt @1:@2 Uhr.
+You don't have permission to run this command (missing privilege: @1).=Sie haben nicht die Erlaubnis, diesen Befehl auszuführen (fehlendes Privileg: @1).
+Invalid time (must be between 0 and 24000).=Ungültige Zeit (muss zwischen 0 und 24000 liegen).
+Time of day changed.=Tageszeit geändert.
+Invalid hour (must be between 0 and 23 inclusive).=Ungültige Stunde (muss zwischen 0 und 23 inklusive liegen).
+Invalid minute (must be between 0 and 59 inclusive).=Ungültige Minute (muss zwischen 0 und 59 inklusive liegen).
+Show day count since world creation=Anzahl Tage seit der Erschaffung der Welt anzeigen
+Current day is @1.=Aktueller Tag ist @1.
+[<delay_in_seconds> | -1] [-r] [<message>]=[<Verzögerung_in_Sekunden> | -1] [-r] [<Nachricht>]
+Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)=Server herunterfahren (-1 bricht einen verzögerten Abschaltvorgang ab, -r erlaubt Spielern, sich wiederzuverbinden)
+Server shutting down (operator request).=Server wird heruntergefahren (Betreiberanfrage).
+Ban the IP of a player or show the ban list=Die IP eines Spielers verbannen oder die Bannliste anzeigen
+The ban list is empty.=Die Bannliste ist leer.
+Ban list: @1=Bannliste: @1
+Player is not online.=Spieler ist nicht online.
+Failed to ban player.=Konnte Spieler nicht verbannen.
+Banned @1.=@1 verbannt.
+<name> | <IP_address>=<Name> | <IP_Adresse>
+Remove IP ban belonging to a player/IP=Einen IP-Bann auf einen Spieler zurücknehmen
+Failed to unban player/IP.=Konnte Bann auf Spieler/IP nicht zurücknehmen.
+Unbanned @1.=Bann auf @1 zurückgenommen.
+<name> [<reason>]=<Name> [<Grund>]
+Kick a player=Spieler hinauswerfen
+Failed to kick player @1.=Spieler @1 konnte nicht hinausgeworfen werden.
+Kicked @1.=@1 hinausgeworfen.
+[full | quick]=[full | quick]
+Clear all objects in world=Alle Objekte in der Welt löschen
+Invalid usage, see /help clearobjects.=Ungültige Verwendung, siehe /help clearobjects.
+Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=Lösche alle Objekte. Dies kann eine lange Zeit dauern. Eine Netzwerkzeitüberschreitung könnte für Sie auftreten. (von @1)
+Cleared all objects.=Alle Objekte gelöscht.
+<name> <message>=<Name> <Nachricht>
+Send a direct message to a player=Eine Direktnachricht an einen Spieler senden
+Invalid usage, see /help msg.=Ungültige Verwendung, siehe /help msg.
+The player @1 is not online.=Der Spieler @1 ist nicht online.
+DM from @1: @2=DN von @1: @2
+Message sent.=Nachricht gesendet.
+Get the last login time of a player or yourself=Den letzten Loginzeitpunkt eines Spielers oder Ihren eigenen anfragen
+@1's last login time was @2.=Letzter Loginzeitpunkt von @1 war @2.
+@1's last login time is unknown.=Letzter Loginzeitpunkt von @1 ist unbekannt.
+Clear the inventory of yourself or another player=Das Inventar von Ihnen oder einem anderen Spieler leeren
+You don't have permission to clear another player's inventory (missing privilege: @1).=Sie haben nicht die Erlaubnis, das Inventar eines anderen Spielers zu leeren (fehlendes Privileg: @1).
+@1 cleared your inventory.=@1 hat Ihr Inventar geleert.
+Cleared @1's inventory.=Inventar von @1 geleert.
+Player must be online to clear inventory!=Spieler muss online sein, um das Inventar leeren zu können!
+Players can't be killed, damage has been disabled.=Spieler können nicht getötet werden, Schaden ist deaktiviert.
+Player @1 is not online.=Spieler @1 ist nicht online.
+You are already dead.=Sie sind schon tot.
+@1 is already dead.=@1 ist bereits tot.
+@1 has been killed.=@1 wurde getötet.
+Kill player or yourself=Einen Spieler oder Sie selbst töten
+Invalid parameters (see /help @1).=Ungültige Parameter (siehe „/help @1“).
+Too many arguments, try using just /help <command>=Zu viele Argumente. Probieren Sie es mit „/help <Befehl>“
+Available commands: @1=Verfügbare Befehle: @1
+Use '/help <cmd>' to get more information, or '/help all' to list everything.=„/help <Befehl>“ benutzen, um mehr Informationen zu erhalten, oder „/help all“, um alles aufzulisten.
+Available commands:=Verfügbare Befehle:
+Command not available: @1=Befehl nicht verfügbar: @1
+[all | privs | <cmd>] [-t]=[all | privs | <Befehl>] [-t]
+Get help for commands or list privileges (-t: output in chat)=Hilfe für Befehle erhalten oder Privilegien auflisten (-t: Ausgabe im Chat)
+Available privileges:=Verfügbare Privilegien:
+Command=Befehl
+Parameters=Parameter
+For more information, click on any entry in the list.=Für mehr Informationen klicken Sie auf einen beliebigen Eintrag in der Liste.
+Double-click to copy the entry to the chat history.=Doppelklicken, um den Eintrag in die Chathistorie einzufügen.
+Command: @1 @2=Befehl: @1 @2
+Available commands: (see also: /help <cmd>)=Verfügbare Befehle: (siehe auch: /help <Befehl>)
+Close=Schließen
+Privilege=Privileg
+Description=Beschreibung
+print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset=print [<Filter>] | dump [<Filter>] | save [<Format> [<Filter>]]
+Handle the profiler and profiling data=Den Profiler und Profilingdaten verwalten
+Statistics written to action log.=Statistiken zum Aktionsprotokoll geschrieben.
+Statistics were reset.=Statistiken wurden zurückgesetzt.
+Usage: @1=Verwendung: @1
+Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=Format kann entweder „txt“, „csv“, „lua“, „json“ oder „json_pretty“ sein (die Struktur kann sich in Zukunft ändern).
+@1 joined the game.=@1 ist dem Spiel beigetreten.
+@1 left the game.=@1 hat das Spiel verlassen.
+@1 left the game (timed out).=@1 hat das Spiel verlassen (Netzwerkzeitüberschreitung).
+(no description)=(keine Beschreibung)
+Can interact with things and modify the world=Kann mit Dingen interagieren und die Welt verändern
+Can speak in chat=Kann im Chat sprechen
+Can modify basic privileges (@1)=Kann grundlegende Privilegien anpassen (@1)
+Can modify privileges=Kann Privilegien anpassen
+Can teleport self=Kann sich selbst teleportieren
+Can teleport other players=Kann andere Spieler teleportieren
+Can set the time of day using /time=Kann die Tageszeit mit /time setzen
+Can do server maintenance stuff=Kann Serverwartungsdinge machen
+Can bypass node protection in the world=Kann den Schutz auf Blöcken in der Welt umgehen
+Can ban and unban players=Kann Spieler verbannen und entbannen
+Can kick players=Kann Spieler hinauswerfen
+Can use /give and /giveme=Kann /give und /giveme benutzen
+Can use /setpassword and /clearpassword=Kann /setpassword und /clearpassword benutzen
+Can use fly mode=Kann den Flugmodus benutzen
+Can use fast mode=Kann den Schnellmodus benutzen
+Can fly through solid nodes using noclip mode=Kann durch feste Blöcke mit dem Geistmodus fliegen
+Can use the rollback functionality=Kann die Rollback-Funktionalität benutzen
+Can view more debug info that might give a gameplay advantage=Kann zusätzliche Debuginformationen betrachten, welche einen spielerischen Vorteil geben könnten
+Can enable wireframe=Kann Drahtmodell aktivieren
+Unknown Item=Unbekannter Gegenstand
+Air=Luft
+Ignore=Ignorieren
+You can't place 'ignore' nodes!=Sie können keine „ignore“-Blöcke platzieren!
+Values below show absolute/relative times spend per server step by the instrumented function.=Die unten angegebenen Werte zeigen absolute/relative Zeitspannen, die je Server-Step von der instrumentierten Funktion in Anspruch genommen wurden.
+A total of @1 sample(s) were taken.=Es wurden insgesamt @1 Datenpunkt(e) aufgezeichnet.
+The output is limited to '@1'.=Die Ausgabe ist beschränkt auf „@1“.
+Saving of profile failed: @1=Speichern des Profils fehlgeschlagen: @1
+Profile saved to @1=Profil abgespeichert nach @1
diff --git a/builtin/locale/__builtin.it.tr b/builtin/locale/__builtin.it.tr
new file mode 100644
index 000000000..77f85c766
--- /dev/null
+++ b/builtin/locale/__builtin.it.tr
@@ -0,0 +1,258 @@
+# textdomain: __builtin
+Empty command.=Comando vuoto.
+Invalid command: @1=Comando non valido: @1
+Invalid command usage.=Utilizzo del comando non valido.
+ (@1 s)=
+Command execution took @1 s=
+You don't have permission to run this command (missing privileges: @1).=Non hai il permesso di eseguire questo comando (privilegi mancanti: @1).
+Unable to get position of player @1.=Impossibile ottenere la posizione del giocatore @1.
+Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=Formato dell'area non corretto. Richiesto: (x1,y1,z1) (x2,y2,z2)
+<action>=<azione>
+Show chat action (e.g., '/me orders a pizza' displays '<player name> orders a pizza')=Mostra un'azione in chat (es. `/me ordina una pizza` mostra `<nome giocatore> ordina una pizza`)
+Show the name of the server owner=Mostra il nome del proprietario del server
+The administrator of this server is @1.=L'amministratore di questo server è @1.
+There's no administrator named in the config file.=Non c'è nessun amministratore nel file di configurazione.
+@1 does not have any privileges.=
+Privileges of @1: @2=Privilegi di @1: @2
+[<name>]=[<nome>]
+Show privileges of yourself or another player=Mostra i privilegi propri o di un altro giocatore
+Player @1 does not exist.=Il giocatore @1 non esiste.
+<privilege>=<privilegio>
+Return list of all online players with privilege=Ritorna una lista di tutti i giocatori connessi col tale privilegio
+Invalid parameters (see /help haspriv).=Parametri non validi (vedi /help haspriv).
+Unknown privilege!=Privilegio sconosciuto!
+No online player has the "@1" privilege.=
+Players online with the "@1" privilege: @2=Giocatori connessi con il privilegio "@1": @2
+Your privileges are insufficient.=I tuoi privilegi sono insufficienti.
+Your privileges are insufficient. '@1' only allows you to grant: @2=
+Unknown privilege: @1=Privilegio sconosciuto: @1
+@1 granted you privileges: @2=@1 ti ha assegnato i seguenti privilegi: @2
+<name> (<privilege> [, <privilege2> [<...>]] | all)=
+Give privileges to player=Dà privilegi al giocatore
+Invalid parameters (see /help grant).=Parametri non validi (vedi /help grant).
+<privilege> [, <privilege2> [<...>]] | all=
+Grant privileges to yourself=Assegna dei privilegi a te stessǝ
+Invalid parameters (see /help grantme).=Parametri non validi (vedi /help grantme).
+Your privileges are insufficient. '@1' only allows you to revoke: @2=
+Note: Cannot revoke in singleplayer: @1=
+Note: Cannot revoke from admin: @1=
+No privileges were revoked.=
+@1 revoked privileges from you: @2=@1 ti ha revocato i seguenti privilegi: @2
+Remove privileges from player=Rimuove privilegi dal giocatore
+Invalid parameters (see /help revoke).=Parametri non validi (vedi /help revoke).
+Revoke privileges from yourself=Revoca privilegi a te stessǝ
+Invalid parameters (see /help revokeme).=Parametri non validi (vedi /help revokeme).
+<name> <password>=<nome> <password>
+Set player's password=Imposta la password del giocatore
+Name field required.=Campo "nome" richiesto.
+Your password was cleared by @1.=La tua password è stata resettata da @1.
+Password of player "@1" cleared.=Password del giocatore "@1" resettata.
+Your password was set by @1.=La tua password è stata impostata da @1.
+Password of player "@1" set.=Password del giocatore "@1" impostata.
+<name>=<nome>
+Set empty password for a player=Imposta una password vuota a un giocatore
+Reload authentication data=Ricarica i dati d'autenticazione
+Done.=Fatto.
+Failed.=Errore.
+Remove a player's data=Rimuove i dati di un giocatore
+Player "@1" removed.=Giocatore "@1" rimosso.
+No such player "@1" to remove.=Non è presente nessun giocatore "@1" da rimuovere.
+Player "@1" is connected, cannot remove.=Il giocatore "@1" è connesso, non può essere rimosso.
+Unhandled remove_player return code @1.=Codice ritornato da remove_player non gestito (@1).
+Cannot teleport out of map bounds!=Non ci si può teletrasportare fuori dai limiti della mappa!
+Cannot get player with name @1.=Impossibile trovare il giocatore chiamato @1.
+Cannot teleport, @1 is attached to an object!=Impossibile teletrasportare, @1 è attaccato a un oggetto!
+Teleporting @1 to @2.=Teletrasportando @1 da @2.
+One does not teleport to oneself.=Non ci si può teletrasportare su se stessi.
+Cannot get teleportee with name @1.=Impossibile trovare il giocatore chiamato @1 per il teletrasporto
+Cannot get target player with name @1.=Impossibile trovare il giocatore chiamato @1 per il teletrasporto
+Teleporting @1 to @2 at @3.=Teletrasportando @1 da @2 a @3
+<X>,<Y>,<Z> | <to_name> | <name> <X>,<Y>,<Z> | <name> <to_name>=<X>,<Y>,<Z> | <da_nome> | <nome> <X>,<Y>,<Z> | <nome> <da_nome>
+Teleport to position or player=Teletrasporta a una posizione o da un giocatore
+You don't have permission to teleport other players (missing privilege: @1).=Non hai il permesso di teletrasportare altri giocatori (privilegio mancante: @1).
+([-n] <name> <value>) | <name>=([-n] <nome> <valore>) | <nome>
+Set or read server configuration setting=Imposta o ottieni le configurazioni del server
+Failed. Use '/set -n <name> <value>' to create a new setting.=Errore. Usa 'set -n <nome> <valore>' per creare una nuova impostazione
+@1 @= @2=@1 @= @2
+<not set>=<non impostato>
+Invalid parameters (see /help set).=Parametri non validi (vedi /help set).
+Finished emerging @1 blocks in @2ms.=Finito di emergere @1 blocchi in @2ms
+emergeblocks update: @1/@2 blocks emerged (@3%)=aggiornamento emergeblocks: @1/@2 blocchi emersi (@3%)
+(here [<radius>]) | (<pos1> <pos2>)=(here [<raggio>]) | (<pos1> <pos2>)
+Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=Carica (o, se non esiste, genera) blocchi mappa contenuti nell'area tra pos1 e pos2 (<pos1> e <pos2> vanno tra parentesi)
+Started emerge of area ranging from @1 to @2.=Iniziata emersione dell'area tra @1 e @2.
+Delete map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=Cancella i blocchi mappa contenuti nell'area tra pos1 e pos2 (<pos1> e <pos2> vanno tra parentesi)
+Successfully cleared area ranging from @1 to @2.=Area tra @1 e @2 ripulita con successo.
+Failed to clear one or more blocks in area.=Errore nel ripulire uno o più blocchi mappa nell'area
+Resets lighting in the area between pos1 and pos2 (<pos1> and <pos2> must be in parentheses)=Reimposta l'illuminazione nell'area tra pos1 e po2 (<pos1> e <pos2> vanno tra parentesi)
+Successfully reset light in the area ranging from @1 to @2.=Luce nell'area tra @1 e @2 reimpostata con successo.
+Failed to load one or more blocks in area.=Errore nel caricare uno o più blocchi mappa nell'area.
+List mods installed on the server=Elenca le mod installate nel server
+No mods installed.=
+Cannot give an empty item.=Impossibile dare un oggetto vuoto.
+Cannot give an unknown item.=Impossibile dare un oggetto sconosciuto.
+Giving 'ignore' is not allowed.=Non è permesso dare 'ignore'.
+@1 is not a known player.=@1 non è un giocatore conosciuto.
+@1 partially added to inventory.=@1 parzialmente aggiunto all'inventario.
+@1 could not be added to inventory.=@1 non può essere aggiunto all'inventario.
+@1 added to inventory.=@1 aggiunto all'inventario.
+@1 partially added to inventory of @2.=@1 parzialmente aggiunto all'inventario di @2.
+@1 could not be added to inventory of @2.=Non è stato possibile aggiungere @1 all'inventario di @2.
+@1 added to inventory of @2.=@1 aggiunto all'inventario di @2.
+<name> <ItemString> [<count> [<wear>]]=<nome> <NomeOggetto> [<quantità> [<usura>]]
+Give item to player=Dà oggetti ai giocatori
+Name and ItemString required.=Richiesti nome e NomeOggetto.
+<ItemString> [<count> [<wear>]]=<NomeOggetto> [<quantità> [<usura>]]
+Give item to yourself=Dà oggetti a te stessǝ
+ItemString required.=Richiesto NomeOggetto.
+<EntityName> [<X>,<Y>,<Z>]=<NomeEntità> [<X>,<Y>,<Z>]
+Spawn entity at given (or your) position=Genera un'entità alla data coordinata (o la tua)
+EntityName required.=Richiesto NomeEntità
+Unable to spawn entity, player is nil.=Impossibile generare l'entità, il giocatore è nil.
+Cannot spawn an unknown entity.=Impossibile generare un'entità sconosciuta.
+Invalid parameters (@1).=Parametri non validi (@1).
+@1 spawned.=Generata entità @1.
+@1 failed to spawn.=Errore nel generare @1
+Destroy item in hand=Distrugge l'oggetto in mano
+Unable to pulverize, no player.=Impossibile polverizzare, nessun giocatore.
+Unable to pulverize, no item in hand.=Impossibile polverizzare, nessun oggetto in mano.
+An item was pulverized.=Un oggetto è stato polverizzato.
+[<range>] [<seconds>] [<limit>]=[<raggio>] [<secondi>] [<limite>]
+Check who last touched a node or a node near it within the time specified by <seconds>. Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set <seconds> to inf for no time limit=Controlla chi è l'ultimo giocatore che ha toccato un nodo o un nodo nelle sue vicinanze, negli ultimi secondi indicati. Di base: raggio @= 0, secondi @= 86400 @= 24h, limite @= 5.
+Rollback functions are disabled.=Le funzioni di rollback sono disabilitate.
+That limit is too high!=Il limite è troppo alto!
+Checking @1 ...=Controllando @1 ...
+Nobody has touched the specified location in @1 seconds.=Nessuno ha toccato il punto specificato negli ultimi @1 secondi.
+@1 @2 @3 -> @4 @5 seconds ago.=@1 @2 @3 -> @4 @5 secondi fa.
+Punch a node (range@=@1, seconds@=@2, limit@=@3).=Colpisce un nodo (raggio@=@1, secondi@=@2, limite@=@3)
+(<name> [<seconds>]) | (:<actor> [<seconds>])=(<nome> [<secondi>]) | (:<attore> [<secondi>])
+Revert actions of a player. Default for <seconds> is 60. Set <seconds> to inf for no time limit=Riavvolge le azioni di un giocatore. Di base, <secondi> è 60. Imposta <secondi> a inf per nessun limite di tempo
+Invalid parameters. See /help rollback and /help rollback_check.=Parametri non validi. Vedi /help rollback e /help rollback_check.
+Reverting actions of player '@1' since @2 seconds.=Riavvolge le azioni del giocatore '@1' avvenute negli ultimi @2 secondi.
+Reverting actions of @1 since @2 seconds.=Riavvolge le azioni di @1 avvenute negli ultimi @2 secondi.
+(log is too long to show)=(il log è troppo lungo per essere mostrato)
+Reverting actions succeeded.=Riavvolgimento azioni avvenuto con successo.
+Reverting actions FAILED.=Errore nel riavvolgere le azioni.
+Show server status=Mostra lo stato del server
+This command was disabled by a mod or game.=Questo comando è stato disabilitato da una mod o dal gioco.
+[<0..23>:<0..59> | <0..24000>]=[<0..23>:<0..59> | <0..24000>]
+Show or set time of day=Mostra o imposta l'orario della giornata
+Current time is @1:@2.=Orario corrente: @1:@2.
+You don't have permission to run this command (missing privilege: @1).=Non hai il permesso di eseguire questo comando (privilegio mancante: @1)
+Invalid time (must be between 0 and 24000).=
+Time of day changed.=Orario della giornata cambiato.
+Invalid hour (must be between 0 and 23 inclusive).=Ora non valida (deve essere tra 0 e 23 inclusi)
+Invalid minute (must be between 0 and 59 inclusive).=Minuto non valido (deve essere tra 0 e 59 inclusi)
+Show day count since world creation=Mostra il conteggio dei giorni da quando il mondo è stato creato
+Current day is @1.=Giorno attuale: @1.
+[<delay_in_seconds> | -1] [-r] [<message>]=
+Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)=
+Server shutting down (operator request).=Arresto del server in corso (per richiesta dell'operatore)
+Ban the IP of a player or show the ban list=Bandisce l'IP del giocatore o mostra la lista di quelli banditi
+The ban list is empty.=La lista banditi è vuota.
+Ban list: @1=Lista banditi: @1
+Player is not online.=Il giocatore non è connesso.
+Failed to ban player.=Errore nel bandire il giocatore.
+Banned @1.=@1 banditǝ.
+<name> | <IP_address>=<nome> | <indirizzo_IP>
+Remove IP ban belonging to a player/IP=Perdona l'IP appartenente a un giocatore/IP
+Failed to unban player/IP.=Errore nel perdonare il giocatore/IP
+Unbanned @1.=@1 perdonatǝ
+<name> [<reason>]=<nome> [<ragione>]
+Kick a player=Caccia un giocatore
+Failed to kick player @1.=Errore nel cacciare il giocatore @1.
+Kicked @1.=@1 cacciatǝ.
+[full | quick]=[full | quick]
+Clear all objects in world=Elimina tutti gli oggetti/entità nel mondo
+Invalid usage, see /help clearobjects.=Uso incorretto, vedi /help clearobjects.
+Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=Eliminando tutti gli oggetti/entità. Questo potrebbe richiedere molto tempo e farti eventualmente crashare. (di @1)
+Cleared all objects.=Tutti gli oggetti sono stati eliminati.
+<name> <message>=<nome> <messaggio>
+Send a direct message to a player=Invia un messaggio privato al giocatore
+Invalid usage, see /help msg.=Uso incorretto, vedi /help msg
+The player @1 is not online.=Il giocatore @1 non è connesso.
+DM from @1: @2=Messaggio privato da @1: @2
+Message sent.=Messaggio inviato.
+Get the last login time of a player or yourself=Ritorna l'ultimo accesso di un giocatore o di te stessǝ
+@1's last login time was @2.=L'ultimo accesso di @1 è avvenuto il @2
+@1's last login time is unknown.=L'ultimo accesso di @1 non è conosciuto
+Clear the inventory of yourself or another player=Svuota l'inventario tuo o di un altro giocatore
+You don't have permission to clear another player's inventory (missing privilege: @1).=Non hai il permesso di svuotare l'inventario di un altro giocatore (privilegio mancante: @1).
+@1 cleared your inventory.=@1 ha svuotato il tuo inventario.
+Cleared @1's inventory.=L'inventario di @1 è stato svuotato.
+Player must be online to clear inventory!=Il giocatore deve essere connesso per svuotarne l'inventario!
+Players can't be killed, damage has been disabled.=I giocatori non possono essere uccisi, il danno è disabilitato.
+Player @1 is not online.=Il giocatore @1 non è connesso.
+You are already dead.=Sei già mortǝ.
+@1 is already dead.=@1 è già mortǝ.
+@1 has been killed.=@1 è stato uccisǝ.
+Kill player or yourself=Uccide un giocatore o te stessǝ
+Invalid parameters (see /help @1).=
+Too many arguments, try using just /help <command>=
+Available commands: @1=Comandi disponibili: @1
+Use '/help <cmd>' to get more information, or '/help all' to list everything.=Usa '/help <comando>' per ottenere più informazioni, o '/help all' per elencare tutti i comandi.
+Available commands:=Comandi disponibili:
+Command not available: @1=Comando non disponibile: @1
+[all | privs | <cmd>] [-t]=
+Get help for commands or list privileges (-t: output in chat)=
+Available privileges:=Privilegi disponibili:
+Command=Comando
+Parameters=Parametri
+For more information, click on any entry in the list.=Per più informazioni, clicca su una qualsiasi voce dell'elenco.
+Double-click to copy the entry to the chat history.=Doppio click per copiare la voce nella cronologia della chat.
+Command: @1 @2=Comando: @1 @2
+Available commands: (see also: /help <cmd>)=Comandi disponibili: (vedi anche /help <comando>)
+Close=Chiudi
+Privilege=Privilegio
+Description=Descrizione
+print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset=print [<filtro>] | dump [<filtro>] | save [<formato> [<filtro>]] | reset
+Handle the profiler and profiling data=Gestisce il profiler e i dati da esso elaborati
+Statistics written to action log.=Statistiche scritte nel log delle azioni.
+Statistics were reset.=Le statistiche sono state resettate.
+Usage: @1=Utilizzo: @1
+Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=I formati supportati sono txt, csv, lua, json e json_pretty (le strutture potrebbero essere soggetti a cambiamenti).
+@1 joined the game.=
+@1 left the game.=
+@1 left the game (timed out).=
+(no description)=(nessuna descrizione)
+Can interact with things and modify the world=Si può interagire con le cose e modificare il mondo
+Can speak in chat=Si può parlare in chat
+Can modify basic privileges (@1)=
+Can modify privileges=Si possono modificare i privilegi
+Can teleport self=Si può teletrasportare se stessз
+Can teleport other players=Si possono teletrasportare gli altri giocatori
+Can set the time of day using /time=Si può impostate l'orario della giornata tramite /time
+Can do server maintenance stuff=Si possono eseguire operazioni di manutenzione del server
+Can bypass node protection in the world=Si può aggirare la protezione dei nodi nel mondo
+Can ban and unban players=Si possono bandire e perdonare i giocatori
+Can kick players=Si possono cacciare i giocatori
+Can use /give and /giveme=Si possono usare /give e /give me
+Can use /setpassword and /clearpassword=Si possono usare /setpassword e /clearpassword
+Can use fly mode=Si può usare la modalità volo
+Can use fast mode=Si può usare la modalità rapida
+Can fly through solid nodes using noclip mode=Si può volare attraverso i nodi solidi con la modalità incorporea
+Can use the rollback functionality=Si può usare la funzione di rollback
+Can view more debug info that might give a gameplay advantage=
+Can enable wireframe=
+Unknown Item=Oggetto sconosciuto
+Air=Aria
+Ignore=Ignora
+You can't place 'ignore' nodes!=Non puoi piazzare nodi 'ignore'!
+Values below show absolute/relative times spend per server step by the instrumented function.=
+A total of @1 sample(s) were taken.=
+The output is limited to '@1'.=
+Saving of profile failed: @1=
+Profile saved to @1=
+
+
+##### not used anymore #####
+
+Invalid time.=Orario non valido.
+[all | privs | <cmd>]=[all | privs | <comando>]
+Get help for commands or list privileges=Richiama la finestra d'aiuto dei comandi o dei privilegi
+Allows enabling various debug options that may affect gameplay=Permette di abilitare varie opzioni di debug che potrebbero influenzare l'esperienza di gioco
+[<delay_in_seconds> | -1] [reconnect] [<message>]=[<ritardo_in_secondi> | -1] [reconnect] [<messaggio>]
+Shutdown server (-1 cancels a delayed shutdown)=Arresta il server (-1 annulla un arresto programmato)
+<name> (<privilege> | all)=<nome> (<privilegio> | all)
+<privilege> | all=<privilegio> | all
+Can modify 'shout' and 'interact' privileges=Si possono modificare i privilegi 'shout' e 'interact'
diff --git a/builtin/locale/template.txt b/builtin/locale/template.txt
new file mode 100644
index 000000000..308d17f37
--- /dev/null
+++ b/builtin/locale/template.txt
@@ -0,0 +1,245 @@
+# textdomain: __builtin
+Empty command.=
+Invalid command: @1=
+Invalid command usage.=
+ (@1 s)=
+Command execution took @1 s=
+You don't have permission to run this command (missing privileges: @1).=
+Unable to get position of player @1.=
+Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=
+<action>=
+Show chat action (e.g., '/me orders a pizza' displays '<player name> orders a pizza')=
+Show the name of the server owner=
+The administrator of this server is @1.=
+There's no administrator named in the config file.=
+@1 does not have any privileges.=
+Privileges of @1: @2=
+[<name>]=
+Show privileges of yourself or another player=
+Player @1 does not exist.=
+<privilege>=
+Return list of all online players with privilege=
+Invalid parameters (see /help haspriv).=
+Unknown privilege!=
+No online player has the "@1" privilege.=
+Players online with the "@1" privilege: @2=
+Your privileges are insufficient.=
+Your privileges are insufficient. '@1' only allows you to grant: @2=
+Unknown privilege: @1=
+@1 granted you privileges: @2=
+<name> (<privilege> [, <privilege2> [<...>]] | all)=
+Give privileges to player=
+Invalid parameters (see /help grant).=
+<privilege> [, <privilege2> [<...>]] | all=
+Grant privileges to yourself=
+Invalid parameters (see /help grantme).=
+Your privileges are insufficient. '@1' only allows you to revoke: @2=
+Note: Cannot revoke in singleplayer: @1=
+Note: Cannot revoke from admin: @1=
+No privileges were revoked.=
+@1 revoked privileges from you: @2=
+Remove privileges from player=
+Invalid parameters (see /help revoke).=
+Revoke privileges from yourself=
+Invalid parameters (see /help revokeme).=
+<name> <password>=
+Set player's password=
+Name field required.=
+Your password was cleared by @1.=
+Password of player "@1" cleared.=
+Your password was set by @1.=
+Password of player "@1" set.=
+<name>=
+Set empty password for a player=
+Reload authentication data=
+Done.=
+Failed.=
+Remove a player's data=
+Player "@1" removed.=
+No such player "@1" to remove.=
+Player "@1" is connected, cannot remove.=
+Unhandled remove_player return code @1.=
+Cannot teleport out of map bounds!=
+Cannot get player with name @1.=
+Cannot teleport, @1 is attached to an object!=
+Teleporting @1 to @2.=
+One does not teleport to oneself.=
+Cannot get teleportee with name @1.=
+Cannot get target player with name @1.=
+Teleporting @1 to @2 at @3.=
+<X>,<Y>,<Z> | <to_name> | <name> <X>,<Y>,<Z> | <name> <to_name>=
+Teleport to position or player=
+You don't have permission to teleport other players (missing privilege: @1).=
+([-n] <name> <value>) | <name>=
+Set or read server configuration setting=
+Failed. Use '/set -n <name> <value>' to create a new setting.=
+@1 @= @2=
+<not set>=
+Invalid parameters (see /help set).=
+Finished emerging @1 blocks in @2ms.=
+emergeblocks update: @1/@2 blocks emerged (@3%)=
+(here [<radius>]) | (<pos1> <pos2>)=
+Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=
+Started emerge of area ranging from @1 to @2.=
+Delete map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=
+Successfully cleared area ranging from @1 to @2.=
+Failed to clear one or more blocks in area.=
+Resets lighting in the area between pos1 and pos2 (<pos1> and <pos2> must be in parentheses)=
+Successfully reset light in the area ranging from @1 to @2.=
+Failed to load one or more blocks in area.=
+List mods installed on the server=
+No mods installed.=
+Cannot give an empty item.=
+Cannot give an unknown item.=
+Giving 'ignore' is not allowed.=
+@1 is not a known player.=
+@1 partially added to inventory.=
+@1 could not be added to inventory.=
+@1 added to inventory.=
+@1 partially added to inventory of @2.=
+@1 could not be added to inventory of @2.=
+@1 added to inventory of @2.=
+<name> <ItemString> [<count> [<wear>]]=
+Give item to player=
+Name and ItemString required.=
+<ItemString> [<count> [<wear>]]=
+Give item to yourself=
+ItemString required.=
+<EntityName> [<X>,<Y>,<Z>]=
+Spawn entity at given (or your) position=
+EntityName required.=
+Unable to spawn entity, player is nil.=
+Cannot spawn an unknown entity.=
+Invalid parameters (@1).=
+@1 spawned.=
+@1 failed to spawn.=
+Destroy item in hand=
+Unable to pulverize, no player.=
+Unable to pulverize, no item in hand.=
+An item was pulverized.=
+[<range>] [<seconds>] [<limit>]=
+Check who last touched a node or a node near it within the time specified by <seconds>. Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set <seconds> to inf for no time limit=
+Rollback functions are disabled.=
+That limit is too high!=
+Checking @1 ...=
+Nobody has touched the specified location in @1 seconds.=
+@1 @2 @3 -> @4 @5 seconds ago.=
+Punch a node (range@=@1, seconds@=@2, limit@=@3).=
+(<name> [<seconds>]) | (:<actor> [<seconds>])=
+Revert actions of a player. Default for <seconds> is 60. Set <seconds> to inf for no time limit=
+Invalid parameters. See /help rollback and /help rollback_check.=
+Reverting actions of player '@1' since @2 seconds.=
+Reverting actions of @1 since @2 seconds.=
+(log is too long to show)=
+Reverting actions succeeded.=
+Reverting actions FAILED.=
+Show server status=
+This command was disabled by a mod or game.=
+[<0..23>:<0..59> | <0..24000>]=
+Show or set time of day=
+Current time is @1:@2.=
+You don't have permission to run this command (missing privilege: @1).=
+Invalid time (must be between 0 and 24000).=
+Time of day changed.=
+Invalid hour (must be between 0 and 23 inclusive).=
+Invalid minute (must be between 0 and 59 inclusive).=
+Show day count since world creation=
+Current day is @1.=
+[<delay_in_seconds> | -1] [-r] [<message>]=
+Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)=
+Server shutting down (operator request).=
+Ban the IP of a player or show the ban list=
+The ban list is empty.=
+Ban list: @1=
+Player is not online.=
+Failed to ban player.=
+Banned @1.=
+<name> | <IP_address>=
+Remove IP ban belonging to a player/IP=
+Failed to unban player/IP.=
+Unbanned @1.=
+<name> [<reason>]=
+Kick a player=
+Failed to kick player @1.=
+Kicked @1.=
+[full | quick]=
+Clear all objects in world=
+Invalid usage, see /help clearobjects.=
+Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=
+Cleared all objects.=
+<name> <message>=
+Send a direct message to a player=
+Invalid usage, see /help msg.=
+The player @1 is not online.=
+DM from @1: @2=
+Message sent.=
+Get the last login time of a player or yourself=
+@1's last login time was @2.=
+@1's last login time is unknown.=
+Clear the inventory of yourself or another player=
+You don't have permission to clear another player's inventory (missing privilege: @1).=
+@1 cleared your inventory.=
+Cleared @1's inventory.=
+Player must be online to clear inventory!=
+Players can't be killed, damage has been disabled.=
+Player @1 is not online.=
+You are already dead.=
+@1 is already dead.=
+@1 has been killed.=
+Kill player or yourself=
+Invalid parameters (see /help @1).=
+Too many arguments, try using just /help <command>=
+Available commands: @1=
+Use '/help <cmd>' to get more information, or '/help all' to list everything.=
+Available commands:=
+Command not available: @1=
+[all | privs | <cmd>] [-t]=
+Get help for commands or list privileges (-t: output in chat)=
+Available privileges:=
+Command=
+Parameters=
+For more information, click on any entry in the list.=
+Double-click to copy the entry to the chat history.=
+Command: @1 @2=
+Available commands: (see also: /help <cmd>)=
+Close=
+Privilege=
+Description=
+print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset=
+Handle the profiler and profiling data=
+Statistics written to action log.=
+Statistics were reset.=
+Usage: @1=
+Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=
+@1 joined the game.=
+@1 left the game.=
+@1 left the game (timed out).=
+(no description)=
+Can interact with things and modify the world=
+Can speak in chat=
+Can modify basic privileges (@1)=
+Can modify privileges=
+Can teleport self=
+Can teleport other players=
+Can set the time of day using /time=
+Can do server maintenance stuff=
+Can bypass node protection in the world=
+Can ban and unban players=
+Can kick players=
+Can use /give and /giveme=
+Can use /setpassword and /clearpassword=
+Can use fly mode=
+Can use fast mode=
+Can fly through solid nodes using noclip mode=
+Can use the rollback functionality=
+Can view more debug info that might give a gameplay advantage=
+Can enable wireframe=
+Unknown Item=
+Air=
+Ignore=
+You can't place 'ignore' nodes!=
+Values below show absolute/relative times spend per server step by the instrumented function.=
+A total of @1 sample(s) were taken.=
+The output is limited to '@1'.=
+Saving of profile failed: @1=
+Profile saved to @1=
diff --git a/builtin/mainmenu/common.lua b/builtin/mainmenu/common.lua
index cd896f9ec..8db8bb8d1 100644
--- a/builtin/mainmenu/common.lua
+++ b/builtin/mainmenu/common.lua
@@ -14,14 +14,11 @@
--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.
---------------------------------------------------------------------------------
+
-- Global menu data
---------------------------------------------------------------------------------
menudata = {}
---------------------------------------------------------------------------------
-- Local cached values
---------------------------------------------------------------------------------
local min_supp_proto, max_supp_proto
function common_update_cached_supp_proto()
@@ -29,14 +26,12 @@ function common_update_cached_supp_proto()
max_supp_proto = core.get_max_supp_proto()
end
common_update_cached_supp_proto()
---------------------------------------------------------------------------------
+
-- Menu helper functions
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
local function render_client_count(n)
- if n > 99 then return '99+'
- elseif n >= 0 then return tostring(n)
+ if n > 999 then return '99+'
+ elseif n >= 0 then return tostring(n)
else return '?' end
end
@@ -50,21 +45,7 @@ local function configure_selected_world_params(idx)
end
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 ..
- (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
-
-
---------------------------------------------------------------------------------
-function render_serverlist_row(spec, is_favorite)
+function render_serverlist_row(spec)
local text = ""
if spec.name then
text = text .. core.formspec_escape(spec.name:trim())
@@ -75,31 +56,29 @@ function render_serverlist_row(spec, is_favorite)
end
end
- local grey_out = not is_server_protocol_compat(spec.proto_min, spec.proto_max)
+ local grey_out = not spec.is_compatible
- local details
- if is_favorite then
- details = "1,"
- else
- details = "0,"
- end
+ local details = {}
- 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,"
+ if spec.lag or spec.ping then
+ local lag = (spec.lag or 0) * 1000 + (spec.ping or 0) * 250
+ if lag <= 125 then
+ table.insert(details, "1")
+ elseif lag <= 175 then
+ table.insert(details, "2")
+ elseif lag <= 250 then
+ table.insert(details, "3")
else
- details = details .. "5,"
+ table.insert(details, "4")
end
else
- details = details .. "0,"
+ table.insert(details, "0")
end
- if spec.clients and spec.clients_max then
+ table.insert(details, ",")
+
+ local color = (grey_out and "#aaaaaa") or ((spec.is_favorite and "#ddddaa") or "#ffffff")
+ if spec.clients and (spec.clients_max or 0) > 0 then
local clients_percent = 100 * spec.clients / spec.clients_max
-- Choose a color depending on how many clients are connected
@@ -110,68 +89,59 @@ function render_serverlist_row(spec, is_favorite)
elseif clients_percent <= 60 then clients_color = '#a1e587' -- 0-60%: green
elseif clients_percent <= 90 then clients_color = '#ffdc97' -- 60-90%: yellow
elseif clients_percent == 100 then clients_color = '#dd5b5b' -- full server: red (darker)
- else clients_color = '#ffba97' -- 90-100%: orange
+ else clients_color = '#ffba97' -- 90-100%: orange
end
- details = details .. clients_color .. ',' ..
- render_client_count(spec.clients) .. ',/,' ..
- render_client_count(spec.clients_max) .. ','
-
- elseif grey_out then
- details = details .. '#aaaaaa,?,/,?,'
+ table.insert(details, clients_color)
+ table.insert(details, render_client_count(spec.clients) .. " / " ..
+ render_client_count(spec.clients_max))
else
- details = details .. ',?,/,?,'
+ table.insert(details, color)
+ table.insert(details, "?")
end
if spec.creative then
- details = details .. "1,"
+ table.insert(details, "1") -- creative icon
else
- details = details .. "0,"
- end
-
- if spec.damage then
- details = details .. "1,"
- else
- details = details .. "0,"
+ table.insert(details, "0")
end
if spec.pvp then
- details = details .. "1,"
+ table.insert(details, "2") -- pvp icon
+ elseif spec.damage then
+ table.insert(details, "1") -- heart icon
else
- details = details .. "0,"
+ table.insert(details, "0")
end
- return details .. (grey_out and '#aaaaaa,' or ',') .. text
-end
+ table.insert(details, color)
+ table.insert(details, text)
---------------------------------------------------------------------------------
-os.tempfolder = function()
- local temp = core.get_temp_path()
- return temp .. DIR_DELIM .. "MT_" .. math.random(0, 10000)
+ return table.concat(details, ",")
end
-
---------------------------------------------------------------------------------
+---------------------------------------------------------------------------------
os.tmpname = function()
- local path = os.tempfolder()
- io.open(path, "w"):close()
- return path
+ error('do not use') -- instead use core.get_temp_path()
end
-
--------------------------------------------------------------------------------
-function menu_render_worldlist()
- local retval = ""
+
+function menu_render_worldlist(show_gameid)
+ local retval = {}
local current_worldlist = menudata.worldlist:get_list()
+ local row
for i, v in ipairs(current_worldlist) do
- if retval ~= "" then retval = retval .. "," end
- retval = retval .. core.formspec_escape(v.name) ..
- " \\[" .. core.formspec_escape(v.gameid) .. "\\]"
+ row = v.name
+ if show_gameid == nil or show_gameid == true then
+ row = row .. " [" .. v.gameid .. "]"
+ end
+ retval[#retval+1] = core.formspec_escape(row)
+
end
- return retval
+ return table.concat(retval, ",")
end
---------------------------------------------------------------------------------
function menu_handle_key_up_down(fields, textlist, settingname)
local oldidx, newidx = core.get_textlist_index(textlist), 1
if fields.key_up or fields.key_down then
@@ -188,7 +158,6 @@ function menu_handle_key_up_down(fields, textlist, settingname)
return false
end
---------------------------------------------------------------------------------
function text2textlist(xpos, ypos, width, height, tl_name, textlen, text, transparency)
local textlines = core.wrap_text(text, textlen, true)
local retval = "textlist[" .. xpos .. "," .. ypos .. ";" .. width ..
@@ -206,7 +175,6 @@ function text2textlist(xpos, ypos, width, height, tl_name, textlen, text, transp
return retval
end
---------------------------------------------------------------------------------
function is_server_protocol_compat(server_proto_min, server_proto_max)
if (not server_proto_min) or (not server_proto_max) then
-- There is no info. Assume the best and act as if we would be compatible.
@@ -214,7 +182,7 @@ function is_server_protocol_compat(server_proto_min, server_proto_max)
end
return min_supp_proto <= server_proto_max and max_supp_proto >= server_proto_min
end
---------------------------------------------------------------------------------
+
function is_server_protocol_compat_or_error(server_proto_min, server_proto_max)
if not is_server_protocol_compat(server_proto_min, server_proto_max) then
local server_prot_ver_info, client_prot_ver_info
@@ -242,7 +210,7 @@ function is_server_protocol_compat_or_error(server_proto_min, server_proto_max)
return true
end
---------------------------------------------------------------------------------
+
function menu_worldmt(selected, setting, value)
local world = menudata.worldlist:get_list()[selected]
if world then
diff --git a/builtin/mainmenu/dlg_contentstore.lua b/builtin/mainmenu/dlg_contentstore.lua
index b0736a4fd..9db67cf57 100644
--- a/builtin/mainmenu/dlg_contentstore.lua
+++ b/builtin/mainmenu/dlg_contentstore.lua
@@ -57,34 +57,77 @@ local filter_types_type = {
"txp",
}
+local REASON_NEW = "new"
+local REASON_UPDATE = "update"
+local REASON_DEPENDENCY = "dependency"
-local function download_package(param)
- if core.download_file(param.package.url, param.filename) then
+
+-- encodes for use as URL parameter or path component
+local function urlencode(str)
+ return str:gsub("[^%a%d()._~-]", function(char)
+ return string.format("%%%02X", string.byte(char))
+ end)
+end
+assert(urlencode("sample text?") == "sample%20text%3F")
+
+
+local function get_download_url(package, reason)
+ local base_url = core.settings:get("contentdb_url")
+ local ret = base_url .. ("/packages/%s/releases/%d/download/"):format(
+ package.url_part, package.release)
+ if reason then
+ ret = ret .. "?reason=" .. reason
+ end
+ return ret
+end
+
+
+local function download_and_extract(param)
+ local package = param.package
+
+ local filename = core.get_temp_path(true)
+ if filename == "" or not core.download_file(param.url, filename) then
+ core.log("error", "Downloading " .. dump(param.url) .. " failed")
return {
- filename = param.filename,
- successful = true,
+ msg = fgettext("Failed to download $1", package.name)
}
+ end
+
+ local tempfolder = core.get_temp_path()
+ if tempfolder ~= "" then
+ tempfolder = tempfolder .. DIR_DELIM .. "MT_" .. math.random(1, 1024000)
+ if not core.extract_zip(filename, tempfolder) then
+ tempfolder = nil
+ end
else
- core.log("error", "downloading " .. dump(param.package.url) .. " failed")
+ tempfolder = nil
+ end
+ os.remove(filename)
+ if not tempfolder then
return {
- successful = false,
+ msg = fgettext("Install: Unsupported file type or broken archive"),
}
end
+
+ return {
+ path = tempfolder
+ }
end
-local function start_install(package)
+local function start_install(package, reason)
local params = {
package = package,
- filename = os.tempfolder() .. "_MODNAME_" .. package.name .. ".zip",
+ url = get_download_url(package, reason),
}
number_downloading = number_downloading + 1
local function callback(result)
- if result.successful then
- local path, msg = pkgmgr.install(package.type,
- result.filename, package.name,
- package.path)
+ if result.msg then
+ gamedata.errormessage = result.msg
+ else
+ local path, msg = pkgmgr.install_dir(package.type, result.path, package.name, package.path)
+ core.delete_dir(result.path)
if not path then
gamedata.errormessage = msg
else
@@ -122,9 +165,6 @@ local function start_install(package)
conf:write()
end
end
- os.remove(result.filename)
- else
- gamedata.errormessage = fgettext("Failed to download $1", package.name)
end
package.downloading = false
@@ -135,7 +175,7 @@ local function start_install(package)
if next then
table.remove(download_queue, 1)
- start_install(next)
+ start_install(next.package, next.reason)
end
ui.update()
@@ -144,19 +184,19 @@ local function start_install(package)
package.queued = false
package.downloading = true
- if not core.handle_async(download_package, params, callback) then
+ if not core.handle_async(download_and_extract, params, callback) then
core.log("error", "ERROR: async event failed")
gamedata.errormessage = fgettext("Failed to download $1", package.name)
return
end
end
-local function queue_download(package)
+local function queue_download(package, reason)
local max_concurrent_downloads = tonumber(core.settings:get("contentdb_max_concurrent_downloads"))
if number_downloading < max_concurrent_downloads then
- start_install(package)
+ start_install(package, reason)
else
- table.insert(download_queue, package)
+ table.insert(download_queue, { package = package, reason = reason })
package.queued = true
end
end
@@ -169,7 +209,7 @@ local function get_raw_dependencies(package)
local url_fmt = "/api/packages/%s/dependencies/?only_hard=1&protocol_version=%s&engine_version=%s"
local version = core.get_version()
local base_url = core.settings:get("contentdb_url")
- local url = base_url .. url_fmt:format(package.id, core.get_max_supp_proto(), version.string)
+ local url = base_url .. url_fmt:format(package.url_part, core.get_max_supp_proto(), urlencode(version.string))
local response = http.fetch_sync({ url = url })
if not response.succeeded then
@@ -407,12 +447,12 @@ function install_dialog.handle_submit(this, fields)
end
if fields.install_all then
- queue_download(install_dialog.package)
+ queue_download(install_dialog.package, REASON_NEW)
if install_dialog.will_install_deps then
for _, dep in pairs(install_dialog.dependencies) do
if not dep.is_optional and not dep.installed and dep.package then
- queue_download(dep.package)
+ queue_download(dep.package, REASON_DEPENDENCY)
end
end
end
@@ -544,33 +584,43 @@ function store.load()
local base_url = core.settings:get("contentdb_url")
local url = base_url ..
"/api/packages/?type=mod&type=game&type=txp&protocol_version=" ..
- core.get_max_supp_proto() .. "&engine_version=" .. version.string
+ core.get_max_supp_proto() .. "&engine_version=" .. urlencode(version.string)
for _, item in pairs(core.settings:get("contentdb_flag_blacklist"):split(",")) do
item = item:trim()
if item ~= "" then
- url = url .. "&hide=" .. item
+ url = url .. "&hide=" .. urlencode(item)
end
end
- local timeout = tonumber(core.settings:get("curl_file_download_timeout"))
- local response = http.fetch_sync({ url = url, timeout = timeout })
+ local response = http.fetch_sync({ url = url })
if not response.succeeded then
return
end
store.packages_full = core.parse_json(response.data) or {}
+ store.aliases = {}
for _, package in pairs(store.packages_full) do
- package.url = base_url .. "/packages/" ..
- package.author .. "/" .. package.name ..
- "/releases/" .. package.release .. "/download/"
-
local name_len = #package.name
+ -- This must match what store.update_paths() does!
+ package.id = package.author:lower() .. "/"
if package.type == "game" and name_len > 5 and package.name:sub(name_len - 4) == "_game" then
- package.id = package.author:lower() .. "/" .. package.name:sub(1, name_len - 5)
+ package.id = package.id .. package.name:sub(1, name_len - 5)
else
- package.id = package.author:lower() .. "/" .. package.name
+ package.id = package.id .. package.name
+ end
+
+ package.url_part = urlencode(package.author) .. "/" .. urlencode(package.name)
+
+ if package.aliases then
+ for _, alias in ipairs(package.aliases) do
+ -- We currently don't support name changing
+ local suffix = "/" .. package.name
+ if alias:sub(-#suffix) == suffix then
+ store.aliases[alias:lower()] = package.id
+ end
+ end
end
end
@@ -584,7 +634,8 @@ function store.update_paths()
pkgmgr.refresh_globals()
for _, mod in pairs(pkgmgr.global_mods:get_list()) do
if mod.author and mod.release > 0 then
- mod_hash[mod.author:lower() .. "/" .. mod.name] = mod
+ local id = mod.author:lower() .. "/" .. mod.name
+ mod_hash[store.aliases[id] or id] = mod
end
end
@@ -592,14 +643,16 @@ function store.update_paths()
pkgmgr.update_gamelist()
for _, game in pairs(pkgmgr.games) do
if game.author ~= "" and game.release > 0 then
- game_hash[game.author:lower() .. "/" .. game.id] = game
+ local id = game.author:lower() .. "/" .. game.id
+ game_hash[store.aliases[id] or id] = game
end
end
local txp_hash = {}
for _, txp in pairs(pkgmgr.get_texture_packs()) do
if txp.author and txp.release > 0 then
- txp_hash[txp.author:lower() .. "/" .. txp.name] = txp
+ local id = txp.author:lower() .. "/" .. txp.name
+ txp_hash[store.aliases[id] or id] = txp
end
end
@@ -915,7 +968,7 @@ function store.handle_submit(this, fields)
local package = store.packages_full[i]
if package.path and package.installed_release < package.release and
not (package.downloading or package.queued) then
- queue_download(package)
+ queue_download(package, REASON_UPDATE)
end
end
return true
@@ -948,7 +1001,7 @@ function store.handle_submit(this, fields)
this:hide()
dlg:show()
else
- queue_download(package)
+ queue_download(package, package.path and REASON_UPDATE or REASON_NEW)
end
end
@@ -973,9 +1026,9 @@ function store.handle_submit(this, fields)
end
if fields["view_" .. i] then
- local url = ("%s/packages/%s/%s?protocol_version=%d"):format(
- core.settings:get("contentdb_url"),
- package.author, package.name, core.get_max_supp_proto())
+ local url = ("%s/packages/%s?protocol_version=%d"):format(
+ core.settings:get("contentdb_url"), package.url_part,
+ core.get_max_supp_proto())
core.open_url(url)
return true
end
diff --git a/builtin/mainmenu/dlg_create_world.lua b/builtin/mainmenu/dlg_create_world.lua
index 1938747fe..8d1509f33 100644
--- a/builtin/mainmenu/dlg_create_world.lua
+++ b/builtin/mainmenu/dlg_create_world.lua
@@ -15,7 +15,8 @@
--with this program; if not, write to the Free Software Foundation, Inc.,
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-local worldname = ""
+-- cf. tab_local, the gamebar already provides game selection so we hide the list from here
+local hide_gamelist = PLATFORM ~= "Android"
local function table_to_flags(ftable)
-- Convert e.g. { jungles = true, caves = false } to "jungles,nocaves"
@@ -31,9 +32,8 @@ local function strflag(flags, flag)
return (flags[flag] == true) and "true" or "false"
end
-local cb_caverns = { "caverns", fgettext("Caverns"), "caverns",
+local cb_caverns = { "caverns", fgettext("Caverns"),
fgettext("Very large caverns deep in the underground") }
-local tt_sea_rivers = fgettext("Sea level rivers")
local flag_checkboxes = {
v5 = {
@@ -41,39 +41,38 @@ local flag_checkboxes = {
},
v7 = {
cb_caverns,
- { "ridges", fgettext("Rivers"), "ridges", tt_sea_rivers },
- { "mountains", fgettext("Mountains"), "mountains" },
- { "floatlands", fgettext("Floatlands (experimental)"), "floatlands",
+ { "ridges", fgettext("Rivers"), fgettext("Sea level rivers") },
+ { "mountains", fgettext("Mountains") },
+ { "floatlands", fgettext("Floatlands (experimental)"),
fgettext("Floating landmasses in the sky") },
},
carpathian = {
cb_caverns,
- { "rivers", fgettext("Rivers"), "rivers", tt_sea_rivers },
+ { "rivers", fgettext("Rivers"), fgettext("Sea level rivers") },
},
valleys = {
- { "altitude-chill", fgettext("Altitude chill"), "altitude_chill",
+ { "altitude_chill", fgettext("Altitude chill"),
fgettext("Reduces heat with altitude") },
- { "altitude-dry", fgettext("Altitude dry"), "altitude_dry",
+ { "altitude_dry", fgettext("Altitude dry"),
fgettext("Reduces humidity with altitude") },
- { "humid-rivers", fgettext("Humid rivers"), "humid_rivers",
+ { "humid_rivers", fgettext("Humid rivers"),
fgettext("Increases humidity around rivers") },
- { "vary-river-depth", fgettext("Vary river depth"), "vary_river_depth",
+ { "vary_river_depth", fgettext("Vary river depth"),
fgettext("Low humidity and high heat causes shallow or dry rivers") },
},
flat = {
cb_caverns,
- { "hills", fgettext("Hills"), "hills" },
- { "lakes", fgettext("Lakes"), "lakes" },
+ { "hills", fgettext("Hills") },
+ { "lakes", fgettext("Lakes") },
},
fractal = {
- { "terrain", fgettext("Additional terrain"), "terrain",
+ { "terrain", fgettext("Additional terrain"),
fgettext("Generate non-fractal terrain: Oceans and underground") },
},
v6 = {
- { "trees", fgettext("Trees and jungle grass"), "trees" },
- { "flat", fgettext("Flat terrain"), "flat" },
- { "mudflow", fgettext("Mud flow"), "mudflow",
- fgettext("Terrain surface erosion") },
+ { "trees", fgettext("Trees and jungle grass") },
+ { "flat", fgettext("Flat terrain") },
+ { "mudflow", fgettext("Mud flow"), fgettext("Terrain surface erosion") },
-- Biome settings are in mgv6_biomes below
},
}
@@ -105,38 +104,26 @@ local function create_world_formspec(dialogdata)
"button[4.75,2.5;3,0.5;world_create_cancel;" .. fgettext("Cancel") .. "]"
end
+ local current_mg = dialogdata.mg
local mapgens = core.get_mapgen_names()
- local current_seed = core.settings:get("fixed_map_seed") or ""
- local current_mg = core.settings:get("mg_name")
local gameid = core.settings:get("menu_last_game")
- local flags = {
- main = core.settings:get_flags("mg_flags"),
- v5 = core.settings:get_flags("mgv5_spflags"),
- v6 = core.settings:get_flags("mgv6_spflags"),
- v7 = core.settings:get_flags("mgv7_spflags"),
- fractal = core.settings:get_flags("mgfractal_spflags"),
- carpathian = core.settings:get_flags("mgcarpathian_spflags"),
- valleys = core.settings:get_flags("mgvalleys_spflags"),
- flat = core.settings:get_flags("mgflat_spflags"),
- }
-
- local gameidx = 0
- if gameid ~= nil then
- local _
- _, gameidx = pkgmgr.find_by_gameid(gameid)
+ local flags = dialogdata.flags
- if gameidx == nil then
- gameidx = 0
- end
+ local game, gameidx = pkgmgr.find_by_gameid(gameid)
+ if game == nil and hide_gamelist then
+ -- should never happen but just pick the first game
+ game = pkgmgr.get_game(1)
+ gameidx = 1
+ core.settings:set("menu_last_game", game.id)
+ elseif game == nil then
+ gameidx = 0
end
- local game_by_gameidx = core.get_game(gameidx)
local disallowed_mapgen_settings = {}
- if game_by_gameidx ~= nil then
- local gamepath = game_by_gameidx.path
- local gameconfig = Settings(gamepath.."/game.conf")
+ if game ~= nil then
+ local gameconfig = Settings(game.path.."/game.conf")
local allowed_mapgens = (gameconfig:get("allowed_mapgens") or ""):split()
for key, value in pairs(allowed_mapgens) do
@@ -156,7 +143,7 @@ local function create_world_formspec(dialogdata)
end
end
- if disallowed_mapgens then
+ if #disallowed_mapgens > 0 then
for i = #mapgens, 1, -1 do
if table.indexof(disallowed_mapgens, mapgens[i]) > 0 then
table.remove(mapgens, i)
@@ -172,23 +159,29 @@ local function create_world_formspec(dialogdata)
local mglist = ""
local selindex
- local i = 1
- local first_mg
- for k,v in pairs(mapgens) do
- if not first_mg then
- first_mg = v
+ do -- build the list of mapgens
+ local i = 1
+ local first_mg
+ for k, v in pairs(mapgens) do
+ if not first_mg then
+ first_mg = v
+ end
+ if current_mg == v then
+ selindex = i
+ end
+ i = i + 1
+ mglist = mglist .. core.formspec_escape(v) .. ","
end
- if current_mg == v then
- selindex = i
+ if not selindex then
+ selindex = 1
+ current_mg = first_mg
end
- i = i + 1
- mglist = mglist .. v .. ","
- end
- if not selindex then
- selindex = 1
- current_mg = first_mg
+ mglist = mglist:sub(1, -2)
end
- mglist = mglist:sub(1, -2)
+
+ -- The logic of the flag element IDs is as follows:
+ -- "flag_main_foo-bar-baz" controls dialogdata.flags["main"]["foo_bar_baz"]
+ -- see the buttonhandler for the implementation of this
local mg_main_flags = function(mapgen, y)
if mapgen == "singlenode" then
@@ -198,11 +191,11 @@ local function create_world_formspec(dialogdata)
return "", y
end
- local form = "checkbox[0," .. y .. ";flag_mg_caves;" ..
+ local form = "checkbox[0," .. y .. ";flag_main_caves;" ..
fgettext("Caves") .. ";"..strflag(flags.main, "caves").."]"
y = y + 0.5
- form = form .. "checkbox[0,"..y..";flag_mg_dungeons;" ..
+ form = form .. "checkbox[0,"..y..";flag_main_dungeons;" ..
fgettext("Dungeons") .. ";"..strflag(flags.main, "dungeons").."]"
y = y + 0.5
@@ -213,7 +206,7 @@ local function create_world_formspec(dialogdata)
else
d_tt = fgettext("Structures appearing on the terrain, typically trees and plants")
end
- form = form .. "checkbox[0,"..y..";flag_mg_decorations;" ..
+ form = form .. "checkbox[0,"..y..";flag_main_decorations;" ..
d_name .. ";" ..
strflag(flags.main, "decorations").."]" ..
"tooltip[flag_mg_decorations;" ..
@@ -221,7 +214,7 @@ local function create_world_formspec(dialogdata)
"]"
y = y + 0.5
- form = form .. "tooltip[flag_mg_caves;" ..
+ form = form .. "tooltip[flag_main_caves;" ..
fgettext("Network of tunnels and caves")
.. "]"
return form, y
@@ -235,13 +228,13 @@ local function create_world_formspec(dialogdata)
return "", y
end
local form = ""
- for _,tab in pairs(flag_checkboxes[mapgen]) do
- local id = "flag_mg"..mapgen.."_"..tab[1]
+ for _, tab in pairs(flag_checkboxes[mapgen]) do
+ local id = "flag_"..mapgen.."_"..tab[1]:gsub("_", "-")
form = form .. ("checkbox[0,%f;%s;%s;%s]"):
- format(y, id, tab[2], strflag(flags[mapgen], tab[3]))
+ format(y, id, tab[2], strflag(flags[mapgen], tab[1]))
- if tab[4] then
- form = form .. "tooltip["..id..";"..tab[4].."]"
+ if tab[3] then
+ form = form .. "tooltip["..id..";"..tab[3].."]"
end
y = y + 0.5
end
@@ -277,16 +270,14 @@ local function create_world_formspec(dialogdata)
-- biomeblend
y = y + 0.55
- form = form .. "checkbox[0,"..y..";flag_mgv6_biomeblend;" ..
+ form = form .. "checkbox[0,"..y..";flag_v6_biomeblend;" ..
fgettext("Biome blending") .. ";"..strflag(flags.v6, "biomeblend").."]" ..
- "tooltip[flag_mgv6_biomeblend;" ..
+ "tooltip[flag_v6_biomeblend;" ..
fgettext("Smooth transition between biomes") .. "]"
return form, y
end
- current_seed = core.formspec_escape(current_seed)
-
local y_start = 0.0
local y = y_start
local str_flags, str_spflags
@@ -323,21 +314,27 @@ local function create_world_formspec(dialogdata)
"container[0,0]"..
"field[0.3,0.6;6,0.5;te_world_name;" ..
fgettext("World name") ..
- ";" .. core.formspec_escape(worldname) .. "]" ..
+ ";" .. core.formspec_escape(dialogdata.worldname) .. "]" ..
+ "set_focus[te_world_name;false]" ..
"field[0.3,1.7;6,0.5;te_seed;" ..
fgettext("Seed") ..
- ";".. current_seed .. "]" ..
+ ";".. core.formspec_escape(dialogdata.seed) .. "]" ..
"label[0,2;" .. fgettext("Mapgen") .. "]"..
- "dropdown[0,2.5;6.3;dd_mapgen;" .. mglist .. ";" .. selindex .. "]" ..
+ "dropdown[0,2.5;6.3;dd_mapgen;" .. mglist .. ";" .. selindex .. "]"
+
+ if not hide_gamelist or devtest_only ~= "" then
+ retval = retval ..
+ "label[0,3.35;" .. fgettext("Game") .. "]"..
+ "textlist[0,3.85;5.8,"..gamelist_height..";games;" ..
+ pkgmgr.gamelist() .. ";" .. gameidx .. ";false]" ..
+ "container[0,4.5]" ..
+ devtest_only ..
+ "container_end[]"
+ end
- "label[0,3.35;" .. fgettext("Game") .. "]"..
- "textlist[0,3.85;5.8,"..gamelist_height..";games;" ..
- pkgmgr.gamelist() .. ";" .. gameidx .. ";false]" ..
- "container[0,4.5]" ..
- devtest_only ..
- "container_end[]" ..
+ retval = retval ..
"container_end[]" ..
-- Right side
@@ -360,9 +357,20 @@ local function create_world_buttonhandler(this, fields)
fields["key_enter"] then
local worldname = fields["te_world_name"]
- local gameindex = core.get_textlist_index("games")
+ local game, gameindex
+ if hide_gamelist then
+ game, gameindex = pkgmgr.find_by_gameid(core.settings:get("menu_last_game"))
+ else
+ gameindex = core.get_textlist_index("games")
+ game = pkgmgr.get_game(gameindex)
+ end
- if gameindex ~= nil then
+ local message
+ if game == nil then
+ message = fgettext("No game selected")
+ end
+
+ if message == nil then
-- For unnamed worlds use the generated name 'world<number>',
-- where the number increments: it is set to 1 larger than the largest
-- generated name number found.
@@ -377,36 +385,48 @@ local function create_world_buttonhandler(this, fields)
worldname = "world" .. worldnum_max + 1
end
- core.settings:set("fixed_map_seed", fields["te_seed"])
-
- local message
- if not menudata.worldlist:uid_exists_raw(worldname) then
- core.settings:set("mg_name",fields["dd_mapgen"])
- message = core.create_world(worldname,gameindex)
- else
+ if menudata.worldlist:uid_exists_raw(worldname) then
message = fgettext("A world named \"$1\" already exists", worldname)
end
+ end
- if message ~= nil then
- gamedata.errormessage = message
- else
- core.settings:set("menu_last_game",pkgmgr.games[gameindex].id)
- if this.data.update_worldlist_filter then
- menudata.worldlist:set_filtercriteria(pkgmgr.games[gameindex].id)
- mm_texture.update("singleplayer", pkgmgr.games[gameindex].id)
- end
- menudata.worldlist:refresh()
- core.settings:set("mainmenu_last_selected_world",
- menudata.worldlist:raw_index_by_uid(worldname))
+ if message == nil then
+ this.data.seed = fields["te_seed"]
+ this.data.mg = fields["dd_mapgen"]
+
+ -- actual names as used by engine
+ local settings = {
+ fixed_map_seed = this.data.seed,
+ mg_name = this.data.mg,
+ mg_flags = table_to_flags(this.data.flags.main),
+ mgv5_spflags = table_to_flags(this.data.flags.v5),
+ mgv6_spflags = table_to_flags(this.data.flags.v6),
+ mgv7_spflags = table_to_flags(this.data.flags.v7),
+ mgfractal_spflags = table_to_flags(this.data.flags.fractal),
+ mgcarpathian_spflags = table_to_flags(this.data.flags.carpathian),
+ mgvalleys_spflags = table_to_flags(this.data.flags.valleys),
+ mgflat_spflags = table_to_flags(this.data.flags.flat),
+ }
+ message = core.create_world(worldname, gameindex, settings)
+ end
+
+ if message == nil then
+ core.settings:set("menu_last_game", game.id)
+ if this.data.update_worldlist_filter then
+ menudata.worldlist:set_filtercriteria(game.id)
end
- else
- gamedata.errormessage = fgettext("No game selected")
+ menudata.worldlist:refresh()
+ core.settings:set("mainmenu_last_selected_world",
+ menudata.worldlist:raw_index_by_uid(worldname))
end
+
+ gamedata.errormessage = message
this:delete()
return true
end
- worldname = fields.te_world_name
+ this.data.worldname = fields["te_world_name"]
+ this.data.seed = fields["te_seed"]
if fields["games"] then
local gameindex = core.get_textlist_index("games")
@@ -417,22 +437,11 @@ local function create_world_buttonhandler(this, fields)
for k,v in pairs(fields) do
local split = string.split(k, "_", nil, 3)
if split and split[1] == "flag" then
- local setting
- if split[2] == "mg" then
- setting = "mg_flags"
- else
- setting = split[2].."_spflags"
- end
-- We replaced the underscore of flag names with a dash.
local flag = string.gsub(split[3], "-", "_")
- local ftable = core.settings:get_flags(setting)
- if v == "true" then
- ftable[flag] = true
- else
- ftable[flag] = false
- end
- local flags = table_to_flags(ftable)
- core.settings:set(setting, flags)
+ local ftable = this.data.flags[split[2]]
+ assert(ftable)
+ ftable[flag] = v == "true"
return true
end
end
@@ -446,18 +455,16 @@ local function create_world_buttonhandler(this, fields)
local entry = core.formspec_escape(fields["mgv6_biomes"])
for b=1, #mgv6_biomes do
if entry == mgv6_biomes[b][1] then
- local ftable = core.settings:get_flags("mgv6_spflags")
+ local ftable = this.data.flags.v6
ftable.jungles = mgv6_biomes[b][2].jungles
ftable.snowbiomes = mgv6_biomes[b][2].snowbiomes
- local flags = table_to_flags(ftable)
- core.settings:set("mgv6_spflags", flags)
return true
end
end
end
if fields["dd_mapgen"] then
- core.settings:set("mg_name", fields["dd_mapgen"])
+ this.data.mg = fields["dd_mapgen"]
return true
end
@@ -466,12 +473,27 @@ end
function create_create_world_dlg(update_worldlistfilter)
- worldname = ""
local retval = dialog_create("sp_create_world",
create_world_formspec,
create_world_buttonhandler,
nil)
- retval.update_worldlist_filter = update_worldlistfilter
+ retval.data = {
+ update_worldlist_filter = update_worldlistfilter,
+ worldname = "",
+ -- settings the world is created with:
+ seed = core.settings:get("fixed_map_seed") or "",
+ mg = core.settings:get("mg_name"),
+ flags = {
+ main = core.settings:get_flags("mg_flags"),
+ v5 = core.settings:get_flags("mgv5_spflags"),
+ v6 = core.settings:get_flags("mgv6_spflags"),
+ v7 = core.settings:get_flags("mgv7_spflags"),
+ fractal = core.settings:get_flags("mgfractal_spflags"),
+ carpathian = core.settings:get_flags("mgcarpathian_spflags"),
+ valleys = core.settings:get_flags("mgvalleys_spflags"),
+ flat = core.settings:get_flags("mgflat_spflags"),
+ }
+ }
return retval
end
diff --git a/builtin/mainmenu/dlg_settings_advanced.lua b/builtin/mainmenu/dlg_settings_advanced.lua
index c16e4aad0..06fd32d84 100644
--- a/builtin/mainmenu/dlg_settings_advanced.lua
+++ b/builtin/mainmenu/dlg_settings_advanced.lua
@@ -31,6 +31,10 @@ end
-- returns error message, or nil
local function parse_setting_line(settings, line, read_all, base_level, allow_secure)
+
+ -- strip carriage returns (CR, /r)
+ line = line:gsub("\r", "")
+
-- comment
local comment = line:match("^#" .. CHAR_CLASSES.SPACE .. "*(.*)$")
if comment then
@@ -620,7 +624,7 @@ local function create_change_setting_formspec(dialogdata)
-- Third row
add_field(0.3, "te_octaves", fgettext("Octaves"), t[7])
- add_field(3.6, "te_persist", fgettext("Persistance"), t[8])
+ add_field(3.6, "te_persist", fgettext("Persistence"), t[8])
add_field(6.9, "te_lacun", fgettext("Lacunarity"), t[9])
height = height + 1.1
diff --git a/builtin/mainmenu/textures.lua b/builtin/mainmenu/game_theme.lua
index a3acbbdec..89e1b66c8 100644
--- a/builtin/mainmenu/textures.lua
+++ b/builtin/mainmenu/game_theme.lua
@@ -16,23 +16,25 @@
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-mm_texture = {}
+mm_game_theme = {}
--------------------------------------------------------------------------------
-function mm_texture.init()
- mm_texture.defaulttexturedir = core.get_texturepath() .. DIR_DELIM .. "base" ..
+function mm_game_theme.init()
+ mm_game_theme.defaulttexturedir = core.get_texturepath_share() .. DIR_DELIM .. "base" ..
DIR_DELIM .. "pack" .. DIR_DELIM
- mm_texture.basetexturedir = mm_texture.defaulttexturedir
+ mm_game_theme.basetexturedir = mm_game_theme.defaulttexturedir
- mm_texture.texturepack = core.settings:get("texture_path")
+ mm_game_theme.texturepack = core.settings:get("texture_path")
- mm_texture.gameid = nil
+ mm_game_theme.gameid = nil
+
+ mm_game_theme.music_handle = nil
end
--------------------------------------------------------------------------------
-function mm_texture.update(tab,gamedetails)
+function mm_game_theme.update(tab,gamedetails)
if tab ~= "singleplayer" then
- mm_texture.reset()
+ mm_game_theme.reset()
return
end
@@ -40,50 +42,54 @@ function mm_texture.update(tab,gamedetails)
return
end
- mm_texture.update_game(gamedetails)
+ mm_game_theme.update_game(gamedetails)
end
--------------------------------------------------------------------------------
-function mm_texture.reset()
- mm_texture.gameid = nil
+function mm_game_theme.reset()
+ mm_game_theme.gameid = nil
local have_bg = false
- local have_overlay = mm_texture.set_generic("overlay")
+ local have_overlay = mm_game_theme.set_generic("overlay")
if not have_overlay then
- have_bg = mm_texture.set_generic("background")
+ have_bg = mm_game_theme.set_generic("background")
end
- mm_texture.clear("header")
- mm_texture.clear("footer")
+ mm_game_theme.clear("header")
+ mm_game_theme.clear("footer")
core.set_clouds(false)
- mm_texture.set_generic("footer")
- mm_texture.set_generic("header")
+ mm_game_theme.set_generic("footer")
+ mm_game_theme.set_generic("header")
if not have_bg then
if core.settings:get_bool("menu_clouds") then
core.set_clouds(true)
else
- mm_texture.set_dirt_bg()
+ mm_game_theme.set_dirt_bg()
end
end
+
+ if mm_game_theme.music_handle ~= nil then
+ core.sound_stop(mm_game_theme.music_handle)
+ end
end
--------------------------------------------------------------------------------
-function mm_texture.update_game(gamedetails)
- if mm_texture.gameid == gamedetails.id then
+function mm_game_theme.update_game(gamedetails)
+ if mm_game_theme.gameid == gamedetails.id then
return
end
local have_bg = false
- local have_overlay = mm_texture.set_game("overlay",gamedetails)
+ local have_overlay = mm_game_theme.set_game("overlay",gamedetails)
if not have_overlay then
- have_bg = mm_texture.set_game("background",gamedetails)
+ have_bg = mm_game_theme.set_game("background",gamedetails)
end
- mm_texture.clear("header")
- mm_texture.clear("footer")
+ mm_game_theme.clear("header")
+ mm_game_theme.clear("footer")
core.set_clouds(false)
if not have_bg then
@@ -91,34 +97,34 @@ function mm_texture.update_game(gamedetails)
if core.settings:get_bool("menu_clouds") then
core.set_clouds(true)
else
- mm_texture.set_dirt_bg()
+ mm_game_theme.set_dirt_bg()
end
end
- mm_texture.set_game("footer",gamedetails)
- mm_texture.set_game("header",gamedetails)
+ mm_game_theme.set_game("footer",gamedetails)
+ mm_game_theme.set_game("header",gamedetails)
- mm_texture.gameid = gamedetails.id
+ mm_game_theme.gameid = gamedetails.id
end
--------------------------------------------------------------------------------
-function mm_texture.clear(identifier)
+function mm_game_theme.clear(identifier)
core.set_background(identifier,"")
end
--------------------------------------------------------------------------------
-function mm_texture.set_generic(identifier)
+function mm_game_theme.set_generic(identifier)
--try texture pack first
- if mm_texture.texturepack ~= nil then
- local path = mm_texture.texturepack .. DIR_DELIM .."menu_" ..
+ if mm_game_theme.texturepack ~= nil then
+ local path = mm_game_theme.texturepack .. DIR_DELIM .."menu_" ..
identifier .. ".png"
if core.set_background(identifier,path) then
return true
end
end
- if mm_texture.defaulttexturedir ~= nil then
- local path = mm_texture.defaulttexturedir .. DIR_DELIM .."menu_" ..
+ if mm_game_theme.defaulttexturedir ~= nil then
+ local path = mm_game_theme.defaulttexturedir .. DIR_DELIM .."menu_" ..
identifier .. ".png"
if core.set_background(identifier,path) then
return true
@@ -129,14 +135,16 @@ function mm_texture.set_generic(identifier)
end
--------------------------------------------------------------------------------
-function mm_texture.set_game(identifier, gamedetails)
+function mm_game_theme.set_game(identifier, gamedetails)
if gamedetails == nil then
return false
end
- if mm_texture.texturepack ~= nil then
- local path = mm_texture.texturepack .. DIR_DELIM ..
+ mm_game_theme.set_music(gamedetails)
+
+ if mm_game_theme.texturepack ~= nil then
+ local path = mm_game_theme.texturepack .. DIR_DELIM ..
gamedetails.id .. "_menu_" .. identifier .. ".png"
if core.set_background(identifier, path) then
return true
@@ -171,9 +179,10 @@ function mm_texture.set_game(identifier, gamedetails)
return false
end
-function mm_texture.set_dirt_bg()
- if mm_texture.texturepack ~= nil then
- local path = mm_texture.texturepack .. DIR_DELIM .."default_dirt.png"
+--------------------------------------------------------------------------------
+function mm_game_theme.set_dirt_bg()
+ if mm_game_theme.texturepack ~= nil then
+ local path = mm_game_theme.texturepack .. DIR_DELIM .."default_dirt.png"
if core.set_background("background", path, true, 128) then
return true
end
@@ -183,3 +192,12 @@ function mm_texture.set_dirt_bg()
local minimalpath = defaulttexturedir .. "menu_bg.png"
core.set_background("background", minimalpath, true, 128)
end
+
+--------------------------------------------------------------------------------
+function mm_game_theme.set_music(gamedetails)
+ if mm_game_theme.music_handle ~= nil then
+ core.sound_stop(mm_game_theme.music_handle)
+ end
+ local music_path = gamedetails.path .. DIR_DELIM .. "menu" .. DIR_DELIM .. "theme"
+ mm_game_theme.music_handle = core.sound_play(music_path, true)
+end
diff --git a/builtin/mainmenu/init.lua b/builtin/mainmenu/init.lua
index 45089c7c9..8e716c2eb 100644
--- a/builtin/mainmenu/init.lua
+++ b/builtin/mainmenu/init.lua
@@ -35,7 +35,7 @@ dofile(menupath .. DIR_DELIM .. "async_event.lua")
dofile(menupath .. DIR_DELIM .. "common.lua")
dofile(menupath .. DIR_DELIM .. "pkgmgr.lua")
dofile(menupath .. DIR_DELIM .. "serverlistmgr.lua")
-dofile(menupath .. DIR_DELIM .. "textures.lua")
+dofile(menupath .. DIR_DELIM .. "game_theme.lua")
dofile(menupath .. DIR_DELIM .. "dlg_config_world.lua")
dofile(menupath .. DIR_DELIM .. "dlg_settings_advanced.lua")
@@ -49,7 +49,7 @@ local tabs = {}
tabs.settings = dofile(menupath .. DIR_DELIM .. "tab_settings.lua")
tabs.content = dofile(menupath .. DIR_DELIM .. "tab_content.lua")
-tabs.credits = dofile(menupath .. DIR_DELIM .. "tab_credits.lua")
+tabs.about = dofile(menupath .. DIR_DELIM .. "tab_about.lua")
tabs.local_game = dofile(menupath .. DIR_DELIM .. "tab_local.lua")
tabs.play_online = dofile(menupath .. DIR_DELIM .. "tab_online.lua")
@@ -87,7 +87,7 @@ local function init_globals()
core.settings:set("menu_last_game", default_game)
end
- mm_texture.init()
+ mm_game_theme.init()
-- Create main tabview
local tv_main = tabview_create("maintab", {x = 12, y = 5.4}, {x = 0, y = 0})
@@ -98,7 +98,7 @@ local function init_globals()
tv_main:add(tabs.content)
tv_main:add(tabs.settings)
- tv_main:add(tabs.credits)
+ tv_main:add(tabs.about)
tv_main:set_global_event_handler(main_event_handler)
tv_main:set_fixed_size(false)
@@ -113,7 +113,7 @@ local function init_globals()
if tv_main.current_tab == "local" then
local game = pkgmgr.find_by_gameid(core.settings:get("menu_last_game"))
if game == nil then
- mm_texture.reset()
+ mm_game_theme.reset()
end
end
@@ -121,8 +121,6 @@ local function init_globals()
tv_main:show()
ui.update()
-
- core.sound_play("main_menu", true)
end
init_globals()
diff --git a/builtin/mainmenu/pkgmgr.lua b/builtin/mainmenu/pkgmgr.lua
index 787936e31..6de671529 100644
--- a/builtin/mainmenu/pkgmgr.lua
+++ b/builtin/mainmenu/pkgmgr.lua
@@ -181,21 +181,6 @@ function pkgmgr.get_texture_packs()
end
--------------------------------------------------------------------------------
-function pkgmgr.extract(modfile)
- if modfile.type == "zip" then
- local tempfolder = os.tempfolder()
-
- if tempfolder ~= nil and
- tempfolder ~= "" then
- core.create_dir(tempfolder)
- if core.extract_zip(modfile.name,tempfolder) then
- return tempfolder
- end
- end
- end
- return nil
-end
-
function pkgmgr.get_folder_type(path)
local testfile = io.open(path .. DIR_DELIM .. "init.lua","r")
if testfile ~= nil then
@@ -450,6 +435,7 @@ function pkgmgr.enable_mod(this, toset)
local toggled_mods = {}
local enabled_mods = {}
toggle_mod_or_modpack(list, toggled_mods, enabled_mods, toset, mod)
+ toset = mod.enabled -- Update if toggled
if not toset then
-- Mod(s) were disabled, so no dependencies need to be enabled
@@ -561,11 +547,10 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
local from = basefolder and basefolder.path or path
if targetpath then
core.delete_dir(targetpath)
- core.create_dir(targetpath)
else
targetpath = core.get_texturepath() .. DIR_DELIM .. basename
end
- if not core.copy_dir(from, targetpath) then
+ if not core.copy_dir(from, targetpath, false) then
return nil,
fgettext("Failed to install $1 to $2", basename, targetpath)
end
@@ -586,7 +571,6 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
-- Get destination name for modpack
if targetpath then
core.delete_dir(targetpath)
- core.create_dir(targetpath)
else
local clean_path = nil
if basename ~= nil then
@@ -610,7 +594,6 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
if targetpath then
core.delete_dir(targetpath)
- core.create_dir(targetpath)
else
local targetfolder = basename
if targetfolder == nil then
@@ -636,14 +619,13 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
if targetpath then
core.delete_dir(targetpath)
- core.create_dir(targetpath)
else
targetpath = core.get_gamepath() .. DIR_DELIM .. basename
end
end
-- Copy it
- if not core.copy_dir(basefolder.path, targetpath) then
+ if not core.copy_dir(basefolder.path, targetpath, false) then
return nil,
fgettext("Failed to install $1 to $2", basename, targetpath)
end
@@ -658,23 +640,6 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
end
--------------------------------------------------------------------------------
-function pkgmgr.install(type, modfilename, basename, dest)
- local archive_info = pkgmgr.identify_filetype(modfilename)
- local path = pkgmgr.extract(archive_info)
-
- if path == nil then
- return nil,
- fgettext("Install: file: \"$1\"", archive_info.name) .. "\n" ..
- fgettext("Install: Unsupported file type \"$1\" or broken archive",
- archive_info.type)
- end
-
- local targetpath, msg = pkgmgr.install_dir(type, path, basename, dest)
- core.delete_dir(path)
- return targetpath, msg
-end
-
---------------------------------------------------------------------------------
function pkgmgr.preparemodlist(data)
local retval = {}
@@ -682,11 +647,9 @@ function pkgmgr.preparemodlist(data)
local game_mods = {}
--read global mods
- local modpath = core.get_modpath()
-
- if modpath ~= nil and
- modpath ~= "" then
- get_mods(modpath,global_mods)
+ local modpaths = core.get_modpaths()
+ for _, modpath in ipairs(modpaths) do
+ get_mods(modpath, global_mods)
end
for i=1,#global_mods,1 do
@@ -820,45 +783,6 @@ function pkgmgr.refresh_globals()
end
--------------------------------------------------------------------------------
-function pkgmgr.identify_filetype(name)
-
- if name:sub(-3):lower() == "zip" then
- return {
- name = name,
- type = "zip"
- }
- end
-
- if name:sub(-6):lower() == "tar.gz" or
- name:sub(-3):lower() == "tgz"then
- return {
- name = name,
- type = "tgz"
- }
- end
-
- if name:sub(-6):lower() == "tar.bz2" then
- return {
- name = name,
- type = "tbz"
- }
- end
-
- if name:sub(-2):lower() == "7z" then
- return {
- name = name,
- type = "7z"
- }
- end
-
- return {
- name = name,
- type = "ukn"
- }
-end
-
-
---------------------------------------------------------------------------------
function pkgmgr.find_by_gameid(gameid)
for i=1,#pkgmgr.games,1 do
if pkgmgr.games[i].id == gameid then
diff --git a/builtin/mainmenu/tab_credits.lua b/builtin/mainmenu/tab_about.lua
index a34dd58bb..ba258fd2d 100644
--- a/builtin/mainmenu/tab_credits.lua
+++ b/builtin/mainmenu/tab_about.lua
@@ -28,32 +28,35 @@ local core_developers = {
"Lars Hofhansl <larsh@apache.org>",
"Pierre-Yves Rollo <dev@pyrollo.com>",
"v-rob <robinsonvincent89@gmail.com>",
+ "hecks",
+ "Hugues Ross <hugues.ross@gmail.com>",
+ "Dmitry Kostenko (x2048) <codeforsmile@gmail.com>",
}
-- For updating active/previous contributors, see the script in ./util/gather_git_credits.py
local active_contributors = {
- "Wuzzy [devtest game, visual corrections]",
- "Zughy [Visual improvements, various fixes]",
- "Maksim (MoNTE48) [Android]",
+ "Wuzzy [I18n for builtin, liquid features, fixes]",
+ "Zughy [Various features and fixes]",
"numzero [Graphics and rendering]",
- "appgurueu [Various internal fixes]",
- "Desour [Formspec and vector API changes]",
- "HybridDog [Rendering fixes and documentation]",
- "Hugues Ross [Graphics-related improvements]",
- "ANAND (ClobberXD) [Mouse buttons rebinding]",
- "luk3yx [Fixes]",
- "hecks [Audiovisuals, Lua API]",
- "LoneWolfHT [Object crosshair, documentation fixes]",
- "Lejo [Server-related improvements]",
- "EvidenceB [Compass HUD element]",
- "Paul Ouellette (pauloue) [Lua API, documentation]",
- "TheTermos [Collision detection, physics]",
+ "Desour [Internal fixes, Clipboard on X11]",
+ "Lars Müller [Various internal fixes]",
+ "JosiahWI [CMake, cleanups and fixes]",
+ "HybridDog [builtin, documentation]",
+ "Jude Melton-Houghton [Database implementation]",
+ "savilli [Fixes]",
+ "Liso [Shadow Mapping]",
+ "MoNTE48 [Build fix]",
+ "Jean-Patrick Guerrero (kilbith) [Fixes]",
+ "ROllerozxa [Code cleanups]",
+ "Lejo [bitop library integration]",
+ "LoneWolfHT [Build fixes]",
+ "NeroBurner [Joystick]",
+ "Elias Fleckenstein [Internal fixes]",
"David CARLIER [Unix & Haiku build fixes]",
- "dcbrwn [Object shading]",
- "Elias Fleckenstein [API features/fixes]",
- "Jean-Patrick Guerrero (kilbith) [model element, visual fixes]",
- "k.h.lai [Memory leak fixes, documentation]",
+ "pecksin [Clickable web links]",
+ "srfqi [Android & rendering fixes]",
+ "EvidenceB [Formspec]",
}
local previous_core_developers = {
@@ -70,6 +73,7 @@ local previous_core_developers = {
"Zeno",
"ShadowNinja <shadowninja@minetest.net>",
"Auke Kok (sofar) <sofar@foo-projects.org>",
+ "Aaron Suen <warr1024@gmail.com>",
}
local previous_contributors = {
@@ -80,10 +84,10 @@ local previous_contributors = {
"MirceaKitsune <mirceakitsune@gmail.com>",
"Constantin Wenger (SpeedProg)",
"Ciaran Gultnieks (CiaranG)",
- "stujones11 [Android UX improvements]",
- "Rogier <rogier777@gmail.com> [Fixes]",
- "Gregory Currie (gregorycu) [optimisation]",
- "srifqi [Fixes]",
+ "Paul Ouellette (pauloue)",
+ "stujones11",
+ "Rogier <rogier777@gmail.com>",
+ "Gregory Currie (gregorycu)",
"JacobF",
"Jeija <jeija@mesecons.net> [HTTP, particles]",
}
@@ -97,8 +101,8 @@ local function buildCreditList(source)
end
return {
- name = "credits",
- caption = fgettext("Credits"),
+ name = "about",
+ caption = fgettext("About"),
cbf_formspec = function(tabview, name, tabdata)
local logofile = defaulttexturedir .. "logo.png"
local version = core.get_version()
@@ -119,11 +123,16 @@ return {
buildCreditList(previous_contributors) .. "," ..
";1]"
+ -- Render information
+ fs = fs .. "label[0.75,4.9;" ..
+ fgettext("Active renderer:") .. "\n" ..
+ core.formspec_escape(core.get_screen_info().render_info) .. "]"
+
if PLATFORM ~= "Android" then
fs = fs .. "tooltip[userdata;" ..
fgettext("Opens the directory that contains user-provided worlds, games, mods,\n" ..
"and texture packs in a file manager / explorer.") .. "]"
- fs = fs .. "button[0,4.75;3.5,1;userdata;" .. fgettext("Open User Data Directory") .. "]"
+ fs = fs .. "button[0,4;3.5,1;userdata;" .. fgettext("Open User Data Directory") .. "]"
end
return fs
diff --git a/builtin/mainmenu/tab_content.lua b/builtin/mainmenu/tab_content.lua
index 336730bf4..fb7f121f8 100644
--- a/builtin/mainmenu/tab_content.lua
+++ b/builtin/mainmenu/tab_content.lua
@@ -146,10 +146,25 @@ local function get_formspec(tabview, name, tabdata)
end
--------------------------------------------------------------------------------
+local function handle_doubleclick(pkg)
+ if pkg.type == "txp" then
+ if core.settings:get("texture_path") == pkg.path then
+ core.settings:set("texture_path", "")
+ else
+ core.settings:set("texture_path", pkg.path)
+ end
+ packages = nil
+ end
+end
+
+--------------------------------------------------------------------------------
local function handle_buttons(tabview, fields, tabname, tabdata)
if fields["pkglist"] ~= nil then
local event = core.explode_table_event(fields["pkglist"])
tabdata.selected_pkg = event.row
+ if event.type == "DCL" then
+ handle_doubleclick(packages:get_list()[tabdata.selected_pkg])
+ end
return true
end
diff --git a/builtin/mainmenu/tab_local.lua b/builtin/mainmenu/tab_local.lua
index 0e06c3bef..e77c6f04d 100644
--- a/builtin/mainmenu/tab_local.lua
+++ b/builtin/mainmenu/tab_local.lua
@@ -18,8 +18,14 @@
local enable_gamebar = PLATFORM ~= "Android"
local current_game, singleplayer_refresh_gamebar
+local valid_disabled_settings = {
+ ["enable_damage"]=true,
+ ["creative_mode"]=true,
+ ["enable_server"]=true,
+}
if enable_gamebar then
+ -- Currently chosen game in gamebar for theming and filtering
function current_game()
local last_game_id = core.settings:get("menu_last_game")
local game = pkgmgr.find_by_gameid(last_game_id)
@@ -27,10 +33,30 @@ if enable_gamebar then
return game
end
+ -- Apply menu changes from given game
+ function apply_game(game)
+ core.set_topleft_text(game.name)
+ core.settings:set("menu_last_game", game.id)
+ menudata.worldlist:set_filtercriteria(game.id)
+
+ mm_game_theme.update("singleplayer", game) -- this refreshes the formspec
+
+ local index = filterlist.get_current_index(menudata.worldlist,
+ 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
+ index = selected
+ else
+ index = #menudata.worldlist:get_list()
+ end
+ end
+ menu_worldmt_legacy(index)
+ end
+
function singleplayer_refresh_gamebar()
local old_bar = ui.find_by_name("game_button_bar")
-
if old_bar ~= nil then
old_bar:delete()
end
@@ -45,26 +71,10 @@ if enable_gamebar then
return true
end
- for key,value in pairs(fields) do
- for j=1,#pkgmgr.games,1 do
- if ("game_btnbar_" .. pkgmgr.games[j].id == key) then
- mm_texture.update("singleplayer", pkgmgr.games[j])
- core.set_topleft_text(pkgmgr.games[j].name)
- core.settings:set("menu_last_game",pkgmgr.games[j].id)
- menudata.worldlist:set_filtercriteria(pkgmgr.games[j].id)
- local index = filterlist.get_current_index(menudata.worldlist,
- 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
- index = selected
- else
- index = #menudata.worldlist:get_list()
- end
- end
- menu_worldmt_legacy(index)
- return true
- end
+ for _, game in ipairs(pkgmgr.games) do
+ if fields["game_btnbar_" .. game.id] then
+ apply_game(game)
+ return true
end
end
end
@@ -73,25 +83,22 @@ if enable_gamebar then
game_buttonbar_button_handler,
{x=-0.3,y=5.9}, "horizontal", {x=12.4,y=1.15})
- for i=1,#pkgmgr.games,1 do
- local btn_name = "game_btnbar_" .. pkgmgr.games[i].id
+ for _, game in ipairs(pkgmgr.games) do
+ local btn_name = "game_btnbar_" .. game.id
local image = nil
local text = nil
- local tooltip = core.formspec_escape(pkgmgr.games[i].name)
+ local tooltip = core.formspec_escape(game.name)
- if pkgmgr.games[i].menuicon_path ~= nil and
- pkgmgr.games[i].menuicon_path ~= "" then
- image = core.formspec_escape(pkgmgr.games[i].menuicon_path)
+ if (game.menuicon_path or "") ~= "" then
+ image = core.formspec_escape(game.menuicon_path)
else
-
- local part1 = pkgmgr.games[i].id:sub(1,5)
- local part2 = pkgmgr.games[i].id:sub(6,10)
- local part3 = pkgmgr.games[i].id:sub(11)
+ local part1 = game.id:sub(1,5)
+ local part2 = game.id:sub(6,10)
+ local part3 = game.id:sub(11)
text = part1 .. "\n" .. part2
- if part3 ~= nil and
- part3 ~= "" then
+ if part3 ~= "" then
text = text .. "\n" .. part3
end
end
@@ -102,37 +109,91 @@ if enable_gamebar then
btnbar:add_button("game_open_cdb", "", plus_image, fgettext("Install games from ContentDB"))
end
else
+ -- Currently chosen game in gamebar: no gamebar -> no "current" game
function current_game()
return nil
end
end
+local function get_disabled_settings(game)
+ if not game then
+ return {}
+ end
+
+ local gameconfig = Settings(game.path .. "/game.conf")
+ local disabled_settings = {}
+ if gameconfig then
+ local disabled_settings_str = (gameconfig:get("disabled_settings") or ""):split()
+ for _, value in pairs(disabled_settings_str) do
+ local state = false
+ value = value:trim()
+ if string.sub(value, 1, 1) == "!" then
+ state = true
+ value = string.sub(value, 2)
+ end
+ if valid_disabled_settings[value] then
+ disabled_settings[value] = state
+ else
+ core.log("error", "Invalid disabled setting in game.conf: "..tostring(value))
+ end
+ end
+ end
+ return disabled_settings
+end
+
local function get_formspec(tabview, name, tabdata)
local retval = ""
local index = filterlist.get_current_index(menudata.worldlist,
- tonumber(core.settings:get("mainmenu_last_selected_world"))
- )
+ tonumber(core.settings:get("mainmenu_last_selected_world")))
+ local list = menudata.worldlist:get_list()
+ local world = list and index and list[index]
+ local game
+ if world then
+ game = pkgmgr.find_by_gameid(world.gameid)
+ else
+ game = current_game()
+ end
+ local disabled_settings = get_disabled_settings(game)
+
+ local creative, damage, host = "", "", ""
+
+ -- Y offsets for game settings checkboxes
+ local y = -0.2
+ local yo = 0.45
+
+ if disabled_settings["creative_mode"] == nil then
+ creative = "checkbox[0,"..y..";cb_creative_mode;".. fgettext("Creative Mode") .. ";" ..
+ dump(core.settings:get_bool("creative_mode")) .. "]"
+ y = y + yo
+ end
+ if disabled_settings["enable_damage"] == nil then
+ damage = "checkbox[0,"..y..";cb_enable_damage;".. fgettext("Enable Damage") .. ";" ..
+ dump(core.settings:get_bool("enable_damage")) .. "]"
+ y = y + yo
+ end
+ if disabled_settings["enable_server"] == nil then
+ host = "checkbox[0,"..y..";cb_server;".. fgettext("Host Server") ..";" ..
+ dump(core.settings:get_bool("enable_server")) .. "]"
+ y = y + yo
+ end
retval = retval ..
"button[3.9,3.8;2.8,1;world_delete;".. fgettext("Delete") .. "]" ..
"button[6.55,3.8;2.8,1;world_configure;".. fgettext("Select Mods") .. "]" ..
"button[9.2,3.8;2.8,1;world_create;".. fgettext("New") .. "]" ..
"label[3.9,-0.05;".. fgettext("Select World:") .. "]"..
- "checkbox[0,-0.20;cb_creative_mode;".. fgettext("Creative Mode") .. ";" ..
- dump(core.settings:get_bool("creative_mode")) .. "]"..
- "checkbox[0,0.25;cb_enable_damage;".. fgettext("Enable Damage") .. ";" ..
- dump(core.settings:get_bool("enable_damage")) .. "]"..
- "checkbox[0,0.7;cb_server;".. fgettext("Host Server") ..";" ..
- dump(core.settings:get_bool("enable_server")) .. "]" ..
+ creative ..
+ damage ..
+ host ..
"textlist[3.9,0.4;7.9,3.45;sp_worlds;" ..
- menu_render_worldlist() ..
+ menu_render_worldlist(not enable_gamebar) ..
";" .. index .. "]"
- if core.settings:get_bool("enable_server") then
+ if core.settings:get_bool("enable_server") and disabled_settings["enable_server"] == nil then
retval = retval ..
"button[7.9,4.75;4.1,1;play;".. fgettext("Host Game") .. "]" ..
- "checkbox[0,1.15;cb_server_announce;" .. fgettext("Announce Server") .. ";" ..
+ "checkbox[0,"..y..";cb_server_announce;" .. fgettext("Announce Server") .. ";" ..
dump(core.settings:get_bool("server_announce")) .. "]" ..
"field[0.3,2.85;3.8,0.5;te_playername;" .. fgettext("Name") .. ";" ..
core.formspec_escape(core.settings:get("name")) .. "]" ..
@@ -227,9 +288,21 @@ local function main_button_handler(this, fields, name, tabdata)
-- Update last game
local world = menudata.worldlist:get_raw_element(gamedata.selected_world)
+ local game_obj
if world then
- local game = pkgmgr.find_by_gameid(world.gameid)
- core.settings:set("menu_last_game", game.id)
+ game_obj = pkgmgr.find_by_gameid(world.gameid)
+ core.settings:set("menu_last_game", game_obj.id)
+ end
+
+ local disabled_settings = get_disabled_settings(game_obj)
+ for k, _ in pairs(valid_disabled_settings) do
+ local v = disabled_settings[k]
+ if v ~= nil then
+ if k == "enable_server" and v == true then
+ error("Setting 'enable_server' cannot be force-enabled! The game.conf needs to be fixed.")
+ end
+ core.settings:set_bool(k, disabled_settings[k])
+ end
end
if core.settings:get_bool("enable_server") then
@@ -251,11 +324,11 @@ local function main_button_handler(this, fields, name, tabdata)
end
if fields["world_create"] ~= nil then
- local create_world_dlg = create_create_world_dlg(true)
+ local create_world_dlg = create_create_world_dlg(enable_gamebar)
create_world_dlg:set_parent(this)
this:hide()
create_world_dlg:show()
- mm_texture.update("singleplayer", current_game())
+ mm_game_theme.update("singleplayer", current_game())
return true
end
@@ -272,7 +345,7 @@ local function main_button_handler(this, fields, name, tabdata)
delete_world_dlg:set_parent(this)
this:hide()
delete_world_dlg:show()
- mm_texture.update("singleplayer",current_game())
+ mm_game_theme.update("singleplayer",current_game())
end
end
@@ -290,7 +363,7 @@ local function main_button_handler(this, fields, name, tabdata)
configdialog:set_parent(this)
this:hide()
configdialog:show()
- mm_texture.update("singleplayer",current_game())
+ mm_game_theme.update("singleplayer",current_game())
end
end
@@ -303,11 +376,8 @@ if enable_gamebar then
function on_change(type, old_tab, new_tab)
if (type == "ENTER") then
local game = current_game()
-
if game then
- menudata.worldlist:set_filtercriteria(game.id)
- core.set_topleft_text(game.name)
- mm_texture.update("singleplayer",game)
+ apply_game(game)
end
singleplayer_refresh_gamebar()
@@ -319,7 +389,7 @@ if enable_gamebar then
gamebar:hide()
end
core.set_topleft_text("")
- mm_texture.update(new_tab,nil)
+ mm_game_theme.update(new_tab,nil)
end
end
end
diff --git a/builtin/mainmenu/tab_online.lua b/builtin/mainmenu/tab_online.lua
index e6748ed88..fb7409864 100644
--- a/builtin/mainmenu/tab_online.lua
+++ b/builtin/mainmenu/tab_online.lua
@@ -15,17 +15,50 @@
--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_sorted_servers()
+ local servers = {
+ fav = {},
+ public = {},
+ incompatible = {}
+ }
+
+ local favs = serverlistmgr.get_favorites()
+ local taken_favs = {}
+ local result = menudata.search_result or serverlistmgr.servers
+ for _, server in ipairs(result) do
+ server.is_favorite = false
+ for index, fav in ipairs(favs) do
+ if server.address == fav.address and server.port == fav.port then
+ taken_favs[index] = true
+ server.is_favorite = true
+ break
+ end
+ end
+ server.is_compatible = is_server_protocol_compat(server.proto_min, server.proto_max)
+ if server.is_favorite then
+ table.insert(servers.fav, server)
+ elseif server.is_compatible then
+ table.insert(servers.public, server)
+ else
+ table.insert(servers.incompatible, server)
+ end
+ end
+
+ if not menudata.search_result then
+ for index, fav in ipairs(favs) do
+ if not taken_favs[index] then
+ table.insert(servers.fav, fav)
+ end
+ end
+ end
+
+ return servers
+end
+
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 selected
- if menudata.search_result then
- selected = menudata.search_result[tabdata.selected]
- else
- selected = serverlistmgr.servers[tabdata.selected]
- end
if not tabdata.search_for then
tabdata.search_for = ""
@@ -33,128 +66,221 @@ local function get_formspec(tabview, name, tabdata)
local retval =
-- Search
- "field[0.15,0.075;5.91,1;te_search;;" .. core.formspec_escape(tabdata.search_for) .. "]" ..
- "image_button[5.63,-.165;.83,.83;" .. core.formspec_escape(defaulttexturedir .. "search.png") .. ";btn_mp_search;]" ..
- "image_button[6.3,-.165;.83,.83;" .. core.formspec_escape(defaulttexturedir .. "clear.png") .. ";btn_mp_clear;]" ..
- "image_button[6.97,-.165;.83,.83;" .. core.formspec_escape(defaulttexturedir .. "refresh.png")
- .. ";btn_mp_refresh;]" ..
+ "field[0.25,0.25;7,0.75;te_search;;" .. core.formspec_escape(tabdata.search_for) .. "]" ..
+ "container[7.25,0.25]" ..
+ "image_button[0,0;0.75,0.75;" .. core.formspec_escape(defaulttexturedir .. "search.png") .. ";btn_mp_search;]" ..
+ "image_button[0.75,0;0.75,0.75;" .. core.formspec_escape(defaulttexturedir .. "clear.png") .. ";btn_mp_clear;]" ..
+ "image_button[1.5,0;0.75,0.75;" .. core.formspec_escape(defaulttexturedir .. "refresh.png") .. ";btn_mp_refresh;]" ..
+ "tooltip[btn_mp_clear;" .. fgettext("Clear") .. "]" ..
+ "tooltip[btn_mp_search;" .. fgettext("Search") .. "]" ..
+ "tooltip[btn_mp_refresh;" .. fgettext("Refresh") .. "]" ..
+ "container_end[]" ..
+
+ "container[9.75,0]" ..
+ "box[0,0;5.75,7;#666666]" ..
-- Address / Port
- "label[7.75,-0.25;" .. fgettext("Address / Port") .. "]" ..
- "field[8,0.65;3.25,0.5;te_address;;" ..
+ "label[0.25,0.35;" .. fgettext("Address") .. "]" ..
+ "label[4.25,0.35;" .. fgettext("Port") .. "]" ..
+ "field[0.25,0.5;4,0.75;te_address;;" ..
core.formspec_escape(core.settings:get("address")) .. "]" ..
- "field[11.1,0.65;1.4,0.5;te_port;;" ..
+ "field[4.25,0.5;1.25,0.75;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;;" ..
+ "label[0.25,1.55;" .. fgettext("Name") .. "]" ..
+ "label[3,1.55;" .. fgettext("Password") .. "]" ..
+ "field[0.25,1.75;2.75,0.75;te_name;;" ..
core.formspec_escape(core.settings:get("name")) .. "]" ..
- "pwdfield[10.73,1.85;1.77,0.5;te_pwd;]" ..
+ "pwdfield[3,1.75;2.5,0.75;te_pwd;]" ..
-- Description Background
- "box[7.73,2.25;4.25,2.6;#999999]"..
+ "label[0.25,2.75;" .. fgettext("Server Description") .. "]" ..
+ "box[0.25,3;5.25,2.75;#999999]"..
-- Connect
- "button[9.88,4.9;2.3,1;btn_mp_connect;" .. fgettext("Connect") .. "]"
+ "button[3,6;2.5,0.75;btn_mp_connect;" .. fgettext("Connect") .. "]"
- if tabdata.selected and selected then
+ if tabdata.selected then
if gamedata.fav then
- retval = retval .. "button[7.73,4.9;2.3,1;btn_delete_favorite;" ..
+ retval = retval .. "button[0.25,6;2.5,0.75;btn_delete_favorite;" ..
fgettext("Del. Favorite") .. "]"
end
- if selected.description then
- retval = retval .. "textarea[8.1,2.3;4.23,2.9;;;" ..
- core.formspec_escape((gamedata.serverdescription or ""), true) .. "]"
+ if gamedata.serverdescription then
+ retval = retval .. "textarea[0.25,3;5.25,2.75;;;" ..
+ core.formspec_escape(gamedata.serverdescription) .. "]"
end
end
- --favorites
+ retval = retval .. "container_end[]"
+
+ -- Table
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;" .. -- "/"
- "text,align=right,padding=0.25;" .. -- clients_max
- image_column(fgettext("Creative mode"), "creative") .. ",padding=1;" ..
- image_column(fgettext("Damage enabled"), "damage") .. ",padding=0.25;" ..
- --~ PvP = Player versus Player
- image_column(fgettext("PvP enabled"), "pvp") .. ",padding=0.25;" ..
+ "image,tooltip=" .. fgettext("Ping") .. "," ..
+ "0=" .. core.formspec_escape(defaulttexturedir .. "blank.png") .. "," ..
+ "1=" .. core.formspec_escape(defaulttexturedir .. "server_ping_4.png") .. "," ..
+ "2=" .. core.formspec_escape(defaulttexturedir .. "server_ping_3.png") .. "," ..
+ "3=" .. core.formspec_escape(defaulttexturedir .. "server_ping_2.png") .. "," ..
+ "4=" .. core.formspec_escape(defaulttexturedir .. "server_ping_1.png") .. "," ..
+ "5=" .. core.formspec_escape(defaulttexturedir .. "server_favorite.png") .. "," ..
+ "6=" .. core.formspec_escape(defaulttexturedir .. "server_public.png") .. "," ..
+ "7=" .. core.formspec_escape(defaulttexturedir .. "server_incompatible.png") .. ";" ..
"color,span=1;" ..
- "text,padding=1]" ..
- "table[-0.15,0.6;7.75,5.15;favorites;"
-
- if menudata.search_result then
- local favs = serverlistmgr.get_favorites()
- for i = 1, #menudata.search_result do
- 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 #serverlistmgr.servers > 0 then
- local favs = serverlistmgr.get_favorites()
- if #favs > 0 then
- for i = 1, #favs do
- for j = 1, #serverlistmgr.servers do
- if serverlistmgr.servers[j].address == favs[i].address and
- serverlistmgr.servers[j].port == favs[i].port then
- table.insert(serverlistmgr.servers, i, table.remove(serverlistmgr.servers, j))
- end
- end
- if favs[i].address ~= serverlistmgr.servers[i].address then
- table.insert(serverlistmgr.servers, i, favs[i])
- end
+ "text,align=inline;"..
+ "color,span=1;" ..
+ "text,align=inline,width=4.25;" ..
+ "image,tooltip=" .. fgettext("Creative mode") .. "," ..
+ "0=" .. core.formspec_escape(defaulttexturedir .. "blank.png") .. "," ..
+ "1=" .. core.formspec_escape(defaulttexturedir .. "server_flags_creative.png") .. "," ..
+ "align=inline,padding=0.25,width=1.5;" ..
+ --~ PvP = Player versus Player
+ "image,tooltip=" .. fgettext("Damage / PvP") .. "," ..
+ "0=" .. core.formspec_escape(defaulttexturedir .. "blank.png") .. "," ..
+ "1=" .. core.formspec_escape(defaulttexturedir .. "server_flags_damage.png") .. "," ..
+ "2=" .. core.formspec_escape(defaulttexturedir .. "server_flags_pvp.png") .. "," ..
+ "align=inline,padding=0.25,width=1.5;" ..
+ "color,align=inline,span=1;" ..
+ "text,align=inline,padding=1]" ..
+ "table[0.25,1;9.25,5.75;servers;"
+
+ local servers = get_sorted_servers()
+
+ local dividers = {
+ fav = "5,#ffff00," .. fgettext("Favorites") .. ",,,0,0,,",
+ public = "6,#4bdd42," .. fgettext("Public Servers") .. ",,,0,0,,",
+ incompatible = "7,"..mt_color_grey.."," .. fgettext("Incompatible Servers") .. ",,,0,0,,"
+ }
+ local order = {"fav", "public", "incompatible"}
+
+ tabdata.lookup = {} -- maps row number to server
+ local rows = {}
+ for _, section in ipairs(order) do
+ local section_servers = servers[section]
+ if next(section_servers) ~= nil then
+ rows[#rows + 1] = dividers[section]
+ for _, server in ipairs(section_servers) do
+ tabdata.lookup[#rows + 1] = server
+ rows[#rows + 1] = render_serverlist_row(server)
end
end
-
- retval = retval .. render_serverlist_row(serverlistmgr.servers[1], (#favs > 0))
- for i = 2, #serverlistmgr.servers do
- retval = retval .. "," .. render_serverlist_row(serverlistmgr.servers[i], (i <= #favs))
- end
end
+ retval = retval .. table.concat(rows, ",")
+
if tabdata.selected then
retval = retval .. ";" .. tabdata.selected .. "]"
else
retval = retval .. ";0]"
end
- return retval
+ return retval, "size[15.5,7,false]real_coordinates[true]"
end
--------------------------------------------------------------------------------
-local function main_button_handler(tabview, fields, name, tabdata)
- local serverlist = menudata.search_result or serverlistmgr.servers
+local function search_server_list(input)
+ menudata.search_result = nil
+ if #serverlistmgr.servers < 2 then
+ return
+ end
+
+ -- setup the keyword list
+ local keywords = {}
+ for word in input:gmatch("%S+") do
+ word = word:gsub("(%W)", "%%%1")
+ table.insert(keywords, word)
+ end
+
+ if #keywords == 0 then
+ return
+ end
+
+ menudata.search_result = {}
+
+ -- Search the serverlist
+ local search_result = {}
+ for i = 1, #serverlistmgr.servers do
+ local server = serverlistmgr.servers[i]
+ local found = 0
+ for k = 1, #keywords do
+ local keyword = keywords[k]
+ if server.name then
+ local sername = server.name:lower()
+ local _, count = sername: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 = (#serverlistmgr.servers - i) / 5 + found
+ server.points = points
+ table.insert(search_result, server)
+ end
+ end
+
+ if #search_result == 0 then
+ return
+ end
+
+ table.sort(search_result, function(a, b)
+ return a.points > b.points
+ end)
+ menudata.search_result = search_result
+end
+
+local function set_selected_server(tabdata, idx, server)
+ -- reset selection
+ if idx == nil or server == nil then
+ tabdata.selected = nil
+
+ core.settings:set("address", "")
+ core.settings:set("remote_port", "30000")
+ return
+ end
+
+ local address = server.address
+ local port = server.port
+ gamedata.serverdescription = server.description
+
+ gamedata.fav = false
+ for _, fav in ipairs(serverlistmgr.get_favorites()) do
+ if address == fav.address and port == fav.port then
+ gamedata.fav = true
+ break
+ end
+ end
+
+ if address and port then
+ core.settings:set("address", address)
+ core.settings:set("remote_port", port)
+ end
+ tabdata.selected = idx
+end
+
+local function main_button_handler(tabview, fields, name, tabdata)
if fields.te_name then
gamedata.playername = fields.te_name
core.settings:set("name", fields.te_name)
end
- if fields.favorites then
- local event = core.explode_table_event(fields.favorites)
- local fav = serverlist[event.row]
+ if fields.servers then
+ local event = core.explode_table_event(fields.servers)
+ local server = tabdata.lookup[event.row]
- if event.type == "DCL" then
- if event.row <= #serverlist then
+ if server then
+ if event.type == "DCL" then
if not is_server_protocol_compat_or_error(
- fav.proto_min, fav.proto_max) then
+ server.proto_min, server.proto_max) then
return true
end
- gamedata.address = fav.address
- gamedata.port = fav.port
+ gamedata.address = server.address
+ gamedata.port = server.port
gamedata.playername = fields.te_name
gamedata.selected_world = 0
@@ -162,84 +288,32 @@ local function main_button_handler(tabview, fields, name, tabdata)
gamedata.password = fields.te_pwd
end
- gamedata.servername = fav.name
- gamedata.serverdescription = fav.description
+ gamedata.servername = server.name
+ gamedata.serverdescription = server.description
if gamedata.address and gamedata.port then
core.settings:set("address", gamedata.address)
core.settings:set("remote_port", gamedata.port)
core.start()
end
+ return true
end
- return true
- end
-
- if event.type == "CHG" then
- if event.row <= #serverlist then
- gamedata.fav = false
- local favs = serverlistmgr.get_favorites()
- local address = fav.address
- local port = fav.port
- gamedata.serverdescription = fav.description
-
- for i = 1, #favs do
- if fav.address == favs[i].address and
- fav.port == favs[i].port then
- gamedata.fav = true
- end
- end
-
- if address and port then
- core.settings:set("address", address)
- core.settings:set("remote_port", port)
- end
- tabdata.selected = event.row
- end
- return true
- end
- end
-
- if fields.key_up or fields.key_down then
- local fav_idx = core.get_table_index("favorites")
- local fav = serverlist[fav_idx]
-
- if fav_idx then
- if fields.key_up and fav_idx > 1 then
- fav_idx = fav_idx - 1
- elseif fields.key_down and fav_idx < #serverlistmgr.servers then
- fav_idx = fav_idx + 1
+ if event.type == "CHG" then
+ set_selected_server(tabdata, event.row, server)
+ return true
end
- else
- fav_idx = 1
- end
-
- if not serverlistmgr.servers or not fav then
- tabdata.selected = 0
- return true
- end
-
- local address = fav.address
- local port = fav.port
- gamedata.serverdescription = fav.description
- if address and port then
- core.settings:set("address", address)
- core.settings:set("remote_port", port)
end
-
- tabdata.selected = fav_idx
- return true
end
if fields.btn_delete_favorite then
- local current_favorite = core.get_table_index("favorites")
- if not current_favorite then return end
-
- serverlistmgr.delete_favorite(serverlistmgr.servers[current_favorite])
- serverlistmgr.sync()
- tabdata.selected = nil
-
- core.settings:set("address", "")
- core.settings:set("remote_port", "30000")
+ local idx = core.get_table_index("servers")
+ if not idx then return end
+ local server = tabdata.lookup[idx]
+ if not server then return end
+
+ serverlistmgr.delete_favorite(server)
+ -- the server at [idx+1] will be at idx once list is refreshed
+ set_selected_server(tabdata, idx, tabdata.lookup[idx+1])
return true
end
@@ -250,63 +324,13 @@ local function main_button_handler(tabview, fields, name, tabdata)
end
if fields.btn_mp_search or fields.key_enter_field == "te_search" then
- tabdata.selected = 1
- local input = fields.te_search:lower()
tabdata.search_for = fields.te_search
-
- if #serverlistmgr.servers < 2 then
- return true
- end
-
- menudata.search_result = {}
-
- -- setup the keyword list
- local keywords = {}
- for word in input:gmatch("%S+") do
- word = word:gsub("(%W)", "%%%1")
- table.insert(keywords, word)
+ search_server_list(fields.te_search:lower())
+ if menudata.search_result then
+ -- first server in row 2 due to header
+ set_selected_server(tabdata, 2, menudata.search_result[1])
end
- if #keywords == 0 then
- menudata.search_result = nil
- return true
- end
-
- -- Search the serverlist
- local search_result = {}
- for i = 1, #serverlistmgr.servers do
- local server = serverlistmgr.servers[i]
- local found = 0
- for k = 1, #keywords do
- local keyword = keywords[k]
- if server.name then
- local sername = server.name:lower()
- local _, count = sername: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 = (#serverlistmgr.servers - 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)
- gamedata.serverdescription = first_server.description
- end
return true
end
@@ -322,20 +346,22 @@ local function main_button_handler(tabview, fields, name, tabdata)
gamedata.address = fields.te_address
gamedata.port = tonumber(fields.te_port)
gamedata.selected_world = 0
- local fav_idx = core.get_table_index("favorites")
- local fav = serverlist[fav_idx]
- if fav_idx and fav_idx <= #serverlist and
- fav.address == gamedata.address and
- fav.port == gamedata.port then
+ local idx = core.get_table_index("servers")
+ local server = idx and tabdata.lookup[idx]
+
+ set_selected_server(tabdata)
- serverlistmgr.add_favorite(fav)
+ if server and server.address == gamedata.address and
+ server.port == gamedata.port then
- gamedata.servername = fav.name
- gamedata.serverdescription = fav.description
+ serverlistmgr.add_favorite(server)
+
+ gamedata.servername = server.name
+ gamedata.serverdescription = server.description
if not is_server_protocol_compat_or_error(
- fav.proto_min, fav.proto_max) then
+ server.proto_min, server.proto_max) then
return true
end
else
@@ -354,6 +380,7 @@ local function main_button_handler(tabview, fields, name, tabdata)
core.start()
return true
end
+
return false
end
@@ -362,7 +389,6 @@ local function on_change(type, old_tab, new_tab)
serverlistmgr.sync()
end
---------------------------------------------------------------------------------
return {
name = "online",
caption = fgettext("Join Game"),
diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua
index 29744048a..700b7390f 100644
--- a/builtin/mainmenu/tab_settings.lua
+++ b/builtin/mainmenu/tab_settings.lua
@@ -43,6 +43,14 @@ local labels = {
fgettext("2x"),
fgettext("4x"),
fgettext("8x")
+ },
+ shadow_levels = {
+ fgettext("Disabled"),
+ fgettext("Very Low"),
+ fgettext("Low"),
+ fgettext("Medium"),
+ fgettext("High"),
+ fgettext("Ultra High")
}
}
@@ -66,6 +74,10 @@ local dd_options = {
antialiasing = {
table.concat(labels.antialiasing, ","),
{"0", "2", "4", "8"}
+ },
+ shadow_levels = {
+ table.concat(labels.shadow_levels, ","),
+ { "0", "1", "2", "3", "4", "5" }
}
}
@@ -110,6 +122,15 @@ local getSettingIndex = {
end
end
return 1
+ end,
+ ShadowMapping = function()
+ local shadow_setting = core.settings:get("shadow_levels")
+ for i = 1, #dd_options.shadow_levels[2] do
+ if shadow_setting == dd_options.shadow_levels[2][i] then
+ return i
+ end
+ end
+ return 1
end
}
@@ -198,6 +219,9 @@ local function formspec(tabview, name, tabdata)
.. dump(core.settings:get_bool("enable_waving_leaves")) .. "]" ..
"checkbox[8.25,2;cb_waving_plants;" .. fgettext("Waving Plants") .. ";"
.. dump(core.settings:get_bool("enable_waving_plants")) .. "]"
+ --"label[8.25,3.0;" .. fgettext("Dynamic shadows: ") .. "]" ..
+ --"dropdown[8.25,3.5;3.5;dd_shadows;" .. dd_options.shadow_levels[1] .. ";"
+ -- .. getSettingIndex.ShadowMapping() .. "]"
else
tab_string = tab_string ..
"label[8.38,0.7;" .. core.colorize("#888888",
@@ -208,6 +232,8 @@ local function formspec(tabview, name, tabdata)
fgettext("Waving Leaves")) .. "]" ..
"label[8.38,2.2;" .. core.colorize("#888888",
fgettext("Waving Plants")) .. "]"
+ --"label[8.38,2.7;" .. core.colorize("#888888",
+ -- fgettext("Dynamic shadows")) .. "]"
end
return tab_string
@@ -221,7 +247,7 @@ local function handle_settings_buttons(this, fields, tabname, tabdata)
adv_settings_dlg:set_parent(this)
this:hide()
adv_settings_dlg:show()
- --mm_texture.update("singleplayer", current_game())
+ --mm_game_theme.update("singleplayer", current_game())
return true
end
if fields["cb_smooth_lighting"] then
@@ -249,13 +275,7 @@ local function handle_settings_buttons(this, fields, tabname, tabdata)
return true
end
if fields["cb_shaders"] then
- 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.settings:set("enable_shaders", fields["cb_shaders"])
- end
+ core.settings:set("enable_shaders", fields["cb_shaders"])
return true
end
if fields["cb_tonemapping"] then
@@ -333,6 +353,34 @@ local function handle_settings_buttons(this, fields, tabname, tabdata)
ddhandled = true
end
+ for i = 1, #labels.shadow_levels do
+ if fields["dd_shadows"] == labels.shadow_levels[i] then
+ core.settings:set("shadow_levels", dd_options.shadow_levels[2][i])
+ ddhandled = true
+ end
+ end
+
+ if fields["dd_shadows"] == labels.shadow_levels[1] then
+ core.settings:set("enable_dynamic_shadows", "false")
+ else
+ local shadow_presets = {
+ [2] = { 80, 512, "true", 0, "false" },
+ [3] = { 120, 1024, "true", 1, "false" },
+ [4] = { 350, 2048, "true", 1, "false" },
+ [5] = { 350, 2048, "true", 2, "true" },
+ [6] = { 450, 4096, "true", 2, "true" },
+ }
+ local s = shadow_presets[table.indexof(labels.shadow_levels, fields["dd_shadows"])]
+ if s then
+ core.settings:set("enable_dynamic_shadows", "true")
+ core.settings:set("shadow_map_max_distance", s[1])
+ core.settings:set("shadow_map_texture_size", s[2])
+ core.settings:set("shadow_map_texture_32bit", s[3])
+ core.settings:set("shadow_filters", s[4])
+ core.settings:set("shadow_map_color", s[5])
+ end
+ end
+
return ddhandled
end
diff --git a/builtin/mainmenu/tests/serverlistmgr_spec.lua b/builtin/mainmenu/tests/serverlistmgr_spec.lua
index 148e9b794..a091959fb 100644
--- a/builtin/mainmenu/tests/serverlistmgr_spec.lua
+++ b/builtin/mainmenu/tests/serverlistmgr_spec.lua
@@ -2,6 +2,7 @@ _G.core = {}
_G.unpack = table.unpack
_G.serverlistmgr = {}
+dofile("builtin/common/vector.lua")
dofile("builtin/common/misc_helpers.lua")
dofile("builtin/mainmenu/serverlistmgr.lua")
diff --git a/builtin/profiler/init.lua b/builtin/profiler/init.lua
index a0033d752..7f63dfaea 100644
--- a/builtin/profiler/init.lua
+++ b/builtin/profiler/init.lua
@@ -15,6 +15,8 @@
--with this program; if not, write to the Free Software Foundation, Inc.,
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+local S = core.get_translator("__builtin")
+
local function get_bool_default(name, default)
local val = core.settings:get_bool(name)
if val == nil then
@@ -40,9 +42,9 @@ function profiler.init_chatcommand()
instrumentation.init_chatcommand()
end
- local param_usage = "print [filter] | dump [filter] | save [format [filter]] | reset"
+ local param_usage = S("print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset")
core.register_chatcommand("profiler", {
- description = "handle the profiler and profiling data",
+ description = S("Handle the profiler and profiling data"),
params = param_usage,
privs = { server=true },
func = function(name, param)
@@ -51,21 +53,19 @@ function profiler.init_chatcommand()
if command == "dump" then
core.log("action", reporter.print(sampler.profile, arg0))
- return true, "Statistics written to action log"
+ return true, S("Statistics written to action log.")
elseif command == "print" then
return true, reporter.print(sampler.profile, arg0)
elseif command == "save" then
return reporter.save(sampler.profile, args[1] or "txt", args[2])
elseif command == "reset" then
sampler.reset()
- return true, "Statistics were reset"
+ return true, S("Statistics were reset.")
end
- return false, string.format(
- "Usage: %s\n" ..
- "Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).",
- param_usage
- )
+ return false,
+ S("Usage: @1", param_usage) .. "\n" ..
+ S("Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).")
end
})
diff --git a/builtin/profiler/instrumentation.lua b/builtin/profiler/instrumentation.lua
index 6b951a2c2..f80314b32 100644
--- a/builtin/profiler/instrumentation.lua
+++ b/builtin/profiler/instrumentation.lua
@@ -102,8 +102,9 @@ local function instrument(def)
-- also called https://en.wikipedia.org/wiki/Continuation_passing_style
-- Compared to table creation and unpacking it won't lose `nil` returns
-- and is expected to be faster
- -- `measure` will be executed after time() and func(...)
- return measure(modname, instrument_name, time(), func(...))
+ -- `measure` will be executed after func(...)
+ local start = time()
+ return measure(modname, instrument_name, start, func(...))
end
end
diff --git a/builtin/profiler/reporter.lua b/builtin/profiler/reporter.lua
index fed47a36b..5928a3718 100644
--- a/builtin/profiler/reporter.lua
+++ b/builtin/profiler/reporter.lua
@@ -15,6 +15,10 @@
--with this program; if not, write to the Free Software Foundation, Inc.,
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+local S = core.get_translator("__builtin")
+-- Note: In this file, only messages are translated
+-- but not the table itself, to keep it simple.
+
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
@@ -104,11 +108,11 @@ local TxtFormatter = Formatter:new {
end,
format = function(self, filter)
local profile = self.profile
- self:print("Values below show absolute/relative times spend per server step by the instrumented function.")
- self:print("A total of %d samples were taken", profile.stats_total.samples)
+ self:print(S("Values below show absolute/relative times spend per server step by the instrumented function."))
+ self:print(S("A total of @1 sample(s) were taken.", profile.stats_total.samples))
if filter then
- self:print("The output is limited to '%s'", filter)
+ self:print(S("The output is limited to '@1'.", filter))
end
self:print()
@@ -259,19 +263,18 @@ function reporter.save(profile, format, filter)
local output, io_err = io.open(path, "w")
if not output then
- return false, "Saving of profile failed with: " .. io_err
+ return false, S("Saving of profile failed: @1", io_err)
end
local content, err = serialize_profile(profile, format, filter)
if not content then
output:close()
- return false, "Saving of profile failed with: " .. err
+ return false, S("Saving of profile failed: @1", err)
end
output:write(content)
output:close()
- local logmessage = "Profile saved to " .. path
- core.log("action", logmessage)
- return true, logmessage
+ core.log("action", "Profile saved to " .. path)
+ return true, S("Profile saved to @1", path)
end
return reporter
diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt
index f800f71ab..42b45aa00 100644
--- a/builtin/settingtypes.txt
+++ b/builtin/settingtypes.txt
@@ -75,7 +75,7 @@ free_move (Flying) bool false
# If enabled, makes move directions relative to the player's pitch when flying or swimming.
pitch_move (Pitch move mode) bool false
-# Fast movement (via the "special" key).
+# Fast movement (via the "Aux1" key).
# This requires the "fast" privilege on the server.
fast_move (Fast movement) bool false
@@ -99,14 +99,14 @@ invert_mouse (Invert mouse) bool false
# Mouse sensitivity multiplier.
mouse_sensitivity (Mouse sensitivity) float 0.2
-# If enabled, "special" key instead of "sneak" key is used for climbing down and
+# If enabled, "Aux1" key instead of "Sneak" key is used for climbing down and
# descending.
-aux1_descends (Special key for climbing/descending) bool false
+aux1_descends (Aux1 key for climbing/descending) bool false
# Double-tapping the jump key toggles fly mode.
doubletap_jump (Double tap jump for fly) bool false
-# If disabled, "special" key is used to fly fast if both fly and fast mode are
+# If disabled, "Aux1" key is used to fly fast if both fly and fast mode are
# enabled.
always_fly_fast (Always fly and fast) bool true
@@ -135,9 +135,9 @@ touchscreen_threshold (Touch screen threshold) int 20 0 100
# If disabled, virtual joystick will center to first-touch's position.
fixed_virtual_joystick (Fixed virtual joystick) bool false
-# (Android) Use virtual joystick to trigger "aux" button.
-# If enabled, virtual joystick will also tap "aux" button when out of main circle.
-virtual_joystick_triggers_aux (Virtual joystick triggers aux button) bool false
+# (Android) Use virtual joystick to trigger "Aux1" button.
+# If enabled, virtual joystick will also tap "Aux1" button when out of main circle.
+virtual_joystick_triggers_aux1 (Virtual joystick triggers Aux1 button) bool false
# Enable joysticks
enable_joysticks (Enable joysticks) bool false
@@ -146,17 +146,17 @@ enable_joysticks (Enable joysticks) bool false
joystick_id (Joystick ID) int 0
# The type of joystick
-joystick_type (Joystick type) enum auto auto,generic,xbox
+joystick_type (Joystick type) enum auto auto,generic,xbox,dragonrise_gamecube
# 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 0.001
-# The deadzone of the joystick
-joystick_deadzone (Joystick deadzone) int 2048
+# The dead zone of the joystick
+joystick_deadzone (Joystick dead zone) int 2048
# The sensitivity of the joystick axes for moving the
-# ingame view frustum around.
+# in-game view frustum around.
joystick_frustum_sensitivity (Joystick frustum sensitivity) float 170
# Key for moving the player forward.
@@ -199,7 +199,7 @@ keymap_inventory (Inventory key) key KEY_KEY_I
# Key for moving fast in fast mode.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_special1 (Special key) key KEY_KEY_E
+keymap_aux1 (Aux1 key) key KEY_KEY_E
# Key for opening the chat window.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
@@ -451,9 +451,9 @@ keymap_decrease_viewing_range_min (View range decrease key) key -
[**Basic]
-# Whether nametag backgrounds should be shown by default.
+# Whether name tag backgrounds should be shown by default.
# Mods may still set a background.
-show_nametag_backgrounds (Show nametag backgrounds by default) bool true
+show_nametag_backgrounds (Show name tag backgrounds by default) bool true
# Enable vertex buffer objects.
# This should greatly improve graphics performance.
@@ -475,6 +475,10 @@ connected_glass (Connect glass) bool false
# Disable for speed or for different looks.
smooth_lighting (Smooth lighting) bool true
+# Enables tradeoffs that reduce CPU load or increase rendering performance
+# at the expense of minor visual glitches that do not impact game playability.
+performance_tradeoffs (Tradeoffs for performance) bool false
+
# Clouds are a client side effect.
enable_clouds (Clouds) bool true
@@ -489,7 +493,7 @@ enable_particles (Digging particles) bool true
[**Filtering]
-# Use mip mapping to scale textures. May slightly increase performance,
+# Use mipmapping to scale textures. May slightly increase performance,
# especially when using a high resolution texture pack.
# Gamma correct downscaling is not supported.
mip_map (Mipmapping) bool false
@@ -504,18 +508,17 @@ bilinear_filter (Bilinear filtering) bool false
trilinear_filter (Trilinear filtering) bool false
# Filtered textures can blend RGB values with fully-transparent neighbors,
-# which PNG optimizers usually discard, sometimes resulting in a dark or
-# light edge to transparent textures. Apply this filter to clean that up
-# at texture load time.
+# which PNG optimizers usually discard, often resulting in dark or
+# light edges to transparent textures. Apply a filter to clean that up
+# at texture load time. This is automatically enabled if mipmapping is enabled.
texture_clean_transparent (Clean transparent textures) bool false
# When using bilinear/trilinear/anisotropic filters, low-resolution textures
# can be blurred, so automatically upscale them with nearest-neighbor
# interpolation to preserve crisp pixels. This sets the minimum texture size
# for the upscaled textures; higher values look sharper, but require more
-# memory. Powers of 2 are recommended. Setting this higher than 1 may not
-# have a visible effect unless bilinear/trilinear/anisotropic filtering is
-# enabled.
+# memory. Powers of 2 are recommended. This setting is ONLY applied if
+# bilinear/trilinear/anisotropic filtering is enabled.
# This is also used as the base node texture size for world-aligned
# texture autoscaling.
texture_min_size (Minimum texture size) int 64
@@ -609,10 +612,10 @@ viewing_range (Viewing range) int 190 20 4000
# 0.1 = Default, 0.25 = Good value for weaker tablets.
near_plane (Near plane) float 0.1 0 0.25
-# Width component of the initial window size.
+# Width component of the initial window size. Ignored in fullscreen mode.
screen_w (Screen width) int 1024 1
-# Height component of the initial window size.
+# Height component of the initial window size. Ignored in fullscreen mode.
screen_h (Screen height) int 600 1
# Save window size automatically when modified.
@@ -621,9 +624,6 @@ autosave_screensize (Autosave screen size) bool true
# Fullscreen mode.
fullscreen (Full screen) bool false
-# Bits per pixel (aka color depth) in fullscreen mode.
-fullscreen_bpp (Full screen BPP) int 24
-
# Vertical screen synchronization.
vsync (VSync) bool false
@@ -662,12 +662,12 @@ lighting_boost_spread (Light curve boost spread) float 0.2 0.0 0.4
# Path to texture directory. All textures are first searched from here.
texture_path (Texture path) path
-# The rendering back-end for Irrlicht.
+# The rendering back-end.
# A restart is required after changing this.
# Note: On Android, stick with OGLES1 if unsure! App may fail to start otherwise.
# On other platforms, OpenGL is recommended.
# Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)
-video_driver (Video driver) enum opengl null,software,burningsvideo,direct3d8,direct3d9,opengl,ogles1,ogles2
+video_driver (Video driver) enum opengl opengl,ogles1,ogles2
# Radius of cloud area stated in number of 64 node cloud squares.
# Values larger than 26 will start to produce sharp cutoffs at cloud area corners.
@@ -728,7 +728,7 @@ selectionbox_width (Selection box width) int 2 1 5
crosshair_color (Crosshair color) string (255,255,255)
# Crosshair alpha (opaqueness, between 0 and 255).
-# Also controls the object crosshair color
+# This also applies to the object crosshair.
crosshair_alpha (Crosshair alpha) int 255 0 255
# Maximum number of recent chat messages to show
@@ -741,7 +741,7 @@ 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.
+# Modifies the size of the HUD elements.
hud_scaling (HUD scale factor) float 1.0
# Enables caching of facedir rotated meshes.
@@ -834,10 +834,6 @@ tooltip_show_delay (Tooltip delay) int 400
# Append item name to tooltip.
tooltip_append_itemname (Append item name) bool false
-# Whether FreeType fonts are used, requires FreeType support to be compiled in.
-# If disabled, bitmap and XML vectors fonts are used instead.
-freetype (FreeType fonts) bool true
-
font_bold (Font bold by default) bool false
font_italic (Font italic by default) bool false
@@ -848,44 +844,41 @@ font_shadow (Font shadow) int 1
# Opaqueness (alpha) of the shadow behind the default font, between 0 and 255.
font_shadow_alpha (Font shadow alpha) int 127 0 255
-# Font size of the default font in point (pt).
+# Font size of the default font where 1 unit = 1 pixel at 96 DPI
font_size (Font size) int 16 1
-# Path to the default font.
-# If “freetype” setting is enabled: Must be a TrueType font.
-# If “freetype” setting is disabled: Must be a bitmap or XML vectors font.
+# For pixel-style fonts that do not scale well, this ensures that font sizes used
+# with this font will always be divisible by this value, in pixels. For instance,
+# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
+# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
+font_size_divisible_by (Font size divisible by) int 1 1
+
+# Path to the default font. Must be a TrueType font.
# The fallback font will be used if the font cannot be loaded.
font_path (Regular font path) filepath fonts/Arimo-Regular.ttf
font_path_bold (Bold font path) filepath fonts/Arimo-Bold.ttf
font_path_italic (Italic font path) filepath fonts/Arimo-Italic.ttf
-font_path_bolditalic (Bold and italic font path) filepath fonts/Arimo-BoldItalic.ttf
+font_path_bold_italic (Bold and italic font path) filepath fonts/Arimo-BoldItalic.ttf
-# Font size of the monospace font in point (pt).
-mono_font_size (Monospace font size) int 15 1
+# Font size of the monospace font where 1 unit = 1 pixel at 96 DPI
+mono_font_size (Monospace font size) int 16 1
-# Path to the monospace font.
-# If “freetype” setting is enabled: Must be a TrueType font.
-# If “freetype” setting is disabled: Must be a bitmap or XML vectors font.
+# For pixel-style fonts that do not scale well, this ensures that font sizes used
+# with this font will always be divisible by this value, in pixels. For instance,
+# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
+# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
+mono_font_size_divisible_by (Monospace font size divisible by) int 1 1
+
+# Path to the monospace font. Must be a TrueType font.
# This font is used for e.g. the console and profiler screen.
mono_font_path (Monospace font path) filepath fonts/Cousine-Regular.ttf
mono_font_path_bold (Bold monospace font path) filepath fonts/Cousine-Bold.ttf
mono_font_path_italic (Italic monospace font path) filepath fonts/Cousine-Italic.ttf
-mono_font_path_bolditalic (Bold and italic monospace font path) filepath fonts/Cousine-BoldItalic.ttf
-
-# Font size of the fallback font in point (pt).
-fallback_font_size (Fallback font size) int 15 1
+mono_font_path_bold_italic (Bold and italic monospace font path) filepath fonts/Cousine-BoldItalic.ttf
-# Shadow offset (in pixels) of the fallback font. If 0, then shadow will not be drawn.
-fallback_font_shadow (Fallback font shadow) int 1
-
-# Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255.
-fallback_font_shadow_alpha (Fallback font shadow alpha) int 128 0 255
-
-# Path of the fallback font.
-# If “freetype” setting is enabled: Must be a TrueType font.
-# If “freetype” setting is disabled: Must be a bitmap or XML vectors font.
+# Path of the fallback font. Must be a TrueType font.
# This font will be used for certain languages or if the default font is unavailable.
fallback_font_path (Fallback font path) filepath fonts/DroidSansFallbackFull.ttf
@@ -898,7 +891,7 @@ chat_font_size (Chat font size) int 0
screenshot_path (Screenshot folder) path screenshots
# Format of screenshots.
-screenshot_format (Screenshot format) enum png png,jpg,bmp,pcx,ppm,tga
+screenshot_format (Screenshot format) enum png png,jpg
# Screenshot quality. Only used for JPEG format.
# 1 means worst quality; 100 means best quality.
@@ -910,6 +903,9 @@ 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 1
+# Adjust the detected display density, used for scaling UI elements.
+display_density_factor (Display Density Scaling Factor) float 1
+
# 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
@@ -934,6 +930,12 @@ mute_sound (Mute sound) bool false
[Client]
+# Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console output.
+clickable_chat_weblinks (Chat weblinks) bool false
+
+# Optional override for chat weblink color.
+chat_weblink_color (Weblink color) string
+
[*Network]
# Address to connect to.
@@ -946,9 +948,9 @@ address (Server address) string
remote_port (Remote port) int 30000 1 65535
# Prometheus listener address.
-# If minetest is compiled with ENABLE_PROMETHEUS option enabled,
+# If Minetest is compiled with ENABLE_PROMETHEUS option enabled,
# enable metrics listener for Prometheus on that address.
-# Metrics can be fetch on http://127.0.0.1:30000/metrics
+# Metrics can be fetched on http://127.0.0.1:30000/metrics
prometheus_listener_address (Prometheus listener address) string 127.0.0.1:30000
# Save the map received by the client on disk.
@@ -1055,11 +1057,10 @@ full_block_send_enable_min_time_from_building (Delay in sending blocks after bui
# client number.
max_packets_per_iteration (Max. packets per iteration) int 1024
-# ZLib compression level to use when sending mapblocks to the client.
-# -1 - Zlib's default compression level
-# 0 - no compresson, fastest
+# Compression level to use when sending mapblocks to the client.
+# -1 - use default compression level
+# 0 - least compression, fastest
# 9 - best compression, slowest
-# (levels 1-3 use Zlib's "fast" method, 4-9 use the normal method)
map_compression_level_net (Map Compression Level for Network Transfer) int -1 -1 9
[*Game]
@@ -1136,6 +1137,10 @@ enable_rollback_recording (Rollback recording) bool false
# @name, @message, @timestamp (optional)
chat_message_format (Chat message format) string <@name> @message
+# If the execution of a chat command takes longer than this specified time in
+# seconds, add the time information to the chat command message
+chatcommand_msg_time_threshold (Chat command time message threshold) float 0.1
+
# A message to be displayed to all clients when the server shuts down.
kick_msg_shutdown (Shutdown message) string Server shutting down.
@@ -1240,7 +1245,7 @@ movement_gravity (Gravity) float 9.81
deprecated_lua_api_handling (Deprecated Lua API handling) enum log none,log,error
# Number of extra blocks that can be loaded by /clearobjects at once.
-# This is a trade-off between sqlite transaction overhead and
+# This is a trade-off between SQLite transaction overhead and
# memory consumption (4096=100MB, as a rule of thumb).
max_clearobjects_extra_loaded_blocks (Max. clearobjects extra blocks) int 4096
@@ -1254,12 +1259,11 @@ max_objects_per_block (Maximum objects per block) int 64
# See https://www.sqlite.org/pragma.html#pragma_synchronous
sqlite_synchronous (Synchronous SQLite) enum 2 0,1,2
-# ZLib compression level to use when saving mapblocks to disk.
-# -1 - Zlib's default compression level
-# 0 - no compresson, fastest
+# Compression level to use when saving mapblocks to disk.
+# -1 - use default compression level
+# 0 - least compression, fastest
# 9 - best compression, slowest
-# (levels 1-3 use Zlib's "fast" method, 4-9 use the normal method)
-map_compression_level_disk (Map Compression Level for Disk Storage) int 3 -1 9
+map_compression_level_disk (Map Compression Level for Disk Storage) int -1 -1 9
# Length of a server tick and the interval at which objects are generally updated over
# network.
@@ -1364,8 +1368,8 @@ instrument.abm (Active Block Modifiers) bool true
# Instrument the action function of Loading Block Modifiers on registration.
instrument.lbm (Loading Block Modifiers) bool true
-# Instrument chatcommands on registration.
-instrument.chatcommand (Chatcommands) bool true
+# Instrument chat commands on registration.
+instrument.chatcommand (Chat commands) bool true
# Instrument global callback functions on registration.
# (anything you pass to a minetest.register_*() function)
@@ -1391,7 +1395,7 @@ name (Player name) string
# Set the language. Leave empty to use the system language.
# A restart is required after changing this.
-language (Language) enum ,ar,ca,cs,da,de,dv,el,en,eo,es,et,eu,fil,fr,hu,id,it,ja,ja_KS,jbo,kk,kn,lo,lt,ms,my,nb,nl,nn,pl,pt,pt_BR,ro,ru,sl,sr_Cyrl,sv,sw,th,tr,uk,vi
+language (Language) enum ,be,bg,ca,cs,da,de,el,en,eo,es,et,eu,fi,fr,gd,gl,hu,id,it,ja,jbo,kk,ko,lt,lv,ms,nb,nl,nn,pl,pt,pt_BR,ro,ru,sk,sl,sr_Cyrl,sr_Latn,sv,sw,tr,uk,vi,zh_CN,zh_TW
# Level of logging to be written to debug.txt:
# - <nothing> (no logging)
@@ -1418,9 +1422,8 @@ enable_ipv6 (IPv6) bool true
[*Advanced]
-# Default timeout for cURL, stated in milliseconds.
-# Only has an effect if compiled with cURL.
-curl_timeout (cURL timeout) int 5000
+# Maximum time an interactive request (e.g. server list fetch) may take, stated in milliseconds.
+curl_timeout (cURL interactive timeout) int 20000
# Limits number of parallel HTTP requests. Affects:
# - Media fetch if server uses remote_media setting.
@@ -1429,12 +1432,9 @@ curl_timeout (cURL timeout) int 5000
# Only has an effect if compiled with cURL.
curl_parallel_limit (cURL parallel limit) int 8
-# Maximum time in ms a file download (e.g. a mod download) may take.
+# Maximum time a file download (e.g. a mod download) may take, stated in milliseconds.
curl_file_download_timeout (cURL file download timeout) int 300000
-# Makes DirectX work with LuaJIT. Disable if it causes troubles.
-high_precision_fpu (High-precision FPU) bool true
-
# Replaces the default main menu with a custom one.
main_menu_script (Main menu script) string
@@ -1459,11 +1459,11 @@ max_block_generate_distance (Max block generate distance) int 10
# 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
+mapgen_limit (Map generation limit) int 31007 0 31007
# Global map generation attributes.
# In Mapgen v6 the 'decorations' flag controls all decorations except trees
-# and junglegrass, in all other mapgens this flag controls all decorations.
+# and jungle grass, in all other mapgens this flag controls all decorations.
mg_flags (Mapgen flags) flags caves,dungeons,light,decorations,biomes,ores caves,dungeons,light,decorations,biomes,ores,nocaves,nodungeons,nolight,nodecorations,nobiomes,noores
[*Biome API temperature and humidity noise parameters]
@@ -2173,15 +2173,15 @@ chunksize (Chunk size) int 5
enable_mapgen_debug_info (Mapgen debug) bool false
# Maximum number of blocks that can be queued for loading.
-emergequeue_limit_total (Absolute limit of queued blocks to emerge) int 1024
+emergequeue_limit_total (Absolute limit of queued blocks to emerge) int 1024 1 1000000
# Maximum number of blocks to be queued that are to be loaded from file.
# This limit is enforced per player.
-emergequeue_limit_diskonly (Per-player limit of queued blocks load from disk) int 128
+emergequeue_limit_diskonly (Per-player limit of queued blocks load from disk) int 128 1 1000000
# Maximum number of blocks to be queued that are to be generated.
# This limit is enforced per player.
-emergequeue_limit_generate (Per-player limit of queued blocks to generate) int 128
+emergequeue_limit_generate (Per-player limit of queued blocks to generate) int 128 1 1000000
# Number of emerge threads to use.
# Value 0:
diff --git a/client/shaders/3d_interlaced_merge/opengl_fragment.glsl b/client/shaders/3d_interlaced_merge/opengl_fragment.glsl
index 7cba61b39..6d3ae5093 100644
--- a/client/shaders/3d_interlaced_merge/opengl_fragment.glsl
+++ b/client/shaders/3d_interlaced_merge/opengl_fragment.glsl
@@ -6,7 +6,7 @@ uniform sampler2D textureFlags;
#define rightImage normalTexture
#define maskImage textureFlags
-varying mediump vec2 varTexCoord;
+varying mediump vec4 varTexCoord;
void main(void)
{
diff --git a/client/shaders/3d_interlaced_merge/opengl_vertex.glsl b/client/shaders/3d_interlaced_merge/opengl_vertex.glsl
index 860049481..224b7d183 100644
--- a/client/shaders/3d_interlaced_merge/opengl_vertex.glsl
+++ b/client/shaders/3d_interlaced_merge/opengl_vertex.glsl
@@ -1,4 +1,4 @@
-varying mediump vec2 varTexCoord;
+varying mediump vec4 varTexCoord;
void main(void)
{
diff --git a/client/shaders/default_shader/opengl_vertex.glsl b/client/shaders/default_shader/opengl_vertex.glsl
index d95a3c2d3..a908ac953 100644
--- a/client/shaders/default_shader/opengl_vertex.glsl
+++ b/client/shaders/default_shader/opengl_vertex.glsl
@@ -3,5 +3,9 @@ varying lowp vec4 varColor;
void main(void)
{
gl_Position = mWorldViewProj * inVertexPosition;
+#ifdef GL_ES
+ varColor = inVertexColor.bgra;
+#else
varColor = inVertexColor;
+#endif
}
diff --git a/client/shaders/minimap_shader/opengl_vertex.glsl b/client/shaders/minimap_shader/opengl_vertex.glsl
index 1a9491805..b23d27181 100644
--- a/client/shaders/minimap_shader/opengl_vertex.glsl
+++ b/client/shaders/minimap_shader/opengl_vertex.glsl
@@ -7,5 +7,9 @@ void main(void)
{
varTexCoord = inTexCoord0.st;
gl_Position = mWorldViewProj * inVertexPosition;
+#ifdef GL_ES
+ varColor = inVertexColor.bgra;
+#else
varColor = inVertexColor;
+#endif
}
diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl
index b58095063..762a676c6 100644
--- a/client/shaders/nodes_shader/opengl_fragment.glsl
+++ b/client/shaders/nodes_shader/opengl_fragment.glsl
@@ -1,5 +1,6 @@
uniform sampler2D baseTexture;
+uniform vec3 dayLight;
uniform vec4 skyBgColor;
uniform float fogDistance;
uniform vec3 eyePosition;
@@ -7,7 +8,22 @@ uniform vec3 eyePosition;
// The cameraOffset is the current center of the visible world.
uniform vec3 cameraOffset;
uniform float animationTimer;
+#ifdef ENABLE_DYNAMIC_SHADOWS
+ // shadow texture
+ uniform sampler2D ShadowMapSampler;
+ // shadow uniforms
+ uniform vec3 v_LightDirection;
+ uniform float f_textureresolution;
+ uniform mat4 m_ShadowViewProj;
+ uniform float f_shadowfar;
+ varying float normalOffsetScale;
+ varying float adj_shadow_strength;
+ varying float cosLight;
+ varying float f_normal_length;
+#endif
+
+varying vec3 vNormal;
varying vec3 vPosition;
// World position in the visible world (i.e. relative to the cameraOffset.)
// This can be used for many shader effects without loss of precision.
@@ -22,10 +38,393 @@ varying mediump vec2 varTexCoord;
centroid varying vec2 varTexCoord;
#endif
varying vec3 eyeVec;
+varying float nightRatio;
const float fogStart = FOG_START;
const float fogShadingParameter = 1.0 / ( 1.0 - fogStart);
+
+
+#ifdef ENABLE_DYNAMIC_SHADOWS
+const float bias0 = 0.9;
+const float zPersFactor = 0.5;
+const float bias1 = 1.0 - bias0 + 1e-6;
+
+vec4 getPerspectiveFactor(in vec4 shadowPosition)
+{
+
+ float pDistance = length(shadowPosition.xy);
+ float pFactor = pDistance * bias0 + bias1;
+
+ shadowPosition.xyz *= vec3(vec2(1.0 / pFactor), zPersFactor);
+
+ return shadowPosition;
+}
+
+// assuming near is always 1.0
+float getLinearDepth()
+{
+ return 2.0 * f_shadowfar / (f_shadowfar + 1.0 - (2.0 * gl_FragCoord.z - 1.0) * (f_shadowfar - 1.0));
+}
+
+vec3 getLightSpacePosition()
+{
+ vec4 pLightSpace;
+ // some drawtypes have zero normals, so we need to handle it :(
+ #if DRAW_TYPE == NDT_PLANTLIKE
+ pLightSpace = m_ShadowViewProj * vec4(worldPosition, 1.0);
+ #else
+ float offsetScale = (0.0057 * getLinearDepth() + normalOffsetScale);
+ pLightSpace = m_ShadowViewProj * vec4(worldPosition + offsetScale * normalize(vNormal), 1.0);
+ #endif
+ pLightSpace = getPerspectiveFactor(pLightSpace);
+ return pLightSpace.xyz * 0.5 + 0.5;
+}
+// custom smoothstep implementation because it's not defined in glsl1.2
+// https://docs.gl/sl4/smoothstep
+float mtsmoothstep(in float edge0, in float edge1, in float x)
+{
+ float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
+ return t * t * (3.0 - 2.0 * t);
+}
+
+#ifdef COLORED_SHADOWS
+
+// c_precision of 128 fits within 7 base-10 digits
+const float c_precision = 128.0;
+const float c_precisionp1 = c_precision + 1.0;
+
+float packColor(vec3 color)
+{
+ return floor(color.b * c_precision + 0.5)
+ + floor(color.g * c_precision + 0.5) * c_precisionp1
+ + floor(color.r * c_precision + 0.5) * c_precisionp1 * c_precisionp1;
+}
+
+vec3 unpackColor(float value)
+{
+ vec3 color;
+ color.b = mod(value, c_precisionp1) / c_precision;
+ color.g = mod(floor(value / c_precisionp1), c_precisionp1) / c_precision;
+ color.r = floor(value / (c_precisionp1 * c_precisionp1)) / c_precision;
+ return color;
+}
+
+vec4 getHardShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec4 texDepth = texture2D(shadowsampler, smTexCoord.xy).rgba;
+
+ float visibility = step(0.0, realDistance - texDepth.r);
+ vec4 result = vec4(visibility, vec3(0.0,0.0,0.0));//unpackColor(texDepth.g));
+ if (visibility < 0.1) {
+ visibility = step(0.0, realDistance - texDepth.b);
+ result = vec4(visibility, unpackColor(texDepth.a));
+ }
+ return result;
+}
+
+#else
+
+float getHardShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ float texDepth = texture2D(shadowsampler, smTexCoord.xy).r;
+ float visibility = step(0.0, realDistance - texDepth);
+ return visibility;
+}
+
+#endif
+
+
+#if SHADOW_FILTER == 2
+ #define PCFBOUND 3.5
+ #define PCFSAMPLES 64.0
+#elif SHADOW_FILTER == 1
+ #define PCFBOUND 1.5
+ #if defined(POISSON_FILTER)
+ #define PCFSAMPLES 32.0
+ #else
+ #define PCFSAMPLES 16.0
+ #endif
+#else
+ #define PCFBOUND 0.0
+ #if defined(POISSON_FILTER)
+ #define PCFSAMPLES 4.0
+ #else
+ #define PCFSAMPLES 1.0
+ #endif
+#endif
+#ifdef COLORED_SHADOWS
+float getHardShadowDepth(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec4 texDepth = texture2D(shadowsampler, smTexCoord.xy);
+ float depth = max(realDistance - texDepth.r, realDistance - texDepth.b);
+ return depth;
+}
+#else
+float getHardShadowDepth(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ float texDepth = texture2D(shadowsampler, smTexCoord.xy).r;
+ float depth = realDistance - texDepth;
+ return depth;
+}
+#endif
+
+float getBaseLength(vec2 smTexCoord)
+{
+ float l = length(2.0 * smTexCoord.xy - 1.0); // length in texture coords
+ return bias1 / (1.0 / l - bias0); // return to undistorted coords
+}
+
+float getDeltaPerspectiveFactor(float l)
+{
+ return 0.1 / (bias0 * l + bias1); // original distortion factor, divided by 10
+}
+
+float getPenumbraRadius(sampler2D shadowsampler, vec2 smTexCoord, float realDistance, float multiplier)
+{
+ float baseLength = getBaseLength(smTexCoord);
+ float perspectiveFactor;
+
+ if (PCFBOUND == 0.0) return 0.0;
+ // Return fast if sharp shadows are requested
+ if (SOFTSHADOWRADIUS <= 1.0) {
+ perspectiveFactor = getDeltaPerspectiveFactor(baseLength);
+ return max(2 * length(smTexCoord.xy) * 2048 / f_textureresolution / pow(perspectiveFactor, 3), SOFTSHADOWRADIUS);
+ }
+
+ vec2 clampedpos;
+ float texture_size = 1.0 / (2048 /*f_textureresolution*/ * 0.5);
+ float y, x;
+ float depth = 0.0;
+ float pointDepth;
+ float maxRadius = SOFTSHADOWRADIUS * 5.0 * multiplier;
+
+ float bound = clamp(PCFBOUND * (1 - baseLength), 0.0, PCFBOUND);
+ int n = 0;
+
+ for (y = -bound; y <= bound; y += 1.0)
+ for (x = -bound; x <= bound; x += 1.0) {
+ clampedpos = vec2(x,y);
+ perspectiveFactor = getDeltaPerspectiveFactor(baseLength + length(clampedpos) * texture_size * maxRadius);
+ clampedpos = clampedpos * texture_size * perspectiveFactor * maxRadius * perspectiveFactor + smTexCoord.xy;
+
+ pointDepth = getHardShadowDepth(shadowsampler, clampedpos.xy, realDistance);
+ if (pointDepth > -0.01) {
+ depth += pointDepth;
+ n += 1;
+ }
+ }
+
+ depth = depth / n;
+ depth = pow(clamp(depth, 0.0, 1000.0), 1.6) / 0.001;
+
+ perspectiveFactor = getDeltaPerspectiveFactor(baseLength);
+ return max(length(smTexCoord.xy) * 2 * 2048 / f_textureresolution / pow(perspectiveFactor, 3), depth * maxRadius);
+}
+
+#ifdef POISSON_FILTER
+const vec2[64] poissonDisk = vec2[64](
+ vec2(0.170019, -0.040254),
+ vec2(-0.299417, 0.791925),
+ vec2(0.645680, 0.493210),
+ vec2(-0.651784, 0.717887),
+ vec2(0.421003, 0.027070),
+ vec2(-0.817194, -0.271096),
+ vec2(-0.705374, -0.668203),
+ vec2(0.977050, -0.108615),
+ vec2(0.063326, 0.142369),
+ vec2(0.203528, 0.214331),
+ vec2(-0.667531, 0.326090),
+ vec2(-0.098422, -0.295755),
+ vec2(-0.885922, 0.215369),
+ vec2(0.566637, 0.605213),
+ vec2(0.039766, -0.396100),
+ vec2(0.751946, 0.453352),
+ vec2(0.078707, -0.715323),
+ vec2(-0.075838, -0.529344),
+ vec2(0.724479, -0.580798),
+ vec2(0.222999, -0.215125),
+ vec2(-0.467574, -0.405438),
+ vec2(-0.248268, -0.814753),
+ vec2(0.354411, -0.887570),
+ vec2(0.175817, 0.382366),
+ vec2(0.487472, -0.063082),
+ vec2(0.355476, 0.025357),
+ vec2(-0.084078, 0.898312),
+ vec2(0.488876, -0.783441),
+ vec2(0.470016, 0.217933),
+ vec2(-0.696890, -0.549791),
+ vec2(-0.149693, 0.605762),
+ vec2(0.034211, 0.979980),
+ vec2(0.503098, -0.308878),
+ vec2(-0.016205, -0.872921),
+ vec2(0.385784, -0.393902),
+ vec2(-0.146886, -0.859249),
+ vec2(0.643361, 0.164098),
+ vec2(0.634388, -0.049471),
+ vec2(-0.688894, 0.007843),
+ vec2(0.464034, -0.188818),
+ vec2(-0.440840, 0.137486),
+ vec2(0.364483, 0.511704),
+ vec2(0.034028, 0.325968),
+ vec2(0.099094, -0.308023),
+ vec2(0.693960, -0.366253),
+ vec2(0.678884, -0.204688),
+ vec2(0.001801, 0.780328),
+ vec2(0.145177, -0.898984),
+ vec2(0.062655, -0.611866),
+ vec2(0.315226, -0.604297),
+ vec2(-0.780145, 0.486251),
+ vec2(-0.371868, 0.882138),
+ vec2(0.200476, 0.494430),
+ vec2(-0.494552, -0.711051),
+ vec2(0.612476, 0.705252),
+ vec2(-0.578845, -0.768792),
+ vec2(-0.772454, -0.090976),
+ vec2(0.504440, 0.372295),
+ vec2(0.155736, 0.065157),
+ vec2(0.391522, 0.849605),
+ vec2(-0.620106, -0.328104),
+ vec2(0.789239, -0.419965),
+ vec2(-0.545396, 0.538133),
+ vec2(-0.178564, -0.596057)
+);
+
+#ifdef COLORED_SHADOWS
+
+vec4 getShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec2 clampedpos;
+ vec4 visibility = vec4(0.0);
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance, 1.5); // scale to align with PCF
+ if (radius < 0.1) {
+ // we are in the middle of even brightness, no need for filtering
+ return getHardShadowColor(shadowsampler, smTexCoord.xy, realDistance);
+ }
+
+ float baseLength = getBaseLength(smTexCoord);
+ float perspectiveFactor;
+
+ float texture_size = 1.0 / (f_textureresolution * 0.5);
+ int samples = int(clamp(PCFSAMPLES * (1 - baseLength) * (1 - baseLength), PCFSAMPLES / 4, PCFSAMPLES));
+ int init_offset = int(floor(mod(((smTexCoord.x * 34.0) + 1.0) * smTexCoord.y, 64.0-samples)));
+ int end_offset = int(samples) + init_offset;
+
+ for (int x = init_offset; x < end_offset; x++) {
+ clampedpos = poissonDisk[x];
+ perspectiveFactor = getDeltaPerspectiveFactor(baseLength + length(clampedpos) * texture_size * radius);
+ clampedpos = clampedpos * texture_size * perspectiveFactor * radius * perspectiveFactor + smTexCoord.xy;
+ visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance);
+ }
+
+ return visibility / samples;
+}
+
+#else
+
+float getShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec2 clampedpos;
+ float visibility = 0.0;
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance, 1.5); // scale to align with PCF
+ if (radius < 0.1) {
+ // we are in the middle of even brightness, no need for filtering
+ return getHardShadow(shadowsampler, smTexCoord.xy, realDistance);
+ }
+
+ float baseLength = getBaseLength(smTexCoord);
+ float perspectiveFactor;
+
+ float texture_size = 1.0 / (f_textureresolution * 0.5);
+ int samples = int(clamp(PCFSAMPLES * (1 - baseLength) * (1 - baseLength), PCFSAMPLES / 4, PCFSAMPLES));
+ int init_offset = int(floor(mod(((smTexCoord.x * 34.0) + 1.0) * smTexCoord.y, 64.0-samples)));
+ int end_offset = int(samples) + init_offset;
+
+ for (int x = init_offset; x < end_offset; x++) {
+ clampedpos = poissonDisk[x];
+ perspectiveFactor = getDeltaPerspectiveFactor(baseLength + length(clampedpos) * texture_size * radius);
+ clampedpos = clampedpos * texture_size * perspectiveFactor * radius * perspectiveFactor + smTexCoord.xy;
+ visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance);
+ }
+
+ return visibility / samples;
+}
+
+#endif
+
+#else
+/* poisson filter disabled */
+
+#ifdef COLORED_SHADOWS
+
+vec4 getShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec2 clampedpos;
+ vec4 visibility = vec4(0.0);
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance, 1.0);
+ if (radius < 0.1) {
+ // we are in the middle of even brightness, no need for filtering
+ return getHardShadowColor(shadowsampler, smTexCoord.xy, realDistance);
+ }
+
+ float baseLength = getBaseLength(smTexCoord);
+ float perspectiveFactor;
+
+ float texture_size = 1.0 / (f_textureresolution * 0.5);
+ float y, x;
+ float bound = clamp(PCFBOUND * (1 - baseLength), PCFBOUND / 2, PCFBOUND);
+ int n = 0;
+
+ // basic PCF filter
+ for (y = -bound; y <= bound; y += 1.0)
+ for (x = -bound; x <= bound; x += 1.0) {
+ clampedpos = vec2(x,y); // screen offset
+ perspectiveFactor = getDeltaPerspectiveFactor(baseLength + length(clampedpos) * texture_size * radius / bound);
+ clampedpos = clampedpos * texture_size * perspectiveFactor * radius * perspectiveFactor / bound + smTexCoord.xy; // both dx,dy and radius are adjusted
+ visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance);
+ n += 1;
+ }
+
+ return visibility / n;
+}
+
+#else
+float getShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec2 clampedpos;
+ float visibility = 0.0;
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance, 1.0);
+ if (radius < 0.1) {
+ // we are in the middle of even brightness, no need for filtering
+ return getHardShadow(shadowsampler, smTexCoord.xy, realDistance);
+ }
+
+ float baseLength = getBaseLength(smTexCoord);
+ float perspectiveFactor;
+
+ float texture_size = 1.0 / (f_textureresolution * 0.5);
+ float y, x;
+ float bound = clamp(PCFBOUND * (1 - baseLength), PCFBOUND / 2, PCFBOUND);
+ int n = 0;
+
+ // basic PCF filter
+ for (y = -bound; y <= bound; y += 1.0)
+ for (x = -bound; x <= bound; x += 1.0) {
+ clampedpos = vec2(x,y); // screen offset
+ perspectiveFactor = getDeltaPerspectiveFactor(baseLength + length(clampedpos) * texture_size * radius / bound);
+ clampedpos = clampedpos * texture_size * perspectiveFactor * radius * perspectiveFactor / bound + smTexCoord.xy; // both dx,dy and radius are adjusted
+ visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance);
+ n += 1;
+ }
+
+ return visibility / n;
+}
+
+#endif
+
+#endif
+#endif
+
#if ENABLE_TONE_MAPPING
/* Hable's UC2 Tone mapping parameters
@@ -58,25 +457,79 @@ vec4 applyToneMapping(vec4 color)
}
#endif
+
+
void main(void)
{
vec3 color;
vec2 uv = varTexCoord.st;
vec4 base = texture2D(baseTexture, uv).rgba;
-#ifdef USE_DISCARD
// If alpha is zero, we can just discard the pixel. This fixes transparency
// on GPUs like GC7000L, where GL_ALPHA_TEST is not implemented in mesa,
// and also on GLES 2, where GL_ALPHA_TEST is missing entirely.
- if (base.a == 0.0) {
+#ifdef USE_DISCARD
+ if (base.a == 0.0)
+ discard;
+#endif
+#ifdef USE_DISCARD_REF
+ if (base.a < 0.5)
discard;
- }
#endif
color = base.rgb;
-
vec4 col = vec4(color.rgb * varColor.rgb, 1.0);
+#ifdef ENABLE_DYNAMIC_SHADOWS
+ float shadow_int = 0.0;
+ vec3 shadow_color = vec3(0.0, 0.0, 0.0);
+ vec3 posLightSpace = getLightSpacePosition();
+
+ float distance_rate = (1 - pow(clamp(2.0 * length(posLightSpace.xy - 0.5),0.0,1.0), 20.0));
+ float f_adj_shadow_strength = max(adj_shadow_strength-mtsmoothstep(0.9,1.1, posLightSpace.z ),0.0);
+
+ if (distance_rate > 1e-7) {
+
+#ifdef COLORED_SHADOWS
+ vec4 visibility;
+ if (cosLight > 0.0)
+ visibility = getShadowColor(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
+ else
+ visibility = vec4(1.0, 0.0, 0.0, 0.0);
+ shadow_int = visibility.r;
+ shadow_color = visibility.gba;
+#else
+ if (cosLight > 0.0)
+ shadow_int = getShadow(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
+ else
+ shadow_int = 1.0;
+#endif
+ shadow_int *= distance_rate;
+ shadow_int = clamp(shadow_int, 0.0, 1.0);
+
+ }
+
+ // turns out that nightRatio falls off much faster than
+ // actual brightness of artificial light in relation to natual light.
+ // Power ratio was measured on torches in MTG (brightness = 14).
+ float adjusted_night_ratio = pow(max(0.0, nightRatio), 0.6);
+
+ if (f_normal_length != 0 && cosLight < 0.035) {
+ shadow_int = max(shadow_int, 1 - clamp(cosLight, 0.0, 0.035)/0.035);
+ }
+
+ shadow_int *= f_adj_shadow_strength;
+
+ // calculate fragment color from components:
+ col.rgb =
+ adjusted_night_ratio * col.rgb + // artificial light
+ (1.0 - adjusted_night_ratio) * ( // natural light
+ col.rgb * (1.0 - shadow_int * (1.0 - shadow_color)) + // filtered texture color
+ dayLight * shadow_color * shadow_int); // reflected filtered sunlight/moonlight
+ // col.r = 0.5 * clamp(getPenumbraRadius(ShadowMapSampler, posLightSpace.xy, posLightSpace.z, 1.0) / SOFTSHADOWRADIUS, 0.0, 1.0) + 0.5 * col.r;
+ // col.r = adjusted_night_ratio; // debug night ratio adjustment
+#endif
+
#if ENABLE_TONE_MAPPING
col = applyToneMapping(col);
#endif
@@ -94,6 +547,6 @@ void main(void)
- 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 c68df4a8e..d316930b2 100644
--- a/client/shaders/nodes_shader/opengl_vertex.glsl
+++ b/client/shaders/nodes_shader/opengl_vertex.glsl
@@ -1,5 +1,4 @@
uniform mat4 mWorld;
-
// Color of the light emitted by the sun.
uniform vec3 dayLight;
uniform vec3 eyePosition;
@@ -8,6 +7,7 @@ uniform vec3 eyePosition;
uniform vec3 cameraOffset;
uniform float animationTimer;
+varying vec3 vNormal;
varying vec3 vPosition;
// World position in the visible world (i.e. relative to the cameraOffset.)
// This can be used for many shader effects without loss of precision.
@@ -24,13 +24,38 @@ varying mediump vec2 varTexCoord;
#else
centroid varying vec2 varTexCoord;
#endif
-varying vec3 eyeVec;
+#ifdef ENABLE_DYNAMIC_SHADOWS
+ // shadow uniforms
+ uniform vec3 v_LightDirection;
+ uniform float f_textureresolution;
+ uniform mat4 m_ShadowViewProj;
+ uniform float f_shadowfar;
+ uniform float f_shadow_strength;
+ uniform float f_timeofday;
+ varying float cosLight;
+ varying float normalOffsetScale;
+ varying float adj_shadow_strength;
+ varying float f_normal_length;
+#endif
+
+varying vec3 eyeVec;
+varying float nightRatio;
// 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;
+#ifdef ENABLE_DYNAMIC_SHADOWS
+// custom smoothstep implementation because it's not defined in glsl1.2
+// https://docs.gl/sl4/smoothstep
+float mtsmoothstep(in float edge0, in float edge1, in float x)
+{
+ float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
+ return t * t * (3.0 - 2.0 * t);
+}
+#endif
+
float smoothCurve(float x)
{
@@ -86,6 +111,9 @@ float snoise(vec3 p)
#endif
+
+
+
void main(void)
{
varTexCoord = inTexCoord0.st;
@@ -136,20 +164,23 @@ void main(void)
gl_Position = mWorldViewProj * inVertexPosition;
#endif
-
vPosition = gl_Position.xyz;
-
eyeVec = -(mWorldView * inVertexPosition).xyz;
+ vNormal = inVertexNormal;
// 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;
+#ifdef GL_ES
+ vec4 color = inVertexColor.bgra;
+#else
+ vec4 color = inVertexColor;
+#endif
// The alpha gives the ratio of sunlight in the incoming light.
- float nightRatio = 1.0 - inVertexColor.a;
- color.rgb = inVertexColor.rgb * (inVertexColor.a * dayLight.rgb +
+ nightRatio = 1.0 - color.a;
+ color.rgb = color.rgb * (color.a * dayLight.rgb +
nightRatio * artificialLight.rgb) * 2.0;
color.a = 1.0;
@@ -160,4 +191,26 @@ void main(void)
0.07 * brightness);
varColor = clamp(color, 0.0, 1.0);
+
+#ifdef ENABLE_DYNAMIC_SHADOWS
+ vec3 nNormal = normalize(vNormal);
+ cosLight = dot(nNormal, -v_LightDirection);
+ float texelSize = 767.0 / f_textureresolution;
+ float slopeScale = clamp(1.0 - abs(cosLight), 0.0, 1.0);
+ normalOffsetScale = texelSize * slopeScale;
+
+ if (f_timeofday < 0.2) {
+ adj_shadow_strength = f_shadow_strength * 0.5 *
+ (1.0 - mtsmoothstep(0.18, 0.2, f_timeofday));
+ } else if (f_timeofday >= 0.8) {
+ adj_shadow_strength = f_shadow_strength * 0.5 *
+ mtsmoothstep(0.8, 0.83, f_timeofday);
+ } else {
+ adj_shadow_strength = f_shadow_strength *
+ mtsmoothstep(0.20, 0.25, f_timeofday) *
+ (1.0 - mtsmoothstep(0.7, 0.8, f_timeofday));
+ }
+ f_normal_length = length(vNormal);
+#endif
+
}
diff --git a/client/shaders/object_shader/opengl_fragment.glsl b/client/shaders/object_shader/opengl_fragment.glsl
index 9a81d8185..3390e7227 100644
--- a/client/shaders/object_shader/opengl_fragment.glsl
+++ b/client/shaders/object_shader/opengl_fragment.glsl
@@ -23,8 +23,22 @@ const float BS = 10.0;
const float fogStart = FOG_START;
const float fogShadingParameter = 1.0 / (1.0 - fogStart);
-#if ENABLE_TONE_MAPPING
+#ifdef ENABLE_DYNAMIC_SHADOWS
+ // shadow texture
+ uniform sampler2D ShadowMapSampler;
+ // shadow uniforms
+ uniform vec3 v_LightDirection;
+ uniform float f_textureresolution;
+ uniform mat4 m_ShadowViewProj;
+ uniform float f_shadowfar;
+ uniform float f_timeofday;
+ varying float normalOffsetScale;
+ varying float adj_shadow_strength;
+ varying float cosLight;
+ varying float f_normal_length;
+#endif
+#if ENABLE_TONE_MAPPING
/* Hable's UC2 Tone mapping parameters
A = 0.22;
B = 0.30;
@@ -55,30 +69,310 @@ vec4 applyToneMapping(vec4 color)
}
#endif
+#ifdef ENABLE_DYNAMIC_SHADOWS
+const float bias0 = 0.9;
+const float zPersFactor = 0.5;
+const float bias1 = 1.0 - bias0;
+
+vec4 getPerspectiveFactor(in vec4 shadowPosition)
+{
+ float pDistance = length(shadowPosition.xy);
+ float pFactor = pDistance * bias0 + bias1;
+ shadowPosition.xyz *= vec3(vec2(1.0 / pFactor), zPersFactor);
+
+ return shadowPosition;
+}
+
+// assuming near is always 1.0
+float getLinearDepth()
+{
+ return 2.0 * f_shadowfar / (f_shadowfar + 1.0 - (2.0 * gl_FragCoord.z - 1.0) * (f_shadowfar - 1.0));
+}
+
+vec3 getLightSpacePosition()
+{
+ vec4 pLightSpace;
+ float normalBias = 0.0005 * getLinearDepth() * cosLight + normalOffsetScale;
+ pLightSpace = m_ShadowViewProj * vec4(worldPosition + normalBias * normalize(vNormal), 1.0);
+ pLightSpace = getPerspectiveFactor(pLightSpace);
+ return pLightSpace.xyz * 0.5 + 0.5;
+}
+
+#ifdef COLORED_SHADOWS
+
+// c_precision of 128 fits within 7 base-10 digits
+const float c_precision = 128.0;
+const float c_precisionp1 = c_precision + 1.0;
+
+float packColor(vec3 color)
+{
+ return floor(color.b * c_precision + 0.5)
+ + floor(color.g * c_precision + 0.5) * c_precisionp1
+ + floor(color.r * c_precision + 0.5) * c_precisionp1 * c_precisionp1;
+}
+
+vec3 unpackColor(float value)
+{
+ vec3 color;
+ color.b = mod(value, c_precisionp1) / c_precision;
+ color.g = mod(floor(value / c_precisionp1), c_precisionp1) / c_precision;
+ color.r = floor(value / (c_precisionp1 * c_precisionp1)) / c_precision;
+ return color;
+}
+
+vec4 getHardShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec4 texDepth = texture2D(shadowsampler, smTexCoord.xy).rgba;
+
+ float visibility = step(0.0, (realDistance-2e-5) - texDepth.r);
+ vec4 result = vec4(visibility, vec3(0.0,0.0,0.0));//unpackColor(texDepth.g));
+ if (visibility < 0.1) {
+ visibility = step(0.0, (realDistance-2e-5) - texDepth.r);
+ result = vec4(visibility, unpackColor(texDepth.a));
+ }
+ return result;
+}
+
+#else
+
+float getHardShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ float texDepth = texture2D(shadowsampler, smTexCoord.xy).r;
+ float visibility = step(0.0, (realDistance-2e-5) - texDepth);
+
+ return visibility;
+}
+
+#endif
+
+#if SHADOW_FILTER == 2
+ #define PCFBOUND 3.5
+ #define PCFSAMPLES 64.0
+#elif SHADOW_FILTER == 1
+ #define PCFBOUND 1.5
+ #if defined(POISSON_FILTER)
+ #define PCFSAMPLES 32.0
+ #else
+ #define PCFSAMPLES 16.0
+ #endif
+#else
+ #define PCFBOUND 0.0
+ #if defined(POISSON_FILTER)
+ #define PCFSAMPLES 4.0
+ #else
+ #define PCFSAMPLES 1.0
+ #endif
+#endif
+
+#ifdef POISSON_FILTER
+const vec2[64] poissonDisk = vec2[64](
+ vec2(0.170019, -0.040254),
+ vec2(-0.299417, 0.791925),
+ vec2(0.645680, 0.493210),
+ vec2(-0.651784, 0.717887),
+ vec2(0.421003, 0.027070),
+ vec2(-0.817194, -0.271096),
+ vec2(-0.705374, -0.668203),
+ vec2(0.977050, -0.108615),
+ vec2(0.063326, 0.142369),
+ vec2(0.203528, 0.214331),
+ vec2(-0.667531, 0.326090),
+ vec2(-0.098422, -0.295755),
+ vec2(-0.885922, 0.215369),
+ vec2(0.566637, 0.605213),
+ vec2(0.039766, -0.396100),
+ vec2(0.751946, 0.453352),
+ vec2(0.078707, -0.715323),
+ vec2(-0.075838, -0.529344),
+ vec2(0.724479, -0.580798),
+ vec2(0.222999, -0.215125),
+ vec2(-0.467574, -0.405438),
+ vec2(-0.248268, -0.814753),
+ vec2(0.354411, -0.887570),
+ vec2(0.175817, 0.382366),
+ vec2(0.487472, -0.063082),
+ vec2(0.355476, 0.025357),
+ vec2(-0.084078, 0.898312),
+ vec2(0.488876, -0.783441),
+ vec2(0.470016, 0.217933),
+ vec2(-0.696890, -0.549791),
+ vec2(-0.149693, 0.605762),
+ vec2(0.034211, 0.979980),
+ vec2(0.503098, -0.308878),
+ vec2(-0.016205, -0.872921),
+ vec2(0.385784, -0.393902),
+ vec2(-0.146886, -0.859249),
+ vec2(0.643361, 0.164098),
+ vec2(0.634388, -0.049471),
+ vec2(-0.688894, 0.007843),
+ vec2(0.464034, -0.188818),
+ vec2(-0.440840, 0.137486),
+ vec2(0.364483, 0.511704),
+ vec2(0.034028, 0.325968),
+ vec2(0.099094, -0.308023),
+ vec2(0.693960, -0.366253),
+ vec2(0.678884, -0.204688),
+ vec2(0.001801, 0.780328),
+ vec2(0.145177, -0.898984),
+ vec2(0.062655, -0.611866),
+ vec2(0.315226, -0.604297),
+ vec2(-0.780145, 0.486251),
+ vec2(-0.371868, 0.882138),
+ vec2(0.200476, 0.494430),
+ vec2(-0.494552, -0.711051),
+ vec2(0.612476, 0.705252),
+ vec2(-0.578845, -0.768792),
+ vec2(-0.772454, -0.090976),
+ vec2(0.504440, 0.372295),
+ vec2(0.155736, 0.065157),
+ vec2(0.391522, 0.849605),
+ vec2(-0.620106, -0.328104),
+ vec2(0.789239, -0.419965),
+ vec2(-0.545396, 0.538133),
+ vec2(-0.178564, -0.596057)
+);
+
+#ifdef COLORED_SHADOWS
+
+vec4 getShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec2 clampedpos;
+ vec4 visibility = vec4(0.0);
+
+ float texture_size = 1.0 / (f_textureresolution * 0.5);
+ int init_offset = int(floor(mod(((smTexCoord.x * 34.0) + 1.0) * smTexCoord.y, 64.0-PCFSAMPLES)));
+ int end_offset = int(PCFSAMPLES) + init_offset;
+
+ for (int x = init_offset; x < end_offset; x++) {
+ clampedpos = poissonDisk[x] * texture_size * SOFTSHADOWRADIUS + smTexCoord.xy;
+ visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance);
+ }
+
+ return visibility / PCFSAMPLES;
+}
+
+#else
+
+float getShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec2 clampedpos;
+ float visibility = 0.0;
+
+ float texture_size = 1.0 / (f_textureresolution * 0.5);
+ int init_offset = int(floor(mod(((smTexCoord.x * 34.0) + 1.0) * smTexCoord.y, 64.0-PCFSAMPLES)));
+ int end_offset = int(PCFSAMPLES) + init_offset;
+
+ for (int x = init_offset; x < end_offset; x++) {
+ clampedpos = poissonDisk[x] * texture_size * SOFTSHADOWRADIUS + smTexCoord.xy;
+ visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance);
+ }
+
+ return visibility / PCFSAMPLES;
+}
+
+#endif
+
+#else
+/* poisson filter disabled */
+
+#ifdef COLORED_SHADOWS
+
+vec4 getShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec2 clampedpos;
+ vec4 visibility = vec4(0.0);
+ float sradius=0.0;
+ if( PCFBOUND>0)
+ sradius = SOFTSHADOWRADIUS / PCFBOUND;
+ float texture_size = 1.0 / (f_textureresolution * 0.5);
+ float y, x;
+ // basic PCF filter
+ for (y = -PCFBOUND; y <= PCFBOUND; y += 1.0)
+ for (x = -PCFBOUND; x <= PCFBOUND; x += 1.0) {
+ clampedpos = vec2(x,y) * texture_size* sradius + smTexCoord.xy;
+ visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance);
+ }
+
+ return visibility / PCFSAMPLES;
+}
+
+#else
+float getShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec2 clampedpos;
+ float visibility = 0.0;
+ float sradius=0.0;
+ if( PCFBOUND>0)
+ sradius = SOFTSHADOWRADIUS / PCFBOUND;
+
+ float texture_size = 1.0 / (f_textureresolution * 0.5);
+ float y, x;
+ // basic PCF filter
+ for (y = -PCFBOUND; y <= PCFBOUND; y += 1.0)
+ for (x = -PCFBOUND; x <= PCFBOUND; x += 1.0) {
+ clampedpos = vec2(x,y) * texture_size * sradius + smTexCoord.xy;
+ visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance);
+ }
+
+ return visibility / PCFSAMPLES;
+}
+
+#endif
+
+#endif
+#endif
+
void main(void)
{
vec3 color;
vec2 uv = varTexCoord.st;
-
vec4 base = texture2D(baseTexture, uv).rgba;
-#ifdef USE_DISCARD
// If alpha is zero, we can just discard the pixel. This fixes transparency
// on GPUs like GC7000L, where GL_ALPHA_TEST is not implemented in mesa,
// and also on GLES 2, where GL_ALPHA_TEST is missing entirely.
- if (base.a == 0.0) {
+#ifdef USE_DISCARD
+ if (base.a == 0.0)
+ discard;
+#endif
+#ifdef USE_DISCARD_REF
+ if (base.a < 0.5)
discard;
- }
#endif
color = base.rgb;
-
vec4 col = vec4(color.rgb, base.a);
-
col.rgb *= varColor.rgb;
-
col.rgb *= emissiveColor.rgb * vIDiff;
+#ifdef ENABLE_DYNAMIC_SHADOWS
+ float shadow_int = 0.0;
+ vec3 shadow_color = vec3(0.0, 0.0, 0.0);
+ vec3 posLightSpace = getLightSpacePosition();
+
+#ifdef COLORED_SHADOWS
+ vec4 visibility;
+ if (cosLight > 0.0)
+ visibility = getShadowColor(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
+ else
+ visibility = vec4(1.0, 0.0, 0.0, 0.0);
+ shadow_int = visibility.r;
+ shadow_color = visibility.gba;
+#else
+ shadow_int = getShadow(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
+#endif
+
+ if (f_normal_length != 0 && cosLight <= 0.001) {
+ shadow_int = clamp(shadow_int + 0.5 * abs(cosLight), 0.0, 1.0);
+ }
+
+ shadow_int = 1.0 - (shadow_int * adj_shadow_strength);
+
+ col.rgb = mix(shadow_color, col.rgb, shadow_int) * shadow_int;
+#endif
+
+
+
#if ENABLE_TONE_MAPPING
col = applyToneMapping(col);
#endif
diff --git a/client/shaders/object_shader/opengl_vertex.glsl b/client/shaders/object_shader/opengl_vertex.glsl
index b4a4d0aaa..f135ab9dc 100644
--- a/client/shaders/object_shader/opengl_vertex.glsl
+++ b/client/shaders/object_shader/opengl_vertex.glsl
@@ -13,12 +13,37 @@ varying mediump vec2 varTexCoord;
centroid varying vec2 varTexCoord;
#endif
+#ifdef ENABLE_DYNAMIC_SHADOWS
+ // shadow uniforms
+ uniform vec3 v_LightDirection;
+ uniform float f_textureresolution;
+ uniform mat4 m_ShadowViewProj;
+ uniform float f_shadowfar;
+ uniform float f_shadow_strength;
+ uniform float f_timeofday;
+ varying float cosLight;
+ varying float normalOffsetScale;
+ varying float adj_shadow_strength;
+ varying float f_normal_length;
+#endif
+
varying vec3 eyeVec;
varying float vIDiff;
const float e = 2.718281828459;
const float BS = 10.0;
+#ifdef ENABLE_DYNAMIC_SHADOWS
+// custom smoothstep implementation because it's not defined in glsl1.2
+// https://docs.gl/sl4/smoothstep
+float mtsmoothstep(in float edge0, in float edge1, in float x)
+{
+ float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
+ return t * t * (3.0 - 2.0 * t);
+}
+#endif
+
+
float directional_ambient(vec3 normal)
{
vec3 v = normal * normal;
@@ -49,5 +74,30 @@ void main(void)
: directional_ambient(normalize(inVertexNormal));
#endif
+#ifdef GL_ES
+ varColor = inVertexColor.bgra;
+#else
varColor = inVertexColor;
+#endif
+
+#ifdef ENABLE_DYNAMIC_SHADOWS
+
+ cosLight = max(0.0, dot(vNormal, -v_LightDirection));
+ float texelSize = 0.51;
+ float slopeScale = clamp(1.0 - cosLight, 0.0, 1.0);
+ normalOffsetScale = texelSize * slopeScale;
+ if (f_timeofday < 0.2) {
+ adj_shadow_strength = f_shadow_strength * 0.5 *
+ (1.0 - mtsmoothstep(0.18, 0.2, f_timeofday));
+ } else if (f_timeofday >= 0.8) {
+ adj_shadow_strength = f_shadow_strength * 0.5 *
+ mtsmoothstep(0.8, 0.83, f_timeofday);
+ } else {
+ adj_shadow_strength = f_shadow_strength *
+ mtsmoothstep(0.20, 0.25, f_timeofday) *
+ (1.0 - mtsmoothstep(0.7, 0.8, f_timeofday));
+ }
+ f_normal_length = length(vNormal);
+
+#endif
}
diff --git a/client/shaders/selection_shader/opengl_vertex.glsl b/client/shaders/selection_shader/opengl_vertex.glsl
index 9ca87a9cf..39dde3056 100644
--- a/client/shaders/selection_shader/opengl_vertex.glsl
+++ b/client/shaders/selection_shader/opengl_vertex.glsl
@@ -6,5 +6,9 @@ void main(void)
varTexCoord = inTexCoord0.st;
gl_Position = mWorldViewProj * inVertexPosition;
+#ifdef GL_ES
+ varColor = inVertexColor.bgra;
+#else
varColor = inVertexColor;
+#endif
}
diff --git a/client/shaders/shadow_shaders/pass1_fragment.glsl b/client/shaders/shadow_shaders/pass1_fragment.glsl
new file mode 100644
index 000000000..2105def96
--- /dev/null
+++ b/client/shaders/shadow_shaders/pass1_fragment.glsl
@@ -0,0 +1,13 @@
+uniform sampler2D ColorMapSampler;
+varying vec4 tPos;
+
+void main()
+{
+ vec4 col = texture2D(ColorMapSampler, gl_TexCoord[0].st);
+
+ if (col.a < 0.70)
+ discard;
+
+ float depth = 0.5 + tPos.z * 0.5;
+ gl_FragColor = vec4(depth, 0.0, 0.0, 1.0);
+}
diff --git a/client/shaders/shadow_shaders/pass1_trans_fragment.glsl b/client/shaders/shadow_shaders/pass1_trans_fragment.glsl
new file mode 100644
index 000000000..b267c2214
--- /dev/null
+++ b/client/shaders/shadow_shaders/pass1_trans_fragment.glsl
@@ -0,0 +1,42 @@
+uniform sampler2D ColorMapSampler;
+varying vec4 tPos;
+
+#ifdef COLORED_SHADOWS
+varying vec3 varColor;
+
+// c_precision of 128 fits within 7 base-10 digits
+const float c_precision = 128.0;
+const float c_precisionp1 = c_precision + 1.0;
+
+float packColor(vec3 color)
+{
+ return floor(color.b * c_precision + 0.5)
+ + floor(color.g * c_precision + 0.5) * c_precisionp1
+ + floor(color.r * c_precision + 0.5) * c_precisionp1 * c_precisionp1;
+}
+
+const vec3 black = vec3(0.0);
+#endif
+
+void main()
+{
+ vec4 col = texture2D(ColorMapSampler, gl_TexCoord[0].st);
+#ifndef COLORED_SHADOWS
+ if (col.a < 0.5)
+ discard;
+#endif
+
+ float depth = 0.5 + tPos.z * 0.5;
+ // ToDo: Liso: Apply movement on waving plants
+ // depth in [0, 1] for texture
+
+ //col.rgb = col.a == 1.0 ? vec3(1.0) : col.rgb;
+#ifdef COLORED_SHADOWS
+ col.rgb *= varColor.rgb;
+ // premultiply color alpha (see-through side)
+ float packedColor = packColor(col.rgb * (1.0 - col.a));
+ gl_FragColor = vec4(depth, packedColor, 0.0,1.0);
+#else
+ gl_FragColor = vec4(depth, 0.0, 0.0, 1.0);
+#endif
+}
diff --git a/client/shaders/shadow_shaders/pass1_trans_vertex.glsl b/client/shaders/shadow_shaders/pass1_trans_vertex.glsl
new file mode 100644
index 000000000..0a9efe450
--- /dev/null
+++ b/client/shaders/shadow_shaders/pass1_trans_vertex.glsl
@@ -0,0 +1,33 @@
+uniform mat4 LightMVP; // world matrix
+varying vec4 tPos;
+#ifdef COLORED_SHADOWS
+varying vec3 varColor;
+#endif
+
+const float bias0 = 0.9;
+const float zPersFactor = 0.5;
+const float bias1 = 1.0 - bias0 + 1e-6;
+
+vec4 getPerspectiveFactor(in vec4 shadowPosition)
+{
+ float pDistance = length(shadowPosition.xy);
+ float pFactor = pDistance * bias0 + bias1;
+ shadowPosition.xyz *= vec3(vec2(1.0 / pFactor), zPersFactor);
+
+ return shadowPosition;
+}
+
+
+void main()
+{
+ vec4 pos = LightMVP * gl_Vertex;
+
+ tPos = getPerspectiveFactor(LightMVP * gl_Vertex);
+
+ gl_Position = vec4(tPos.xyz, 1.0);
+ gl_TexCoord[0].st = gl_MultiTexCoord0.st;
+
+#ifdef COLORED_SHADOWS
+ varColor = gl_Color.rgb;
+#endif
+}
diff --git a/client/shaders/shadow_shaders/pass1_vertex.glsl b/client/shaders/shadow_shaders/pass1_vertex.glsl
new file mode 100644
index 000000000..a6d8b3db8
--- /dev/null
+++ b/client/shaders/shadow_shaders/pass1_vertex.glsl
@@ -0,0 +1,26 @@
+uniform mat4 LightMVP; // world matrix
+varying vec4 tPos;
+
+const float bias0 = 0.9;
+const float zPersFactor = 0.5;
+const float bias1 = 1.0 - bias0 + 1e-6;
+
+vec4 getPerspectiveFactor(in vec4 shadowPosition)
+{
+ float pDistance = length(shadowPosition.xy);
+ float pFactor = pDistance * bias0 + bias1;
+ shadowPosition.xyz *= vec3(vec2(1.0 / pFactor), zPersFactor);
+
+ return shadowPosition;
+}
+
+
+void main()
+{
+ vec4 pos = LightMVP * gl_Vertex;
+
+ tPos = getPerspectiveFactor(pos);
+
+ gl_Position = vec4(tPos.xyz, 1.0);
+ gl_TexCoord[0].st = gl_MultiTexCoord0.st;
+}
diff --git a/client/shaders/shadow_shaders/pass2_fragment.glsl b/client/shaders/shadow_shaders/pass2_fragment.glsl
new file mode 100644
index 000000000..00b4f9f6c
--- /dev/null
+++ b/client/shaders/shadow_shaders/pass2_fragment.glsl
@@ -0,0 +1,23 @@
+uniform sampler2D ShadowMapClientMap;
+#ifdef COLORED_SHADOWS
+uniform sampler2D ShadowMapClientMapTraslucent;
+#endif
+uniform sampler2D ShadowMapSamplerdynamic;
+
+void main() {
+
+#ifdef COLORED_SHADOWS
+ vec2 first_depth = texture2D(ShadowMapClientMap, gl_TexCoord[0].st).rg;
+ vec2 depth_splitdynamics = vec2(texture2D(ShadowMapSamplerdynamic, gl_TexCoord[2].st).r, 0.0);
+ if (first_depth.r > depth_splitdynamics.r)
+ first_depth = depth_splitdynamics;
+ vec2 depth_color = texture2D(ShadowMapClientMapTraslucent, gl_TexCoord[1].st).rg;
+ gl_FragColor = vec4(first_depth.r, first_depth.g, depth_color.r, depth_color.g);
+#else
+ float first_depth = texture2D(ShadowMapClientMap, gl_TexCoord[0].st).r;
+ float depth_splitdynamics = texture2D(ShadowMapSamplerdynamic, gl_TexCoord[2].st).r;
+ first_depth = min(first_depth, depth_splitdynamics);
+ gl_FragColor = vec4(first_depth, 0.0, 0.0, 1.0);
+#endif
+
+}
diff --git a/client/shaders/shadow_shaders/pass2_vertex.glsl b/client/shaders/shadow_shaders/pass2_vertex.glsl
new file mode 100644
index 000000000..ac445c9c7
--- /dev/null
+++ b/client/shaders/shadow_shaders/pass2_vertex.glsl
@@ -0,0 +1,9 @@
+
+void main()
+{
+ vec4 uv = vec4(gl_Vertex.xyz, 1.0) * 0.5 + 0.5;
+ gl_TexCoord[0] = uv;
+ gl_TexCoord[1] = uv;
+ gl_TexCoord[2] = uv;
+ gl_Position = vec4(gl_Vertex.xyz, 1.0);
+}
diff --git a/clientmods/preview/mod.conf b/clientmods/preview/mod.conf
new file mode 100644
index 000000000..4e56ec293
--- /dev/null
+++ b/clientmods/preview/mod.conf
@@ -0,0 +1 @@
+name = preview
diff --git a/cmake/Modules/FindGMP.cmake b/cmake/Modules/FindGMP.cmake
index 7b45f16c7..190b7c548 100644
--- a/cmake/Modules/FindGMP.cmake
+++ b/cmake/Modules/FindGMP.cmake
@@ -12,8 +12,6 @@ if(ENABLE_SYSTEM_GMP)
else()
message (STATUS "Detecting GMP from system failed.")
endif()
-else()
- message (STATUS "Detecting GMP from system disabled! (ENABLE_SYSTEM_GMP=0)")
endif()
if(NOT USE_SYSTEM_GMP)
diff --git a/cmake/Modules/FindGettextLib.cmake b/cmake/Modules/FindGettextLib.cmake
index 529452a4a..b7681827c 100644
--- a/cmake/Modules/FindGettextLib.cmake
+++ b/cmake/Modules/FindGettextLib.cmake
@@ -42,15 +42,6 @@ if(WIN32)
NAMES ${GETTEXT_LIB_NAMES}
PATHS "${CUSTOM_GETTEXT_PATH}/lib"
DOC "GetText library")
- find_file(GETTEXT_DLL
- NAMES libintl.dll intl.dll libintl3.dll intl3.dll
- PATHS "${CUSTOM_GETTEXT_PATH}/bin" "${CUSTOM_GETTEXT_PATH}/lib"
- DOC "gettext *intl*.dll")
- find_file(GETTEXT_ICONV_DLL
- NAMES libiconv2.dll
- PATHS "${CUSTOM_GETTEXT_PATH}/bin" "${CUSTOM_GETTEXT_PATH}/lib"
- DOC "gettext *iconv*.lib")
- set(GETTEXT_REQUIRED_VARS ${GETTEXT_REQUIRED_VARS} GETTEXT_DLL GETTEXT_ICONV_DLL)
endif(WIN32)
diff --git a/cmake/Modules/FindIrrlicht.cmake b/cmake/Modules/FindIrrlicht.cmake
deleted file mode 100644
index 6f361e829..000000000
--- a/cmake/Modules/FindIrrlicht.cmake
+++ /dev/null
@@ -1,77 +0,0 @@
-
-mark_as_advanced(IRRLICHT_LIBRARY IRRLICHT_INCLUDE_DIR IRRLICHT_DLL)
-set(IRRLICHT_SOURCE_DIR "" CACHE PATH "Path to irrlicht source directory (optional)")
-
-
-# Find include directory
-
-if(NOT IRRLICHT_SOURCE_DIR STREQUAL "")
- set(IRRLICHT_SOURCE_DIR_INCLUDE
- "${IRRLICHT_SOURCE_DIR}/include"
- )
-
- set(IRRLICHT_LIBRARY_NAMES libIrrlicht.a Irrlicht Irrlicht.lib)
-
- if(WIN32)
- if(MSVC)
- set(IRRLICHT_SOURCE_DIR_LIBS "${IRRLICHT_SOURCE_DIR}/lib/Win32-visualstudio")
- set(IRRLICHT_LIBRARY_NAMES Irrlicht.lib)
- else()
- set(IRRLICHT_SOURCE_DIR_LIBS "${IRRLICHT_SOURCE_DIR}/lib/Win32-gcc")
- set(IRRLICHT_LIBRARY_NAMES libIrrlicht.a libIrrlicht.dll.a)
- endif()
- else()
- set(IRRLICHT_SOURCE_DIR_LIBS "${IRRLICHT_SOURCE_DIR}/lib/Linux")
- set(IRRLICHT_LIBRARY_NAMES libIrrlicht.a)
- endif()
-
- find_path(IRRLICHT_INCLUDE_DIR NAMES irrlicht.h
- PATHS
- ${IRRLICHT_SOURCE_DIR_INCLUDE}
- NO_DEFAULT_PATH
- )
-
- find_library(IRRLICHT_LIBRARY NAMES ${IRRLICHT_LIBRARY_NAMES}
- PATHS
- ${IRRLICHT_SOURCE_DIR_LIBS}
- NO_DEFAULT_PATH
- )
-
-else()
- find_path(IRRLICHT_INCLUDE_DIR NAMES irrlicht.h
- PATHS
- /usr/local/include/irrlicht
- /usr/include/irrlicht
- /system/develop/headers/irrlicht #Haiku
- PATH_SUFFIXES "include/irrlicht"
- )
-
- find_library(IRRLICHT_LIBRARY NAMES libIrrlicht.so libIrrlicht.a Irrlicht
- PATHS
- /usr/local/lib
- /usr/lib
- /system/develop/lib # Haiku
- )
-endif()
-
-
-# On Windows, find the DLL for installation
-if(WIN32)
- # If VCPKG_APPLOCAL_DEPS is ON, dll's are automatically handled by VCPKG
- if(NOT VCPKG_APPLOCAL_DEPS)
- if(MSVC)
- set(IRRLICHT_COMPILER "VisualStudio")
- else()
- set(IRRLICHT_COMPILER "gcc")
- endif()
- find_file(IRRLICHT_DLL NAMES Irrlicht.dll
- PATHS
- "${IRRLICHT_SOURCE_DIR}/bin/Win32-${IRRLICHT_COMPILER}"
- DOC "Path of the Irrlicht dll (for installation)"
- )
- endif()
-endif(WIN32)
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(Irrlicht DEFAULT_MSG IRRLICHT_LIBRARY IRRLICHT_INCLUDE_DIR)
-
diff --git a/cmake/Modules/FindJson.cmake b/cmake/Modules/FindJson.cmake
index a5e9098f8..cce2d387f 100644
--- a/cmake/Modules/FindJson.cmake
+++ b/cmake/Modules/FindJson.cmake
@@ -1,26 +1,25 @@
-# Look for JSONCPP if asked to.
-# We use a bundled version by default because some distros ship versions of
-# JSONCPP that cause segfaults and other memory errors when we link with them.
-# See https://github.com/minetest/minetest/issues/1793
+# Look for JsonCpp, with fallback to bundeled version
mark_as_advanced(JSON_LIBRARY JSON_INCLUDE_DIR)
-option(ENABLE_SYSTEM_JSONCPP "Enable using a system-wide JSONCPP. May cause segfaults and other memory errors!" FALSE)
+option(ENABLE_SYSTEM_JSONCPP "Enable using a system-wide JsonCpp" TRUE)
+set(USE_SYSTEM_JSONCPP FALSE)
if(ENABLE_SYSTEM_JSONCPP)
find_library(JSON_LIBRARY NAMES jsoncpp)
find_path(JSON_INCLUDE_DIR json/allocator.h PATH_SUFFIXES jsoncpp)
- include(FindPackageHandleStandardArgs)
- find_package_handle_standard_args(Json DEFAULT_MSG JSON_LIBRARY JSON_INCLUDE_DIR)
-
- if(JSON_FOUND)
- message(STATUS "Using system JSONCPP library.")
+ if(JSON_LIBRARY AND JSON_INCLUDE_DIR)
+ message(STATUS "Using JsonCpp provided by system.")
+ set(USE_SYSTEM_JSONCPP TRUE)
endif()
endif()
-if(NOT JSON_FOUND)
- message(STATUS "Using bundled JSONCPP library.")
+if(NOT USE_SYSTEM_JSONCPP)
+ message(STATUS "Using bundled JsonCpp library.")
set(JSON_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/jsoncpp)
set(JSON_LIBRARY jsoncpp)
add_subdirectory(lib/jsoncpp)
endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Json DEFAULT_MSG JSON_LIBRARY JSON_INCLUDE_DIR)
diff --git a/cmake/Modules/FindLuaJIT.cmake b/cmake/Modules/FindLuaJIT.cmake
index 97b0b7c64..217415d14 100644
--- a/cmake/Modules/FindLuaJIT.cmake
+++ b/cmake/Modules/FindLuaJIT.cmake
@@ -1,8 +1,8 @@
# Locate LuaJIT library
# This module defines
# LUAJIT_FOUND, if false, do not try to link to Lua
+# LUA_LIBRARY, where to find the lua library
# LUA_INCLUDE_DIR, where to find lua.h
-# LUA_VERSION_STRING, the version of Lua found (since CMake 2.8.8)
#
# This module is similar to FindLua51.cmake except that it finds LuaJit instead.
@@ -44,19 +44,10 @@ else()
)
endif()
-
-IF(LUA_INCLUDE_DIR AND EXISTS "${LUA_INCLUDE_DIR}/luajit.h")
- FILE(STRINGS "${LUA_INCLUDE_DIR}/luajit.h" lua_version_str REGEX "^#define[ \t]+LUA_RELEASE[ \t]+\"LuaJIT .+\"")
-
- STRING(REGEX REPLACE "^#define[ \t]+LUA_RELEASE[ \t]+\"LuaJIT ([^\"]+)\".*" "\\1" LUA_VERSION_STRING "${lua_version_str}")
- UNSET(lua_version_str)
-ENDIF()
-
INCLUDE(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set LUAJIT_FOUND to TRUE if
-# all listed variables are TRUE
+# all listed variables exist
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LuaJIT
- REQUIRED_VARS LUA_LIBRARY LUA_INCLUDE_DIR
- VERSION_VAR LUA_VERSION_STRING)
+ REQUIRED_VARS LUA_LIBRARY LUA_INCLUDE_DIR)
-MARK_AS_ADVANCED(LUA_INCLUDE_DIR LUA_LIBRARY LUA_MATH_LIBRARY)
+MARK_AS_ADVANCED(LUA_INCLUDE_DIR LUA_LIBRARY)
diff --git a/cmake/Modules/FindOpenGLES2.cmake b/cmake/Modules/FindOpenGLES2.cmake
index a47126705..ce04191dd 100644
--- a/cmake/Modules/FindOpenGLES2.cmake
+++ b/cmake/Modules/FindOpenGLES2.cmake
@@ -42,7 +42,7 @@ else()
)
include(FindPackageHandleStandardArgs)
- find_package_handle_standard_args(OPENGLES2 DEFAULT_MSG OPENGLES2_LIBRARY OPENGLES2_INCLUDE_DIR)
+ find_package_handle_standard_args(OpenGLES2 DEFAULT_MSG OPENGLES2_LIBRARY OPENGLES2_INCLUDE_DIR)
find_path(EGL_INCLUDE_DIR EGL/egl.h
PATHS /usr/openwin/share/include
@@ -59,7 +59,6 @@ else()
/usr/lib
)
- include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(EGL DEFAULT_MSG EGL_LIBRARY EGL_INCLUDE_DIR)
endif()
diff --git a/cmake/Modules/FindZstd.cmake b/cmake/Modules/FindZstd.cmake
new file mode 100644
index 000000000..e28e1334b
--- /dev/null
+++ b/cmake/Modules/FindZstd.cmake
@@ -0,0 +1,25 @@
+mark_as_advanced(ZSTD_LIBRARY ZSTD_INCLUDE_DIR)
+
+find_path(ZSTD_INCLUDE_DIR NAMES zstd.h)
+
+find_library(ZSTD_LIBRARY NAMES zstd)
+
+if(ZSTD_INCLUDE_DIR AND ZSTD_LIBRARY)
+ # Check that the API we use exists
+ include(CheckSymbolExists)
+ unset(HAVE_ZSTD_INITCSTREAM CACHE)
+ set(CMAKE_REQUIRED_INCLUDES ${ZSTD_INCLUDE_DIR})
+ set(CMAKE_REQUIRED_LIBRARIES ${ZSTD_LIBRARY})
+ check_symbol_exists(ZSTD_initCStream zstd.h HAVE_ZSTD_INITCSTREAM)
+ unset(CMAKE_REQUIRED_INCLUDES)
+ unset(CMAKE_REQUIRED_LIBRARIES)
+
+ if(NOT HAVE_ZSTD_INITCSTREAM)
+ unset(ZSTD_INCLUDE_DIR CACHE)
+ unset(ZSTD_LIBRARY CACHE)
+ endif()
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Zstd DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR)
+
diff --git a/cmake/Modules/MinetestFindIrrlichtHeaders.cmake b/cmake/Modules/MinetestFindIrrlichtHeaders.cmake
new file mode 100644
index 000000000..d33b296d0
--- /dev/null
+++ b/cmake/Modules/MinetestFindIrrlichtHeaders.cmake
@@ -0,0 +1,26 @@
+# Locate Irrlicht or IrrlichtMt headers on system.
+
+foreach(libname IN ITEMS IrrlichtMt Irrlicht)
+ string(TOLOWER "${libname}" libname2)
+
+ find_path(IRRLICHT_INCLUDE_DIR NAMES irrlicht.h
+ DOC "Path to the directory with IrrlichtMt includes"
+ PATHS
+ /usr/local/include/${libname2}
+ /usr/include/${libname2}
+ /system/develop/headers/${libname2} #Haiku
+ PATH_SUFFIXES "include/${libname2}"
+ )
+
+ if(IRRLICHT_INCLUDE_DIR)
+ break()
+ endif()
+endforeach()
+
+# Handholding for users
+if(IRRLICHT_INCLUDE_DIR AND (NOT IS_DIRECTORY "${IRRLICHT_INCLUDE_DIR}" OR
+ NOT EXISTS "${IRRLICHT_INCLUDE_DIR}/irrlicht.h"))
+ message(WARNING "IRRLICHT_INCLUDE_DIR was set to ${IRRLICHT_INCLUDE_DIR} "
+ "but irrlicht.h does not exist inside. The path will not be used.")
+ unset(IRRLICHT_INCLUDE_DIR CACHE)
+endif()
diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in
index d7816f0e4..ae36fd6bf 100644
--- a/doc/Doxyfile.in
+++ b/doc/Doxyfile.in
@@ -16,7 +16,6 @@ PREDEFINED = "USE_SPATIAL=1" \
"USE_REDIS=1" \
"USE_SOUND=1" \
"USE_CURL=1" \
- "USE_FREETYPE=1" \
"USE_GETTEXT=1"
# Input
diff --git a/doc/client_lua_api.txt b/doc/client_lua_api.txt
index 098596481..32be8c849 100644
--- a/doc/client_lua_api.txt
+++ b/doc/client_lua_api.txt
@@ -1,4 +1,4 @@
-Minetest Lua Client Modding API Reference 5.4.0
+Minetest Lua Client Modding API Reference 5.5.0
================================================
* More information at <http://www.minetest.net/>
* Developer Wiki: <http://dev.minetest.net/>
@@ -651,6 +651,9 @@ Minetest namespace reference
* `minetest.sha1(data, [raw])`: returns the sha1 hash of data
* `data`: string of data to hash
* `raw`: return raw bytes instead of hex digits, default: false
+* `minetest.colorspec_to_colorstring(colorspec)`: Converts a ColorSpec to a
+ ColorString. If the ColorSpec is invalid, returns `nil`.
+ * `colorspec`: The ColorSpec to convert
* `minetest.get_csm_restrictions()`: returns a table of `Flags` indicating the
restrictions applied to the current mod.
* If a flag in this table is set to true, the feature is RESTRICTED.
@@ -907,7 +910,9 @@ Call these functions only at load time!
* Example: `minetest.rgba(10, 20, 30, 40)`, returns `"#0A141E28"`
* `minetest.encode_base64(string)`: returns string encoded in base64
* Encodes a string in base64.
-* `minetest.decode_base64(string)`: returns string
+* `minetest.decode_base64(string)`: returns string or nil on failure
+ * Padding characters are only supported starting at version 5.4.0, where
+ 5.5.0 and newer perform proper checks.
* Decodes a string encoded in base64.
* `minetest.gettext(string)` : returns string
* look up the translation of a string in the gettext message catalog
@@ -1025,8 +1030,8 @@ Methods:
* 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)
+* `get_move_resistance()`
+ * returns move resistance of current node, the higher the slower the player moves
* `is_climbing()`
* returns true if player is climbing
* `swimming_vertical()`
@@ -1228,7 +1233,7 @@ It can be created via `Raycast(pos1, pos2, objects, liquids)` or
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_viscosity = <number>, -- How slow 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
@@ -1243,6 +1248,7 @@ It can be created via `Raycast(pos1, pos2, objects, liquids)` or
},
legacy_facedir_simple = bool, -- Whether to use old facedir
legacy_wallmounted = bool -- Whether to use old wallmounted
+ move_resistance = <number>, -- How slow players can move through the node *May not exist*
}
```
@@ -1309,6 +1315,8 @@ It can be created via `Raycast(pos1, pos2, objects, liquids)` or
-- ^ See "HUD Element Types"
size = { x=100, y=100 }, -- default {x=0, y=0}
-- ^ Size of element in pixels
+ style = 0,
+ -- ^ For "text" elements sets font style: bitfield with 1 = bold, 2 = italic, 4 = monospace
}
```
@@ -1348,9 +1356,8 @@ The following functions provide escape sequences:
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.
+To specify the value of the alpha channel, append `#A` or `#AA` to the end of
+the color name (e.g. `colorname#08`).
`Color`
-------------
diff --git a/doc/direction.md b/doc/direction.md
new file mode 100644
index 000000000..826dd47b3
--- /dev/null
+++ b/doc/direction.md
@@ -0,0 +1,69 @@
+# Minetest Direction Document
+
+## 1. Long-term Roadmap
+
+The long-term roadmaps, aims, and guiding philosophies are set out using the
+following documents:
+
+* [What is Minetest?](http://c55.me/blog/?p=1491)
+* [celeron55's roadmap](https://forum.minetest.net/viewtopic.php?t=9177)
+* [celeron55's comment in "A clear mission statement for Minetest is missing"](https://github.com/minetest/minetest/issues/3476#issuecomment-167399287)
+* [Core developer to-do/wish lists](https://forum.minetest.net/viewforum.php?f=7)
+
+## 2. Medium-term Roadmap
+
+These are the current medium-term goals for Minetest development, in no
+particular order.
+
+These goals were created from the top points in a
+[roadmap brainstorm](https://github.com/minetest/minetest/issues/10461).
+This should be reviewed approximately yearly, or when goals are achieved.
+
+Pull requests that address one of these goals will be labelled as "Roadmap".
+PRs that are not on the roadmap will be closed unless they receive a concept
+approval within a week, issues can be used for preapproval.
+Bug fixes are exempt for this, and are always accepted and prioritised.
+See [CONTRIBUTING.md](../.github/CONTRIBUTING.md) for more info.
+
+### 2.1 Rendering/Graphics improvements
+
+The priority is fixing the issues, performance, and general correctness.
+Once that is done, fancier features can be worked on, such as water shaders,
+shadows, and improved lighting.
+
+Examples include
+[transparency sorting](https://github.com/minetest/minetest/issues/95),
+[particle performance](https://github.com/minetest/minetest/issues/1414),
+[general view distance](https://github.com/minetest/minetest/issues/7222).
+
+This includes work on maintaining
+[our Irrlicht fork](https://github.com/minetest/irrlicht), and switching to
+alternative libraries to replace Irrlicht functionality as needed
+
+### 2.2 Internal code refactoring
+
+To ensure sustainable development, Minetest's code needs to be
+[refactored and improved](https://github.com/minetest/minetest/pulls?q=is%3Aopen+sort%3Aupdated-desc+label%3A%22Code+quality%22+).
+This will remove code rot and allow for more efficient development.
+
+### 2.3 UI Improvements
+
+A [formspec replacement](https://github.com/minetest/minetest/issues/6527) is
+needed to make GUIs better and easier to create. This replacement could also
+be a replacement for HUDs, allowing for a unified API.
+
+A [new mainmenu](https://github.com/minetest/minetest/issues/6733) is needed to
+improve user experience. First impressions matter, and the current main menu
+doesn't do a very good job at selling Minetest or explaining what it is.
+A new main menu should promote games to users, allowing Minetest Game to no
+longer be bundled by default.
+
+The UI code is undergoing rapid changes, so it is especially important to make
+an issue for any large changes before spending lots of time.
+
+### 2.4 Object and entity improvements
+
+There are still a significant number of issues with objects.
+Collisions,
+[performance](https://github.com/minetest/minetest/issues/6453),
+API convenience, and discrepancies between players and entities.
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 790ab32f4..faaed55e1 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -77,8 +77,16 @@ The game directory can contain the following files:
`disallowed_mapgens`.
* `disallowed_mapgen_settings= <comma-separated mapgen settings>`
e.g. `disallowed_mapgen_settings = mgv5_spflags`
- These settings are hidden for this game in the world creation
+ These mapgen settings are hidden for this game in the world creation
dialog and game start menu.
+ * `disabled_settings = <comma-separated settings>`
+ e.g. `disabled_settings = enable_damage, creative_mode`
+ These settings are hidden for this game in the "Start game" tab
+ and will be initialized as `false` when the game is started.
+ Prepend a setting name with an exclamation mark to initialize it to `true`
+ (this does not work for `enable_server`).
+ Only these settings are supported:
+ `enable_damage`, `creative_mode`, `enable_server`.
* `author`: The author of the game. It only appears when downloaded from
ContentDB.
* `release`: Ignore this: Should only ever be set by ContentDB, as it is
@@ -105,8 +113,16 @@ If you want to specify multiple images for one identifier, add additional
images named like `$identifier.$n.png`, with an ascending number $n starting
with 1, and a random image will be chosen from the provided ones.
+Menu music
+-----------
+Games can provide custom main menu music. They are put inside a `menu`
+directory inside the game directory.
+The music files are named `theme.ogg`.
+If you want to specify multiple music files for one game, add additional
+images named like `theme.$n.ogg`, with an ascending number $n starting
+with 1 (max 10), and a random music file will be chosen from the provided ones.
Mods
====
@@ -247,7 +263,7 @@ Media files (textures, sounds, whatever) that will be transferred to the
client and will be available for use by the mod and translation files for
the clients (see [Translations]).
-It is suggested to use the folders for the purpous they are thought for,
+It is suggested to use the folders for the purpose they are thought for,
eg. put textures into `textures`, translation files into `locale`,
models for entities or meshnodes into `models` et cetera.
@@ -620,6 +636,23 @@ 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.
+#### `[png:<base64>`
+
+Embed a base64 encoded PNG image in the texture string.
+You can produce a valid string for this by calling
+`minetest.encode_base64(minetest.encode_png(tex))`,
+refer to the documentation of these functions for details.
+You can use this to send disposable images such as captchas
+to individual clients, or render things that would be too
+expensive to compose with `[combine:`.
+
+IMPORTANT: Avoid sending large images this way.
+This is not a replacement for asset files, do not use it to do anything
+that you could instead achieve by just using a file.
+In particular consider `minetest.dynamic_add_media` and test whether
+using other texture modifiers could result in a shorter string than
+embedding a whole image, this may vary by use case.
+
Hardware coloring
-----------------
@@ -993,7 +1026,7 @@ The function of `param1` is determined by `paramtype` in node definition.
`param1` is reserved for the engine when `paramtype != "none"`.
* `paramtype = "light"`
- * The value stores light with and without sun in its upper and lower 4 bits
+ * The value stores light with and without sun in its lower and upper 4 bits
respectively.
* Required by a light source node to enable spreading its light.
* Required by the following drawtypes as they determine their visual
@@ -1022,7 +1055,8 @@ The function of `param2` is determined by `paramtype2` in node definition.
to access/manipulate the content of this field
* Bit 3: If set, liquid is flowing downwards (no graphical effect)
* `paramtype2 = "wallmounted"`
- * Supported drawtypes: "torchlike", "signlike", "normal", "nodebox", "mesh"
+ * Supported drawtypes: "torchlike", "signlike", "plantlike",
+ "plantlike_rooted", "normal", "nodebox", "mesh"
* The rotation of the node is stored in `param2`
* You can make this value by using `minetest.dir_to_wallmounted()`
* Values range 0 - 5
@@ -1048,9 +1082,9 @@ The function of `param2` is determined by `paramtype2` in node definition.
* The height of the 'plantlike' section is stored in `param2`.
* The height is (`param2` / 16) nodes.
* `paramtype2 = "degrotate"`
- * Only valid for "plantlike" drawtype. The rotation of the node is stored in
- `param2`.
- * Values range 0 - 179. The value stored in `param2` is multiplied by two to
+ * Valid for `plantlike` and `mesh` drawtypes. The rotation of the node is
+ stored in `param2`.
+ * Values range 0–239. The value stored in `param2` is multiplied by 1.5 to
get the actual rotation in degrees of the node.
* `paramtype2 = "meshoptions"`
* Only valid for "plantlike" drawtype. `param2` encodes the shape and
@@ -1084,10 +1118,20 @@ The function of `param2` is determined by `paramtype2` in node definition.
palette. The palette should have 32 pixels.
* `paramtype2 = "glasslikeliquidlevel"`
* Only valid for "glasslike_framed" or "glasslike_framed_optional"
- drawtypes.
- * `param2` values 0-63 define 64 levels of internal liquid, 0 being empty
- and 63 being full.
+ drawtypes. "glasslike_framed_optional" nodes are only affected if the
+ "Connected Glass" setting is enabled.
+ * Bits 0-5 define 64 levels of internal liquid, 0 being empty and 63 being
+ full.
+ * Bits 6 and 7 modify the appearance of the frame and node faces. One or
+ both of these values may be added to `param2`:
+ * 64 - Makes the node not connect with neighbors above or below it.
+ * 128 - Makes the node not connect with neighbors to its sides.
* Liquid texture is defined using `special_tiles = {"modname_tilename.png"}`
+* `paramtype2 = "colordegrotate"`
+ * Same as `degrotate`, but with colors.
+ * The first (most-significant) three bits of `param2` tells which color
+ is picked from the palette. The palette should have 8 pixels.
+ * Remaining 5 bits store rotation in range 0–23 (i.e. in 15° steps)
* `paramtype2 = "none"`
* `param2` will not be used by the engine and can be used to store
an arbitrary value
@@ -1107,8 +1151,20 @@ Look for examples in `games/devtest` or `games/minetest_game`.
* Invisible, uses no texture.
* `liquid`
* The cubic source node for a liquid.
+ * Faces bordering to the same node are never rendered.
+ * Connects to node specified in `liquid_alternative_flowing`.
+ * Use `backface_culling = false` for the tiles you want to make
+ visible when inside the node.
* `flowingliquid`
* The flowing version of a liquid, appears with various heights and slopes.
+ * Faces bordering to the same node are never rendered.
+ * Connects to node specified in `liquid_alternative_source`.
+ * Node textures are defined with `special_tiles` where the first tile
+ is for the top and bottom faces and the second tile is for the side
+ faces.
+ * `tiles` is used for the item/inventory/wield image rendering.
+ * Use `backface_culling = false` for the special tiles you want to make
+ visible when inside the node
* `glasslike`
* Often used for partially-transparent nodes.
* Only external sides of textures are visible.
@@ -1135,14 +1191,20 @@ Look for examples in `games/devtest` or `games/minetest_game`.
used to compensate for how `glasslike` reduces visual thickness.
* `torchlike`
* A single vertical texture.
- * If placed on top of a node, uses the first texture specified in `tiles`.
- * If placed against the underside of a node, uses the second texture
- specified in `tiles`.
- * If placed on the side of a node, uses the third texture specified in
- `tiles` and is perpendicular to that node.
+ * If `paramtype2="[color]wallmounted":
+ * If placed on top of a node, uses the first texture specified in `tiles`.
+ * If placed against the underside of a node, uses the second texture
+ specified in `tiles`.
+ * If placed on the side of a node, uses the third texture specified in
+ `tiles` and is perpendicular to that node.
+ * If `paramtype2="none"`:
+ * Will be rendered as if placed on top of a node (see
+ above) and only the first texture is used.
* `signlike`
* A single texture parallel to, and mounted against, the top, underside or
side of a node.
+ * If `paramtype2="[color]wallmounted", it rotates according to `param2`
+ * If `paramtype2="none"`, it will always be on the floor.
* `plantlike`
* Two vertical and diagonal textures at right-angles to each other.
* See `paramtype2 = "meshoptions"` above for other options.
@@ -1175,7 +1237,12 @@ Look for examples in `games/devtest` or `games/minetest_game`.
* `plantlike_rooted`
* Enables underwater `plantlike` without air bubbles around the nodes.
* Consists of a base cube at the co-ordinates of the node plus a
- `plantlike` extension above with a height of `param2 / 16` nodes.
+ `plantlike` extension above
+ * If `paramtype2="leveled", the `plantlike` extension has a height
+ of `param2 / 16` nodes, otherwise it's the height of 1 node
+ * If `paramtype2="wallmounted"`, the `plantlike` extension
+ will be at one of the corresponding 6 sides of the base cube.
+ Also, the base cube rotates like a `normal` cube would
* The `plantlike` extension visually passes through any nodes above the
base cube without affecting them.
* The base cube texture tiles are defined as normal, the `plantlike`
@@ -1482,6 +1549,9 @@ Position/vector
{x=num, y=num, z=num}
+ Note: it is highly recommended to construct a vector using the helper function:
+ vector.new(num, num, num)
+
For helper functions see [Spatial Vectors].
`pointed_thing`
@@ -1549,15 +1619,37 @@ since, by default, no schematic attributes are set.
Items
=====
+Items are things that can be held by players, dropped in the map and
+stored in inventories.
+Items come in the form of item stacks, which are collections of equal
+items that occupy a single inventory slot.
+
Item types
----------
There are three kinds of items: nodes, tools and craftitems.
-* Node: Can be placed in the world's voxel grid
-* Tool: Has a wear property but cannot be stacked. The default use action is to
- dig nodes or hit objects according to its tool capabilities.
-* Craftitem: Cannot dig nodes or be placed
+* Node: Placeable item form of a node in the world's voxel grid
+* Tool: Has a changable wear property but cannot be stacked
+* Craftitem: Has no special properties
+
+Every registered node (the voxel in the world) has a corresponding
+item form (the thing in your inventory) that comes along with it.
+This item form can be placed which will create a node in the
+world (by default).
+Both the 'actual' node and its item form share the same identifier.
+For all practical purposes, you can treat the node and its item form
+interchangeably. We usually just say 'node' to the item form of
+the node as well.
+
+Note the definition of tools is purely technical. The only really
+unique thing about tools is their wear, and that's basically it.
+Beyond that, you can't make any gameplay-relevant assumptions
+about tools or non-tools. It is perfectly valid to register something
+that acts as tool in a gameplay sense as a craftitem, and vice-versa.
+
+Craftitems can be used for items that neither need to be a node
+nor a tool.
Amount and wear
---------------
@@ -1568,7 +1660,9 @@ 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 is used 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.
+a higher wear. Non-tools technically also have a wear property,
+but it is always 0. There is also a special 'toolrepair' crafting
+recipe that is only available to tools.
Item formats
------------
@@ -1622,8 +1716,8 @@ Groups
======
In a number of places, there is a group table. Groups define the
-properties of a thing (item, node, armor of entity, capabilities of
-tool) in such a way that the engine and other mods can can interact with
+properties of a thing (item, node, armor of entity, tool capabilities)
+in such a way that the engine and other mods can can interact with
the thing without actually knowing what the thing is.
Usage
@@ -1664,17 +1758,17 @@ Groups of entities
------------------
For entities, groups are, as of now, used only for calculating damage.
-The rating is the percentage of damage caused by tools with this damage group.
+The rating is the percentage of damage caused by items with this damage group.
See [Entity damage mechanism].
object.get_armor_groups() --> a group-rating table (e.g. {fleshy=100})
object.set_armor_groups({fleshy=30, cracky=80})
-Groups of tools
----------------
+Groups of tool capabilities
+---------------------------
-Groups in tools define which groups of nodes and entities they are
-effective towards.
+Groups in tool capabilities define which groups of nodes and entities they
+are effective towards.
Groups in crafting recipes
--------------------------
@@ -1706,7 +1800,7 @@ The asterisk `(*)` after a group name describes that there is no engine
functionality bound to it, and implementation is left up as a suggestion
to games.
-### Node, item and tool groups
+### Node and item groups
* `not_in_creative_inventory`: (*) Special group for inventory mods to indicate
that the item should be hidden in item lists.
@@ -1725,16 +1819,24 @@ to games.
* `3`: the node always gets the digging time 0 seconds (torch)
* `disable_jump`: Player (and possibly other things) cannot jump from node
or if their feet are in the node. Note: not supported for `new_move = false`
-* `fall_damage_add_percent`: damage speed = `speed * (1 + value/100)`
+* `fall_damage_add_percent`: modifies the fall damage suffered when hitting
+ the top of this node. There's also an armor group with the same name.
+ The final player damage is determined by the following formula:
+ damage =
+ collision speed
+ * ((node_fall_damage_add_percent + 100) / 100) -- node group
+ * ((player_fall_damage_add_percent + 100) / 100) -- player armor group
+ - (14) -- constant tolerance
+ Negative damage values are discarded as no damage.
* `falling_node`: if there is no walkable block under the node it will fall
-* `float`: the node will not fall through liquids
+* `float`: the node will not fall through liquids (`liquidtype ~= "none"`)
* `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
- * See also: `leveldiff` in [Tools]
+ * See also: `leveldiff` in [Tool Capabilities]
* `slippery`: Players and items will slide on the node.
Slipperiness rises steadily with `slippery` value, starting at 1.
@@ -1745,12 +1847,15 @@ to games.
`"toolrepair"` crafting recipe
-### `ObjectRef` groups
+### `ObjectRef` armor groups
* `immortal`: Skips all damage and breath handling for an object. This group
will also hide the integrated HUD status bars for players. It is
automatically set to all players when damage is disabled on the server and
cannot be reset (subject to change).
+* `fall_damage_add_percent`: Modifies the fall damage suffered by players
+ when they hit the ground. It is analog to the node group with the same
+ name. See the node group above for the exact calculation.
* `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.
@@ -1762,8 +1867,8 @@ Known damage and digging time defining groups
* `crumbly`: dirt, sand
* `cracky`: tough but crackable stuff like stone.
-* `snappy`: something that can be cut using fine tools; e.g. leaves, small
- plants, wire, sheets of metal
+* `snappy`: something that can be cut using things like scissors, shears,
+ bolt cutters and the like, e.g. leaves, small plants, wire, sheets of metal
* `choppy`: something that can be cut using force; e.g. trees, wooden planks
* `fleshy`: Living things like animals and the player. This could imply
some blood effects when hitting.
@@ -1772,7 +1877,7 @@ Known damage and digging time defining groups
Can be added to nodes that shouldn't logically be breakable by the
hand but are. Somewhat similar to `dig_immediate`, but times are more
like `{[1]=3.50,[2]=2.00,[3]=0.70}` and this does not override the
- speed of a tool if the tool can dig at a faster speed than this
+ digging speed of an item if it can dig at a faster speed than this
suggests for the hand.
Examples of custom groups
@@ -1798,54 +1903,67 @@ Groups such as `crumbly`, `cracky` and `snappy` are used for this
purpose. Rating is `1`, `2` or `3`. A higher rating for such a group implies
faster digging time.
-The `level` group is used to limit the toughness of nodes a tool can dig
-and to scale the digging times / damage to a greater extent.
+The `level` group is used to limit the toughness of nodes an item capable
+of digging can dig and to scale the digging times / damage to a greater extent.
**Please do understand this**, otherwise you cannot use the system to it's
full potential.
-Tools define their properties by a list of parameters for groups. They
+Items define their properties by a list of parameters for groups. They
cannot dig other groups; thus it is important to use a standard bunch of
-groups to enable interaction with tools.
+groups to enable interaction with items.
-Tools
-=====
+Tool Capabilities
+=================
-Tools definition
-----------------
+'Tool capabilities' is a property of items that defines two things:
-Tools define:
+1) Which nodes it can dig and how fast
+2) Which objects it can hurt by punching and by how much
+
+Tool capabilities are available for all items, not just tools.
+But only tools can receive wear from digging and punching.
+
+Missing or incomplete tool capabilities will default to the
+player's hand.
+
+Tool capabilities definition
+----------------------------
+
+Tool capabilities define:
* Full punch interval
* Maximum drop level
-* For an arbitrary list of groups:
+* For an arbitrary list of node groups:
* Uses (until the tool breaks)
- * Maximum level (usually `0`, `1`, `2` or `3`)
- * Digging times
- * Damage groups
+ * Maximum level (usually `0`, `1`, `2` or `3`)
+ * Digging times
+* Damage groups
+* Punch attack uses (until the tool breaks)
### Full punch interval
-When used as a weapon, the tool will do full damage if this time is spent
-between punches. If e.g. half the time is spent, the tool will do half
+When used as a weapon, the item will do full damage if this time is spent
+between punches. If e.g. half the time is spent, the item will do half
damage.
### Maximum drop level
-Suggests the maximum level of node, when dug with the tool, that will drop
-it's useful item. (e.g. iron ore to drop a lump of iron).
+Suggests the maximum level of node, when dug with the item, that will drop
+its useful item. (e.g. iron ore to drop a lump of iron).
This is not automated; it is the responsibility of the node definition
to implement this.
-### Uses
+### Uses (tools only)
Determines how many uses the tool has when it is used for digging a node,
-of this group, of the maximum level. For lower leveled nodes, the use count
-is multiplied by `3^leveldiff`.
+of this group, of the maximum level. The maximum supported number of
+uses is 65535. The special number 0 is used for infinite uses.
+For lower leveled nodes, the use count is multiplied by `3^leveldiff`.
`leveldiff` is the difference of the tool's `maxlevel` `groupcaps` and the
node's `level` group. The node cannot be dug if `leveldiff` is less than zero.
@@ -1853,9 +1971,11 @@ node's `level` group. The node cannot be dug if `leveldiff` is less than zero.
* `uses=10, leveldiff=1`: actual uses: 30
* `uses=10, leveldiff=2`: actual uses: 90
+For non-tools, this has no effect.
+
### Maximum level
-Tells what is the maximum level of a node of this group that the tool will
+Tells what is the maximum level of a node of this group that the item will
be able to dig.
### Digging times
@@ -1864,7 +1984,7 @@ List of digging times for different ratings of the group, for nodes of the
maximum level.
For example, as a Lua table, `times={2=2.00, 3=0.70}`. This would
-result in the tool to be able to dig nodes that have a rating of `2` or `3`
+result in the item 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.
@@ -1876,8 +1996,19 @@ i.e. players can more quickly click the nodes away instead of holding LMB.
List of damage for groups of entities. See [Entity damage mechanism].
-Example definition of the capabilities of a tool
-------------------------------------------------
+### Punch attack uses (tools only)
+
+Determines how many uses (before breaking) the tool has when dealing damage
+to an object, when the full punch interval (see above) was always
+waited out fully.
+
+Wear received by the tool is proportional to the time spent, scaled by
+the full punch interval.
+
+For non-tools, this has no effect.
+
+Example definition of the capabilities of an item
+-------------------------------------------------
tool_capabilities = {
full_punch_interval=1.5,
@@ -1888,7 +2019,7 @@ Example definition of the capabilities of a tool
damage_groups = {fleshy=2},
}
-This makes the tool be able to dig nodes that fulfil both of these:
+This makes the item capable of digging nodes that fulfil both of these:
* Have the `crumbly` group
* Have a `level` group less or equal to `2`
@@ -1992,8 +2123,12 @@ Node metadata contains two things:
Some of the values in the key-value store are handled specially:
-* `formspec`: Defines a right-click inventory menu. See [Formspec].
-* `infotext`: Text shown on the screen when the node is pointed at
+* `formspec`: Defines an inventory menu that is opened with the
+ 'place/use' key. Only works if no `on_rightclick` was
+ defined for the node. See also [Formspec].
+* `infotext`: Text shown on the screen when the node is pointed at.
+ Line-breaks will be applied automatically.
+ If the infotext is very long, it will be truncated.
Example:
@@ -2046,6 +2181,21 @@ Example:
meta:set_string("key", "value")
print(dump(meta:to_table()))
+Example manipulations of "description" and expected output behaviors:
+
+ print(ItemStack("default:pick_steel"):get_description()) --> Steel Pickaxe
+ print(ItemStack("foobar"):get_description()) --> Unknown Item
+
+ local stack = ItemStack("default:stone")
+ stack:get_meta():set_string("description", "Custom description\nAnother line")
+ print(stack:get_description()) --> Custom description\nAnother line
+ print(stack:get_short_description()) --> Custom description
+
+ stack:get_meta():set_string("short_description", "Short")
+ print(stack:get_description()) --> Custom description\nAnother line
+ print(stack:get_short_description()) --> Short
+
+ print(ItemStack("mod:item_with_no_desc"):get_description()) --> mod:item_with_no_desc
@@ -2121,18 +2271,20 @@ Examples
Version History
---------------
-* FORMSPEC VERSION 1:
+* Formspec version 1 (pre-5.1.0):
* (too much)
-* FORMSPEC VERSION 2:
+* Formspec version 2 (5.1.0):
* Forced real coordinates
* background9[]: 9-slice scaling parameters
-* FORMSPEC VERSION 3:
+* Formspec version 3 (5.2.0):
* Formspec elements are drawn in the order of definition
* bgcolor[]: use 3 parameters (bgcolor, formspec (now an enum), fbgcolor)
* box[] and image[] elements enable clipping by default
* new element: scroll_container[]
-* FORMSPEC VERSION 4:
+* Formspec version 4 (5.4.0):
* Allow dropdown indexing events
+* Formspec version 5 (5.5.0):
+ * Added padding[] element
Elements
--------
@@ -2176,9 +2328,20 @@ Elements
* `position` and `anchor` elements need suitable values to avoid a formspec
extending off the game window due to particular game window sizes.
-### `no_prepend[]`
+### `padding[<X>,<Y>]`
* Must be used after the `size`, `position`, and `anchor` elements (if present).
+* Defines how much space is padded around the formspec if the formspec tries to
+ increase past the size of the screen and coordinates have to be shrunk.
+* For X and Y, 0.0 represents no padding (the formspec can touch the edge of the
+ screen), and 0.5 represents half the screen (which forces the coordinate size
+ to 0). If negative, the formspec can extend off the edge of the screen.
+* Defaults to [0.05, 0.05].
+
+### `no_prepend[]`
+
+* Must be used after the `size`, `position`, `anchor`, and `padding` elements
+ (if present).
* Disables player:set_formspec_prepend() from applying to this formspec.
### `real_coordinates[<bool>]`
@@ -2299,7 +2462,7 @@ Elements
* `frame duration`: Milliseconds between each frame. `0` means the frames don't advance.
* `frame start` (Optional): The index of the frame to start on. Default `1`.
-### `model[<X>,<Y>;<W>,<H>;<name>;<mesh>;<textures>;<rotation X,Y>;<continuous>;<mouse control>;<frame loop range>]`
+### `model[<X>,<Y>;<W>,<H>;<name>;<mesh>;<textures>;<rotation X,Y>;<continuous>;<mouse control>;<frame loop range>;<animation speed>]`
* Show a mesh model.
* `name`: Element name that can be used for styling
@@ -2313,6 +2476,7 @@ Elements
* `frame loop range` (Optional): Range of the animation frames.
* Defaults to the full range of all available frames.
* Syntax: `<begin>,<end>`
+* `animation speed` (Optional): Sets the animation speed. Default 0 FPS.
### `item_image[<X>,<Y>;<W>,<H>;<item name>]`
@@ -2678,7 +2842,7 @@ Elements
* `span=<value>`: number of following columns to affect
(default: infinite).
-### `style[<selector 1>,<selector 2>;<prop1>;<prop2>;...]`
+### `style[<selector 1>,<selector 2>,...;<prop1>;<prop2>;...]`
* Set the style for the element(s) matching `selector` by name.
* `selector` can be one of:
@@ -2691,7 +2855,7 @@ Elements
* See [Styling Formspecs].
-### `style_type[<selector 1>,<selector 2>;<prop1>;<prop2>;...]`
+### `style_type[<selector 1>,<selector 2>,...;<prop1>;<prop2>;...]`
* Set the style for the element(s) matching `selector` by type.
* `selector` can be one of:
@@ -2764,10 +2928,10 @@ Styling Formspecs
Formspec elements can be themed using the style elements:
- style[<name 1>,<name 2>;<prop1>;<prop2>;...]
- style[<name 1>:<state>,<name 2>:<state>;<prop1>;<prop2>;...]
- style_type[<type 1>,<type 2>;<prop1>;<prop2>;...]
- style_type[<type 1>:<state>,<type 2>:<state>;<prop1>;<prop2>;...]
+ style[<name 1>,<name 2>,...;<prop1>;<prop2>;...]
+ style[<name 1>:<state>,<name 2>:<state>,...;<prop1>;<prop2>;...]
+ style_type[<type 1>,<type 2>,...;<prop1>;<prop2>;...]
+ style_type[<type 1>:<state>,<type 2>:<state>,...;<prop1>;<prop2>;...]
Where a prop is:
@@ -2942,6 +3106,9 @@ Some tags can enclose text, they open with `<tagname>` and close with `</tagname
Tags can have attributes, in that case, attributes are in the opening tag in
form of a key/value separated with equal signs. Attribute values should not be quoted.
+If you want to insert a literal greater-than sign or a backslash into the text,
+you must escape it by preceding it with a backslash.
+
These are the technically basic tags but see below for usual tags. Base tags are:
`<style color=... font=... size=...>...</style>`
@@ -3077,9 +3244,8 @@ Colors
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.
+To specify the value of the alpha channel, append `#A` or `#AA` to the end of
+the color name (e.g. `colorname#08`).
`ColorSpec`
-----------
@@ -3134,29 +3300,63 @@ no particular point.
Internally, it is implemented as a table with the 3 fields
`x`, `y` and `z`. Example: `{x = 0, y = 1, z = 0}`.
+However, one should *never* create a vector manually as above, such misbehavior
+is deprecated. The vector helpers set a metatable for the created vectors which
+allows indexing with numbers, calling functions directly on vectors and using
+operators (like `+`). Furthermore, the internal implementation might change in
+the future.
+Old code might still use vectors without metatables, be aware of this!
+
+All these forms of addressing a vector `v` are valid:
+`v[1]`, `v[3]`, `v.x`, `v[1] = 42`, `v.y = 13`
+
+Where `v` is a vector and `foo` stands for any function name, `v:foo(...)` does
+the same as `vector.foo(v, ...)`, apart from deprecated functionality.
+
+The metatable that is used for vectors can be accessed via `vector.metatable`.
+Do not modify it!
+
+All `vector.*` functions allow vectors `{x = X, y = Y, z = Z}` without metatables.
+Returned vectors always have a metatable set.
For the following functions, `v`, `v1`, `v2` are vectors,
`p1`, `p2` are positions,
-`s` is a scalar (a number):
-
-* `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 of `a`, `b`, `c` are defined numbers.
+`s` is a scalar (a number),
+vectors are written like this: `(x, y, z)`:
+
+* `vector.new([a[, b, c]])`:
+ * Returns a new vector `(a, b, c)`.
+ * Deprecated: `vector.new()` does the same as `vector.zero()` and
+ `vector.new(v)` does the same as `vector.copy(v)`
+* `vector.zero()`:
+ * Returns a new vector `(0, 0, 0)`.
+* `vector.copy(v)`:
+ * Returns a copy of the vector `v`.
+* `vector.from_string(s[, init])`:
+ * Returns `v, np`, where `v` is a vector read from the given string `s` and
+ `np` is the next position in the string after the vector.
+ * Returns `nil` on failure.
+ * `s`: Has to begin with a substring of the form `"(x, y, z)"`. Additional
+ spaces, leaving away commas and adding an additional comma to the end
+ is allowed.
+ * `init`: If given starts looking for the vector at this string index.
+* `vector.to_string(v)`:
+ * Returns a string of the form `"(x, y, z)"`.
* `vector.direction(p1, p2)`:
* Returns a vector of length 1 with direction `p1` to `p2`.
- * If `p1` and `p2` are identical, returns `{x = 0, y = 0, z = 0}`.
+ * If `p1` and `p2` are identical, returns `(0, 0, 0)`.
* `vector.distance(p1, p2)`:
* Returns zero or a positive number, the distance between `p1` and `p2`.
* `vector.length(v)`:
* Returns zero or a positive number, the length of vector `v`.
* `vector.normalize(v)`:
* Returns a vector of length 1 with direction of vector `v`.
- * If `v` has zero length, returns `{x = 0, y = 0, z = 0}`.
+ * If `v` has zero length, returns `(0, 0, 0)`.
* `vector.floor(v)`:
* Returns a vector, each dimension rounded down.
* `vector.round(v)`:
* Returns a vector, each dimension rounded to nearest integer.
+ * At a multiple of 0.5, rounds away from zero.
* `vector.apply(v, func)`:
* Returns a vector where the function `func` has been applied to each
component.
@@ -3171,7 +3371,11 @@ For the following functions, `v`, `v1`, `v2` are vectors,
* `vector.cross(v1, v2)`:
* Returns the cross product of `v1` and `v2`.
* `vector.offset(v, x, y, z)`:
- * Returns the sum of the vectors `v` and `{x = x, y = y, z = z}`.
+ * Returns the sum of the vectors `v` and `(x, y, z)`.
+* `vector.check()`:
+ * Returns a boolean value indicating whether `v` is a real vector, eg. created
+ by a `vector.*` function.
+ * Returns `false` for anything else, including tables like `{x=3,y=1,z=4}`.
For the following functions `x` can be either a vector or a number:
@@ -3190,14 +3394,30 @@ For the following functions `x` can be either a vector or a number:
* Returns a scaled vector.
* Deprecated: If `s` is a vector: Returns the Schur quotient.
+Operators can be used if all of the involved vectors have metatables:
+* `v1 == v2`:
+ * Returns whether `v1` and `v2` are identical.
+* `-v`:
+ * Returns the additive inverse of v.
+* `v1 + v2`:
+ * Returns the sum of both vectors.
+ * Note: `+` can not be used together with scalars.
+* `v1 - v2`:
+ * Returns the difference of `v1` subtracted by `v2`.
+ * Note: `-` can not be used together with scalars.
+* `v * s` or `s * v`:
+ * Returns `v` scaled by `s`.
+* `v / s`:
+ * Returns `v` scaled by `1 / s`.
+
For the following functions `a` is an angle in radians and `r` is a rotation
vector ({x = <pitch>, y = <yaw>, z = <roll>}) where pitch, yaw and roll are
angles in radians.
* `vector.rotate(v, r)`:
* Applies the rotation `r` to `v` and returns the result.
- * `vector.rotate({x = 0, y = 0, z = 1}, r)` and
- `vector.rotate({x = 0, y = 1, z = 0}, r)` return vectors pointing
+ * `vector.rotate(vector.new(0, 0, 1), r)` and
+ `vector.rotate(vector.new(0, 1, 0), r)` return vectors pointing
forward and up relative to an entity's rotation `r`.
* `vector.rotate_around_axis(v1, v2, a)`:
* Returns `v1` rotated around axis `v2` by `a` radians according to
@@ -3231,6 +3451,8 @@ Helper functions
* If the absolute value of `x` is within the `tolerance` or `x` is NaN,
`0` is returned.
* `math.factorial(x)`: returns the factorial of `x`
+* `math.round(x)`: Returns `x` rounded to the nearest integer.
+ * At a multiple of 0.5, rounds away from zero.
* `string.split(str, separator, include_empty, max_splits, sep_is_pattern)`
* `separator`: string, default: `","`
* `include_empty`: boolean, default: `false`
@@ -3268,7 +3490,6 @@ Helper functions
* returns true when the passed number represents NaN.
* `minetest.get_us_time()`
* returns time with microsecond precision. May not return wall time.
- * This value might overflow on certain 32-bit systems!
* `table.copy(table)`: returns a table
* returns a deep copy of `table`
* `table.indexof(list, val)`: returns the smallest numerical index containing
@@ -3291,25 +3512,27 @@ Helper functions
* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a
position.
* returns the exact position on the surface of a pointed node
-* `minetest.get_dig_params(groups, tool_capabilities)`: Simulates a tool
- that digs a node.
+* `minetest.get_dig_params(groups, tool_capabilities [, wear])`:
+ Simulates an item that digs a node.
Returns a table with the following fields:
* `diggable`: `true` if node can be dug, `false` otherwise.
* `time`: Time it would take to dig the node.
- * `wear`: How much wear would be added to the tool.
+ * `wear`: How much wear would be added to the tool (ignored for non-tools).
`time` and `wear` are meaningless if node's not diggable
Parameters:
* `groups`: Table of the node groups of the node that would be dug
- * `tool_capabilities`: Tool capabilities table of the tool
-* `minetest.get_hit_params(groups, tool_capabilities [, time_from_last_punch])`:
+ * `tool_capabilities`: Tool capabilities table of the item
+ * `wear`: Amount of wear the tool starts with (default: 0)
+* `minetest.get_hit_params(groups, tool_capabilities [, time_from_last_punch [, wear]])`:
Simulates an item that punches an object.
Returns a table with the following fields:
- * `hp`: How much damage the punch would cause.
- * `wear`: How much wear would be added to the tool.
+ * `hp`: How much damage the punch would cause (between -65535 and 65535).
+ * `wear`: How much wear would be added to the tool (ignored for non-tools).
Parameters:
* `groups`: Damage groups of the object
* `tool_capabilities`: Tool capabilities table of the item
* `time_from_last_punch`: time in seconds since last punch action
+ * `wear`: Amount of wear the item starts with (default: 0)
@@ -3509,7 +3732,7 @@ A whole number, 1 or more.
Each additional octave adds finer detail to the noise but also increases the
noise calculation load.
3 is a typical minimum for a high quality, complex and natural-looking noise
-variation. 1 octave has a slight 'gridlike' appearence.
+variation. 1 octave has a slight 'gridlike' appearance.
Choose the number of octaves according to the `spread` and `lacunarity`, and the
size of the finest detail you require. For example:
@@ -3584,7 +3807,7 @@ For 2D or 3D perlin noise or perlin noise maps:
spread = {x = 500, y = 500, z = 500},
seed = 571347,
octaves = 5,
- persist = 0.63,
+ persistence = 0.63,
lacunarity = 2.0,
flags = "defaults, absvalue",
}
@@ -3674,7 +3897,7 @@ The following is a decent set of parameters to work from:
spread = {x=200, y=200, z=200},
seed = 5390,
octaves = 4,
- persist = 0.5,
+ persistence = 0.5,
lacunarity = 2.0,
flags = "eased",
},
@@ -3980,7 +4203,7 @@ differences:
### Other API functions operating on a VoxelManip
-If any VoxelManip contents were set to a liquid node,
+If any VoxelManip contents were set to a liquid node (`liquidtype ~= "none"`),
`VoxelManip:update_liquids()` must be called for these liquid nodes to begin
flowing. It is recommended to call this function only after having written all
buffered data back to the VoxelManip object, save for special situations where
@@ -4231,7 +4454,7 @@ Callbacks:
* `puncher`: an `ObjectRef` (can be `nil`)
* `time_from_last_punch`: Meant for disallowing spamming of clicks
(can be `nil`).
- * `tool_capabilities`: capability table of used tool (can be `nil`)
+ * `tool_capabilities`: capability table of used item (can be `nil`)
* `dir`: unit vector of direction of punch. Always defined. Points from the
puncher to the punched.
* `damage`: damage that will be done to entity.
@@ -4240,6 +4463,9 @@ Callbacks:
* Called when the object dies.
* `killer`: an `ObjectRef` (can be `nil`)
* `on_rightclick(self, clicker)`
+ * Called when `clicker` pressed the 'place/use' key while pointing
+ to the object (not neccessarily an actual rightclick)
+ * `clicker`: an `ObjectRef` (may or may not be a player)
* `on_attach_child(self, child)`
* `child`: an `ObjectRef` of the child that attaches
* `on_detach_child(self, child)`
@@ -4392,6 +4618,13 @@ Utilities
direct_velocity_on_players = true,
-- nodedef's use_texture_alpha accepts new string modes (5.4.0)
use_texture_alpha_string_modes = true,
+ -- degrotate param2 rotates in units of 1.5° instead of 2°
+ -- thus changing the range of values from 0-179 to 0-240 (5.5.0)
+ degrotate_240_steps = true,
+ -- ABM supports min_y and max_y fields in definition (5.5.0)
+ abm_min_max_y = true,
+ -- dynamic_add_media supports passing a table with options (5.5.0)
+ dynamic_add_media_table = true,
}
* `minetest.has_feature(arg)`: returns `boolean, missing_features`
@@ -4427,6 +4660,19 @@ Utilities
* `minetest.mkdir(path)`: returns success.
* Creates a directory specified by `path`, creating parent directories
if they don't exist.
+* `minetest.rmdir(path, recursive)`: returns success.
+ * Removes a directory specified by `path`.
+ * If `recursive` is set to `true`, the directory is recursively removed.
+ Otherwise, the directory will only be removed if it is empty.
+ * Returns true on success, false on failure.
+* `minetest.cpdir(source, destination)`: returns success.
+ * Copies a directory specified by `path` to `destination`
+ * Any files in `destination` will be overwritten if they already exist.
+ * Returns true on success, false on failure.
+* `minetest.mvdir(source, destination)`: returns success.
+ * Moves a directory specified by `path` to `destination`.
+ * If the `destination` is a non-empty directory, then the move will fail.
+ * Returns true on success, false on failure.
* `minetest.get_dir_list(path, [is_dir])`: returns list of entry names
* is_dir is one of:
* nil: return all entries,
@@ -4451,6 +4697,26 @@ Utilities
* `minetest.sha1(data, [raw])`: returns the sha1 hash of data
* `data`: string of data to hash
* `raw`: return raw bytes instead of hex digits, default: false
+* `minetest.colorspec_to_colorstring(colorspec)`: Converts a ColorSpec to a
+ ColorString. If the ColorSpec is invalid, returns `nil`.
+ * `colorspec`: The ColorSpec to convert
+* `minetest.colorspec_to_bytes(colorspec)`: Converts a ColorSpec to a raw
+ string of four bytes in an RGBA layout, returned as a string.
+ * `colorspec`: The ColorSpec to convert
+* `minetest.encode_png(width, height, data, [compression])`: Encode a PNG
+ image and return it in string form.
+ * `width`: Width of the image
+ * `height`: Height of the image
+ * `data`: Image data, one of:
+ * array table of ColorSpec, length must be width*height
+ * string with raw RGBA pixels, length must be width*height*4
+ * `compression`: Optional zlib compression level, number in range 0 to 9.
+ The data is one-dimensional, starting in the upper left corner of the image
+ and laid out in scanlines going from left to right, then top to bottom.
+ Please note that it's not safe to use string.char to generate raw data,
+ use `colorspec_to_bytes` to generate raw RGBA values in a predictable way.
+ The resulting PNG image is always 32-bit. Palettes are not supported at the moment.
+ You may use this to procedurally generate textures during server init.
Logging
-------
@@ -4595,15 +4861,16 @@ Call these functions only at load time!
* `hitter`: ObjectRef - Player that hit
* `time_from_last_punch`: Meant for disallowing spamming of clicks
(can be nil).
- * `tool_capabilities`: Capability table of used tool (can be nil)
+ * `tool_capabilities`: Capability table of used item (can be nil)
* `dir`: Unit vector of direction of punch. Always defined. Points from
the puncher to the punched.
* `damage`: Number that represents the damage calculated by the engine
* should return `true` to prevent the default damage mechanism
* `minetest.register_on_rightclickplayer(function(player, clicker))`
- * Called when a player is right-clicked
- * `player`: ObjectRef - Player that was right-clicked
- * `clicker`: ObjectRef - Object that right-clicked, may or may not be a player
+ * Called when the 'place/use' key was used while pointing a player
+ (not neccessarily an actual rightclick)
+ * `player`: ObjectRef - Player that is acted upon
+ * `clicker`: ObjectRef - Object that acted upon `player`, may or may not be a player
* `minetest.register_on_player_hpchange(function(player, hp_change, reason), modifier)`
* Called when the player gets damaged or healed
* `player`: ObjectRef of the player
@@ -4759,6 +5026,12 @@ Call these functions only at load time!
* Called when an incoming mod channel message is received
* You should have joined some channels to receive events.
* If message comes from a server mod, `sender` field is an empty string.
+* `minetest.register_on_liquid_transformed(function(pos_list, node_list))`
+ * Called after liquid nodes (`liquidtype ~= "none"`) are modified by the
+ engine's liquid transformation process.
+ * `pos_list` is an array of all modified positions.
+ * `node_list` is an array of the old node that was previously at the position
+ with the corresponding index in pos_list.
Setting-related
---------------
@@ -4895,7 +5168,7 @@ Environment access
* 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
+ * Returns `true` and the ObjectRef of the spawned entity 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
@@ -5097,7 +5370,8 @@ Environment access
* `pos1`: start of the ray
* `pos2`: end of the ray
* `objects`: if false, only nodes will be returned. Default is `true`.
- * `liquids`: if false, liquid nodes won't be returned. Default is `false`.
+ * `liquids`: if false, liquid nodes (`liquidtype ~= "none"`) won't be
+ returned. Default is `false`.
* `minetest.find_path(pos1,pos2,searchdistance,max_jump,max_drop,algorithm)`
* returns table containing path that can be walked on
* returns a table of 3D points representing a path from `pos1` to `pos2` or
@@ -5121,7 +5395,7 @@ Environment access
* `minetest.spawn_tree (pos, {treedef})`
* spawns L-system tree at given `pos` with definition in `treedef` table
* `minetest.transforming_liquid_add(pos)`
- * add node to liquid update queue
+ * add node to liquid flow update queue
* `minetest.get_node_max_level(pos)`
* get max available level for leveled node
* `minetest.get_node_level(pos)`
@@ -5199,7 +5473,7 @@ Inventory
* `minetest.remove_detached_inventory(name)`
* Returns a `boolean` indicating whether the removal succeeded.
* `minetest.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing)`:
- returns left over ItemStack.
+ returns leftover ItemStack or nil to indicate no inventory change
* See `minetest.item_eat` and `minetest.register_on_item_eat`
Formspec
@@ -5279,9 +5553,9 @@ Item handling
information.
* `minetest.get_node_drops(node, toolname)`
* Returns list of itemstrings that are dropped by `node` when dug
- with `toolname`.
+ with the item `toolname` (not limited to tools).
* `node`: node as table or node name
- * `toolname`: name of the tool item (can be `nil`)
+ * `toolname`: name of the item used to dig (can be `nil`)
* `minetest.get_craft_result(input)`: returns `output, decremented_input`
* `input.method` = `"normal"` or `"cooking"` or `"fuel"`
* `input.width` = for example `3`
@@ -5442,6 +5716,8 @@ Server
a player joined.
* This function may be overwritten by mods to customize the status message.
* `minetest.get_server_uptime()`: returns the server uptime in seconds
+* `minetest.get_server_max_lag()`: returns the current maximum lag
+ of the server in seconds or nil if server is not fully loaded yet
* `minetest.remove_player(name)`: remove player from database (if they are not
connected).
* As auth data is not removed, minetest.player_exists will continue to
@@ -5450,22 +5726,33 @@ Server
* Returns a code (0: successful, 1: no such player, 2: player is connected)
* `minetest.remove_player_auth(name)`: remove player authentication data
* Returns boolean indicating success (false if player nonexistant)
-* `minetest.dynamic_add_media(filepath, callback)`
- * `filepath`: path to a media file on the filesystem
- * `callback`: function with arguments `name`, where name is a player name
- (previously there was no callback argument; omitting it is deprecated)
- * Adds the file to the media sent to clients by the server on startup
- and also pushes this file to already connected clients.
- The file must be a supported image, sound or model format. It must not be
- modified, deleted, moved or renamed after calling this function.
- The list of dynamically added media is not persisted.
+* `minetest.dynamic_add_media(options, callback)`
+ * `options`: table containing the following parameters
+ * `filepath`: path to a media file on the filesystem
+ * `to_player`: name of the player the media should be sent to instead of
+ all players (optional)
+ * `ephemeral`: boolean that marks the media as ephemeral,
+ it will not be cached on the client (optional, default false)
+ * `callback`: function with arguments `name`, which is a player name
+ * Pushes the specified media file to client(s). (details below)
+ The file must be a supported image, sound or model format.
+ Dynamically added media is not persisted between server restarts.
* Returns false on error, true if the request was accepted
* The given callback will be called for every player as soon as the
media is available on the client.
- Old clients that lack support for this feature will not see the media
- unless they reconnect to the server. (callback won't be called)
- * Since media transferred this way currently does not use client caching
- or HTTP transfers, dynamic media should not be used with big files.
+ * Details/Notes:
+ * If `ephemeral`=false and `to_player` is unset the file is added to the media
+ sent to clients on startup, this means the media will appear even on
+ old clients if they rejoin the server.
+ * If `ephemeral`=false the file must not be modified, deleted, moved or
+ renamed after calling this function.
+ * Regardless of any use of `ephemeral`, adding media files with the same
+ name twice is not possible/guaranteed to work. An exception to this is the
+ use of `to_player` to send the same, already existent file to multiple
+ chosen players.
+ * Clients will attempt to fetch files added this way via remote media,
+ this can make transfer of bigger files painless (if set up). Nevertheless
+ it is advised not to use dynamic media for big media files.
Bans
----
@@ -5480,6 +5767,10 @@ Bans
* `minetest.kick_player(name, [reason])`: disconnect a player with an optional
reason.
* Returns boolean indicating success (false if player nonexistant)
+* `minetest.disconnect_player(name, [reason])`: disconnect a player with an
+ optional reason, this will not prefix with 'Kicked: ' like kick_player.
+ If no reason is given, it will default to 'Disconnected.'
+ * Returns boolean indicating success (false if player nonexistant)
Particles
---------
@@ -5721,7 +6012,9 @@ Misc.
* Example: `minetest.rgba(10, 20, 30, 40)`, returns `"#0A141E28"`
* `minetest.encode_base64(string)`: returns string encoded in base64
* Encodes a string in base64.
-* `minetest.decode_base64(string)`: returns string or nil for invalid base64
+* `minetest.decode_base64(string)`: returns string or nil on failure
+ * Padding characters are only supported starting at version 5.4.0, where
+ 5.5.0 and newer perform proper checks.
* Decodes a string encoded in base64.
* `minetest.is_protected(pos, name)`: returns boolean
* Returning `true` restricts the player `name` from modifying (i.e. digging,
@@ -5809,6 +6102,19 @@ Misc.
* If `transient` is `false` or absent, frees a persistent forceload.
If `true`, frees a transient forceload.
+* `minetest.compare_block_status(pos, condition)`
+ * Checks whether the mapblock at positition `pos` is in the wanted condition.
+ * `condition` may be one of the following values:
+ * `"unknown"`: not in memory
+ * `"emerging"`: in the queue for loading from disk or generating
+ * `"loaded"`: in memory but inactive (no ABMs are executed)
+ * `"active"`: in memory and active
+ * Other values are reserved for future functionality extensions
+ * Return value, the comparison status:
+ * `false`: Mapblock does not fulfil the wanted condition
+ * `true`: Mapblock meets the requirement
+ * `nil`: Unsupported `condition` value
+
* `minetest.request_insecure_environment()`: returns an environment containing
insecure functions if the calling mod has been listed as trusted in the
`secure.trusted_mods` setting or security is disabled, otherwise returns
@@ -6068,7 +6374,7 @@ an itemstring, a table or `nil`.
* `get_tool_capabilities()`: returns the digging properties of the item,
or those of the hand if none are defined for this item type
* `add_wear(amount)`
- * Increases wear by `amount` if the item is a tool
+ * Increases wear by `amount` if the item is a tool, otherwise does nothing
* `amount`: number, integer
* `add_item(item)`: returns leftover `ItemStack`
* Put some item or stack onto this stack
@@ -6262,6 +6568,8 @@ object you are working with still exists.
Default `{x=0, y=0, z=0}`
* `forced_visible`: Boolean to control whether the attached entity
should appear in first person. Default `false`.
+ * This command may fail silently (do nothing) when it would result
+ in circular attachments.
* `get_attach()`: returns parent, bone, position, rotation, forced_visible,
or nil if it isn't attached.
* `get_children()`: returns a list of ObjectRefs that are attached to the
@@ -6393,6 +6701,7 @@ object you are working with still exists.
* `set_inventory_formspec(formspec)`
* Redefine player's inventory form
* Should usually be called in `on_joinplayer`
+ * If `formspec` is `""`, the player's inventory is disabled.
* `get_inventory_formspec()`: returns a formspec string
* `set_formspec_prepend(formspec)`:
* the formspec string will be added to every formspec shown to the user,
@@ -6407,18 +6716,21 @@ object you are working with still exists.
`aux1`, `sneak`, `dig`, `place`, `LMB`, `RMB`, and `zoom`.
* The fields `LMB` and `RMB` are equal to `dig` and `place` respectively,
and exist only to preserve backwards compatibility.
+ * Returns an empty table `{}` if the object is not a player.
* `get_player_control_bits()`: returns integer with bit packed player pressed
- keys. Bits:
- * 0 - up
- * 1 - down
- * 2 - left
- * 3 - right
- * 4 - jump
- * 5 - aux1
- * 6 - sneak
- * 7 - dig
- * 8 - place
- * 9 - zoom
+ keys.
+ * Bits:
+ * 0 - up
+ * 1 - down
+ * 2 - left
+ * 3 - right
+ * 4 - jump
+ * 5 - aux1
+ * 6 - sneak
+ * 7 - dig
+ * 8 - place
+ * 9 - zoom
+ * Returns `0` (no bits set) if the object is not a player.
* `set_physics_override(override_table)`
* `override_table` is a table with the following fields:
* `speed`: multiplier to default walking speed value (default: `1`)
@@ -6487,43 +6799,46 @@ object you are working with still exists.
* `set_sky(sky_parameters)`
* The presence of the function `set_sun`, `set_moon` or `set_stars` indicates
whether `set_sky` accepts this format. Check the legacy format otherwise.
+ * Passing no arguments resets the sky to its default values.
* `sky_parameters` is a table with the following optional fields:
* `base_color`: ColorSpec, changes fog in "skybox" and "plain".
+ (default: `#ffffff`)
* `type`: Available types:
* `"regular"`: Uses 0 textures, `base_color` ignored
* `"skybox"`: Uses 6 textures, `base_color` used as fog.
* `"plain"`: Uses 0 textures, `base_color` used as both fog and sky.
+ (default: `"regular"`)
* `textures`: A table containing up to six textures in the following
order: Y+ (top), Y- (bottom), X- (west), X+ (east), Z+ (north), Z- (south).
* `clouds`: Boolean for whether clouds appear. (default: `true`)
- * `sky_color`: A table containing the following values, alpha is ignored:
- * `day_sky`: ColorSpec, for the top half of the `"regular"`
- sky during the day. (default: `#8cbafa`)
- * `day_horizon`: ColorSpec, for the bottom half of the
- `"regular"` sky during the day. (default: `#9bc1f0`)
- * `dawn_sky`: ColorSpec, for the top half of the `"regular"`
- sky during dawn/sunset. (default: `#b4bafa`)
+ * `sky_color`: A table used in `"regular"` type only, containing the
+ following values (alpha is ignored):
+ * `day_sky`: ColorSpec, for the top half of the sky during the day.
+ (default: `#61b5f5`)
+ * `day_horizon`: ColorSpec, for the bottom half of the sky during the day.
+ (default: `#90d3f6`)
+ * `dawn_sky`: ColorSpec, for the top half of the sky during dawn/sunset.
+ (default: `#b4bafa`)
The resulting sky color will be a darkened version of the ColorSpec.
Warning: The darkening of the ColorSpec is subject to change.
- * `dawn_horizon`: ColorSpec, for the bottom half of the `"regular"`
- sky during dawn/sunset. (default: `#bac1f0`)
+ * `dawn_horizon`: ColorSpec, for the bottom half of the sky during dawn/sunset.
+ (default: `#bac1f0`)
The resulting sky color will be a darkened version of the ColorSpec.
Warning: The darkening of the ColorSpec is subject to change.
- * `night_sky`: ColorSpec, for the top half of the `"regular"`
- sky during the night. (default: `#006aff`)
+ * `night_sky`: ColorSpec, for the top half of the sky during the night.
+ (default: `#006bff`)
The resulting sky color will be a dark version of the ColorSpec.
Warning: The darkening of the ColorSpec is subject to change.
- * `night_horizon`: ColorSpec, for the bottom half of the `"regular"`
- sky during the night. (default: `#4090ff`)
+ * `night_horizon`: ColorSpec, for the bottom half of the sky during the night.
+ (default: `#4090ff`)
The resulting sky color will be a dark version of the ColorSpec.
Warning: The darkening of the ColorSpec is subject to change.
- * `indoors`: ColorSpec, for when you're either indoors or
- underground. Only applies to the `"regular"` sky.
+ * `indoors`: ColorSpec, for when you're either indoors or underground.
(default: `#646464`)
* `fog_sun_tint`: ColorSpec, changes the fog tinting for the sun
- at sunrise and sunset.
+ at sunrise and sunset. (default: `#f47d1d`)
* `fog_moon_tint`: ColorSpec, changes the fog tinting for the moon
- at sunrise and sunset.
+ at sunrise and sunset. (default: `#7f99cc`)
* `fog_tint_type`: string, changes which mode the directional fog
abides by, `"custom"` uses `sun_tint` and `moon_tint`, while
`"default"` uses the classic Minetest sun and moon tinting.
@@ -6541,11 +6856,12 @@ object you are working with still exists.
* `get_sky_color()`: returns a table with the `sky_color` parameters as in
`set_sky`.
* `set_sun(sun_parameters)`:
+ * Passing no arguments resets the sun to its default values.
* `sun_parameters` is a table with the following optional fields:
* `visible`: Boolean for whether the sun is visible.
(default: `true`)
* `texture`: A regular texture for the sun. Setting to `""`
- will re-enable the mesh sun. (default: `"sun.png"`)
+ will re-enable the mesh sun. (default: "sun.png", if it exists)
* `tonemap`: A 512x1 texture containing the tonemap for the sun
(default: `"sun_tonemap.png"`)
* `sunrise`: A regular texture for the sunrise texture.
@@ -6556,17 +6872,19 @@ object you are working with still exists.
* `get_sun()`: returns a table with the current sun parameters as in
`set_sun`.
* `set_moon(moon_parameters)`:
+ * Passing no arguments resets the moon to its default values.
* `moon_parameters` is a table with the following optional fields:
* `visible`: Boolean for whether the moon is visible.
(default: `true`)
* `texture`: A regular texture for the moon. Setting to `""`
- will re-enable the mesh moon. (default: `"moon.png"`)
+ will re-enable the mesh moon. (default: "moon.png", if it exists)
* `tonemap`: A 512x1 texture containing the tonemap for the moon
(default: `"moon_tonemap.png"`)
* `scale`: Float controlling the overall size of the moon (default: `1`)
* `get_moon()`: returns a table with the current moon parameters as in
`set_moon`.
* `set_stars(star_parameters)`:
+ * Passing no arguments resets stars to their default values.
* `star_parameters` is a table with the following optional fields:
* `visible`: Boolean for whether the stars are visible.
(default: `true`)
@@ -6580,6 +6898,7 @@ object you are working with still exists.
* `get_stars()`: returns a table with the current stars parameters as in
`set_stars`.
* `set_clouds(cloud_parameters)`: set cloud parameters
+ * Passing no arguments resets clouds to their default values.
* `cloud_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, ColorSpec
@@ -6746,7 +7065,8 @@ It can be created via `Raycast(pos1, pos2, objects, liquids)` or
* `pos1`: start of the ray
* `pos2`: end of the ray
* `objects`: if false, only nodes will be returned. Default is true.
-* `liquids`: if false, liquid nodes won't be returned. Default is false.
+* `liquids`: if false, liquid nodes (`liquidtype ~= "none"`) won't be
+ returned. Default is false.
### Methods
@@ -6905,6 +7225,7 @@ Player properties need to be saved manually.
-- "sprite" uses 1 texture.
-- "upright_sprite" uses 2 textures: {front, back}.
-- "wielditem" expects 'textures = {itemname}' (see 'visual' above).
+ -- "mesh" requires one texture for each mesh buffer/material (in order)
colors = {},
-- Number of required colors depends on visual
@@ -6975,7 +7296,7 @@ Player properties need to be saved manually.
-- Default: false
infotext = "",
- -- By default empty, text to be shown when pointed at object
+ -- Same as infotext for nodes. Empty by default
static_save = true,
-- If false, never save this object statically. It will simply be
@@ -7076,6 +7397,11 @@ Used by `minetest.register_abm`.
-- Chance of triggering `action` per-node per-interval is 1.0 / this
-- value
+ min_y = -32768,
+ max_y = 32767,
+ -- min and max height levels where ABM will be processed
+ -- can be used to reduce CPU usage
+
catch_up = true,
-- If true, catch-up behaviour is enabled: The `chance` value is
-- temporarily reduced when returning to an area to simulate time lost
@@ -7225,6 +7551,8 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
range = 4.0,
liquids_pointable = false,
+ -- If true, item points to all liquid nodes (`liquidtype ~= "none"`),
+ -- even those for which `pointable = false`
light_source = 0,
-- When used for nodes: Defines amount of light emitted by node.
@@ -7233,7 +7561,7 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
-- A value outside the range 0 to minetest.LIGHT_MAX causes undefined
-- behavior.
- -- See "Tools" section for an example including explanation
+ -- See "Tool Capabilities" section for an example including explanation
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level = 0,
@@ -7280,12 +7608,17 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
},
on_place = function(itemstack, placer, pointed_thing),
- -- Shall place item and return the leftover itemstack.
+ -- When the 'place' key was pressed with the item in hand
+ -- and a node was pointed at.
+ -- Shall place item and return the leftover itemstack
+ -- or nil to not modify the inventory.
-- The placer may be any ObjectRef or nil.
-- default: minetest.item_place
on_secondary_use = function(itemstack, user, pointed_thing),
-- Same as on_place but called when not pointing at a node.
+ -- Function must return either nil if inventory shall not be modified,
+ -- or an itemstack to replace the original itemstack.
-- The user may be any ObjectRef or nil.
-- default: nil
@@ -7296,8 +7629,9 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
on_use = function(itemstack, user, pointed_thing),
-- default: nil
- -- Function must return either nil if no item shall be removed from
- -- inventory, or an itemstack to replace the original itemstack.
+ -- When user pressed the 'punch/mine' key with the item in hand.
+ -- Function must return either nil if inventory shall not be modified,
+ -- or an itemstack to replace the original itemstack.
-- e.g. itemstack:take_item(); return itemstack
-- Otherwise, the function is free to do what it wants.
-- The user may be any ObjectRef or nil.
@@ -7306,7 +7640,7 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
after_use = function(itemstack, user, node, digparams),
-- default: nil
-- If defined, should return an itemstack and will be called instead of
- -- wearing out the tool. If returns nil, does nothing.
+ -- wearing out the item (if tool). If returns nil, does nothing.
-- If after_use doesn't exist, it is the same as:
-- function(itemstack, user, node, digparams)
-- itemstack:add_wear(digparams.wear)
@@ -7407,24 +7741,54 @@ Used by `minetest.register_node`.
climbable = false, -- If true, can be climbed on (ladder)
+ move_resistance = 0,
+ -- Slows down movement of players through this node (max. 7).
+ -- If this is nil, it will be equal to liquid_viscosity.
+ -- Note: If liquid movement physics apply to the node
+ -- (see `liquid_move_physics`), the movement speed will also be
+ -- affected by the `movement_liquid_*` settings.
+
buildable_to = false, -- If true, placed nodes can replace this node
floodable = false,
-- If true, liquids flow into and replace this node.
-- Warning: making a liquid node 'floodable' will cause problems.
- liquidtype = "none", -- "none" / "source" / "flowing"
+ liquidtype = "none", -- specifies liquid flowing physics
+ -- * "none": no liquid flowing physics
+ -- * "source": spawns flowing liquid nodes at all 4 sides and below;
+ -- recommended drawtype: "liquid".
+ -- * "flowing": spawned from source, spawns more flowing liquid nodes
+ -- around it until `liquid_range` is reached;
+ -- will drain out without a source;
+ -- recommended drawtype: "flowingliquid".
+ -- If it's "source" or "flowing" and `liquid_range > 0`, then
+ -- both `liquid_alternative_*` fields must be specified
liquid_alternative_flowing = "", -- Flowing version of source liquid
liquid_alternative_source = "", -- Source version of flowing liquid
- liquid_viscosity = 0, -- Higher viscosity = slower flow (max. 7)
+ liquid_viscosity = 0,
+ -- Controls speed at which the liquid spreads/flows (max. 7).
+ -- 0 is fastest, 7 is slowest.
+ -- By default, this also slows down movement of players inside the node
+ -- (can be overridden using `move_resistance`)
liquid_renewable = true,
-- If true, a new liquid source can be created by placing two or more
-- sources nearby
+ liquid_move_physics = nil, -- specifies movement physics if inside node
+ -- * false: No liquid movement physics apply.
+ -- * true: Enables liquid movement physics. Enables things like
+ -- ability to "swim" up/down, sinking slowly if not moving,
+ -- smoother speed change when falling into, etc. The `movement_liquid_*`
+ -- settings apply.
+ -- * nil: Will be treated as true if `liquidype ~= "none"`
+ -- and as false otherwise.
+ -- Default: nil
+
leveled = 0,
-- Only valid for "nodebox" drawtype with 'type = "leveled"'.
-- Allows defining the nodebox height without using param2.
@@ -7434,9 +7798,12 @@ Used by `minetest.register_node`.
leveled_max = 127,
-- Maximum value for `leveled` (0-127), enforced in
-- `minetest.set_node_level` and `minetest.add_node_level`.
- -- Values above 124 might causes collision detection issues.
+ -- Values above 124 might causes collision detection issues.
- liquid_range = 8, -- Number of flowing nodes around source (max. 8)
+ liquid_range = 8,
+ -- Maximum distance that flowing liquid nodes can spread around
+ -- source on flat land;
+ -- maximum = 8; set to 0 to disable liquid flow
drowning = 0,
-- Player will take this amount of damage if no bubbles are left
@@ -7507,7 +7874,7 @@ Used by `minetest.register_node`.
-- While digging node.
-- If `"__group"`, then the sound will be
-- `default_dig_<groupname>`, where `<groupname>` is the
- -- name of the tool's digging group with the fastest digging time.
+ -- name of the item's digging group with the fastest digging time.
-- In case of a tie, one of the sounds will be played (but we
-- cannot predict which one)
-- Default value: `"__group"`
@@ -7531,14 +7898,13 @@ Used by `minetest.register_node`.
drop = "",
-- Name of dropped item when dug.
-- Default dropped item is the node itself.
- -- Using a table allows multiple items, drop chances and tool filtering.
- -- Tool filtering was undocumented until recently, tool filtering by string
- -- matching is deprecated.
+ -- Using a table allows multiple items, drop chances and item filtering.
+ -- Item filtering by string matching is deprecated.
drop = {
max_items = 1,
-- Maximum number of item lists to drop.
-- The entries in 'items' are processed in order. For each:
- -- Tool filtering is applied, chance of drop is applied, if both are
+ -- Item filtering is applied, chance of drop is applied, if both are
-- successful the entire item list is dropped.
-- Entry processing continues until the number of dropped item lists
-- equals 'max_items'.
@@ -7552,7 +7918,7 @@ Used by `minetest.register_node`.
items = {"default:diamond"},
},
{
- -- Only drop if using a tool whose name is identical to one
+ -- Only drop if using an item whose name is identical to one
-- of these.
tools = {"default:shovel_mese", "default:shovel_diamond"},
rarity = 5,
@@ -7563,14 +7929,24 @@ Used by `minetest.register_node`.
inherit_color = true,
},
{
- -- Only drop if using a tool whose name contains
- -- "default:shovel_" (this tool filtering by string matching
- -- is deprecated).
+ -- Only drop if using an item whose name contains
+ -- "default:shovel_" (this item filtering by string matching
+ -- is deprecated, use tool_groups instead).
tools = {"~default:shovel_"},
rarity = 2,
-- The item list dropped.
items = {"default:sand", "default:desert_sand"},
},
+ {
+ -- Only drop if using an item in the "magicwand" group, or
+ -- an item that is in both the "pickaxe" and the "lucky"
+ -- groups.
+ tool_groups = {
+ "magicwand",
+ {"pickaxe", "lucky"}
+ },
+ items = {"default:coal_lump"},
+ },
},
},
@@ -7634,9 +8010,9 @@ Used by `minetest.register_node`.
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing),
-- default: nil
- -- Called when clicker (an ObjectRef) "rightclicks"
- -- ("rightclick" here stands for the placement key) while pointing at
- -- the node at pos with 'node' being the node table.
+ -- Called when clicker (an ObjectRef) used the 'place/build' key
+ -- (not neccessarily an actual rightclick)
+ -- while pointing at the node at pos with 'node' being the node table.
-- itemstack will hold clicker's wielded item.
-- Shall return the leftover itemstack.
-- Note: pointed_thing can be nil, if a mod calls this function.
@@ -7645,7 +8021,7 @@ Used by `minetest.register_node`.
on_dig = function(pos, node, digger),
-- default: minetest.node_dig
- -- By default checks privileges, wears out tool and removes node.
+ -- By default checks privileges, wears out item (if tool) and removes node.
-- return true if the node was dug successfully, false otherwise.
-- Deprecated: returning nil is the same as returning true.
@@ -7732,10 +8108,22 @@ Used by `minetest.register_craft`.
{
type = "toolrepair",
- additional_wear = -0.02,
+ additional_wear = -0.02, -- multiplier of 65536
}
-Note: Tools with group `disable_repair=1` will not repairable by this recipe.
+Adds a shapeless recipe for *every* tool that doesn't have the `disable_repair=1`
+group. Player can put 2 equal tools in the craft grid to get one "repaired" tool
+back.
+The wear of the output is determined by the wear of both tools, plus a
+'repair bonus' given by `additional_wear`. To reduce the wear (i.e. 'repair'),
+you want `additional_wear` to be negative.
+
+The formula used to calculate the resulting wear is:
+
+ 65536 - ( (65536 - tool_1_wear) + (65536 - tool_2_wear) + 65536 * additional_wear )
+
+The result is rounded and can't be lower than 0. If the result is 65536 or higher,
+no crafting is possible.
### Cooking
@@ -7803,7 +8191,7 @@ See [Ores] section above for essential information.
spread = {x = 100, y = 100, z = 100},
seed = 23,
octaves = 3,
- persist = 0.7
+ persistence = 0.7
},
-- NoiseParams structure describing one of the perlin noises used for
-- ore distribution.
@@ -7832,7 +8220,7 @@ See [Ores] section above for essential information.
spread = {x = 100, y = 100, z = 100},
seed = 47,
octaves = 3,
- persist = 0.7
+ persistence = 0.7
},
np_puff_bottom = {
offset = 4,
@@ -7840,7 +8228,7 @@ See [Ores] section above for essential information.
spread = {x = 100, y = 100, z = 100},
seed = 11,
octaves = 3,
- persist = 0.7
+ persistence = 0.7
},
-- vein
@@ -7853,7 +8241,7 @@ See [Ores] section above for essential information.
spread = {x = 100, y = 100, z = 100},
seed = 17,
octaves = 3,
- persist = 0.7
+ persistence = 0.7
},
stratum_thickness = 8,
}
@@ -7980,7 +8368,7 @@ See [Decoration types]. Used by `minetest.register_decoration`.
spread = {x = 100, y = 100, z = 100},
seed = 354,
octaves = 3,
- persist = 0.7,
+ persistence = 0.7,
lacunarity = 2.0,
flags = "absvalue"
},
@@ -8236,6 +8624,9 @@ Used by `Player:hud_add`. Returned by `Player:hud_get`.
z_index = 0,
-- Z index : lower z-index HUDs are displayed behind higher z-index HUDs
+
+ style = 0,
+ -- For "text" elements sets font style: bitfield with 1 = bold, 2 = italic, 4 = monospace
}
Particle definition
@@ -8383,7 +8774,7 @@ Used by `HTTPApiTable.fetch` and `HTTPApiTable.fetch_async`.
url = "http://example.org",
timeout = 10,
- -- Timeout for connection in seconds. Default is 3 seconds.
+ -- Timeout for request to be completed in seconds. Default depends on engine settings.
method = "GET", "POST", "PUT" or "DELETE"
-- The http method to use. Defaults to "GET".
@@ -8475,3 +8866,10 @@ Used by `minetest.register_authentication_handler`.
-- Returns an iterator (use with `for` loops) for all player names
-- currently in the auth database
}
+
+Bit Library
+-----------
+
+Functions: bit.tobit, bit.tohex, bit.bnot, bit.band, bit.bor, bit.bxor, bit.lshift, bit.rshift, bit.arshift, bit.rol, bit.ror, bit.bswap
+
+See http://bitop.luajit.org/ for advanced information.
diff --git a/doc/menu_lua_api.txt b/doc/menu_lua_api.txt
index b3975bc1d..9bc0c46bd 100644
--- a/doc/menu_lua_api.txt
+++ b/doc/menu_lua_api.txt
@@ -1,4 +1,4 @@
-Minetest Lua Mainmenu API Reference 5.4.0
+Minetest Lua Mainmenu API Reference 5.5.0
=========================================
Introduction
@@ -85,7 +85,9 @@ core.get_video_drivers()
core.get_mapgen_names([include_hidden=false]) -> table of map generator algorithms
registered in the core (possible in async calls)
core.get_cache_path() -> path of cache
-core.get_temp_path() -> path of temp folder
+core.get_temp_path([param]) (possible in async calls)
+^ param=true: returns path to a temporary file
+^ otherwise: returns path to the temporary folder
HTTP Requests
@@ -204,7 +206,8 @@ core.get_screen_info()
display_width = <width of display>,
display_height = <height of display>,
window_width = <current window width>,
- window_height = <current window height>
+ window_height = <current window height>,
+ render_info = <active render information>
}
@@ -218,7 +221,13 @@ Package - content which is downloadable from the content db, may or may not be i
* returns path to global user data,
the directory that contains user-provided mods, worlds, games, and texture packs.
* core.get_modpath() (possible in async calls)
- * returns path to global modpath
+ * returns path to global modpath, where mods can be installed
+* core.get_modpaths() (possible in async calls)
+ * returns list of paths to global modpaths, where mods have been installed
+
+ The difference with "core.get_modpath" is that no mods should be installed in these
+ directories by Minetest -- they might be read-only.
+
* core.get_clientmodpath() (possible in async calls)
* returns path to global client-side modpath
* core.get_gamepath() (possible in async calls)
diff --git a/doc/minetest.6 b/doc/minetest.6
index bac70fe1a..6a3601f80 100644
--- a/doc/minetest.6
+++ b/doc/minetest.6
@@ -112,6 +112,10 @@ leveldb, and files.
Migrate from current players backend to another. Possible values are sqlite3,
leveldb, postgresql, dummy, and files.
.TP
+.B \-\-migrate-mod-storage <value>
+Migrate from current mod storage backend to another. Possible values are
+sqlite3, dummy, and files.
+.TP
.B \-\-terminal
Display an interactive terminal over ncurses during execution.
@@ -119,6 +123,9 @@ Display an interactive terminal over ncurses during execution.
.TP
.B MINETEST_SUBGAME_PATH
Colon delimited list of directories to search for games.
+.TP
+.B MINETEST_MOD_PATH
+Colon delimited list of directories to search for mods.
.SH BUGS
Please report all bugs at https://github.com/minetest/minetest/issues.
diff --git a/doc/texture_packs.txt b/doc/texture_packs.txt
index 8af2cbad6..f738032b6 100644
--- a/doc/texture_packs.txt
+++ b/doc/texture_packs.txt
@@ -90,9 +90,10 @@ by texture packs. All existing fallback textures can be found in the directory
* `minimap_mask_square.png`: mask used for the square minimap
* `minimap_overlay_round.png`: overlay texture for the round minimap
* `minimap_overlay_square.png`: overlay texture for the square minimap
-* `no_texture_airlike.png`: fallback inventory image for airlike nodes
* `object_marker_red.png`: texture for players on the minimap
* `player_marker.png`: texture for the own player on the square minimap
+* `no_texture_airlike.png`: fallback inventory image for airlike nodes
+* `no_texture.png`: fallback image for unspecified textures
* `player.png`: front texture of the 2D upright sprite player
* `player_back.png`: back texture of the 2D upright sprite player
diff --git a/doc/world_format.txt b/doc/world_format.txt
index a8a9e463e..eb1d7f728 100644
--- a/doc/world_format.txt
+++ b/doc/world_format.txt
@@ -1,5 +1,5 @@
=============================
-Minetest World Format 22...27
+Minetest World Format 22...29
=============================
This applies to a world format carrying the block serialization version
@@ -8,6 +8,7 @@ This applies to a world format carrying the block serialization version
- 0.4.0 (23)
- 24 was never released as stable and existed for ~2 days
- 27 was added in 0.4.15-dev
+- 29 was added in 5.5.0-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
@@ -281,6 +282,8 @@ MapBlock serialization format
NOTE: Byte order is MSB first (big-endian).
NOTE: Zlib data is in such a format that Python's zlib at least can
directly decompress.
+NOTE: Since version 29 zstd is used instead of zlib. In addition the entire
+ block is first serialized and then compressed (except the version byte).
u8 version
- map format version number, see serialisation.h for the latest number
@@ -324,6 +327,20 @@ u16 lighting_complete
then Minetest will correct lighting in the day light bank when
the block at (1, 0, 0) is also loaded.
+if map format version >= 29:
+ u32 timestamp
+ - Timestamp when last saved, as seconds from starting the game.
+ - 0xffffffff = invalid/unknown timestamp, nothing should be done with the time
+ difference when loaded
+
+ u16 num_name_id_mappings
+ foreach num_name_id_mappings
+ u16 id
+ u16 name_len
+ u8[name_len] name
+if map format version < 29:
+ -- Nothing right here, timpstamp and node id mappings are serialized later
+
u8 content_width
- Number of bytes in the content (param0) fields of nodes
if map format version <= 23:
@@ -335,7 +352,7 @@ u8 params_width
- Number of bytes used for parameters per node
- Always 2
-zlib-compressed node data:
+node data (zlib-compressed if version < 29):
if content_width == 1:
- content:
u8[4096]: param0 fields
@@ -348,31 +365,31 @@ if content_width == 2:
u8[4096]: param2 fields
- The location of a node in each of those arrays is (z*16*16 + y*16 + x).
-zlib-compressed node metadata list
+node metadata list (zlib-compressed if version < 29):
- content:
-if map format version <= 22:
- u16 version (=1)
- u16 count of metadata
- foreach count:
- u16 position (p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X)
- u16 type_id
- u16 content_size
- u8[content_size] content of metadata. Format depends on type_id, see below.
-if map format version >= 23:
- u8 version -- Note: type was u16 for map format version <= 22
- -- = 1 for map format version < 28
- -- = 2 since map format version 28
- u16 count of metadata
- foreach count:
- u16 position (p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X)
- u32 num_vars
- foreach num_vars:
- u16 key_len
- u8[key_len] key
- u32 val_len
- u8[val_len] value
- u8 is_private -- only for version >= 2. 0 = not private, 1 = private
- serialized inventory
+ if map format version <= 22:
+ u16 version (=1)
+ u16 count of metadata
+ foreach count:
+ u16 position (p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X)
+ u16 type_id
+ u16 content_size
+ u8[content_size] content of metadata. Format depends on type_id, see below.
+ if map format version >= 23:
+ u8 version -- Note: type was u16 for map format version <= 22
+ -- = 1 for map format version < 28
+ -- = 2 since map format version 28
+ u16 count of metadata
+ foreach count:
+ u16 position (p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X)
+ u32 num_vars
+ foreach num_vars:
+ u16 key_len
+ u8[key_len] key
+ u32 val_len
+ u8[val_len] value
+ u8 is_private -- only for version >= 2. 0 = not private, 1 = private
+ serialized inventory
- Node timers
if map format version == 23:
@@ -403,20 +420,18 @@ foreach static_object_count:
u16 data_size
u8[data_size] data
-u32 timestamp
-- Timestamp when last saved, as seconds from starting the game.
-- 0xffffffff = invalid/unknown timestamp, nothing should be done with the time
- difference when loaded
-
-u8 name-id-mapping version
-- Always 0
+if map format version < 29:
+ u32 timestamp
+ - Same meaning as the timestamp further up
-u16 num_name_id_mappings
+ u8 name-id-mapping version
+ - Always 0
-foreach num_name_id_mappings
- u16 id
- u16 name_len
- u8[name_len] name
+ u16 num_name_id_mappings
+ foreach num_name_id_mappings
+ u16 id
+ u16 name_len
+ u8[name_len] name
- Node timers
if map format version == 25:
diff --git a/fonts/mono_dejavu_sans_10.xml b/fonts/mono_dejavu_sans_10.xml
deleted file mode 100644
index 0276cedb6..000000000
--- a/fonts/mono_dejavu_sans_10.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_100.png b/fonts/mono_dejavu_sans_100.png
deleted file mode 100644
index 45a312542..000000000
--- a/fonts/mono_dejavu_sans_100.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_11.xml b/fonts/mono_dejavu_sans_11.xml
deleted file mode 100644
index f727ed2bb..000000000
--- a/fonts/mono_dejavu_sans_11.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_110.png b/fonts/mono_dejavu_sans_110.png
deleted file mode 100644
index c90c0e242..000000000
--- a/fonts/mono_dejavu_sans_110.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_12.xml b/fonts/mono_dejavu_sans_12.xml
deleted file mode 100644
index 38f6427be..000000000
--- a/fonts/mono_dejavu_sans_12.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_120.png b/fonts/mono_dejavu_sans_120.png
deleted file mode 100644
index 0cebd70e8..000000000
--- a/fonts/mono_dejavu_sans_120.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_14.xml b/fonts/mono_dejavu_sans_14.xml
deleted file mode 100644
index b90a34960..000000000
--- a/fonts/mono_dejavu_sans_14.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_140.png b/fonts/mono_dejavu_sans_140.png
deleted file mode 100644
index a413759ea..000000000
--- a/fonts/mono_dejavu_sans_140.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_16.xml b/fonts/mono_dejavu_sans_16.xml
deleted file mode 100644
index 3f7d2c2a2..000000000
--- a/fonts/mono_dejavu_sans_16.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_160.png b/fonts/mono_dejavu_sans_160.png
deleted file mode 100644
index bd8a2f40a..000000000
--- a/fonts/mono_dejavu_sans_160.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_18.xml b/fonts/mono_dejavu_sans_18.xml
deleted file mode 100644
index 92865cbfc..000000000
--- a/fonts/mono_dejavu_sans_18.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_180.png b/fonts/mono_dejavu_sans_180.png
deleted file mode 100644
index a299afcbe..000000000
--- a/fonts/mono_dejavu_sans_180.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_20.xml b/fonts/mono_dejavu_sans_20.xml
deleted file mode 100644
index acd8c77d0..000000000
--- a/fonts/mono_dejavu_sans_20.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_200.png b/fonts/mono_dejavu_sans_200.png
deleted file mode 100644
index 68ee62681..000000000
--- a/fonts/mono_dejavu_sans_200.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_22.xml b/fonts/mono_dejavu_sans_22.xml
deleted file mode 100644
index eafb4def6..000000000
--- a/fonts/mono_dejavu_sans_22.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_220.png b/fonts/mono_dejavu_sans_220.png
deleted file mode 100644
index 042d7e094..000000000
--- a/fonts/mono_dejavu_sans_220.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_24.xml b/fonts/mono_dejavu_sans_24.xml
deleted file mode 100644
index fc8b6232e..000000000
--- a/fonts/mono_dejavu_sans_24.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_240.png b/fonts/mono_dejavu_sans_240.png
deleted file mode 100644
index d2d68c5bb..000000000
--- a/fonts/mono_dejavu_sans_240.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_26.xml b/fonts/mono_dejavu_sans_26.xml
deleted file mode 100644
index 829f09948..000000000
--- a/fonts/mono_dejavu_sans_26.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_260.png b/fonts/mono_dejavu_sans_260.png
deleted file mode 100644
index 3a8cb6c57..000000000
--- a/fonts/mono_dejavu_sans_260.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_28.xml b/fonts/mono_dejavu_sans_28.xml
deleted file mode 100644
index b5b25bd07..000000000
--- a/fonts/mono_dejavu_sans_28.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_280.png b/fonts/mono_dejavu_sans_280.png
deleted file mode 100644
index ccf62ba48..000000000
--- a/fonts/mono_dejavu_sans_280.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_4.xml b/fonts/mono_dejavu_sans_4.xml
deleted file mode 100644
index cfebb39b3..000000000
--- a/fonts/mono_dejavu_sans_4.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_40.png b/fonts/mono_dejavu_sans_40.png
deleted file mode 100644
index 24ed693f7..000000000
--- a/fonts/mono_dejavu_sans_40.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_6.xml b/fonts/mono_dejavu_sans_6.xml
deleted file mode 100644
index d0e1de21d..000000000
--- a/fonts/mono_dejavu_sans_6.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_60.png b/fonts/mono_dejavu_sans_60.png
deleted file mode 100644
index 326af996f..000000000
--- a/fonts/mono_dejavu_sans_60.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_8.xml b/fonts/mono_dejavu_sans_8.xml
deleted file mode 100644
index c48bf7ccc..000000000
--- a/fonts/mono_dejavu_sans_8.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_80.png b/fonts/mono_dejavu_sans_80.png
deleted file mode 100644
index 04326dbb2..000000000
--- a/fonts/mono_dejavu_sans_80.png
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_9.xml b/fonts/mono_dejavu_sans_9.xml
deleted file mode 100644
index 74e841034..000000000
--- a/fonts/mono_dejavu_sans_9.xml
+++ /dev/null
Binary files differ
diff --git a/fonts/mono_dejavu_sans_90.png b/fonts/mono_dejavu_sans_90.png
deleted file mode 100644
index 65ac51858..000000000
--- a/fonts/mono_dejavu_sans_90.png
+++ /dev/null
Binary files differ
diff --git a/games/devtest/menu/background.png b/games/devtest/menu/background.png
index 415bb3d14..89c45fcd5 100644
--- a/games/devtest/menu/background.png
+++ b/games/devtest/menu/background.png
Binary files differ
diff --git a/games/devtest/mods/basetools/init.lua b/games/devtest/mods/basetools/init.lua
index bd7480030..fd83b82eb 100644
--- a/games/devtest/mods/basetools/init.lua
+++ b/games/devtest/mods/basetools/init.lua
@@ -16,11 +16,11 @@ Tool types:
Tool materials:
-* Dirt: dig nodes of rating 3, one use only
* Wood: dig nodes of rating 3
* Stone: dig nodes of rating 3 or 2
* Steel: dig nodes of rating 3, 2 or 1
* Mese: dig "everything" instantly
+* n-Uses: can be used n times before breaking
]]
-- The hand
@@ -92,20 +92,6 @@ minetest.register_tool("basetools:pick_mese", {
-- Pickaxes: Dig cracky
--
--- This should break after only 1 use
-minetest.register_tool("basetools:pick_dirt", {
- description = "Dirt Pickaxe".."\n"..
- "Digs cracky=3".."\n"..
- "1 use only",
- inventory_image = "basetools_dirtpick.png",
- tool_capabilities = {
- max_drop_level=0,
- groupcaps={
- cracky={times={[3]=2.00}, uses=1, maxlevel=0}
- },
- },
-})
-
minetest.register_tool("basetools:pick_wood", {
description = "Wooden Pickaxe".."\n"..
"Digs cracky=3",
@@ -348,3 +334,31 @@ minetest.register_tool("basetools:dagger_steel", {
damage_groups = {fleshy=2},
}
})
+
+-- Test tool uses and punch_attack_uses
+local uses = { 1, 2, 3, 5, 10, 50, 100, 1000, 10000, 65535 }
+for i=1, #uses do
+ local u = uses[i]
+ local color = string.format("#FF00%02X", math.floor(((i-1)/#uses) * 255))
+ minetest.register_tool("basetools:pick_uses_"..string.format("%05d", u), {
+ description = u.."-Uses Pickaxe".."\n"..
+ "Digs cracky=3",
+ inventory_image = "basetools_steelpick.png^[colorize:"..color..":127",
+ tool_capabilities = {
+ max_drop_level=0,
+ groupcaps={
+ cracky={times={[3]=0.1, [2]=0.2, [1]=0.3}, uses=u, maxlevel=0}
+ },
+ },
+ })
+
+ minetest.register_tool("basetools:sword_uses_"..string.format("%05d", u), {
+ description = u.."-Uses Sword".."\n"..
+ "Damage: fleshy=1",
+ inventory_image = "basetools_woodsword.png^[colorize:"..color..":127",
+ tool_capabilities = {
+ damage_groups = {fleshy=1},
+ punch_attack_uses = u,
+ },
+ })
+end
diff --git a/games/devtest/mods/basetools/textures/basetools_dirtpick.png b/games/devtest/mods/basetools/textures/basetools_dirtpick.png
deleted file mode 100644
index 20a021d72..000000000
--- a/games/devtest/mods/basetools/textures/basetools_dirtpick.png
+++ /dev/null
Binary files differ
diff --git a/games/devtest/mods/broken/init.lua b/games/devtest/mods/broken/init.lua
new file mode 100644
index 000000000..04993ca16
--- /dev/null
+++ b/games/devtest/mods/broken/init.lua
@@ -0,0 +1,11 @@
+-- Register stuff with empty definitions to test if Minetest fallback options
+-- for these things work properly.
+
+-- The itemstrings are deliberately kept descriptive to keep them easy to
+-- recognize.
+
+minetest.register_node("broken:node_with_empty_definition", {})
+minetest.register_tool("broken:tool_with_empty_definition", {})
+minetest.register_craftitem("broken:craftitem_with_empty_definition", {})
+
+minetest.register_entity("broken:entity_with_empty_definition", {})
diff --git a/games/devtest/mods/broken/mod.conf b/games/devtest/mods/broken/mod.conf
new file mode 100644
index 000000000..a24378a34
--- /dev/null
+++ b/games/devtest/mods/broken/mod.conf
@@ -0,0 +1,2 @@
+name = broken
+description = Register items and an entity with empty definitions to test fallback
diff --git a/games/devtest/mods/experimental/commands.lua b/games/devtest/mods/experimental/commands.lua
index 132b08b0b..e42ae954d 100644
--- a/games/devtest/mods/experimental/commands.lua
+++ b/games/devtest/mods/experimental/commands.lua
@@ -131,10 +131,11 @@ local function place_nodes(param)
p2_max = 63
elseif def.paramtype2 == "leveled" then
p2_max = 127
- elseif def.paramtype2 == "degrotate" and def.drawtype == "plantlike" then
- p2_max = 179
+ elseif def.paramtype2 == "degrotate" and (def.drawtype == "plantlike" or def.drawtype == "mesh") then
+ p2_max = 239
elseif def.paramtype2 == "colorfacedir" or
def.paramtype2 == "colorwallmounted" or
+ def.paramtype2 == "colordegrotate" or
def.paramtype2 == "color" then
p2_max = 255
end
@@ -143,7 +144,8 @@ local function place_nodes(param)
-- Skip undefined param2 values
if not ((def.paramtype2 == "meshoptions" and p2 % 8 > 4) or
(def.paramtype2 == "colorwallmounted" and p2 % 8 > 5) or
- (def.paramtype2 == "colorfacedir" and p2 % 32 > 23)) then
+ ((def.paramtype2 == "colorfacedir" or def.paramtype2 == "colordegrotate")
+ and p2 % 32 > 23)) then
minetest.set_node(pos, { name = itemstring, param2 = p2 })
nodes_placed = nodes_placed + 1
@@ -215,5 +217,5 @@ minetest.register_chatcommand("test_place_nodes", {
})
core.register_on_chatcommand(function(name, command, params)
- minetest.log("caught command '"..command.."', issued by '"..name.."'. Parameters: '"..params.."'")
+ minetest.log("action", "caught command '"..command.."', issued by '"..name.."'. Parameters: '"..params.."'")
end)
diff --git a/games/devtest/mods/testformspec/formspec.lua b/games/devtest/mods/testformspec/formspec.lua
index 2a2bdad60..c0db695b7 100644
--- a/games/devtest/mods/testformspec/formspec.lua
+++ b/games/devtest/mods/testformspec/formspec.lua
@@ -270,6 +270,16 @@ local scroll_fs =
--style_type[label;border=;bgcolor=]
--label[0.75,2;Reset]
+local window = {
+ sizex = 12,
+ sizey = 13,
+ positionx = 0.5,
+ positiony = 0.5,
+ anchorx = 0.5,
+ anchory = 0.5,
+ paddingx = 0.05,
+ paddingy = 0.05
+}
local pages = {
-- Real Coordinates
@@ -341,9 +351,28 @@ local pages = {
"size[12,13]real_coordinates[true]" ..
"container[0.5,1.5]" .. tabheaders_fs .. "container_end[]",
- -- Inv
+ -- Inv
"size[12,13]real_coordinates[true]" .. inv_style_fs,
+ -- Window
+ function()
+ return "formspec_version[3]" ..
+ string.format("size[%s,%s]position[%s,%s]anchor[%s,%s]padding[%s,%s]",
+ window.sizex, window.sizey, window.positionx, window.positiony,
+ window.anchorx, window.anchory, window.paddingx, window.paddingy) ..
+ string.format("field[0.5,0.5;2.5,0.5;sizex;X Size;%s]field[3.5,0.5;2.5,0.5;sizey;Y Size;%s]" ..
+ "field[0.5,1.5;2.5,0.5;positionx;X Position;%s]field[3.5,1.5;2.5,0.5;positiony;Y Position;%s]" ..
+ "field[0.5,2.5;2.5,0.5;anchorx;X Anchor;%s]field[3.5,2.5;2.5,0.5;anchory;Y Anchor;%s]" ..
+ "field[0.5,3.5;2.5,0.5;paddingx;X Padding;%s]field[3.5,3.5;2.5,0.5;paddingy;Y Padding;%s]" ..
+ "button[2,4.5;2.5,0.5;submit_window;Submit]",
+ window.sizex, window.sizey, window.positionx, window.positiony,
+ window.anchorx, window.anchory, window.paddingx, window.paddingy) ..
+ "field_close_on_enter[sizex;false]field_close_on_enter[sizey;false]" ..
+ "field_close_on_enter[positionx;false]field_close_on_enter[positiony;false]" ..
+ "field_close_on_enter[anchorx;false]field_close_on_enter[anchory;false]" ..
+ "field_close_on_enter[paddingx;false]field_close_on_enter[paddingy;false]"
+ end,
+
-- Animation
[[
formspec_version[3]
@@ -362,20 +391,55 @@ Number]
animated_image[5.5,0.5;5,2;;testformspec_animation.png;4;100]
animated_image[5.5,2.75;5,2;;testformspec_animation.jpg;4;100]
+ ]],
+
+ -- Model
+ [[
+ formspec_version[3]
+ size[12,13]
style[m1;bgcolor=black]
- model[0.5,6;4,4;m1;testformspec_character.b3d;testformspec_character.png]
- model[5,6;4,4;m2;testformspec_chest.obj;default_chest_top.png,default_chest_top.png,default_chest_side.png,default_chest_side.png,default_chest_front.png,default_chest_inside.png;30,1;true;true]
+ style[m2;bgcolor=black]
+ label[5,1;all defaults]
+ label[5,5.1;angle = 0, 180
+continuous = false
+mouse control = false
+frame loop range = 0,30]
+ label[5,9.2;continuous = true
+mouse control = true]
+ model[0.5,0.1;4,4;m1;testformspec_character.b3d;testformspec_character.png]
+ model[0.5,4.2;4,4;m2;testformspec_character.b3d;testformspec_character.png;0,180;false;false;0,30]
+ model[0.5,8.3;4,4;m3;testformspec_chest.obj;default_chest_top.png,default_chest_top.png,default_chest_side.png,default_chest_side.png,default_chest_front.png,default_chest_inside.png;30,1;true;true]
]],
-- Scroll containers
"formspec_version[3]size[12,13]" ..
scroll_fs,
+
+ -- Sound
+ [[
+ formspec_version[3]
+ size[12,13]
+ style[snd_btn;sound=soundstuff_mono]
+ style[snd_ibtn;sound=soundstuff_mono]
+ style[snd_drp;sound=soundstuff_mono]
+ style[snd_chk;sound=soundstuff_mono]
+ style[snd_tab;sound=soundstuff_mono]
+ button[0.5,0.5;2,1;snd_btn;Sound]
+ image_button[0.5,2;2,1;testformspec_item.png;snd_ibtn;Sound]
+ dropdown[0.5,4;4;snd_drp;Sound,Two,Three;]
+ checkbox[0.5,5.5.5;snd_chk;Sound;]
+ tabheader[0.5,7;8,0.65;snd_tab;Soundtab1,Soundtab2,Soundtab3;1;false;false]
+ ]],
}
-local function show_test_formspec(pname, page_id)
- page_id = page_id or 2
+local page_id = 2
+local function show_test_formspec(pname)
+ local page = pages[page_id]
+ if type(page) == "function" then
+ page = page()
+ end
- local fs = pages[page_id] .. "tabheader[0,0;8,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Invs,Anim,ScrollC;" .. page_id .. ";false;false]"
+ local fs = page .. "tabheader[0,0;8,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Invs,Window,Anim,Model,ScrollC,Sound;" .. page_id .. ";false;false]"
minetest.show_formspec(pname, "testformspec:formspec", fs)
end
@@ -385,9 +449,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
return false
end
-
if fields.maintabs then
- show_test_formspec(player:get_player_name(), tonumber(fields.maintabs))
+ page_id = tonumber(fields.maintabs)
+ show_test_formspec(player:get_player_name())
return true
end
@@ -403,6 +467,26 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
minetest.chat_send_player(player:get_player_name(), "Hypertext action received: " .. tostring(fields.hypertext))
return true
end
+
+ for name, value in pairs(fields) do
+ if window[name] then
+ print(name, window[name])
+ local num_val = tonumber(value) or 0
+
+ if name == "sizex" and num_val < 4 then
+ num_val = 6.5
+ elseif name == "sizey" and num_val < 5 then
+ num_val = 5.5
+ end
+
+ window[name] = num_val
+ print(name, window[name])
+ end
+ end
+
+ if fields.submit_window then
+ show_test_formspec(player:get_player_name())
+ end
end)
minetest.register_chatcommand("test_formspec", {
diff --git a/games/devtest/mods/testhud/init.lua b/games/devtest/mods/testhud/init.lua
new file mode 100644
index 000000000..2fa12fd71
--- /dev/null
+++ b/games/devtest/mods/testhud/init.lua
@@ -0,0 +1,81 @@
+local player_huds = {}
+
+local states = {
+ {0, "Normal font"},
+ {1, "Bold font"},
+ {2, "Italic font"},
+ {3, "Bold and italic font"},
+ {4, "Monospace font"},
+ {5, "Bold and monospace font"},
+ {7, "ZOMG all the font styles"},
+}
+
+
+local default_def = {
+ hud_elem_type = "text",
+ position = {x = 0.5, y = 0.5},
+ scale = {x = 2, y = 2},
+ alignment = { x = 0, y = 0 },
+}
+
+local function add_hud(player, state)
+ local def = table.copy(default_def)
+ local statetbl = states[state]
+ def.offset = {x = 0, y = 32 * state}
+ def.style = statetbl[1]
+ def.text = statetbl[2]
+ return player:hud_add(def)
+end
+
+minetest.register_on_leaveplayer(function(player)
+ player_huds[player:get_player_name()] = nil
+end)
+
+local etime = 0
+local state = 0
+
+minetest.register_globalstep(function(dtime)
+ etime = etime + dtime
+ if etime < 1 then
+ return
+ end
+ etime = 0
+ for _, player in ipairs(minetest.get_connected_players()) do
+ local huds = player_huds[player:get_player_name()]
+ if huds then
+ for i, hud_id in ipairs(huds) do
+ local statetbl = states[(state + i) % #states + 1]
+ player:hud_change(hud_id, "style", statetbl[1])
+ player:hud_change(hud_id, "text", statetbl[2])
+ end
+ end
+ end
+ state = state + 1
+end)
+
+minetest.register_chatcommand("hudfonts", {
+ params = "",
+ description = "Show/Hide some text on the HUD with various font options",
+ func = function(name, param)
+ local player = minetest.get_player_by_name(name)
+ local param = tonumber(param) or 0
+ param = math.min(math.max(param, 1), #states)
+ if player_huds[name] == nil then
+ player_huds[name] = {}
+ for i = 1, param do
+ table.insert(player_huds[name], add_hud(player, i))
+ end
+ minetest.chat_send_player(name, ("%d HUD element(s) added."):format(param))
+ else
+ local huds = player_huds[name]
+ if huds then
+ for _, hud_id in ipairs(huds) do
+ player:hud_remove(hud_id)
+ end
+ minetest.chat_send_player(name, "All HUD elements removed.")
+ end
+ player_huds[name] = nil
+ end
+ return true
+ end,
+})
diff --git a/games/devtest/mods/testhud/mod.conf b/games/devtest/mods/testhud/mod.conf
new file mode 100644
index 000000000..ed9f65c59
--- /dev/null
+++ b/games/devtest/mods/testhud/mod.conf
@@ -0,0 +1,2 @@
+name = testhud
+description = For testing HUD functionality
diff --git a/games/devtest/mods/testnodes/drawtypes.lua b/games/devtest/mods/testnodes/drawtypes.lua
index ff970144d..208774f6c 100644
--- a/games/devtest/mods/testnodes/drawtypes.lua
+++ b/games/devtest/mods/testnodes/drawtypes.lua
@@ -15,22 +15,6 @@ testing this node easier and more convenient.
local S = minetest.get_translator("testnodes")
--- If set to true, will show an inventory image for nodes that have no inventory image as of Minetest 5.1.0.
--- This is due to <https://github.com/minetest/minetest/issues/9209>.
--- This is only added to make the items more visible to avoid confusion, but you will no longer see
--- the default inventory images for these items. When you want to test the default inventory image of drawtypes,
--- this should be turned off.
--- TODO: Remove support for fallback inventory image as soon #9209 is fixed.
-local SHOW_FALLBACK_IMAGE = minetest.settings:get_bool("testnodes_show_fallback_image", false)
-
-local fallback_image = function(img)
- if SHOW_FALLBACK_IMAGE then
- return img
- else
- return nil
- end
-end
-
-- A regular cube
minetest.register_node("testnodes:normal", {
description = S("Normal Drawtype Test Node"),
@@ -145,20 +129,15 @@ minetest.register_node("testnodes:fencelike", {
})
minetest.register_node("testnodes:torchlike", {
- description = S("Torchlike Drawtype Test Node"),
+ description = S("Floor Torchlike Drawtype Test Node"),
drawtype = "torchlike",
paramtype = "light",
- tiles = {
- "testnodes_torchlike_floor.png",
- "testnodes_torchlike_ceiling.png",
- "testnodes_torchlike_wall.png",
- },
+ tiles = { "testnodes_torchlike_floor.png^[colorize:#FF0000:64" },
walkable = false,
sunlight_propagates = true,
groups = { dig_immediate = 3 },
- inventory_image = fallback_image("testnodes_torchlike_floor.png"),
})
minetest.register_node("testnodes:torchlike_wallmounted", {
@@ -176,12 +155,22 @@ minetest.register_node("testnodes:torchlike_wallmounted", {
walkable = false,
sunlight_propagates = true,
groups = { dig_immediate = 3 },
- inventory_image = fallback_image("testnodes_torchlike_floor.png"),
})
+minetest.register_node("testnodes:signlike", {
+ description = S("Floor Signlike Drawtype Test Node"),
+ drawtype = "signlike",
+ paramtype = "light",
+ tiles = { "testnodes_signlike.png^[colorize:#FF0000:64" },
-minetest.register_node("testnodes:signlike", {
+ walkable = false,
+ groups = { dig_immediate = 3 },
+ sunlight_propagates = true,
+})
+
+
+minetest.register_node("testnodes:signlike_wallmounted", {
description = S("Wallmounted Signlike Drawtype Test Node"),
drawtype = "signlike",
paramtype = "light",
@@ -192,7 +181,6 @@ minetest.register_node("testnodes:signlike", {
walkable = false,
groups = { dig_immediate = 3 },
sunlight_propagates = true,
- inventory_image = fallback_image("testnodes_signlike.png"),
})
minetest.register_node("testnodes:plantlike", {
@@ -220,9 +208,46 @@ minetest.register_node("testnodes:plantlike_waving", {
groups = { dig_immediate = 3 },
})
+minetest.register_node("testnodes:plantlike_wallmounted", {
+ description = S("Wallmounted Plantlike Drawtype Test Node"),
+ drawtype = "plantlike",
+ paramtype = "light",
+ paramtype2 = "wallmounted",
+ tiles = { "testnodes_plantlike_wallmounted.png" },
+ leveled = 1,
+
+
+ walkable = false,
+ sunlight_propagates = true,
+ groups = { dig_immediate = 3 },
+})
-- param2 will rotate
+local function rotate_on_rightclick(pos, node, clicker)
+ local def = minetest.registered_nodes[node.name]
+ local aux1 = clicker:get_player_control().aux1
+
+ local deg, deg_max
+ local color, color_mult = 0, 0
+ if def.paramtype2 == "degrotate" then
+ deg = node.param2
+ deg_max = 240
+ elseif def.paramtype2 == "colordegrotate" then
+ -- MSB [3x color, 5x rotation] LSB
+ deg = node.param2 % 2^5
+ deg_max = 24
+ color_mult = 2^5
+ color = math.floor(node.param2 / color_mult)
+ end
+
+ deg = (deg + (aux1 and 10 or 1)) % deg_max
+ node.param2 = color * color_mult + deg
+ minetest.swap_node(pos, node)
+ minetest.chat_send_player(clicker:get_player_name(),
+ "Rotation is now " .. deg .. " / " .. deg_max)
+end
+
minetest.register_node("testnodes:plantlike_degrotate", {
description = S("Degrotate Plantlike Drawtype Test Node"),
drawtype = "plantlike",
@@ -230,12 +255,43 @@ minetest.register_node("testnodes:plantlike_degrotate", {
paramtype2 = "degrotate",
tiles = { "testnodes_plantlike_degrotate.png" },
-
+ on_rightclick = rotate_on_rightclick,
+ place_param2 = 7,
walkable = false,
sunlight_propagates = true,
groups = { dig_immediate = 3 },
})
+minetest.register_node("testnodes:mesh_degrotate", {
+ description = S("Degrotate Mesh Drawtype Test Node"),
+ drawtype = "mesh",
+ paramtype = "light",
+ paramtype2 = "degrotate",
+ mesh = "testnodes_ocorner.obj",
+ tiles = { "testnodes_mesh_stripes2.png" },
+
+ on_rightclick = rotate_on_rightclick,
+ place_param2 = 10, -- 15°
+ sunlight_propagates = true,
+ groups = { dig_immediate = 3 },
+})
+
+minetest.register_node("testnodes:mesh_colordegrotate", {
+ description = S("Color Degrotate Mesh Drawtype Test Node"),
+ drawtype = "mesh",
+ paramtype = "light",
+ paramtype2 = "colordegrotate",
+ palette = "testnodes_palette_facedir.png",
+ mesh = "testnodes_ocorner.obj",
+ tiles = { "testnodes_mesh_stripes3.png" },
+
+ on_rightclick = rotate_on_rightclick,
+ -- color index 1, 1 step (=15°) rotated
+ place_param2 = 1 * 2^5 + 1,
+ sunlight_propagates = true,
+ groups = { dig_immediate = 3 },
+})
+
-- param2 will change height
minetest.register_node("testnodes:plantlike_leveled", {
description = S("Leveled Plantlike Drawtype Test Node"),
@@ -277,6 +333,20 @@ minetest.register_node("testnodes:plantlike_rooted", {
groups = { dig_immediate = 3 },
})
+minetest.register_node("testnodes:plantlike_rooted_wallmounted", {
+ description = S("Wallmounted Rooted Plantlike Drawtype Test Node"),
+ drawtype = "plantlike_rooted",
+ paramtype = "light",
+ paramtype2 = "wallmounted",
+ tiles = {
+ "testnodes_plantlike_rooted_base.png",
+ "testnodes_plantlike_rooted_base.png",
+ "testnodes_plantlike_rooted_base_side_wallmounted.png" },
+ special_tiles = { "testnodes_plantlike_rooted_wallmounted.png" },
+
+ groups = { dig_immediate = 3 },
+})
+
minetest.register_node("testnodes:plantlike_rooted_waving", {
description = S("Waving Rooted Plantlike Drawtype Test Node"),
drawtype = "plantlike_rooted",
@@ -456,7 +526,6 @@ minetest.register_node("testnodes:airlike", {
walkable = false,
groups = { dig_immediate = 3 },
sunlight_propagates = true,
- inventory_image = fallback_image("testnodes_airlike.png"),
})
-- param2 changes liquid height
@@ -546,10 +615,13 @@ scale("allfaces_optional_waving",
scale("plantlike",
S("Double-sized Plantlike Drawtype Test Node"),
S("Half-sized Plantlike Drawtype Test Node"))
+scale("plantlike_wallmounted",
+ S("Double-sized Wallmounted Plantlike Drawtype Test Node"),
+ S("Half-sized Wallmounted Plantlike Drawtype Test Node"))
scale("torchlike_wallmounted",
S("Double-sized Wallmounted Torchlike Drawtype Test Node"),
S("Half-sized Wallmounted Torchlike Drawtype Test Node"))
-scale("signlike",
+scale("signlike_wallmounted",
S("Double-sized Wallmounted Signlike Drawtype Test Node"),
S("Half-sized Wallmounted Signlike Drawtype Test Node"))
scale("firelike",
diff --git a/games/devtest/mods/testnodes/liquids.lua b/games/devtest/mods/testnodes/liquids.lua
index 3d2ea17f5..be33814af 100644
--- a/games/devtest/mods/testnodes/liquids.lua
+++ b/games/devtest/mods/testnodes/liquids.lua
@@ -40,9 +40,11 @@ for d=0, 8 do
liquid_range = d,
})
+ if d <= 7 then
+
local mod = "^[colorize:#000000:127"
minetest.register_node("testnodes:vliquid_"..d, {
- description = "Test Liquid Source, Viscosity "..d,
+ description = "Test Liquid Source, Viscosity/Resistance "..d,
drawtype = "liquid",
tiles = {"testnodes_liquidsource_r"..d..".png"..mod},
special_tiles = {
@@ -61,7 +63,7 @@ for d=0, 8 do
})
minetest.register_node("testnodes:vliquid_flowing_"..d, {
- description = "Flowing Test Liquid, Viscosity "..d,
+ description = "Flowing Test Liquid, Viscosity/Resistance "..d,
drawtype = "flowingliquid",
tiles = {"testnodes_liquidflowing_r"..d..".png"..mod},
special_tiles = {
@@ -80,4 +82,53 @@ for d=0, 8 do
liquid_viscosity = d,
})
+ mod = "^[colorize:#000000:192"
+ local v = 4
+ minetest.register_node("testnodes:vrliquid_"..d, {
+ description = "Test Liquid Source, Viscosity "..v..", Resistance "..d,
+ drawtype = "liquid",
+ tiles = {"testnodes_liquidsource_r"..d..".png"..mod},
+ special_tiles = {
+ {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = false},
+ {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = true},
+ },
+ use_texture_alpha = "blend",
+ paramtype = "light",
+ walkable = false,
+ pointable = false,
+ diggable = false,
+ buildable_to = true,
+ is_ground_content = false,
+ liquidtype = "source",
+ liquid_alternative_flowing = "testnodes:vrliquid_flowing_"..d,
+ liquid_alternative_source = "testnodes:vrliquid_"..d,
+ liquid_viscosity = v,
+ move_resistance = d,
+ })
+
+ minetest.register_node("testnodes:vrliquid_flowing_"..d, {
+ description = "Flowing Test Liquid, Viscosity "..v..", Resistance "..d,
+ drawtype = "flowingliquid",
+ tiles = {"testnodes_liquidflowing_r"..d..".png"..mod},
+ special_tiles = {
+ {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false},
+ {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false},
+ },
+ use_texture_alpha = "blend",
+ paramtype = "light",
+ paramtype2 = "flowingliquid",
+ walkable = false,
+ pointable = false,
+ diggable = false,
+ buildable_to = true,
+ is_ground_content = false,
+ liquidtype = "flowing",
+ liquid_alternative_flowing = "testnodes:vrliquid_flowing_"..d,
+ liquid_alternative_source = "testnodes:vrliquid_"..d,
+ liquid_viscosity = v,
+ move_resistance = d,
+ })
+
+ end
+
end
diff --git a/games/devtest/mods/testnodes/properties.lua b/games/devtest/mods/testnodes/properties.lua
index a52cd1d6f..51f703d7c 100644
--- a/games/devtest/mods/testnodes/properties.lua
+++ b/games/devtest/mods/testnodes/properties.lua
@@ -152,6 +152,66 @@ minetest.register_node("testnodes:liquidflowing_nojump", {
post_effect_color = {a = 70, r = 255, g = 0, b = 200},
})
+-- A liquid which doesn't have liquid movement physics (source variant)
+minetest.register_node("testnodes:liquid_noswim", {
+ description = S("No-swim Liquid Source Node"),
+ liquidtype = "source",
+ liquid_range = 1,
+ liquid_viscosity = 0,
+ liquid_alternative_flowing = "testnodes:liquidflowing_noswim",
+ liquid_alternative_source = "testnodes:liquid_noswim",
+ liquid_renewable = false,
+ liquid_move_physics = false,
+ groups = {dig_immediate=3},
+ walkable = false,
+
+ drawtype = "liquid",
+ tiles = {"testnodes_liquidsource.png^[colorize:#FF00FF:127"},
+ special_tiles = {
+ {name = "testnodes_liquidsource.png^[colorize:#FF00FF:127", backface_culling = false},
+ {name = "testnodes_liquidsource.png^[colorize:#FF00FF:127", backface_culling = true},
+ },
+ use_texture_alpha = "blend",
+ paramtype = "light",
+ pointable = false,
+ liquids_pointable = true,
+ buildable_to = true,
+ is_ground_content = false,
+ post_effect_color = {a = 70, r = 255, g = 200, b = 200},
+})
+
+-- A liquid which doen't have liquid movement physics (flowing variant)
+minetest.register_node("testnodes:liquidflowing_noswim", {
+ description = S("No-swim Flowing Liquid Node"),
+ liquidtype = "flowing",
+ liquid_range = 1,
+ liquid_viscosity = 0,
+ liquid_alternative_flowing = "testnodes:liquidflowing_noswim",
+ liquid_alternative_source = "testnodes:liquid_noswim",
+ liquid_renewable = false,
+ liquid_move_physics = false,
+ groups = {dig_immediate=3},
+ walkable = false,
+
+
+ drawtype = "flowingliquid",
+ tiles = {"testnodes_liquidflowing.png^[colorize:#FF00FF:127"},
+ special_tiles = {
+ {name = "testnodes_liquidflowing.png^[colorize:#FF00FF:127", backface_culling = false},
+ {name = "testnodes_liquidflowing.png^[colorize:#FF00FF:127", backface_culling = false},
+ },
+ use_texture_alpha = "blend",
+ paramtype = "light",
+ paramtype2 = "flowingliquid",
+ pointable = false,
+ liquids_pointable = true,
+ buildable_to = true,
+ is_ground_content = false,
+ post_effect_color = {a = 70, r = 255, g = 200, b = 200},
+})
+
+
+
-- Nodes that modify fall damage (various damage modifiers)
for i=-100, 100, 25 do
if i ~= 0 then
@@ -216,6 +276,54 @@ for i=1, 5 do
})
end
+-- Move resistance nodes (various resistance levels)
+for r=0, 7 do
+ if r > 0 then
+ minetest.register_node("testnodes:move_resistance"..r, {
+ description = S("Move-resistant Node (@1)", r),
+ walkable = false,
+ move_resistance = r,
+
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = { "testnodes_move_resistance.png" },
+ is_ground_content = false,
+ groups = { dig_immediate = 3 },
+ color = { b = 0, g = 255, r = math.floor((r/7)*255), a = 255 },
+ })
+ end
+
+ minetest.register_node("testnodes:move_resistance_liquidlike"..r, {
+ description = S("Move-resistant Node, liquidlike (@1)", r),
+ walkable = false,
+ move_resistance = r,
+ liquid_move_physics = true,
+
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = { "testnodes_move_resistance.png" },
+ is_ground_content = false,
+ groups = { dig_immediate = 3 },
+ color = { b = 255, g = 0, r = math.floor((r/7)*255), a = 255 },
+ })
+end
+
+minetest.register_node("testnodes:climbable_move_resistance_4", {
+ description = S("Climbable Move-resistant Node (4)"),
+ walkable = false,
+ climbable = true,
+ move_resistance = 4,
+
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = {"testnodes_climbable_resistance_side.png"},
+ is_ground_content = false,
+ groups = { dig_immediate = 3 },
+})
+
-- By placing something on the node, the node itself will be replaced
minetest.register_node("testnodes:buildable_to", {
description = S("Replacable Node"),
diff --git a/games/devtest/mods/testnodes/settingtypes.txt b/games/devtest/mods/testnodes/settingtypes.txt
deleted file mode 100644
index 7f753bf3e..000000000
--- a/games/devtest/mods/testnodes/settingtypes.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-# If set to true, will show an inventory image for nodes that have no inventory image as of Minetest 5.1.0.
-# This is due to <https://github.com/minetest/minetest/issues/9209>.
-# This is only added to make the items more visible to avoid confusion, but you will no longer see the default inventory images for these items. When you want to test the default inventory image of drawtypes, this should be turned off.
-testnodes_show_fallback_image (Use fallback inventory images) bool false
diff --git a/games/devtest/mods/testnodes/textures.lua b/games/devtest/mods/testnodes/textures.lua
index f6e6a0c2a..dc581b0c7 100644
--- a/games/devtest/mods/testnodes/textures.lua
+++ b/games/devtest/mods/testnodes/textures.lua
@@ -65,3 +65,109 @@ for a=1,#alphas do
})
end
+-- Generate PNG textures
+
+local function mandelbrot(w, h, iterations)
+ local r = {}
+ for y=0, h-1 do
+ for x=0, w-1 do
+ local re = (x - w/2) * 4/w
+ local im = (y - h/2) * 4/h
+ -- zoom in on a nice view
+ re = re / 128 - 0.23
+ im = im / 128 - 0.82
+
+ local px, py = 0, 0
+ local i = 0
+ while px*px + py*py <= 4 and i < iterations do
+ px, py = px*px - py*py + re, 2 * px * py + im
+ i = i + 1
+ end
+ r[w*y+x+1] = i / iterations
+ end
+ end
+ return r
+end
+
+local function gen_checkers(w, h, tile)
+ local r = {}
+ for y=0, h-1 do
+ for x=0, w-1 do
+ local hori = math.floor(x / tile) % 2 == 0
+ local vert = math.floor(y / tile) % 2 == 0
+ r[w*y+x+1] = hori ~= vert and 1 or 0
+ end
+ end
+ return r
+end
+
+local fractal = mandelbrot(512, 512, 128)
+local frac_emb = mandelbrot(64, 64, 64)
+local checker = gen_checkers(512, 512, 32)
+
+local floor = math.floor
+local abs = math.abs
+local data_emb = {}
+local data_mb = {}
+local data_ck = {}
+for i=1, #frac_emb do
+ data_emb[i] = {
+ r = floor(abs(frac_emb[i] * 2 - 1) * 255),
+ g = floor(abs(1 - frac_emb[i]) * 255),
+ b = floor(frac_emb[i] * 255),
+ a = frac_emb[i] < 0.95 and 255 or 0,
+ }
+end
+for i=1, #fractal do
+ data_mb[i] = {
+ r = floor(fractal[i] * 255),
+ g = floor(abs(fractal[i] * 2 - 1) * 255),
+ b = floor(abs(1 - fractal[i]) * 255),
+ a = 255,
+ }
+ data_ck[i] = checker[i] > 0 and "#F80" or "#000"
+end
+
+local textures_path = minetest.get_modpath( minetest.get_current_modname() ) .. "/textures/"
+minetest.safe_file_write(
+ textures_path .. "testnodes_generated_mb.png",
+ minetest.encode_png(512,512,data_mb)
+)
+minetest.safe_file_write(
+ textures_path .. "testnodes_generated_ck.png",
+ minetest.encode_png(512,512,data_ck)
+)
+
+minetest.register_node("testnodes:generated_png_mb", {
+ description = S("Generated Mandelbrot PNG Test Node"),
+ tiles = { "testnodes_generated_mb.png" },
+
+ groups = { dig_immediate = 2 },
+})
+minetest.register_node("testnodes:generated_png_ck", {
+ description = S("Generated Checker PNG Test Node"),
+ tiles = { "testnodes_generated_ck.png" },
+
+ groups = { dig_immediate = 2 },
+})
+
+local png_emb = "[png:" .. minetest.encode_base64(minetest.encode_png(64,64,data_emb))
+
+minetest.register_node("testnodes:generated_png_emb", {
+ description = S("Generated In-Band Mandelbrot PNG Test Node"),
+ tiles = { png_emb },
+
+ groups = { dig_immediate = 2 },
+})
+minetest.register_node("testnodes:generated_png_src_emb", {
+ description = S("Generated In-Band Source Blit Mandelbrot PNG Test Node"),
+ tiles = { png_emb .. "^testnodes_damage_neg.png" },
+
+ groups = { dig_immediate = 2 },
+})
+minetest.register_node("testnodes:generated_png_dst_emb", {
+ description = S("Generated In-Band Dest Blit Mandelbrot PNG Test Node"),
+ tiles = { "testnodes_generated_ck.png^" .. png_emb },
+
+ groups = { dig_immediate = 2 },
+})
diff --git a/games/devtest/mods/testnodes/textures/testnodes_climbable_resistance_side.png b/games/devtest/mods/testnodes/textures/testnodes_climbable_resistance_side.png
new file mode 100644
index 000000000..be01583e6
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_climbable_resistance_side.png
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_move_resistance.png b/games/devtest/mods/testnodes/textures/testnodes_move_resistance.png
new file mode 100644
index 000000000..cac3944bf
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_move_resistance.png
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png
new file mode 100644
index 000000000..b0be8d077
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png
new file mode 100644
index 000000000..421466407
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.png
new file mode 100644
index 000000000..c89b29e30
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.png
Binary files differ
diff --git a/games/devtest/mods/testtools/README.md b/games/devtest/mods/testtools/README.md
index 9cfe29ea4..a1eb95ed7 100644
--- a/games/devtest/mods/testtools/README.md
+++ b/games/devtest/mods/testtools/README.md
@@ -33,6 +33,13 @@ Usage:
* Punch node: Make it fall
* Place: Try to teleport up to 2 units upwards, then make it fall
+## Node Meta Editor
+Edit and view metadata of nodes.
+
+Usage:
+
+* Punch: Open node metadata editor
+
## Entity Rotator
Changes the entity rotation (with `set_rotation`).
@@ -90,6 +97,13 @@ Usage:
* Place: Increase move distance
* Sneak+place: Decrease move distance
+## Children Getter
+Shows list of objects that are attached to an object (aka "children") in chat.
+
+Usage:
+* Punch object: Show children of punched object
+* Punch air: Show your own children
+
## Entity Visual Scaler
Change visual size of entities
@@ -97,3 +111,10 @@ Usage:
* Punch entity to increase visual size
* Sneak+punch entity to decrease visual size
+
+## Light Tool
+Show light level of node.
+
+Usage:
+* Punch: Show light info of node in front of the punched node's side
+* Place: Show light info of the node that you touched
diff --git a/games/devtest/mods/testtools/init.lua b/games/devtest/mods/testtools/init.lua
index d578b264a..1041acdeb 100644
--- a/games/devtest/mods/testtools/init.lua
+++ b/games/devtest/mods/testtools/init.lua
@@ -3,8 +3,6 @@ local F = minetest.formspec_escape
dofile(minetest.get_modpath("testtools") .. "/light.lua")
--- TODO: Add a Node Metadata tool
-
minetest.register_tool("testtools:param2tool", {
description = S("Param2 Tool") .."\n"..
S("Modify param2 value of nodes") .."\n"..
@@ -111,25 +109,6 @@ minetest.register_tool("testtools:node_setter", {
end,
})
-minetest.register_on_player_receive_fields(function(player, formname, fields)
- if formname == "testtools:node_setter" then
- local playername = player:get_player_name()
- local witem = player:get_wielded_item()
- if witem:get_name() == "testtools:node_setter" then
- if fields.nodename and fields.param2 then
- local param2 = tonumber(fields.param2)
- if not param2 then
- return
- end
- local meta = witem:get_meta()
- meta:set_string("node", fields.nodename)
- meta:set_int("node_param2", param2)
- player:set_wielded_item(witem)
- end
- end
- end
-end)
-
minetest.register_tool("testtools:remover", {
description = S("Remover") .."\n"..
S("Punch: Remove pointed node or object"),
@@ -634,6 +613,54 @@ minetest.register_tool("testtools:object_attacher", {
end,
})
+local function print_object(obj)
+ if obj:is_player() then
+ return "player '"..obj:get_player_name().."'"
+ elseif obj:get_luaentity() then
+ return "LuaEntity '"..obj:get_luaentity().name.."'"
+ else
+ return "object"
+ end
+end
+
+minetest.register_tool("testtools:children_getter", {
+ description = S("Children Getter") .."\n"..
+ S("Shows list of objects attached to object") .."\n"..
+ S("Punch object to show its 'children'") .."\n"..
+ S("Punch air to show your own 'children'"),
+ inventory_image = "testtools_children_getter.png",
+ groups = { testtool = 1, disable_repair = 1 },
+ on_use = function(itemstack, user, pointed_thing)
+ if user and user:is_player() then
+ local name = user:get_player_name()
+ local selected_object
+ local self_name
+ if pointed_thing.type == "object" then
+ selected_object = pointed_thing.ref
+ elseif pointed_thing.type == "nothing" then
+ selected_object = user
+ else
+ return
+ end
+ self_name = print_object(selected_object)
+ local children = selected_object:get_children()
+ local ret = ""
+ for c=1, #children do
+ ret = ret .. "* " .. print_object(children[c])
+ if c < #children then
+ ret = ret .. "\n"
+ end
+ end
+ if ret == "" then
+ ret = S("No children attached to @1.", self_name)
+ else
+ ret = S("Children of @1:", self_name) .. "\n" .. ret
+ end
+ minetest.chat_send_player(user:get_player_name(), ret)
+ end
+ end,
+})
+
-- Use loadstring to parse param as a Lua value
local function use_loadstring(param, player)
-- For security reasons, require 'server' priv, just in case
@@ -666,6 +693,68 @@ local function use_loadstring(param, player)
return true, errOrResult
end
+-- Node Meta Editor
+local node_meta_posses = {}
+local node_meta_latest_keylist = {}
+
+local function show_node_meta_formspec(user, pos, key, value, keylist)
+ local textlist
+ if keylist then
+ textlist = "textlist[0,0.5;2.5,6.5;keylist;"..keylist.."]"
+ else
+ textlist = ""
+ end
+ minetest.show_formspec(user:get_player_name(),
+ "testtools:node_meta_editor",
+ "size[15,9]"..
+ "label[0,0;"..F(S("Current keys:")).."]"..
+ textlist..
+ "field[3,0.5;12,1;key;"..F(S("Key"))..";"..F(key).."]"..
+ "textarea[3,1.5;12,6;value;"..F(S("Value (use empty value to delete key)"))..";"..F(value).."]"..
+ "button[0,8;3,1;get;"..F(S("Get value")).."]"..
+ "button[4,8;3,1;set;"..F(S("Set value")).."]"..
+ "label[0,7.2;"..F(S("pos = @1", minetest.pos_to_string(pos))).."]")
+end
+
+local function get_node_meta_keylist(meta, playername, escaped)
+ local keys = {}
+ local ekeys = {}
+ local mtable = meta:to_table()
+ for k,_ in pairs(mtable.fields) do
+ table.insert(keys, k)
+ if escaped then
+ table.insert(ekeys, F(k))
+ else
+ table.insert(ekeys, k)
+ end
+ end
+ if playername then
+ node_meta_latest_keylist[playername] = keys
+ end
+ return table.concat(ekeys, ",")
+end
+
+minetest.register_tool("testtools:node_meta_editor", {
+ description = S("Node Meta Editor") .. "\n" ..
+ S("Place: Edit node metadata"),
+ inventory_image = "testtools_node_meta_editor.png",
+ groups = { testtool = 1, disable_repair = 1 },
+ on_place = function(itemstack, user, pointed_thing)
+ if pointed_thing.type ~= "node" then
+ return itemstack
+ end
+ if not user:is_player() then
+ return itemstack
+ end
+ local pos = pointed_thing.under
+ node_meta_posses[user:get_player_name()] = pos
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ show_node_meta_formspec(user, pos, "", "", get_node_meta_keylist(meta, user:get_player_name(), true))
+ return itemstack
+ end,
+})
+
minetest.register_on_player_receive_fields(function(player, formname, fields)
if not (player and player:is_player()) then
return
@@ -728,5 +817,70 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
editor_formspec(name, selected_objects[name], prop_to_string(props[key]), sel)
return
end
+ elseif formname == "testtools:node_setter" then
+ local playername = player:get_player_name()
+ local witem = player:get_wielded_item()
+ if witem:get_name() == "testtools:node_setter" then
+ if fields.nodename and fields.param2 then
+ local param2 = tonumber(fields.param2)
+ if not param2 then
+ return
+ end
+ local meta = witem:get_meta()
+ meta:set_string("node", fields.nodename)
+ meta:set_int("node_param2", param2)
+ player:set_wielded_item(witem)
+ end
+ end
+ elseif formname == "testtools:node_meta_editor" then
+ local name = player:get_player_name()
+ local pos = node_meta_posses[name]
+ if fields.keylist then
+ local evnt = minetest.explode_textlist_event(fields.keylist)
+ if evnt.type == "DCL" or evnt.type == "CHG" then
+ local keylist_table = node_meta_latest_keylist[name]
+ if not pos then
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ if not keylist_table then
+ return
+ end
+ if #keylist_table == 0 then
+ return
+ end
+ local key = keylist_table[evnt.index]
+ local value = meta:get_string(key)
+ local keylist_escaped = {}
+ for k,v in pairs(keylist_table) do
+ keylist_escaped[k] = F(v)
+ end
+ local keylist = table.concat(keylist_escaped, ",")
+ show_node_meta_formspec(player, pos, key, value, keylist)
+ return
+ end
+ elseif fields.key and fields.key ~= "" and fields.value then
+ if not pos then
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ if fields.get then
+ local value = meta:get_string(fields.key)
+ show_node_meta_formspec(player, pos, fields.key, value,
+ get_node_meta_keylist(meta, name, true))
+ return
+ elseif fields.set then
+ meta:set_string(fields.key, fields.value)
+ show_node_meta_formspec(player, pos, fields.key, fields.value,
+ get_node_meta_keylist(meta, name, true))
+ return
+ end
+ end
end
end)
+
+minetest.register_on_leaveplayer(function(player)
+ local name = player:get_player_name()
+ node_meta_latest_keylist[name] = nil
+ node_meta_posses[name] = nil
+end)
diff --git a/games/devtest/mods/testtools/light.lua b/games/devtest/mods/testtools/light.lua
index a9458ca6b..afca9a489 100644
--- a/games/devtest/mods/testtools/light.lua
+++ b/games/devtest/mods/testtools/light.lua
@@ -1,22 +1,37 @@
local S = minetest.get_translator("testtools")
-minetest.register_tool("testtools:lighttool", {
- description = S("Light tool"),
- inventory_image = "testtools_lighttool.png",
- groups = { testtool = 1, disable_repair = 1 },
- on_use = function(itemstack, user, pointed_thing)
- local pos = pointed_thing.above
+local function get_func(is_place)
+ return function(itemstack, user, pointed_thing)
+ local pos
+ if is_place then
+ pos = pointed_thing.under
+ else
+ pos = pointed_thing.above
+ end
if pointed_thing.type ~= "node" or not pos then
return
end
local node = minetest.get_node(pos)
+ local pstr = minetest.pos_to_string(pos)
local time = minetest.get_timeofday()
local sunlight = minetest.get_natural_light(pos)
local artificial = minetest.get_artificial_light(node.param1)
- local message = ("param1 0x%02x | time %.5f | sunlight %d | artificial %d")
- :format(node.param1, time, sunlight, artificial)
+ local message = ("pos=%s | param1=0x%02x | " ..
+ "sunlight=%d | artificial=%d | timeofday=%.5f" )
+ :format(pstr, node.param1, sunlight, artificial, time)
minetest.chat_send_player(user:get_player_name(), message)
end
+end
+
+minetest.register_tool("testtools:lighttool", {
+ description = S("Light Tool") .. "\n" ..
+ S("Show light values of node") .. "\n" ..
+ S("Punch: Light of node above touched node") .. "\n" ..
+ S("Place: Light of touched node itself"),
+ inventory_image = "testtools_lighttool.png",
+ groups = { testtool = 1, disable_repair = 1 },
+ on_use = get_func(false),
+ on_place = get_func(true),
})
diff --git a/games/devtest/mods/testtools/textures/testtools_children_getter.png b/games/devtest/mods/testtools/textures/testtools_children_getter.png
new file mode 100644
index 000000000..b7fa34025
--- /dev/null
+++ b/games/devtest/mods/testtools/textures/testtools_children_getter.png
Binary files differ
diff --git a/games/devtest/mods/testtools/textures/testtools_node_meta_editor.png b/games/devtest/mods/testtools/textures/testtools_node_meta_editor.png
new file mode 100644
index 000000000..89eafd65c
--- /dev/null
+++ b/games/devtest/mods/testtools/textures/testtools_node_meta_editor.png
Binary files differ
diff --git a/games/devtest/mods/unittests/crafting.lua b/games/devtest/mods/unittests/crafting.lua
index eff13ce09..8c16d3efb 100644
--- a/games/devtest/mods/unittests/crafting.lua
+++ b/games/devtest/mods/unittests/crafting.lua
@@ -1,6 +1,7 @@
+dofile(core.get_modpath(core.get_current_modname()) .. "/crafting_prepare.lua")
+
-- Test minetest.clear_craft function
local function test_clear_craft()
- minetest.log("info", "[unittests] Testing minetest.clear_craft")
-- Clearing by output
minetest.register_craft({
output = "foo",
@@ -22,11 +23,10 @@ local function test_clear_craft()
minetest.clear_craft({recipe={{"foo", "bar"}}})
assert(minetest.get_all_craft_recipes("foo") == nil)
end
+unittests.register("test_clear_craft", test_clear_craft)
-- Test minetest.get_craft_result function
local function test_get_craft_result()
- minetest.log("info", "[unittests] Testing minetest.get_craft_result")
-
-- normal
local input = {
method = "normal",
@@ -107,14 +107,6 @@ local function test_get_craft_result()
assert(output.item)
minetest.log("info", "[unittests] unrepairable tool crafting output.item:to_table(): "..dump(output.item:to_table()))
-- unrepairable tool must not yield any output
- assert(output.item:get_name() == "")
-
+ assert(output.item:is_empty())
end
-
-function unittests.test_crafting()
- test_clear_craft()
- test_get_craft_result()
- minetest.log("action", "[unittests] Crafting tests passed!")
- return true
-end
-
+unittests.register("test_get_craft_result", test_get_craft_result)
diff --git a/games/devtest/mods/unittests/init.lua b/games/devtest/mods/unittests/init.lua
index 12c67f78b..0754d507f 100644
--- a/games/devtest/mods/unittests/init.lua
+++ b/games/devtest/mods/unittests/init.lua
@@ -1,18 +1,199 @@
unittests = {}
+unittests.list = {}
+
+-- name: Name of the test
+-- func:
+-- for sync: function(player, pos), should error on failure
+-- for async: function(callback, player, pos)
+-- MUST call callback() or callback("error msg") in case of error once test is finished
+-- this means you cannot use assert() in the test implementation
+-- opts: {
+-- player = false, -- Does test require a player?
+-- map = false, -- Does test require map access?
+-- async = false, -- Does the test run asynchronously? (read notes above!)
+-- }
+function unittests.register(name, func, opts)
+ local def = table.copy(opts or {})
+ def.name = name
+ def.func = func
+ table.insert(unittests.list, def)
+end
+
+function unittests.on_finished(all_passed)
+ -- free to override
+end
+
+-- Calls invoke with a callback as argument
+-- Suspends coroutine until that callback is called
+-- Return values are passed through
+local function await(invoke)
+ local co = coroutine.running()
+ assert(co)
+ local called_early = true
+ invoke(function(...)
+ if called_early == true then
+ called_early = {...}
+ else
+ coroutine.resume(co, ...)
+ end
+ end)
+ if called_early ~= true then
+ -- callback was already called before yielding
+ return unpack(called_early)
+ end
+ called_early = nil
+ return coroutine.yield()
+end
+
+function unittests.run_one(idx, counters, out_callback, player, pos)
+ local def = unittests.list[idx]
+ if not def.player then
+ player = nil
+ elseif player == nil then
+ out_callback(false)
+ return false
+ end
+ if not def.map then
+ pos = nil
+ elseif pos == nil then
+ out_callback(false)
+ return false
+ end
+
+ local tbegin = core.get_us_time()
+ local function done(status, err)
+ local tend = core.get_us_time()
+ local ms_taken = (tend - tbegin) / 1000
+
+ if not status then
+ core.log("error", err)
+ end
+ print(string.format("[%s] %s - %dms",
+ status and "PASS" or "FAIL", def.name, ms_taken))
+ counters.time = counters.time + ms_taken
+ counters.total = counters.total + 1
+ if status then
+ counters.passed = counters.passed + 1
+ end
+ end
+
+ if def.async then
+ core.log("info", "[unittest] running " .. def.name .. " (async)")
+ def.func(function(err)
+ done(err == nil, err)
+ out_callback(true)
+ end, player, pos)
+ else
+ core.log("info", "[unittest] running " .. def.name)
+ local status, err = pcall(def.func, player, pos)
+ done(status, err)
+ out_callback(true)
+ end
+
+ return true
+end
+
+local function wait_for_player(callback)
+ if #core.get_connected_players() > 0 then
+ return callback(core.get_connected_players()[1])
+ end
+ local first = true
+ core.register_on_joinplayer(function(player)
+ if first then
+ callback(player)
+ first = false
+ end
+ end)
+end
+
+local function wait_for_map(player, callback)
+ local check = function()
+ if core.get_node_or_nil(player:get_pos()) ~= nil then
+ callback()
+ else
+ minetest.after(0, check)
+ end
+ end
+ check()
+end
+
+function unittests.run_all()
+ -- This runs in a coroutine so it uses await().
+ local counters = { time = 0, total = 0, passed = 0 }
+
+ -- Run standalone tests first
+ for idx = 1, #unittests.list do
+ local def = unittests.list[idx]
+ def.done = await(function(cb)
+ unittests.run_one(idx, counters, cb, nil, nil)
+ end)
+ end
+
+ -- Wait for a player to join, run tests that require a player
+ local player = await(wait_for_player)
+ for idx = 1, #unittests.list do
+ local def = unittests.list[idx]
+ if not def.done then
+ def.done = await(function(cb)
+ unittests.run_one(idx, counters, cb, player, nil)
+ end)
+ end
+ end
+
+ -- Wait for the world to generate/load, run tests that require map access
+ await(function(cb)
+ wait_for_map(player, cb)
+ end)
+ local pos = vector.round(player:get_pos())
+ for idx = 1, #unittests.list do
+ local def = unittests.list[idx]
+ if not def.done then
+ def.done = await(function(cb)
+ unittests.run_one(idx, counters, cb, player, pos)
+ end)
+ end
+ end
+
+ -- Print stats
+ assert(#unittests.list == counters.total)
+ print(string.rep("+", 80))
+ print(string.format("Unit Test Results: %s",
+ counters.total == counters.passed and "PASSED" or "FAILED"))
+ print(string.format(" %d / %d failed tests.",
+ counters.total - counters.passed, counters.total))
+ print(string.format(" Testing took %dms total.", counters.time))
+ print(string.rep("+", 80))
+ unittests.on_finished(counters.total == counters.passed)
+ return counters.total == counters.passed
+end
+
+--------------
+
local modpath = minetest.get_modpath("unittests")
-dofile(modpath .. "/random.lua")
+dofile(modpath .. "/misc.lua")
dofile(modpath .. "/player.lua")
-dofile(modpath .. "/crafting_prepare.lua")
dofile(modpath .. "/crafting.lua")
dofile(modpath .. "/itemdescription.lua")
-if minetest.settings:get_bool("devtest_unittests_autostart", false) then
- unittests.test_random()
- unittests.test_crafting()
- unittests.test_short_desc()
- minetest.register_on_joinplayer(function(player)
- unittests.test_player(player)
+--------------
+
+if core.settings:get_bool("devtest_unittests_autostart", false) then
+ core.after(0, function()
+ coroutine.wrap(unittests.run_all)()
end)
+else
+ minetest.register_chatcommand("unittests", {
+ privs = {basic_privs=true},
+ description = "Runs devtest unittests (may modify player or map state)",
+ func = function(name, param)
+ unittests.on_finished = function(ok)
+ core.chat_send_player(name,
+ (ok and "All tests passed." or "There were test failures.") ..
+ " Check the console for detailed output.")
+ end
+ coroutine.wrap(unittests.run_all)()
+ return true, ""
+ end,
+ })
end
-
diff --git a/games/devtest/mods/unittests/itemdescription.lua b/games/devtest/mods/unittests/itemdescription.lua
index d6ee6551a..dc62de7f0 100644
--- a/games/devtest/mods/unittests/itemdescription.lua
+++ b/games/devtest/mods/unittests/itemdescription.lua
@@ -25,7 +25,7 @@ minetest.register_chatcommand("item_description", {
end
})
-function unittests.test_short_desc()
+local function test_short_desc()
local function get_short_description(item)
return ItemStack(item):get_short_description()
end
@@ -49,3 +49,4 @@ function unittests.test_short_desc()
return true
end
+unittests.register("test_short_desc", test_short_desc)
diff --git a/games/devtest/mods/unittests/misc.lua b/games/devtest/mods/unittests/misc.lua
new file mode 100644
index 000000000..cf4f92cfa
--- /dev/null
+++ b/games/devtest/mods/unittests/misc.lua
@@ -0,0 +1,38 @@
+local function test_random()
+ -- Try out PseudoRandom
+ local pseudo = PseudoRandom(13)
+ assert(pseudo:next() == 22290)
+ assert(pseudo:next() == 13854)
+end
+unittests.register("test_random", test_random)
+
+local function test_dynamic_media(cb, player)
+ if core.get_player_information(player:get_player_name()).protocol_version < 40 then
+ core.log("warning", "test_dynamic_media: Client too old, skipping test.")
+ return cb()
+ end
+
+ -- Check that the client acknowledges media transfers
+ local path = core.get_worldpath() .. "/test_media.obj"
+ local f = io.open(path, "w")
+ f:write("# contents don't matter\n")
+ f:close()
+
+ local call_ok = false
+ local ok = core.dynamic_add_media({
+ filepath = path,
+ to_player = player:get_player_name(),
+ }, function(name)
+ if not call_ok then
+ cb("impossible condition")
+ end
+ cb()
+ end)
+ if not ok then
+ return cb("dynamic_add_media() returned error")
+ end
+ call_ok = true
+
+ -- if the callback isn't called this test will just hang :shrug:
+end
+unittests.register("test_dynamic_media", test_dynamic_media, {async=true, player=true})
diff --git a/games/devtest/mods/unittests/player.lua b/games/devtest/mods/unittests/player.lua
index 4a681310d..fa0557960 100644
--- a/games/devtest/mods/unittests/player.lua
+++ b/games/devtest/mods/unittests/player.lua
@@ -2,6 +2,21 @@
-- HP Change Reasons
--
local expect = nil
+minetest.register_on_player_hpchange(function(player, hp, reason)
+ if expect == nil then
+ return
+ end
+
+ for key, value in pairs(reason) do
+ assert(expect[key] == value)
+ end
+ for key, value in pairs(expect) do
+ assert(reason[key] == value)
+ end
+
+ expect = nil
+end)
+
local function run_hpchangereason_tests(player)
local old_hp = player:get_hp()
@@ -20,7 +35,11 @@ local function run_hpchangereason_tests(player)
player:set_hp(old_hp)
end
+unittests.register("test_hpchangereason", run_hpchangereason_tests, {player=true})
+--
+-- Player meta
+--
local function run_player_meta_tests(player)
local meta = player:get_meta()
meta:set_string("foo", "bar")
@@ -48,29 +67,4 @@ local function run_player_meta_tests(player)
assert(meta:get_string("foo") == "")
assert(meta:equals(meta2))
end
-
-function unittests.test_player(player)
- minetest.register_on_player_hpchange(function(player, hp, reason)
- if not expect then
- return
- end
-
- for key, value in pairs(reason) do
- assert(expect[key] == value)
- end
-
- for key, value in pairs(expect) do
- assert(reason[key] == value)
- end
-
- expect = nil
- end)
-
- run_hpchangereason_tests(player)
- run_player_meta_tests(player)
- local msg = "Player tests passed for player '"..player:get_player_name().."'!"
- minetest.chat_send_all(msg)
- minetest.log("action", "[unittests] "..msg)
- return true
-end
-
+unittests.register("test_player_meta", run_player_meta_tests, {player=true})
diff --git a/games/devtest/mods/unittests/random.lua b/games/devtest/mods/unittests/random.lua
deleted file mode 100644
index f94f0a88e..000000000
--- a/games/devtest/mods/unittests/random.lua
+++ /dev/null
@@ -1,10 +0,0 @@
-function unittests.test_random()
- -- Try out PseudoRandom
- minetest.log("action", "[unittests] Testing PseudoRandom ...")
- local pseudo = PseudoRandom(13)
- assert(pseudo:next() == 22290)
- assert(pseudo:next() == 13854)
- minetest.log("action", "[unittests] PseudoRandom test passed!")
- return true
-end
-
diff --git a/games/devtest/mods/util_commands/init.lua b/games/devtest/mods/util_commands/init.lua
index ca5dca2d9..79acaa0d0 100644
--- a/games/devtest/mods/util_commands/init.lua
+++ b/games/devtest/mods/util_commands/init.lua
@@ -114,6 +114,59 @@ minetest.register_chatcommand("detach", {
end,
})
+minetest.register_chatcommand("use_tool", {
+ params = "(dig <group> <leveldiff>) | (hit <damage_group> <time_from_last_punch>) [<uses>]",
+ description = "Apply tool wear a number of times, as if it were used for digging",
+ func = function(name, param)
+ local player = minetest.get_player_by_name(name)
+ if not player then
+ return false, "No player."
+ end
+ local mode, group, level, uses = string.match(param, "([a-z]+) ([a-z0-9]+) (-?%d+) (%d+)")
+ if not mode then
+ mode, group, level = string.match(param, "([a-z]+) ([a-z0-9]+) (-?%d+)")
+ uses = 1
+ end
+ if not mode or not group or not level then
+ return false
+ end
+ if mode ~= "dig" and mode ~= "hit" then
+ return false
+ end
+ local tool = player:get_wielded_item()
+ local caps = tool:get_tool_capabilities()
+ if not caps or tool:get_count() == 0 then
+ return false, "No tool in hand."
+ end
+ local actual_uses = 0
+ for u=1, uses do
+ local wear = tool:get_wear()
+ local dp
+ if mode == "dig" then
+ dp = minetest.get_dig_params({[group]=3, level=level}, caps, wear)
+ else
+ dp = minetest.get_hit_params({[group]=100}, caps, level, wear)
+ end
+ tool:add_wear(dp.wear)
+ actual_uses = actual_uses + 1
+ if tool:get_count() == 0 then
+ break
+ end
+ end
+ player:set_wielded_item(tool)
+ if tool:get_count() == 0 then
+ return true, string.format("Tool used %d time(s). "..
+ "The tool broke after %d use(s).", uses, actual_uses)
+ else
+ local wear = tool:get_wear()
+ return true, string.format("Tool used %d time(s). "..
+ "Final wear=%d", uses, wear)
+ end
+ end,
+})
+
+
+
-- Use this to test waypoint capabilities
minetest.register_chatcommand("test_waypoints", {
params = "[change_immediate]",
diff --git a/games/devtest/settingtypes.txt b/games/devtest/settingtypes.txt
index 40ee5845b..c4365643e 100644
--- a/games/devtest/settingtypes.txt
+++ b/games/devtest/settingtypes.txt
@@ -30,8 +30,3 @@ devtest_dungeon_mossycobble (Generate mossy cobblestone) bool false
# If enabled, some very basic biomes will be registered.
devtest_register_biomes (Register biomes) bool true
-
-# If set to true, will show an inventory image for nodes that have no inventory image as of Minetest 5.1.0.
-# This is due to <https://github.com/minetest/minetest/issues/9209>.
-# This is only added to make the items more visible to avoid confusion, but you will no longer see the default inventory images for these items. When you want to test the default inventory image of drawtypes, this should be turned off.
-testnodes_show_fallback_image (Use fallback inventory images) bool false
diff --git a/lib/bitop/CMakeLists.txt b/lib/bitop/CMakeLists.txt
new file mode 100644
index 000000000..03b4d0b96
--- /dev/null
+++ b/lib/bitop/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_library(bitop bit.c)
+target_link_libraries(bitop)
+
+include_directories(${LUA_INCLUDE_DIR})
diff --git a/lib/bitop/bit.c b/lib/bitop/bit.c
new file mode 100644
index 000000000..f23c31a4c
--- /dev/null
+++ b/lib/bitop/bit.c
@@ -0,0 +1,189 @@
+/*
+** Lua BitOp -- a bit operations library for Lua 5.1/5.2.
+** http://bitop.luajit.org/
+**
+** Copyright (C) 2008-2012 Mike Pall. All rights reserved.
+**
+** 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.
+**
+** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]
+*/
+
+#include "bit.h"
+
+#define LUA_BITOP_VERSION "1.0.2"
+
+#define LUA_LIB
+#include "lauxlib.h"
+
+#ifdef _MSC_VER
+/* MSVC is stuck in the last century and doesn't have C99's stdint.h. */
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int64 uint64_t;
+#else
+#include <stdint.h>
+#endif
+
+typedef int32_t SBits;
+typedef uint32_t UBits;
+
+typedef union {
+ lua_Number n;
+#ifdef LUA_NUMBER_DOUBLE
+ uint64_t b;
+#else
+ UBits b;
+#endif
+} BitNum;
+
+/* Convert argument to bit type. */
+static UBits barg(lua_State *L, int idx)
+{
+ BitNum bn;
+ UBits b;
+#if LUA_VERSION_NUM < 502
+ bn.n = lua_tonumber(L, idx);
+#else
+ bn.n = luaL_checknumber(L, idx);
+#endif
+#if defined(LUA_NUMBER_DOUBLE)
+ bn.n += 6755399441055744.0; /* 2^52+2^51 */
+#ifdef SWAPPED_DOUBLE
+ b = (UBits)(bn.b >> 32);
+#else
+ b = (UBits)bn.b;
+#endif
+#elif defined(LUA_NUMBER_INT) || defined(LUA_NUMBER_LONG) || \
+ defined(LUA_NUMBER_LONGLONG) || defined(LUA_NUMBER_LONG_LONG) || \
+ defined(LUA_NUMBER_LLONG)
+ if (sizeof(UBits) == sizeof(lua_Number))
+ b = bn.b;
+ else
+ b = (UBits)(SBits)bn.n;
+#elif defined(LUA_NUMBER_FLOAT)
+#error "A 'float' lua_Number type is incompatible with this library"
+#else
+#error "Unknown number type, check LUA_NUMBER_* in luaconf.h"
+#endif
+#if LUA_VERSION_NUM < 502
+ if (b == 0 && !lua_isnumber(L, idx)) {
+ luaL_typerror(L, idx, "number");
+ }
+#endif
+ return b;
+}
+
+/* Return bit type. */
+#define BRET(b) lua_pushnumber(L, (lua_Number)(SBits)(b)); return 1;
+
+static int bit_tobit(lua_State *L) { BRET(barg(L, 1)) }
+static int bit_bnot(lua_State *L) { BRET(~barg(L, 1)) }
+
+#define BIT_OP(func, opr) \
+ static int func(lua_State *L) { int i; UBits b = barg(L, 1); \
+ for (i = lua_gettop(L); i > 1; i--) b opr barg(L, i); BRET(b) }
+BIT_OP(bit_band, &=)
+BIT_OP(bit_bor, |=)
+BIT_OP(bit_bxor, ^=)
+
+#define bshl(b, n) (b << n)
+#define bshr(b, n) (b >> n)
+#define bsar(b, n) ((SBits)b >> n)
+#define brol(b, n) ((b << n) | (b >> (32-n)))
+#define bror(b, n) ((b << (32-n)) | (b >> n))
+#define BIT_SH(func, fn) \
+ static int func(lua_State *L) { \
+ UBits b = barg(L, 1); UBits n = barg(L, 2) & 31; BRET(fn(b, n)) }
+BIT_SH(bit_lshift, bshl)
+BIT_SH(bit_rshift, bshr)
+BIT_SH(bit_arshift, bsar)
+BIT_SH(bit_rol, brol)
+BIT_SH(bit_ror, bror)
+
+static int bit_bswap(lua_State *L)
+{
+ UBits b = barg(L, 1);
+ b = (b >> 24) | ((b >> 8) & 0xff00) | ((b & 0xff00) << 8) | (b << 24);
+ BRET(b)
+}
+
+static int bit_tohex(lua_State *L)
+{
+ UBits b = barg(L, 1);
+ SBits n = lua_isnone(L, 2) ? 8 : (SBits)barg(L, 2);
+ const char *hexdigits = "0123456789abcdef";
+ char buf[8];
+ int i;
+ if (n < 0) { n = -n; hexdigits = "0123456789ABCDEF"; }
+ if (n > 8) n = 8;
+ for (i = (int)n; --i >= 0; ) { buf[i] = hexdigits[b & 15]; b >>= 4; }
+ lua_pushlstring(L, buf, (size_t)n);
+ return 1;
+}
+
+static const struct luaL_Reg bit_funcs[] = {
+ { "tobit", bit_tobit },
+ { "bnot", bit_bnot },
+ { "band", bit_band },
+ { "bor", bit_bor },
+ { "bxor", bit_bxor },
+ { "lshift", bit_lshift },
+ { "rshift", bit_rshift },
+ { "arshift", bit_arshift },
+ { "rol", bit_rol },
+ { "ror", bit_ror },
+ { "bswap", bit_bswap },
+ { "tohex", bit_tohex },
+ { NULL, NULL }
+};
+
+/* Signed right-shifts are implementation-defined per C89/C99.
+** But the de facto standard are arithmetic right-shifts on two's
+** complement CPUs. This behaviour is required here, so test for it.
+*/
+#define BAD_SAR (bsar(-8, 2) != (SBits)-2)
+
+LUALIB_API int luaopen_bit(lua_State *L)
+{
+ UBits b;
+ lua_pushnumber(L, (lua_Number)1437217655L);
+ b = barg(L, -1);
+ if (b != (UBits)1437217655L || BAD_SAR) { /* Perform a simple self-test. */
+ const char *msg = "compiled with incompatible luaconf.h";
+#ifdef LUA_NUMBER_DOUBLE
+#ifdef _WIN32
+ if (b == (UBits)1610612736L)
+ msg = "use D3DCREATE_FPU_PRESERVE with DirectX";
+#endif
+ if (b == (UBits)1127743488L)
+ msg = "not compiled with SWAPPED_DOUBLE";
+#endif
+ if (BAD_SAR)
+ msg = "arithmetic right-shift broken";
+ luaL_error(L, "bit library self-test failed (%s)", msg);
+ }
+#if LUA_VERSION_NUM < 502
+ luaL_register(L, "bit", bit_funcs);
+#else
+ luaL_newlib(L, bit_funcs);
+#endif
+ return 1;
+}
diff --git a/lib/bitop/bit.h b/lib/bitop/bit.h
new file mode 100644
index 000000000..3e5845ee5
--- /dev/null
+++ b/lib/bitop/bit.h
@@ -0,0 +1,34 @@
+/*
+** Lua BitOp -- a bit operations library for Lua 5.1/5.2.
+** http://bitop.luajit.org/
+**
+** Copyright (C) 2008-2012 Mike Pall. All rights reserved.
+**
+** 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.
+**
+** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]
+*/
+
+#pragma once
+
+#include "lua.h"
+
+#define LUA_BITLIBNAME "bit"
+LUALIB_API int luaopen_bit(lua_State *L);
diff --git a/minetest.conf.example b/minetest.conf.example
index 47c03ff80..7f4b5d946 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -30,7 +30,7 @@
# type: bool
# pitch_move = false
-# Fast movement (via the "special" key).
+# Fast movement (via the "Aux1" key).
# This requires the "fast" privilege on the server.
# type: bool
# fast_move = false
@@ -61,7 +61,7 @@
# type: float
# mouse_sensitivity = 0.2
-# If enabled, "special" key instead of "sneak" key is used for climbing down and
+# If enabled, "Aux1" key instead of "Sneak" key is used for climbing down and
# descending.
# type: bool
# aux1_descends = false
@@ -70,7 +70,7 @@
# type: bool
# doubletap_jump = false
-# If disabled, "special" key is used to fly fast if both fly and fast mode are
+# If disabled, "Aux1" key is used to fly fast if both fly and fast mode are
# enabled.
# type: bool
# always_fly_fast = true
@@ -107,10 +107,10 @@
# type: bool
# fixed_virtual_joystick = false
-# (Android) Use virtual joystick to trigger "aux" button.
-# If enabled, virtual joystick will also tap "aux" button when out of main circle.
+# (Android) Use virtual joystick to trigger "Aux1" button.
+# If enabled, virtual joystick will also tap "Aux1" button when out of main circle.
# type: bool
-# virtual_joystick_triggers_aux = false
+# virtual_joystick_triggers_aux1 = false
# Enable joysticks
# type: bool
@@ -121,7 +121,7 @@
# joystick_id = 0
# The type of joystick
-# type: enum values: auto, generic, xbox
+# type: enum values: auto, generic, xbox, dragonrise_gamecube
# joystick_type = auto
# The time in seconds it takes between repeated events
@@ -129,12 +129,12 @@
# type: float min: 0.001
# repeat_joystick_button_time = 0.17
-# The deadzone of the joystick
+# The dead zone of the joystick
# type: int
# joystick_deadzone = 2048
# The sensitivity of the joystick axes for moving the
-# ingame view frustum around.
+# in-game view frustum around.
# type: float
# joystick_frustum_sensitivity = 170
@@ -188,7 +188,7 @@
# Key for moving fast in fast mode.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
# type: key
-# keymap_special1 = KEY_KEY_E
+# keymap_aux1 = KEY_KEY_E
# Key for opening the chat window.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
@@ -503,7 +503,7 @@
### Basic
-# Whether nametag backgrounds should be shown by default.
+# Whether name tag backgrounds should be shown by default.
# Mods may still set a background.
# type: bool
# show_nametag_backgrounds = true
@@ -533,6 +533,11 @@
# type: bool
# smooth_lighting = true
+# Enables tradeoffs that reduce CPU load or increase rendering performance
+# at the expense of minor visual glitches that do not impact game playability.
+# type: bool
+# performance_tradeoffs = false
+
# Clouds are a client side effect.
# type: bool
# enable_clouds = true
@@ -551,7 +556,7 @@
### Filtering
-# Use mip mapping to scale textures. May slightly increase performance,
+# Use mipmapping to scale textures. May slightly increase performance,
# especially when using a high resolution texture pack.
# Gamma correct downscaling is not supported.
# type: bool
@@ -570,9 +575,9 @@
# trilinear_filter = false
# Filtered textures can blend RGB values with fully-transparent neighbors,
-# which PNG optimizers usually discard, sometimes resulting in a dark or
-# light edge to transparent textures. Apply this filter to clean that up
-# at texture load time.
+# which PNG optimizers usually discard, often resulting in dark or
+# light edges to transparent textures. Apply a filter to clean that up
+# at texture load time. This is automatically enabled if mipmapping is enabled.
# type: bool
# texture_clean_transparent = false
@@ -580,9 +585,8 @@
# can be blurred, so automatically upscale them with nearest-neighbor
# interpolation to preserve crisp pixels. This sets the minimum texture size
# for the upscaled textures; higher values look sharper, but require more
-# memory. Powers of 2 are recommended. Setting this higher than 1 may not
-# have a visible effect unless bilinear/trilinear/anisotropic filtering is
-# enabled.
+# memory. Powers of 2 are recommended. This setting is ONLY applied if
+# bilinear/trilinear/anisotropic filtering is enabled.
# This is also used as the base node texture size for world-aligned
# texture autoscaling.
# type: int
@@ -694,11 +698,11 @@
# type: float min: 0 max: 0.25
# near_plane = 0.1
-# Width component of the initial window size.
+# Width component of the initial window size. Ignored in fullscreen mode.
# type: int min: 1
# screen_w = 1024
-# Height component of the initial window size.
+# Height component of the initial window size. Ignored in fullscreen mode.
# type: int min: 1
# screen_h = 600
@@ -710,10 +714,6 @@
# type: bool
# fullscreen = false
-# Bits per pixel (aka color depth) in fullscreen mode.
-# type: int
-# fullscreen_bpp = 24
-
# Vertical screen synchronization.
# type: bool
# vsync = false
@@ -761,12 +761,12 @@
# type: path
# texture_path =
-# The rendering back-end for Irrlicht.
+# The rendering back-end.
# A restart is required after changing this.
# Note: On Android, stick with OGLES1 if unsure! App may fail to start otherwise.
# On other platforms, OpenGL is recommended.
# Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)
-# type: enum values: null, software, burningsvideo, direct3d8, direct3d9, opengl, ogles1, ogles2
+# type: enum values: opengl, ogles1, ogles2
# video_driver = opengl
# Radius of cloud area stated in number of 64 node cloud squares.
@@ -843,7 +843,7 @@
# crosshair_color = (255,255,255)
# Crosshair alpha (opaqueness, between 0 and 255).
-# Also controls the object crosshair color
+# This also applies to the object crosshair.
# type: int min: 0 max: 255
# crosshair_alpha = 255
@@ -860,7 +860,7 @@
# type: float
# hud_hotbar_max_width = 1.0
-# Modifies the size of the hudbar elements.
+# Modifies the size of the HUD elements.
# type: float
# hud_scaling = 1.0
@@ -974,11 +974,6 @@
# type: bool
# tooltip_append_itemname = false
-# Whether FreeType fonts are used, requires FreeType support to be compiled in.
-# If disabled, bitmap and XML vectors fonts are used instead.
-# type: bool
-# freetype = true
-
# type: bool
# font_bold = false
@@ -993,13 +988,18 @@
# type: int min: 0 max: 255
# font_shadow_alpha = 127
-# Font size of the default font in point (pt).
+# Font size of the default font where 1 unit = 1 pixel at 96 DPI
# type: int min: 1
# font_size = 16
-# Path to the default font.
-# If “freetype” setting is enabled: Must be a TrueType font.
-# If “freetype” setting is disabled: Must be a bitmap or XML vectors font.
+# For pixel-style fonts that do not scale well, this ensures that font sizes used
+# with this font will always be divisible by this value, in pixels. For instance,
+# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
+# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
+# type: int min: 1
+# font_size_divisible_by = 1
+
+# Path to the default font. Must be a TrueType font.
# The fallback font will be used if the font cannot be loaded.
# type: filepath
# font_path = fonts/Arimo-Regular.ttf
@@ -1011,15 +1011,20 @@
# font_path_italic = fonts/Arimo-Italic.ttf
# type: filepath
-# font_path_bolditalic = fonts/Arimo-BoldItalic.ttf
+# font_path_bold_italic = fonts/Arimo-BoldItalic.ttf
+
+# Font size of the monospace font where 1 unit = 1 pixel at 96 DPI
+# type: int min: 1
+# mono_font_size = 16
-# Font size of the monospace font in point (pt).
+# For pixel-style fonts that do not scale well, this ensures that font sizes used
+# with this font will always be divisible by this value, in pixels. For instance,
+# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
+# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
# type: int min: 1
-# mono_font_size = 15
+# mono_font_size_divisible_by = 1
-# Path to the monospace font.
-# If “freetype” setting is enabled: Must be a TrueType font.
-# If “freetype” setting is disabled: Must be a bitmap or XML vectors font.
+# Path to the monospace font. Must be a TrueType font.
# This font is used for e.g. the console and profiler screen.
# type: filepath
# mono_font_path = fonts/Cousine-Regular.ttf
@@ -1031,23 +1036,9 @@
# mono_font_path_italic = fonts/Cousine-Italic.ttf
# type: filepath
-# mono_font_path_bolditalic = fonts/Cousine-BoldItalic.ttf
-
-# Font size of the fallback font in point (pt).
-# type: int min: 1
-# fallback_font_size = 15
-
-# Shadow offset (in pixels) of the fallback font. If 0, then shadow will not be drawn.
-# type: int
-# fallback_font_shadow = 1
+# mono_font_path_bold_italic = fonts/Cousine-BoldItalic.ttf
-# Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255.
-# type: int min: 0 max: 255
-# fallback_font_shadow_alpha = 128
-
-# Path of the fallback font.
-# If “freetype” setting is enabled: Must be a TrueType font.
-# If “freetype” setting is disabled: Must be a bitmap or XML vectors font.
+# Path of the fallback font. Must be a TrueType font.
# This font will be used for certain languages or if the default font is unavailable.
# type: filepath
# fallback_font_path = fonts/DroidSansFallbackFull.ttf
@@ -1063,7 +1054,7 @@
# screenshot_path = screenshots
# Format of screenshots.
-# type: enum values: png, jpg, bmp, pcx, ppm, tga
+# type: enum values: png, jpg
# screenshot_format = png
# Screenshot quality. Only used for JPEG format.
@@ -1078,6 +1069,10 @@
# type: int min: 1
# screen_dpi = 72
+# Adjust the detected display density, used for scaling UI elements.
+# type: float
+# display_density_factor = 1
+
# 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
@@ -1110,6 +1105,14 @@
# Client
#
+# Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console output.
+# type: bool
+# clickable_chat_weblinks = false
+
+# Optional override for chat weblink color.
+# type: string
+# chat_weblink_color =
+
## Network
# Address to connect to.
@@ -1124,9 +1127,9 @@
# remote_port = 30000
# Prometheus listener address.
-# If minetest is compiled with ENABLE_PROMETHEUS option enabled,
+# If Minetest is compiled with ENABLE_PROMETHEUS option enabled,
# enable metrics listener for Prometheus on that address.
-# Metrics can be fetch on http://127.0.0.1:30000/metrics
+# Metrics can be fetched on http://127.0.0.1:30000/metrics
# type: string
# prometheus_listener_address = 127.0.0.1:30000
@@ -1261,11 +1264,10 @@
# type: int
# max_packets_per_iteration = 1024
-# ZLib compression level to use when sending mapblocks to the client.
-# -1 - Zlib's default compression level
-# 0 - no compresson, fastest
+# Compression level to use when sending mapblocks to the client.
+# -1 - use default compression level
+# 0 - least compression, fastest
# 9 - best compression, slowest
-# (levels 1-3 use Zlib's "fast" method, 4-9 use the normal method)
# type: int min: -1 max: 9
# map_compression_level_net = -1
@@ -1364,6 +1366,11 @@
# type: string
# chat_message_format = <@name> @message
+# If the execution of a chat command takes longer than this specified time in
+# seconds, add the time information to the chat command message
+# type: float
+# chatcommand_msg_time_threshold = 0.1
+
# A message to be displayed to all clients when the server shuts down.
# type: string
# kick_msg_shutdown = Server shutting down.
@@ -1495,7 +1502,7 @@
# deprecated_lua_api_handling = log
# Number of extra blocks that can be loaded by /clearobjects at once.
-# This is a trade-off between sqlite transaction overhead and
+# This is a trade-off between SQLite transaction overhead and
# memory consumption (4096=100MB, as a rule of thumb).
# type: int
# max_clearobjects_extra_loaded_blocks = 4096
@@ -1513,13 +1520,12 @@
# type: enum values: 0, 1, 2
# sqlite_synchronous = 2
-# ZLib compression level to use when saving mapblocks to disk.
-# -1 - Zlib's default compression level
-# 0 - no compresson, fastest
+# Compression level to use when saving mapblocks to disk.
+# -1 - use default compression level
+# 0 - least compression, fastest
# 9 - best compression, slowest
-# (levels 1-3 use Zlib's "fast" method, 4-9 use the normal method)
# type: int min: -1 max: 9
-# map_compression_level_disk = 3
+# map_compression_level_disk = -1
# Length of a server tick and the interval at which objects are generally updated over
# network.
@@ -1647,7 +1653,7 @@
# type: bool
# instrument.lbm = true
-# Instrument chatcommands on registration.
+# Instrument chat commands on registration.
# type: bool
# instrument.chatcommand = true
@@ -1682,7 +1688,7 @@
# Set the language. Leave empty to use the system language.
# A restart is required after changing this.
-# type: enum values: , ar, ca, cs, da, de, dv, el, en, eo, es, et, eu, fil, fr, hu, id, it, ja, ja_KS, jbo, kk, kn, lo, lt, ms, my, nb, nl, nn, pl, pt, pt_BR, ro, ru, sl, sr_Cyrl, sv, sw, th, tr, uk, vi
+# type: enum values: , be, bg, ca, cs, da, de, el, en, eo, es, et, eu, fi, fr, gd, gl, hu, id, it, ja, jbo, kk, ko, lt, lv, ms, nb, nl, nn, pl, pt, pt_BR, ro, ru, sk, sl, sr_Cyrl, sr_Latn, sv, sw, tr, uk, vi, zh_CN, zh_TW
# language =
# Level of logging to be written to debug.txt:
@@ -1714,10 +1720,9 @@
## Advanced
-# Default timeout for cURL, stated in milliseconds.
-# Only has an effect if compiled with cURL.
+# Maximum time an interactive request (e.g. server list fetch) may take, stated in milliseconds.
# type: int
-# curl_timeout = 5000
+# curl_timeout = 20000
# Limits number of parallel HTTP requests. Affects:
# - Media fetch if server uses remote_media setting.
@@ -1727,14 +1732,10 @@
# type: int
# curl_parallel_limit = 8
-# Maximum time in ms a file download (e.g. a mod download) may take.
+# Maximum time a file download (e.g. a mod download) may take, stated in milliseconds.
# type: int
# curl_file_download_timeout = 300000
-# Makes DirectX work with LuaJIT. Disable if it causes troubles.
-# type: bool
-# high_precision_fpu = true
-
# Replaces the default main menu with a custom one.
# type: string
# main_menu_script =
@@ -1766,12 +1767,12 @@
# 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
-# mapgen_limit = 31000
+# type: int min: 0 max: 31007
+# mapgen_limit = 31007
# Global map generation attributes.
# In Mapgen v6 the 'decorations' flag controls all decorations except trees
-# and junglegrass, in all other mapgens this flag controls all decorations.
+# and jungle grass, in all other mapgens this flag controls all decorations.
# type: flags possible values: caves, dungeons, light, decorations, biomes, ores, nocaves, nodungeons, nolight, nodecorations, nobiomes, noores
# mg_flags = caves,dungeons,light,decorations,biomes,ores
@@ -3352,17 +3353,17 @@
# enable_mapgen_debug_info = false
# Maximum number of blocks that can be queued for loading.
-# type: int
+# type: int min: 1 max: 1000000
# emergequeue_limit_total = 1024
# Maximum number of blocks to be queued that are to be loaded from file.
# This limit is enforced per player.
-# type: int
+# type: int min: 1 max: 1000000
# emergequeue_limit_diskonly = 128
# Maximum number of blocks to be queued that are to be generated.
# This limit is enforced per player.
-# type: int
+# type: int min: 1 max: 1000000
# emergequeue_limit_generate = 128
# Number of emerge threads to use.
diff --git a/misc/Info.plist b/misc/Info.plist
index 1498ee474..0491d2fc1 100644
--- a/misc/Info.plist
+++ b/misc/Info.plist
@@ -8,7 +8,13 @@
<string>minetest</string>
<key>CFBundleIconFile</key>
<string>minetest-icon.icns</string>
+ <key>CFBundleName</key>
+ <string>Minetest</string>
+ <key>CFBundleDisplayName</key>
+ <string>Minetest</string>
<key>CFBundleIdentifier</key>
<string>net.minetest.minetest</string>
+ <key>NSHighResolutionCapable</key>
+ <false/>
</dict>
</plist>
diff --git a/misc/debpkg-control b/misc/debpkg-control
index 30dc94088..e867f3eb9 100644
--- a/misc/debpkg-control
+++ b/misc/debpkg-control
@@ -2,8 +2,8 @@ Section: games
Priority: extra
Standards-Version: 3.6.2
Package: minetest-staging
-Version: 0.4.15-DATEPLACEHOLDER
-Depends: libc6, libcurl3-gnutls, libfreetype6, libirrlicht1.8, libjsoncpp1, LEVELDB_PLACEHOLDER, liblua5.1-0, libluajit-5.1-2, libopenal1, libsqlite3-0, libstdc++6, libvorbisfile3, libx11-6, zlib1g
+Version: 5.4.0-DATEPLACEHOLDER
+Depends: libc6, libcurl3-gnutls, libfreetype6, libgl1, JPEG_PLACEHOLDER, JSONCPP_PLACEHOLDER, LEVELDB_PLACEHOLDER, libopenal1, libpng16-16, libsqlite3-0, libstdc++6, libvorbisfile3, libx11-6, libxxf86vm1, libzstd1, zlib1g
Maintainer: Loic Blot <loic.blot@unix-experience.fr>
Homepage: https://www.minetest.net/
Vcs-Git: https://github.com/minetest/minetest.git
@@ -12,15 +12,12 @@ Architecture: amd64
Build-Depends:
cmake,
gettext,
- libbz2-dev,
libcurl4-gnutls-dev,
libfreetype6-dev,
- libglu1-mesa-dev,
- libirrlicht-dev (>= 1.7.0),
+ libgl1-mesa-dev,
libjpeg-dev,
libjsoncpp-dev,
libleveldb-dev,
- libluajit-5.1-dev | liblua5.1-dev,
libogg-dev,
libopenal-dev,
libpng-dev,
@@ -28,7 +25,7 @@ Build-Depends:
libvorbis-dev,
libx11-dev,
zlib1g-dev
-Description: Multiplayer infinite-world block sandbox (server)
+Description: Multiplayer infinite-world block sandbox game
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
diff --git a/misc/net.minetest.minetest.appdata.xml b/misc/net.minetest.minetest.appdata.xml
index 02e1139c2..a6b61448e 100644
--- a/misc/net.minetest.minetest.appdata.xml
+++ b/misc/net.minetest.minetest.appdata.xml
@@ -62,6 +62,6 @@
<translation type="gettext">minetest</translation>
<update_contact>sfan5@live.de</update_contact>
<releases>
- <release date="2021-10-23" version="5.4.2"/>
+ <release date="2022-01-30" version="5.5.0"/>
</releases>
</component>
diff --git a/po/ar/minetest.po b/po/ar/minetest.po
index 9b037bf47..fc4891024 100644
--- a/po/ar/minetest.po
+++ b/po/ar/minetest.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-23 19:03+0100\n"
-"PO-Revision-Date: 2021-03-19 20:18+0000\n"
+"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"PO-Revision-Date: 2021-12-05 13:51+0000\n"
"Last-Translator: abidin toumi <abidin24@disroot.org>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/minetest/minetest/"
"ar/>\n"
@@ -18,7 +18,43 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
-"X-Generator: Weblate 4.5.2-dev\n"
+"X-Generator: Weblate 4.10-dev\n"
+
+#: builtin/client/chatcommands.lua
+msgid "Clear the out chat queue"
+msgstr "امسح طابور الرسائل الصادرة"
+
+#: builtin/client/chatcommands.lua
+msgid "Empty command."
+msgstr "أمر فارغ."
+
+#: builtin/client/chatcommands.lua
+msgid "Exit to main menu"
+msgstr "اخرج للقائمة الرئيسة"
+
+#: builtin/client/chatcommands.lua
+msgid "Invalid command: "
+msgstr "أمر غير صالح: "
+
+#: builtin/client/chatcommands.lua
+msgid "Issued command: "
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "List online players"
+msgstr "قائمة اللاعبين المتصلين"
+
+#: builtin/client/chatcommands.lua
+msgid "Online players: "
+msgstr "اللاعبون المتصلون: "
+
+#: builtin/client/chatcommands.lua
+msgid "The out chat queue is now empty."
+msgstr "طابور الرسائل الصادرة فارغ."
+
+#: builtin/client/chatcommands.lua
+msgid "This command is disabled by server."
+msgstr "هذا الأمر معطل من الخادم."
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
@@ -28,11 +64,41 @@ msgstr "أعِد الإحياء"
msgid "You died"
msgstr "مِت"
+#: builtin/common/chatcommands.lua
+msgid "Available commands:"
+msgstr "الأوامر المتوفرة:"
+
+#: builtin/common/chatcommands.lua
+msgid "Available commands: "
+msgstr "الأوامر المتاحة: "
+
+#: builtin/common/chatcommands.lua
+msgid "Command not available: "
+msgstr "الأوامر غير المتاحة: "
+
+#: builtin/common/chatcommands.lua
+msgid "Get help for commands"
+msgstr "احصل على تعليمات الأوامر"
+
+#: builtin/common/chatcommands.lua
+msgid ""
+"Use '.help <cmd>' to get more information, or '.help all' to list everything."
+msgstr ""
+"استخدم '.help <cmd>' للحصول على مزيد من المعلومات أو '.help all' لعرض كل شيء."
+
+#: builtin/common/chatcommands.lua
+msgid "[all | <cmd>]"
+msgstr "[all | <cmd>]"
+
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
msgstr "موافق"
#: builtin/fstk/ui.lua
+msgid "<none available>"
+msgstr "<ليس متاحًا>"
+
+#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
msgstr "حدث خطأ في برنامج Lua النصي:"
@@ -167,7 +233,7 @@ msgstr "الاعتماديتان \"$1\" و $2 ستثبتان."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 by $2"
-msgstr ""
+msgstr "$1 بواسطة $2"
#: builtin/mainmenu/dlg_contentstore.lua
msgid ""
@@ -187,7 +253,7 @@ msgstr "يحتاج $1 لكن لم يُعثر عليها."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 will be installed, and $2 dependencies will be skipped."
-msgstr ""
+msgstr "$1 سيُثبت، واعتماديات $1 ستُتجاهل."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "All packages"
@@ -203,7 +269,7 @@ msgstr "عُد للقائمة الرئيسة"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Base Game:"
-msgstr "اللعبة القاعدية"
+msgstr "اللعبة القاعدية :"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "ContentDB is not available when Minetest was compiled without cURL"
@@ -235,6 +301,11 @@ msgid "Install missing dependencies"
msgstr "ثبت الإعتماديات المفقودة"
#: builtin/mainmenu/dlg_contentstore.lua
+#, fuzzy
+msgid "Install: Unsupported file type or broken archive"
+msgstr "يثبت: نوع الملف \"$1\" غير مدعوم أو هو أرشيف تالف"
+
+#: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "التعديلات"
@@ -285,7 +356,7 @@ msgstr "حدِّث الكل [$1]"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "View more information in a web browser"
-msgstr ""
+msgstr "اعرض مزيدًا من المعلومات عبر المتصفح"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
@@ -313,11 +384,11 @@ msgstr "مواطن بيئية"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caverns"
-msgstr "مغارات"
+msgstr "كهوف"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caves"
-msgstr "كهوف"
+msgstr "مغارات"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
@@ -401,7 +472,7 @@ msgstr "تدفق الطين"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Network of tunnels and caves"
-msgstr "شبكة أنفاق وكهوف"
+msgstr "شبكة أنفاق ومغارات"
#: builtin/mainmenu/dlg_create_world.lua
msgid "No game selected"
@@ -535,7 +606,7 @@ msgstr "< عد لصفحة الإعدادات"
msgid "Browse"
msgstr "استعرض"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "عطِّل"
@@ -561,7 +632,7 @@ msgstr "المُعادل"
#: builtin/mainmenu/dlg_settings_advanced.lua
#, fuzzy
-msgid "Persistance"
+msgid "Persistence"
msgstr "استمرار"
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -580,7 +651,7 @@ msgstr "إستعِد الإفتراضي"
msgid "Scale"
msgstr "تكبير/تصغير"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
msgstr "إبحث"
@@ -673,14 +744,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1"
msgstr "تثبيت تعديل: لا يمكن العصور على اسم مجلد مناسب لحزمة التعديلات $1"
#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: Unsupported file type \"$1\" or broken archive"
-msgstr "يثبت: نوع الملف \"$1\" غير مدعوم أو هو أرشيف تالف"
-
-#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: file: \"$1\""
-msgstr "ثبت: الملف: \"$1\""
-
-#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
msgstr "فشل إيجاد تعديل أو حزمة تعديلات صالحة"
@@ -712,6 +775,42 @@ msgstr "قائمة الخوادم العمومية معطلة"
msgid "Try reenabling public serverlist and check your internet connection."
msgstr "جرب إعادة تمكين قائمة الحوادم العامة وتحقق من إتصالك بالانترنت."
+#: builtin/mainmenu/tab_about.lua
+msgid "About"
+msgstr "حول"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active Contributors"
+msgstr "المساهمون النشطون"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active renderer:"
+msgstr "محرك التصيير النشط:"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Core Developers"
+msgstr "المطورون الرئيسيون"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Open User Data Directory"
+msgstr "افتح دليل بيانات المستخدم"
+
+#: builtin/mainmenu/tab_about.lua
+msgid ""
+"Opens the directory that contains user-provided worlds, games, mods,\n"
+"and texture packs in a file manager / explorer."
+msgstr ""
+"يفتح الدليل الذي يحوي العوالم والألعاب والتعديلات \n"
+"وحزم الإكساء في مدير الملفات."
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Contributors"
+msgstr "المساهمون السابقون"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Core Developers"
+msgstr "المطورون الرئيسيون السابقون"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "تصفح المحتوى عبر الانترنت"
@@ -752,38 +851,6 @@ msgstr "أزل الحزمة"
msgid "Use Texture Pack"
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 "Open User Data Directory"
-msgstr "افتح دليل بيانات المستخدم"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid ""
-"Opens the directory that contains user-provided worlds, games, mods,\n"
-"and texture packs in a file manager / explorer."
-msgstr ""
-"يفتح الدليل الذي يحوي العوالم والألعاب والتعديلات \n"
-"وحزم الإكساء في مدير الملفات."
-
-#: 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 "أعلن عن الخادوم"
@@ -813,7 +880,7 @@ msgstr "استضف خدوم"
msgid "Install games from ContentDB"
msgstr "ثبت العابا من ContentDB"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Name"
msgstr "الاسم"
@@ -825,7 +892,7 @@ msgstr "جديد"
msgid "No world created or selected!"
msgstr "لم تنشئ او تحدد عالما!"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Password"
msgstr "كلمة المرور"
@@ -833,7 +900,7 @@ msgstr "كلمة المرور"
msgid "Play Game"
msgstr "إلعب"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
msgstr "المنفذ"
@@ -854,8 +921,12 @@ msgid "Start Game"
msgstr "ابدأ اللعبة"
#: builtin/mainmenu/tab_online.lua
-msgid "Address / Port"
-msgstr "العنوان \\ المنفذ"
+msgid "Address"
+msgstr "عنوان"
+
+#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
+msgid "Clear"
+msgstr "امسح"
#: builtin/mainmenu/tab_online.lua
msgid "Connect"
@@ -865,34 +936,42 @@ msgstr "اتصل"
msgid "Creative mode"
msgstr "النمط الإبداعي"
+#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "Damage enabled"
-msgstr "الضرر ممكن"
+msgid "Damage / PvP"
+msgstr "الضرر / قتال اللاعبين"
#: builtin/mainmenu/tab_online.lua
msgid "Del. Favorite"
msgstr "حذف المفضلة"
#: builtin/mainmenu/tab_online.lua
-msgid "Favorite"
+msgid "Favorites"
msgstr "المفضلة"
#: builtin/mainmenu/tab_online.lua
-msgid "Join Game"
-msgstr "انضم للعبة"
+msgid "Incompatible Servers"
+msgstr "خوادم غير متوافقة"
#: builtin/mainmenu/tab_online.lua
-msgid "Name / Password"
-msgstr "الاسم \\ كلمة المرور"
+msgid "Join Game"
+msgstr "انضم للعبة"
#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr ""
-#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "PvP enabled"
-msgstr "قتال اللاعبين ممكن"
+msgid "Public Servers"
+msgstr "خوادم عمومية"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Refresh"
+msgstr "حدِّث"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Server Description"
+msgstr "وصف الخادم"
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -934,11 +1013,31 @@ msgstr "غيِر المفاتيح"
msgid "Connected Glass"
msgstr "زجاج متصل"
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Dynamic shadows"
+msgstr "ظلال ديناميكية"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Dynamic shadows: "
+msgstr "ظلال ديناميكية: "
+
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
msgstr "اوراق بتفاصيل واضحة"
#: builtin/mainmenu/tab_settings.lua
+msgid "High"
+msgstr "عالي"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Low"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Medium"
+msgstr "متوسط"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
msgstr ""
@@ -1010,10 +1109,6 @@ msgstr "إضاءة سلسة"
msgid "Texturing:"
msgstr "الإكساء:"
-#: builtin/mainmenu/tab_settings.lua
-msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "لاستخدام المظللات يجب استخدام تعريف OpenGL."
-
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
msgstr ""
@@ -1027,6 +1122,14 @@ msgid "Trilinear Filter"
msgstr "مرشح خطي ثلاثي"
#: builtin/mainmenu/tab_settings.lua
+msgid "Ultra High"
+msgstr "عالية جدا"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Very Low"
+msgstr "منخفضة جدًا"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
msgstr "اوراق متموجة"
@@ -1038,7 +1141,7 @@ msgstr "سوائل متموجة"
msgid "Waving Plants"
msgstr "نباتات متموجة"
-#: src/client/client.cpp
+#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "انتهت مهلة الاتصال."
@@ -1067,8 +1170,8 @@ msgid "Connection error (timed out?)"
msgstr "خطأ في الاتصال (انتهاء المهلة؟)"
#: src/client/clientlauncher.cpp
-msgid "Could not find or load game \""
-msgstr "لا يمكن إيجاد أو تحميل لعبة \""
+msgid "Could not find or load game: "
+msgstr "تعذر العثور على اللعبة أو تحميلها "
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
@@ -1098,18 +1201,6 @@ msgstr "فشل فتح ملف كلمة المرور المدخل: "
msgid "Provided world path doesn't exist: "
msgstr "مسار العالم المدخل غير موجود: "
-#. ~ DO NOT TRANSLATE THIS LITERALLY!
-#. This is a special string. Put either "no" or "yes"
-#. into the translation field (literally).
-#. Choose "yes" if the language requires use of the fallback
-#. font, "no" otherwise.
-#. The fallback font is (normally) required for languages with
-#. non-Latin script, like Chinese.
-#. When in doubt, test your translation.
-#: src/client/fontengine.cpp
-msgid "needs_fallback_font"
-msgstr "yes"
-
#: src/client/game.cpp
msgid ""
"\n"
@@ -1123,14 +1214,6 @@ msgid "- Address: "
msgstr "- العنوان: "
#: src/client/game.cpp
-msgid "- Creative Mode: "
-msgstr "- النمط الإبداعي: "
-
-#: src/client/game.cpp
-msgid "- Damage: "
-msgstr "- التضرر: "
-
-#: src/client/game.cpp
msgid "- Mode: "
msgstr "- النمط: "
@@ -1152,6 +1235,16 @@ msgid "- Server Name: "
msgstr "- اسم الخادم: "
#: src/client/game.cpp
+#, fuzzy
+msgid "A serialization error occurred:"
+msgstr "حدث خطأ في التسلسل:"
+
+#: src/client/game.cpp
+#, c-format
+msgid "Access denied. Reason: %s"
+msgstr "رُفض النفاذ. السبب: %s"
+
+#: src/client/game.cpp
msgid "Automatic forward disabled"
msgstr "المشي التلقائي معطل"
@@ -1160,6 +1253,22 @@ msgid "Automatic forward enabled"
msgstr "المشي التلقائي ممكن"
#: src/client/game.cpp
+msgid "Block bounds hidden"
+msgstr "حدود الكتل مخفية"
+
+#: src/client/game.cpp
+msgid "Block bounds shown for all blocks"
+msgstr "حدود كل الكتل ظاهرة"
+
+#: src/client/game.cpp
+msgid "Block bounds shown for current block"
+msgstr "حدود الكتلة الحالية ظاهرة"
+
+#: src/client/game.cpp
+msgid "Block bounds shown for nearby blocks"
+msgstr "حدود الكتل القريبة ظاهرة"
+
+#: src/client/game.cpp
msgid "Camera update disabled"
msgstr "تحديث الكاميرا معطل"
@@ -1168,6 +1277,10 @@ msgid "Camera update enabled"
msgstr "تحديث الكاميرا مفعل"
#: src/client/game.cpp
+msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgstr "تعذر إظهار حدود الكتل ( تحتاج امتياز 'basic_debug')"
+
+#: src/client/game.cpp
msgid "Change Password"
msgstr "غير كلمة المرور"
@@ -1180,6 +1293,10 @@ msgid "Cinematic mode enabled"
msgstr "الوضع السينمائي مفعل"
#: src/client/game.cpp
+msgid "Client disconnected"
+msgstr "فُصل الاتصال عن العميل"
+
+#: src/client/game.cpp
msgid "Client side scripting is disabled"
msgstr "البرمجة النصية معطلة من جانب العميل"
@@ -1188,6 +1305,10 @@ msgid "Connecting to server..."
msgstr "يتصل بالخادوم…"
#: src/client/game.cpp
+msgid "Connection failed for unknown reason"
+msgstr "فشل الاتصال لسبب مجهول"
+
+#: src/client/game.cpp
msgid "Continue"
msgstr "تابع"
@@ -1225,6 +1346,11 @@ msgstr ""
"- -%s: دردشة\n"
#: src/client/game.cpp
+#, c-format
+msgid "Couldn't resolve address: %s"
+msgstr "تعذر تحليل العنوان:%s"
+
+#: src/client/game.cpp
msgid "Creating client..."
msgstr "ينشىء عميلا…"
@@ -1353,6 +1479,10 @@ msgid "Minimap currently disabled by game or mod"
msgstr "الخريطة المصغرة معطلة من قبل لعبة أو تعديل"
#: src/client/game.cpp
+msgid "Multiplayer"
+msgstr "متعدد اللاعبين"
+
+#: src/client/game.cpp
msgid "Noclip mode disabled"
msgstr "وضع العقبات مفعل"
@@ -1426,6 +1556,21 @@ msgstr "الصوت غير مكتوم"
#: src/client/game.cpp
#, c-format
+msgid "The server is probably running a different version of %s."
+msgstr "يُحتمل أن نسخة الخادم مختلفة عن %s."
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to connect to %s because IPv6 is disabled"
+msgstr "تعذر الاتصال بـ %s لأن IPv6 معطلة"
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to listen on %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
msgid "Viewing range changed to %d"
msgstr "غُيرَ مدى الرؤية الى %d"
@@ -1494,13 +1639,8 @@ msgid "Caps Lock"
msgstr "Caps Lock"
#: src/client/keycode.cpp
-msgid "Clear"
-msgstr "امسح"
-
-#: src/client/keycode.cpp
-#, fuzzy
msgid "Control"
-msgstr "Control"
+msgstr "التحكم"
#: src/client/keycode.cpp
msgid "Down"
@@ -1516,17 +1656,15 @@ msgstr ""
#: src/client/keycode.cpp
msgid "Execute"
-msgstr ""
+msgstr "شغّل"
#: src/client/keycode.cpp
-#, fuzzy
msgid "Help"
-msgstr "Help"
+msgstr "مساعدة"
#: src/client/keycode.cpp
-#, fuzzy
msgid "Home"
-msgstr "Home"
+msgstr "الرئيسية"
#: src/client/keycode.cpp
#, fuzzy
@@ -1799,19 +1937,26 @@ msgid "Minimap hidden"
msgstr "الخريطة المصغرة مخفية"
#: src/client/minimap.cpp
-#, fuzzy, c-format
+#, c-format
msgid "Minimap in radar mode, Zoom x%d"
-msgstr "الخريطة المصغرة في وضع الرادار، تكبير x1"
+msgstr "الخريطة المصغرة في وضع الرادار، تكبير x%d"
#: src/client/minimap.cpp
-#, fuzzy, c-format
+#, c-format
msgid "Minimap in surface mode, Zoom x%d"
-msgstr "الخريطة المصغرة في وضع الأسطح، تكبير x1"
+msgstr "الخريطة المصغرة في وضع الأسطح، تكبير x%d"
#: src/client/minimap.cpp
-#, fuzzy
msgid "Minimap in texture mode"
-msgstr "الخريطة المصغرة في وضع الأسطح، تكبير x1"
+msgstr "الخريطة المصغرة في وضع الاكساء"
+
+#: src/gui/guiChatConsole.cpp
+msgid "Failed to open webpage"
+msgstr "فشل فتح صفحة الويب"
+
+#: src/gui/guiChatConsole.cpp
+msgid "Opening webpage"
+msgstr "يفتح صفحة الويب"
#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
msgid "Passwords do not match!"
@@ -1839,8 +1984,8 @@ msgid "Proceed"
msgstr "تابع"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "\"Special\" = climb down"
-msgstr "\"خاص\" = التسلق نزولا"
+msgid "\"Aux1\" = climb down"
+msgstr "\"Aux1\" = التسلق نزولا"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Autoforward"
@@ -1851,10 +1996,18 @@ msgid "Automatic jumping"
msgstr "القفز التلقائي"
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Aux1"
+msgstr "Aux1"
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
msgstr "للخلف"
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Block bounds"
+msgstr "حدود الكتلة"
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Change camera"
msgstr "غير الكاميرا"
@@ -1872,11 +2025,11 @@ msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
msgid "Dec. range"
-msgstr ""
+msgstr "قلل المدى"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Dec. volume"
-msgstr ""
+msgstr "قلل الحجم"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Double tap \"jump\" to toggle fly"
@@ -1892,11 +2045,11 @@ msgstr "للأمام"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inc. range"
-msgstr ""
+msgstr "زد المدى"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inc. volume"
-msgstr ""
+msgstr "زد الحجم"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inventory"
@@ -1940,11 +2093,7 @@ msgstr "صوّر الشاشة"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Sneak"
-msgstr ""
-
-#: src/gui/guiKeyChangeMenu.cpp
-msgid "Special"
-msgstr "خاص"
+msgstr "تسلل"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle HUD"
@@ -2007,8 +2156,9 @@ msgid "Muted"
msgstr "مكتوم"
#: src/gui/guiVolumeChange.cpp
-msgid "Sound Volume: "
-msgstr "حجم الصوت: "
+#, c-format
+msgid "Sound Volume: %d%%"
+msgstr "حجم الصوت: %d%%"
#. ~ Imperative, as in "Enter/type in text".
#. Don't forget the space.
@@ -2033,8 +2183,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"(Android) Use virtual joystick to trigger \"aux\" button.\n"
-"If enabled, virtual joystick will also tap \"aux\" button when out of main "
+"(Android) Use virtual joystick to trigger \"Aux1\" button.\n"
+"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
@@ -2091,11 +2241,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "3D clouds"
-msgstr ""
+msgstr "سحب ثلاثية الأبعاد"
#: src/settings_translation_file.cpp
msgid "3D mode"
-msgstr ""
+msgstr "وضع الشاشة ثلاثية الأبعاد"
#: src/settings_translation_file.cpp
msgid "3D mode parallax strength"
@@ -2157,7 +2307,7 @@ msgstr ""
#: 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."
@@ -2177,23 +2327,23 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Acceleration in air"
-msgstr ""
+msgstr "تسارع الطيران"
#: src/settings_translation_file.cpp
msgid "Acceleration of gravity, in nodes per second per second."
-msgstr ""
+msgstr "تسارع الجاذبية، عقدة/ثانية²."
#: src/settings_translation_file.cpp
msgid "Active Block Modifiers"
-msgstr ""
+msgstr "معدِلات الكتل النشطة"
#: src/settings_translation_file.cpp
msgid "Active block management interval"
-msgstr ""
+msgstr "مهلة إدارة الكتل النشطة"
#: src/settings_translation_file.cpp
msgid "Active block range"
-msgstr ""
+msgstr "مدى الكتل النشطة"
#: src/settings_translation_file.cpp
msgid "Active object send range"
@@ -2205,6 +2355,10 @@ 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."
@@ -2217,6 +2371,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Adjust the detected display density, used for scaling UI elements."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, c-format
msgid ""
"Adjusts the density of the floatland layer.\n"
@@ -2228,9 +2386,10 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Advanced"
-msgstr ""
+msgstr "متقدم"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Alters the light curve by applying 'gamma correction' to it.\n"
"Higher values make middle and lower light levels brighter.\n"
@@ -2238,6 +2397,11 @@ msgid ""
"This only has significant effect on daylight and artificial\n"
"light, it has very little effect on natural night light."
msgstr ""
+"يعدل منحنى الضوء عن طريق تطبيق \"تصحيح جاما\" عليه.\n"
+"القيم الأعلى تجعل مستويات الإضاءة المتوسطة والدنيا أكثر بريقًا.\n"
+"تترك القيمة \"1.0\" منحنى الضوء على حاله.\n"
+"لها تأثير كبير فقط على ضوء النهار والضوء الصناعي ، ولها تأثير ضئيل للغاية "
+"على ضوء الليل الطبيعي."
#: src/settings_translation_file.cpp
msgid "Always fly and fast"
@@ -2249,11 +2413,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Amount of messages a player may send per 10 seconds."
-msgstr ""
+msgstr "عدد اارسائل المسموح بها لكل 10 ثوان."
#: src/settings_translation_file.cpp
msgid "Amplifies the valleys."
-msgstr ""
+msgstr "تضخيم الوديان."
#: src/settings_translation_file.cpp
msgid "Anisotropic filtering"
@@ -2261,15 +2425,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Announce server"
-msgstr ""
+msgstr "أعلن عن الخادم"
#: src/settings_translation_file.cpp
msgid "Announce to this serverlist."
-msgstr ""
+msgstr "أدرجه في هذه القائمة."
#: src/settings_translation_file.cpp
msgid "Append item name"
-msgstr ""
+msgstr "ضمّن اسم العنصر"
#: src/settings_translation_file.cpp
msgid "Append item name to tooltip."
@@ -2291,7 +2455,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Ask to reconnect after crash"
-msgstr ""
+msgstr "اطلب إعادة الاتصال بعد انقطاعه"
#: src/settings_translation_file.cpp
msgid ""
@@ -2310,11 +2474,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Automatic forward key"
-msgstr ""
+msgstr "زر المشي التلقائي"
#: src/settings_translation_file.cpp
msgid "Automatically jump up single-node obstacles."
-msgstr ""
+msgstr "قفز تلقائي فوق العوائق التي ارتفاعها كتلة واحدة."
#: src/settings_translation_file.cpp
msgid "Automatically report to the serverlist."
@@ -2322,31 +2486,39 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Autosave screen size"
-msgstr ""
+msgstr "حفظ حجم الشاشة تلقائيًا"
#: src/settings_translation_file.cpp
msgid "Autoscaling mode"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Aux1 key"
+msgstr "مفتاح Aux1"
+
+#: src/settings_translation_file.cpp
+msgid "Aux1 key for climbing/descending"
+msgstr "مفتاح Aux1 للتسلق / للنزول"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Base ground level"
-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"
@@ -2358,7 +2530,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Bilinear filtering"
-msgstr ""
+msgstr "ترشيح خطي ثنائي"
#: src/settings_translation_file.cpp
msgid "Bind address"
@@ -2373,36 +2545,32 @@ 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 "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
-msgstr ""
+msgstr "مسار الخطين العريض والمائل"
#: src/settings_translation_file.cpp
msgid "Bold and italic monospace font path"
-msgstr ""
+msgstr "مسار خطي monospace العريض والمائل"
#: src/settings_translation_file.cpp
msgid "Bold font path"
-msgstr ""
+msgstr "مسار الخط العريض"
#: src/settings_translation_file.cpp
msgid "Bold monospace font path"
-msgstr ""
+msgstr "مسار خط monospace العريض"
#: 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 ""
@@ -2414,11 +2582,11 @@ 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"
@@ -2438,7 +2606,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr ""
+msgstr "عُرض المغارة"
#: src/settings_translation_file.cpp
msgid "Cave1 noise"
@@ -2475,12 +2643,21 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Chat font size"
+msgid "Chat command time message threshold"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chat commands"
+msgstr "الأوامر"
+
+#: src/settings_translation_file.cpp
+msgid "Chat font size"
+msgstr "حجم خط المحادثة"
+
+#: src/settings_translation_file.cpp
msgid "Chat key"
-msgstr ""
+msgstr "مفتاح المحادثة"
#: src/settings_translation_file.cpp
msgid "Chat log level"
@@ -2488,11 +2665,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Chat message count limit"
-msgstr ""
+msgstr "حدُّ رسائل المحادثة"
#: src/settings_translation_file.cpp
msgid "Chat message format"
-msgstr ""
+msgstr "نسقُ رسائل المحادثة"
#: src/settings_translation_file.cpp
msgid "Chat message kick threshold"
@@ -2500,15 +2677,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Chat message max length"
-msgstr ""
+msgstr "الطول الأقصى لرسائل المحادثة"
#: src/settings_translation_file.cpp
msgid "Chat toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Chatcommands"
-msgstr ""
+msgid "Chat weblinks"
+msgstr "روابط المحادثة"
#: src/settings_translation_file.cpp
msgid "Chunk size"
@@ -2516,23 +2693,31 @@ 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 ""
#: src/settings_translation_file.cpp
-msgid "Client"
+msgid ""
+"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console "
+"output."
msgstr ""
+"روابط ويب قابلة للنقر (زر الفأرة الأوسط أو زر الفأرة الأيسر+Ctrl) مفعلة في "
+"المحادثة."
+
+#: 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"
@@ -2548,15 +2733,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Climbing speed"
-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."
@@ -2564,11 +2749,15 @@ 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 "Colored shadows"
+msgstr "ظلال ملونة"
#: src/settings_translation_file.cpp
msgid ""
@@ -2598,16 +2787,40 @@ msgid "Command key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Connect glass"
+msgid ""
+"Compression level to use when saving mapblocks to disk.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
msgstr ""
+"مستوى ضغط لحفظ الملف mapblocks في القرص.\n"
+"-1 - المستوى الافتراضي\n"
+"0 - ضغط ضعيف، سريع\n"
+"9 - ضغط قوي، بطيء"
#: src/settings_translation_file.cpp
-msgid "Connect to external media server"
+msgid ""
+"Compression level to use when sending mapblocks to the client.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
msgstr ""
+"مستوى ضغط لإرسال ملف mapblocks للعميل.\n"
+"-1 - المستوى الافتراضي\n"
+"0 - ضغط ضعيف، سريع\n"
+"9 - ضغط قوي، بطيء"
+
+#: 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 ""
+msgstr "زجاج متصل اذا كانت العقدة تدعمه."
#: src/settings_translation_file.cpp
msgid "Console alpha"
@@ -2645,7 +2858,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Controls"
-msgstr ""
+msgstr "التحكم"
#: src/settings_translation_file.cpp
msgid ""
@@ -2653,6 +2866,9 @@ msgid ""
"Examples:\n"
"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged."
msgstr ""
+"يتحكم في طول دورة النهار والليل.\n"
+"أمثلة:\n"
+"72 = 20 دقيقة ، 360 = 4 دقائق ، 1 = 24 ساعة ، 0 = نهار / ليل أبدي."
#: src/settings_translation_file.cpp
msgid "Controls sinking speed in liquid."
@@ -2675,11 +2891,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Crash message"
-msgstr ""
+msgstr "رسالة الانهيار"
#: src/settings_translation_file.cpp
msgid "Creative"
-msgstr ""
+msgstr "إبداعي"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha"
@@ -2688,7 +2904,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
-"Also controls the object crosshair color"
+"This also applies to the object crosshair."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2707,7 +2923,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Damage"
-msgstr ""
+msgstr "ضرر"
#: src/settings_translation_file.cpp
msgid "Debug info toggle key"
@@ -2723,11 +2939,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Dec. volume key"
-msgstr ""
+msgstr "مفتاح تقليل الحجم"
#: src/settings_translation_file.cpp
msgid "Decrease this to increase liquid resistance to movement."
-msgstr ""
+msgstr "قلل منه لزيادة مقاومة الحركة في السوائل."
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -2735,59 +2951,62 @@ 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 stack size"
-msgstr ""
+msgstr "حجم المكدس الافتراضي"
#: src/settings_translation_file.cpp
msgid ""
-"Default timeout for cURL, stated in milliseconds.\n"
-"Only has an effect if compiled with cURL."
+"Define shadow filtering quality.\n"
+"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
+"but also uses more resources."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
-msgstr ""
+msgstr "يحدد المناطق التي تتواجد بها أشجار التفاح."
#: src/settings_translation_file.cpp
msgid "Defines areas with sandy beaches."
-msgstr ""
+msgstr "يحدد المناطق التي توجد بها شواطئ رملية."
#: src/settings_translation_file.cpp
msgid "Defines distribution of higher terrain and steepness of cliffs."
-msgstr ""
+msgstr "يحدد توزع التضاريس العالية والمنحدرات."
#: src/settings_translation_file.cpp
msgid "Defines distribution of higher terrain."
-msgstr ""
+msgstr "يحدد توزع التضاريس العالية."
#: src/settings_translation_file.cpp
msgid "Defines full size of caverns, smaller values create larger caverns."
-msgstr ""
+msgstr "يضبط حجم الكهوف ، كلما قلت القيمة زاد حجم الكهوف."
#: src/settings_translation_file.cpp
msgid "Defines large-scale river channel structure."
@@ -2795,15 +3014,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Defines location and terrain of optional hills and lakes."
-msgstr ""
+msgstr "يحدد تضاريس التلال والبحيرات الاختيارية وموقعها."
#: src/settings_translation_file.cpp
msgid "Defines the base ground level."
-msgstr ""
+msgstr "يحدد مستوى الأرض الأساسي."
#: src/settings_translation_file.cpp
msgid "Defines the depth of the river channel."
-msgstr ""
+msgstr "يحدد عمق الأنهار."
#: src/settings_translation_file.cpp
msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
@@ -2819,7 +3038,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Defines tree areas and tree density."
-msgstr ""
+msgstr "يحدد مواقع الأشجار وكثافتها."
#: src/settings_translation_file.cpp
msgid ""
@@ -2829,19 +3048,20 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Delay in sending blocks after building"
-msgstr ""
+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 ""
+msgstr "معالجة API Lua القديمة"
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find giant caverns."
-msgstr ""
+msgstr "بُعد الكهوف الكبيرة عن السطح."
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find large caves."
@@ -2884,6 +3104,10 @@ msgid "Disallow empty passwords"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Display Density Scaling Factor"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -2928,6 +3152,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enable Poisson disk filtering.\n"
+"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF "
+"filtering."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable colored shadows.\n"
+"On true translucent nodes cast colored shadows. This is expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable console window"
msgstr ""
@@ -3036,6 +3273,12 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enables tradeoffs that reduce CPU load or increase rendering performance\n"
+"at the expense of minor visual glitches that do not impact game playability."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3074,18 +3317,6 @@ msgid "Fallback font path"
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 ""
@@ -3103,7 +3334,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Fast movement (via the \"special\" key).\n"
+"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
@@ -3137,14 +3368,14 @@ 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."
+"which PNG optimizers usually discard, often resulting in dark or\n"
+"light edges to transparent textures. Apply a filter to clean that up\n"
+"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Filtering"
-msgstr ""
+msgstr "الترشيح"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3160,11 +3391,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Fixed virtual joystick"
-msgstr ""
+msgstr "عصا التحكم الافتراضية ثابتة"
#: src/settings_translation_file.cpp
msgid "Floatland density"
-msgstr ""
+msgstr "كثافة الأرض الطافية"
#: src/settings_translation_file.cpp
msgid "Floatland maximum Y"
@@ -3192,7 +3423,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Fly key"
-msgstr ""
+msgstr "زر الطيران"
#: src/settings_translation_file.cpp
msgid "Flying"
@@ -3200,27 +3431,27 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Fog"
-msgstr ""
+msgstr "الضباب"
#: src/settings_translation_file.cpp
msgid "Fog start"
-msgstr ""
+msgstr "بداية الضباب"
#: src/settings_translation_file.cpp
msgid "Fog toggle key"
-msgstr ""
+msgstr "مفتاح تبديل ظهور الضباب"
#: src/settings_translation_file.cpp
msgid "Font bold by default"
-msgstr ""
+msgstr "الخط عريض افتراضيًا"
#: src/settings_translation_file.cpp
msgid "Font italic by default"
-msgstr ""
+msgstr "الخط مائل افتراضيًا"
#: src/settings_translation_file.cpp
msgid "Font shadow"
-msgstr ""
+msgstr "ظل الخط"
#: src/settings_translation_file.cpp
msgid "Font shadow alpha"
@@ -3228,18 +3459,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Font size"
-msgstr ""
+msgstr "حجم الخط"
#: src/settings_translation_file.cpp
-msgid "Font size of the default font in point (pt)."
+msgid "Font size divisible by"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the fallback font in point (pt)."
+msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the monospace font in point (pt)."
+msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3250,6 +3481,17 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"For pixel-style fonts that do not scale well, this ensures that font sizes "
+"used\n"
+"with this font will always be divisible by this value, in pixels. For "
+"instance,\n"
+"a pixel font 16 pixels tall should have this set to 16, so it will only ever "
+"be\n"
+"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Format of player chat messages. The following strings are valid "
"placeholders:\n"
"@name, @message, @timestamp (optional)"
@@ -3308,10 +3550,6 @@ 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)."
@@ -3336,10 +3574,6 @@ msgid "Full screen"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Full screen BPP"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
msgstr ""
@@ -3363,7 +3597,7 @@ msgstr ""
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."
+"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3432,7 +3666,8 @@ msgid "Heat noise"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Height component of the initial window size. Ignored in fullscreen mode."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3444,10 +3679,6 @@ msgid "Height select noise"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "High-precision FPU"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Hill steepness"
msgstr ""
@@ -3480,154 +3711,160 @@ msgid ""
"Horizontal acceleration in air when jumping or falling,\n"
"in nodes per second per second."
msgstr ""
+"التسارع الأفقي عند الصقوط والقفز،\n"
+"وحدتها عقدة/ثانية²."
#: src/settings_translation_file.cpp
msgid ""
"Horizontal and vertical acceleration in fast mode,\n"
"in nodes per second per second."
msgstr ""
+"التسارع الأفقي والعمودي في نمط السرعة،\n"
+"وحدتها عقدة/ثانية²."
#: src/settings_translation_file.cpp
msgid ""
"Horizontal and vertical acceleration on ground or when climbing,\n"
"in nodes per second per second."
msgstr ""
+"التسارع الأفقي والعمودي أثناء التسلق،\n"
+"وحدتها عقدة/ثانية²."
#: src/settings_translation_file.cpp
msgid "Hotbar next key"
-msgstr ""
+msgstr "مفتاح العنصر التالي في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar previous key"
-msgstr ""
+msgstr "مفتاح العنصر السابق في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 1 key"
-msgstr ""
+msgstr "مفتاح الخانة 1 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 10 key"
-msgstr ""
+msgstr "مفتاح الخانة 10 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 11 key"
-msgstr ""
+msgstr "مفتاح الخانة 11 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 12 key"
-msgstr ""
+msgstr "مفتاح الخانة 21 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 13 key"
-msgstr ""
+msgstr "مفتاح الخانة 13 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 14 key"
-msgstr ""
+msgstr "مفتاح الخانة 14 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 15 key"
-msgstr ""
+msgstr "مفتاح الخانة 15 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 16 key"
-msgstr ""
+msgstr "مفتاح الخانة 16 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 17 key"
-msgstr ""
+msgstr "مفتاح الخانة 17 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 18 key"
-msgstr ""
+msgstr "مفتاح الخانة 18 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 19 key"
-msgstr ""
+msgstr "مفتاح الخانة 19 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 2 key"
-msgstr ""
+msgstr "مفتاح الخانة 2 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 20 key"
-msgstr ""
+msgstr "مفتاح الخانة 20 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 21 key"
-msgstr ""
+msgstr "مفتاح الخانة 21 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 22 key"
-msgstr ""
+msgstr "مفتاح الخانة 22 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 23 key"
-msgstr ""
+msgstr "مفتاح الخانة 23 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 24 key"
-msgstr ""
+msgstr "مفتاح الخانة 24 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 25 key"
-msgstr ""
+msgstr "مفتاح الخانة 25 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 26 key"
-msgstr ""
+msgstr "مفتاح الخانة 26 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 27 key"
-msgstr ""
+msgstr "مفتاح الخانة 27 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 28 key"
-msgstr ""
+msgstr "مفتاح الخانة 28 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 29 key"
-msgstr ""
+msgstr "مفتاح الخانة 29 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 3 key"
-msgstr ""
+msgstr "مفتاح الخانة 3 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 30 key"
-msgstr ""
+msgstr "مفتاح الخانة 30 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 31 key"
-msgstr ""
+msgstr "مفتاح الخانة 31 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 32 key"
-msgstr ""
+msgstr "مفتاح الخانة 32 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 4 key"
-msgstr ""
+msgstr "مفتاح الخانة 4 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 5 key"
-msgstr ""
+msgstr "مفتاح الخانة 5 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 6 key"
-msgstr ""
+msgstr "مفتاح الخانة 6 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 7 key"
-msgstr ""
+msgstr "مفتاح الخانة 7 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 8 key"
-msgstr ""
+msgstr "مفتاح الخانة 8 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 9 key"
-msgstr ""
+msgstr "مفتاح الخانة 9 في شريط الإجراءات"
#: src/settings_translation_file.cpp
msgid "How deep to make rivers."
@@ -3639,6 +3876,9 @@ msgid ""
"If negative, liquid waves will move backwards.\n"
"Requires waving liquids to be enabled."
msgstr ""
+"سرعة موجات السوائل.كلما زادت القيمة زادت سرعتها.\n"
+"إذا كانت سالبة ، فإن حركة الموجات ستكون لجهة المعاكسة .\n"
+"لاستخدامها فعّل سوائل متموجة."
#: src/settings_translation_file.cpp
msgid ""
@@ -3660,28 +3900,33 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Humidity variation for biomes."
-msgstr ""
+msgstr "اختلاف الرطوبة في الحيوم."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "IPv6"
-msgstr ""
+msgstr "IPv6"
#: src/settings_translation_file.cpp
msgid "IPv6 server"
-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, \"special\" key is used to fly fast if both fly and fast mode "
-"are\n"
+"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
+"إذا تم تعطيله ، فسيتم استخدام مفتاح \"Aux1\" للطيران بسرعة إذا كانت أوضاع "
+"الطيران والسرعة \n"
+"مفعلة."
#: src/settings_translation_file.cpp
msgid ""
@@ -3701,10 +3946,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"If enabled, \"special\" key instead of \"sneak\" key is used for climbing "
-"down and\n"
+"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down "
+"and\n"
"descending."
msgstr ""
+"إذا فُعّل ، سيستخدم مفتاح \"Aux1\" بدلاً من مفتاح \"التسلل\" للتحرك للتسلق "
+"والنزول."
#: src/settings_translation_file.cpp
msgid ""
@@ -3714,7 +3961,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "If enabled, disable cheat prevention in multiplayer."
-msgstr ""
+msgstr "إذا فُعّل، سيعطل مكافحة الغش في وضع تعدد اللاعبين."
#: src/settings_translation_file.cpp
msgid ""
@@ -3748,6 +3995,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If the execution of a chat command takes longer than this specified time in\n"
+"seconds, add the time information to the chat command message"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If the file size of debug.txt exceeds the number of megabytes specified in\n"
"this setting when it is opened, the file is moved to debug.txt.1,\n"
"deleting an older debug.txt.1 if it exists.\n"
@@ -3793,7 +4046,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrument chatcommands on registration."
+msgid "Instrument chat commands on registration."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3877,7 +4130,7 @@ msgid "Joystick button repetition interval"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Joystick deadzone"
+msgid "Joystick dead zone"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4447,7 +4700,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
-msgstr ""
+msgstr "اطرد اللاعبين الذين أرسلوا أكثر من X رسالة في 10 ثوانٍ."
#: src/settings_translation_file.cpp
msgid "Lake steepness"
@@ -4459,19 +4712,19 @@ 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 cave maximum number"
-msgstr ""
+msgstr "أقصى عدد للمغارات الكبيرة"
#: src/settings_translation_file.cpp
msgid "Large cave minimum number"
-msgstr ""
+msgstr "أقل عدد للمغارات الكبيرة"
#: src/settings_translation_file.cpp
msgid "Large cave proportion flooded"
@@ -4483,7 +4736,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Leaves style"
-msgstr ""
+msgstr "مظهر الأوراق"
#: src/settings_translation_file.cpp
msgid ""
@@ -4492,6 +4745,10 @@ msgid ""
"- Simple: only outer faces, if defined special_tiles are used\n"
"- Opaque: disable transparency"
msgstr ""
+"مظهر أوراق الشجر:\n"
+"- مفصل: كل الوجوه مرئية\n"
+"- بسيط: الوجوه الخارجية فقط ، إذا تم تحديد \"special_tiles\"\n"
+"- معتم: يعطل الشفافية"
#: src/settings_translation_file.cpp
msgid "Left key"
@@ -4635,10 +4892,6 @@ msgid ""
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 ""
@@ -4710,6 +4963,10 @@ msgid "Map save interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Map shadows update frames"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mapblock limit"
msgstr ""
@@ -4818,6 +5075,10 @@ msgid "Maximum FPS when the window is not focused, or when the game is paused."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum distance to render shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
msgstr ""
@@ -4923,7 +5184,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum time in ms a file download (e.g. a mod download) may take."
+msgid ""
+"Maximum time a file download (e.g. a mod download) may take, stated in "
+"milliseconds."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum time an interactive request (e.g. server list fetch) may take, "
+"stated in milliseconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4987,7 +5256,7 @@ msgid "Mod channels"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Modifies the size of the hudbar elements."
+msgid "Modifies the size of the HUD elements."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4999,6 +5268,10 @@ msgid "Monospace font size"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Monospace font size divisible by"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mountain height noise"
msgstr ""
@@ -5119,7 +5392,7 @@ 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"
+"This is a trade-off between SQLite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
@@ -5138,21 +5411,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"Open the pause menu when the window's focus is lost. Does not pause if a "
"formspec is\n"
"open."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Optional override for chat weblink color."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
-"Path of the fallback font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path of the fallback font. Must be a TrueType font.\n"
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
@@ -5175,17 +5445,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the default font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the monospace font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
@@ -5240,6 +5506,10 @@ msgid "Player versus player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Poisson filtering"
+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."
@@ -5284,9 +5554,9 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Prometheus listener address.\n"
-"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
+"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
"enable metrics listener for Prometheus on that address.\n"
-"Metrics can be fetch on http://127.0.0.1:30000/metrics"
+"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5575,6 +5845,32 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Set the shadow strength.\n"
+"Lower value means lighter shadows, higher value means darker shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the soft shadow radius size.\n"
+"Lower values mean sharper shadows, bigger values mean softer shadows.\n"
+"Minimum value: 1.0; maximum value: 10.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the tilt of Sun/Moon orbit in degrees.\n"
+"Value of 0 means no tilt / vertical orbit.\n"
+"Minimum value: 0.0; maximum value: 60.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true to enable Shadow Mapping.\n"
+"Requires shaders to be enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Set to true to enable waving leaves.\n"
"Requires shaders to be enabled."
msgstr ""
@@ -5592,6 +5888,13 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Sets shadow texture quality to 32 bits.\n"
+"On false, 16 bits texture will be used.\n"
+"This can cause much more artifacts in the shadow."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Shader path"
msgstr ""
@@ -5604,15 +5907,29 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Shadow filter quality"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map max distance in nodes to render shadows"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture in 32 bits"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture size"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Shadow offset (in pixels) of the default font. If 0, then shadow will not be "
"drawn."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not "
-"be drawn."
+msgid "Shadow strength"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5634,8 +5951,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Show nametag backgrounds by default"
-msgstr ""
+#, fuzzy
+msgid "Show name tag backgrounds by default"
+msgstr "الخط عريض افتراضيًا"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
@@ -5659,6 +5977,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Sky Body Orbit Tilt"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Slice w"
msgstr ""
@@ -5713,15 +6035,11 @@ msgid "Sneaking speed, in nodes per second."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Sound"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Special key"
+msgid "Soft shadow radius"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Special key for climbing/descending"
+msgid "Sound"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5741,6 +6059,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Spread a complete update of shadow map over given amount of frames.\n"
+"Higher values might make shadows laggy, lower values\n"
+"will consume more resources.\n"
+"Minimum value: 1; maximum value: 16"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Spread of light curve boost range.\n"
"Controls the width of the range to be boosted.\n"
"Standard deviation of the light curve boost Gaussian."
@@ -5847,6 +6173,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Texture size to render the shadow map on.\n"
+"This must be a power of two.\n"
+"Bigger numbers create better shadows but it is also more expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Textures on a node may be aligned either to the node or to the world.\n"
"The former mode suits better things like machines, furniture, etc., while\n"
"the latter makes stairs and microblocks fit surroundings better.\n"
@@ -5860,7 +6193,7 @@ msgid "The URL for the content repository"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "The deadzone of the joystick"
+msgid "The dead zone of the joystick"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5918,7 +6251,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"The rendering back-end for Irrlicht.\n"
+"The rendering back-end.\n"
"A restart is required after changing this.\n"
"Note: On Android, stick with OGLES1 if unsure! App may fail to start "
"otherwise.\n"
@@ -5929,7 +6262,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"The sensitivity of the joystick axes for moving the\n"
-"ingame view frustum around."
+"in-game view frustum around."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6023,6 +6356,10 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Tradeoffs for performance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6092,7 +6429,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Use mip mapping to scale textures. May slightly increase performance,\n"
+"Use mipmapping to scale textures. May slightly increase performance,\n"
"especially when using a high resolution texture pack.\n"
"Gamma correct downscaling is not supported."
msgstr ""
@@ -6205,7 +6542,7 @@ msgid "Viewing range"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Virtual joystick triggers aux button"
+msgid "Virtual joystick triggers Aux1 button"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6276,6 +6613,10 @@ msgid "Waving plants"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Weblink color"
+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"
@@ -6296,23 +6637,15 @@ msgid ""
"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.\n"
+"memory. Powers of 2 are recommended. This setting is ONLY applied if\n"
+"bilinear/trilinear/anisotropic filtering is enabled.\n"
"This is also used as the base node texture size for world-aligned\n"
"texture autoscaling."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Whether FreeType fonts are used, requires FreeType support to be compiled "
-"in.\n"
-"If disabled, bitmap and XML vectors fonts are used instead."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Whether nametag backgrounds should be shown by default.\n"
+"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
@@ -6354,7 +6687,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Width component of the initial window size."
+msgid "Width component of the initial window size. Ignored in fullscreen mode."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6439,34 +6772,25 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when saving mapblocks to disk.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when sending mapblocks to the client.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
+msgid "cURL file download timeout"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "cURL file download timeout"
+msgid "cURL interactive timeout"
msgstr ""
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
msgstr ""
-#: src/settings_translation_file.cpp
-msgid "cURL timeout"
-msgstr ""
+#~ msgid "- Creative Mode: "
+#~ msgstr "- النمط الإبداعي: "
+
+#~ msgid "- Damage: "
+#~ msgstr "- التضرر: "
+
+#~ msgid "Address / Port"
+#~ msgstr "العنوان \\ المنفذ"
#~ msgid "Are you sure to reset your singleplayer world?"
#~ msgstr "هل أنت متأكد من إعادة تعيين عالم اللاعب الوحيد؟"
@@ -6483,12 +6807,21 @@ msgstr ""
#~ msgid "Configure"
#~ msgstr "اضبط"
+#~ msgid "Credits"
+#~ msgstr "إشادات"
+
+#~ msgid "Damage enabled"
+#~ msgstr "الضرر ممكن"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "تنزيل وتثبيت $1, يرجى الإنتظار..."
#~ msgid "Generate Normal Maps"
#~ msgstr "ولِد خرائط عادية"
+#~ msgid "Install: file: \"$1\""
+#~ msgstr "ثبت: الملف: \"$1\""
+
#~ msgid "Main"
#~ msgstr "الرئيسية"
@@ -6504,6 +6837,9 @@ msgstr ""
#~ msgid "Minimap in surface mode, Zoom x4"
#~ msgstr "الخريطة المصغرة في وضع الأسطح، تكبير x4"
+#~ msgid "Name / Password"
+#~ msgstr "الاسم \\ كلمة المرور"
+
#~ msgid "Name/Password"
#~ msgstr "الاسم\\كلمة المرور"
@@ -6513,14 +6849,29 @@ msgstr ""
#~ msgid "Ok"
#~ msgstr "موافق"
+#~ msgid "PvP enabled"
+#~ msgstr "قتال اللاعبين ممكن"
+
#~ msgid "Reset singleplayer world"
#~ msgstr "أعد تعيين عالم اللاعب المنفرد"
+#~ msgid "Special"
+#~ msgstr "خاص"
+
#~ msgid "Start Singleplayer"
#~ msgstr "إلعب فرديا"
+#~ msgid "To enable shaders the OpenGL driver needs to be used."
+#~ msgstr "لاستخدام المظللات يجب استخدام تعريف OpenGL."
+
#~ msgid "View"
#~ msgstr "إعرض"
#~ msgid "Yes"
#~ msgstr "نعم"
+
+#~ msgid "You died."
+#~ msgstr "مِت"
+
+#~ msgid "needs_fallback_font"
+#~ msgstr "yes"
diff --git a/po/be/minetest.po b/po/be/minetest.po
index 8b597ca4b..d625a7c75 100644
--- a/po/be/minetest.po
+++ b/po/be/minetest.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Belarusian (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-23 19:03+0100\n"
+"POT-Creation-Date: 2022-01-25 23:19+0100\n"
"PO-Revision-Date: 2019-11-19 23:04+0000\n"
"Last-Translator: Viktar Vauchkevich <victorenator@gmail.com>\n"
"Language-Team: Belarusian <https://hosted.weblate.org/projects/minetest/"
@@ -15,6 +15,48 @@ msgstr ""
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 3.10-dev\n"
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Clear the out chat queue"
+msgstr "Максімальны памер чаргі размовы"
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Empty command."
+msgstr "Загады размовы"
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Exit to main menu"
+msgstr "Выхад у меню"
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Invalid command: "
+msgstr "Лакальная каманда"
+
+#: builtin/client/chatcommands.lua
+msgid "Issued command: "
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "List online players"
+msgstr "Адзіночная гульня"
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Online players: "
+msgstr "Адзіночная гульня"
+
+#: builtin/client/chatcommands.lua
+msgid "The out chat queue is now empty."
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "This command is disabled by server."
+msgstr ""
+
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
msgstr "Адрадзіцца"
@@ -23,11 +65,42 @@ msgstr "Адрадзіцца"
msgid "You died"
msgstr "Вы загінулі"
+#: builtin/common/chatcommands.lua
+#, fuzzy
+msgid "Available commands:"
+msgstr "Лакальная каманда"
+
+#: builtin/common/chatcommands.lua
+#, fuzzy
+msgid "Available commands: "
+msgstr "Лакальная каманда"
+
+#: builtin/common/chatcommands.lua
+msgid "Command not available: "
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "Get help for commands"
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid ""
+"Use '.help <cmd>' to get more information, or '.help all' to list everything."
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "[all | <cmd>]"
+msgstr ""
+
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
msgstr ""
#: builtin/fstk/ui.lua
+msgid "<none available>"
+msgstr ""
+
+#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
msgstr "Адбылася памылка ў Lua-скрыпце:"
@@ -234,6 +307,11 @@ msgid "Install missing dependencies"
msgstr "Неабавязковыя залежнасці:"
#: builtin/mainmenu/dlg_contentstore.lua
+#, fuzzy
+msgid "Install: Unsupported file type or broken archive"
+msgstr "Усталёўка: непадтрымліваемы файл тыпу \"$1\" або сапсаваны архіў"
+
+#: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Мадыфікацыі"
@@ -554,7 +632,7 @@ msgstr "< Назад на старонку налад"
msgid "Browse"
msgstr "Праглядзець"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Адключаны"
@@ -579,7 +657,8 @@ msgid "Offset"
msgstr "Зрух"
#: builtin/mainmenu/dlg_settings_advanced.lua
-msgid "Persistance"
+#, fuzzy
+msgid "Persistence"
msgstr "Сталасць"
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -598,7 +677,7 @@ msgstr "Аднавіць прадвызначанае"
msgid "Scale"
msgstr "Маштаб"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
msgstr "Пошук"
@@ -693,14 +772,6 @@ msgstr ""
"мадыфікацый \"$1\""
#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: Unsupported file type \"$1\" or broken archive"
-msgstr "Усталёўка: непадтрымліваемы файл тыпу \"$1\" або сапсаваны архіў"
-
-#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: file: \"$1\""
-msgstr "Усталёўка: файл: \"$1\""
-
-#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
msgstr "Не атрымалася знайсці прыдатную мадыфікацыю альбо пакунак мадыфікацый"
@@ -735,6 +806,42 @@ msgstr ""
"Паспрабуйце паўторна ўключыць спіс публічных сервераў і праверце злучэнне з "
"сецівам."
+#: builtin/mainmenu/tab_about.lua
+msgid "About"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active Contributors"
+msgstr "Актыўныя ўдзельнікі"
+
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Active renderer:"
+msgstr "Адлегласць адпраўлення актыўнага аб'екта"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Core Developers"
+msgstr "Асноўныя распрацоўшчыкі"
+
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Open User Data Directory"
+msgstr "Абраць каталог"
+
+#: builtin/mainmenu/tab_about.lua
+msgid ""
+"Opens the directory that contains user-provided worlds, games, mods,\n"
+"and texture packs in a file manager / explorer."
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Contributors"
+msgstr "Былыя ўдзельнікі"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Core Developers"
+msgstr "Былыя асноўныя распрацоўшчыкі"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Пошук у сеціве"
@@ -775,37 +882,6 @@ msgstr "Выдаліць пакунак"
msgid "Use Texture Pack"
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
-#, fuzzy
-msgid "Open User Data Directory"
-msgstr "Абраць каталог"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid ""
-"Opens the directory that contains user-provided worlds, games, mods,\n"
-"and texture packs in a file manager / explorer."
-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 "Анансаваць сервер"
@@ -834,7 +910,7 @@ msgstr "Сервер"
msgid "Install games from ContentDB"
msgstr ""
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Name"
msgstr ""
@@ -846,7 +922,7 @@ msgstr "Новы"
msgid "No world created or selected!"
msgstr "Няма створанага альбо абранага свету!"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Password"
msgstr "Новы пароль"
@@ -855,7 +931,7 @@ msgstr "Новы пароль"
msgid "Play Game"
msgstr "Гуляць"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
msgstr "Порт"
@@ -877,8 +953,13 @@ msgid "Start Game"
msgstr "Пачаць гульню"
#: builtin/mainmenu/tab_online.lua
-msgid "Address / Port"
-msgstr "Адрас / Порт"
+#, fuzzy
+msgid "Address"
+msgstr "- Адрас: "
+
+#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
+msgid "Clear"
+msgstr "Ачысціць"
#: builtin/mainmenu/tab_online.lua
msgid "Connect"
@@ -888,34 +969,46 @@ msgstr "Злучыцца"
msgid "Creative mode"
msgstr "Творчы рэжым"
+#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "Damage enabled"
-msgstr "Пашкоджанні ўключаныя"
+#, fuzzy
+msgid "Damage / PvP"
+msgstr "Пашкоджанні"
#: builtin/mainmenu/tab_online.lua
msgid "Del. Favorite"
msgstr "Прыбраць з упадабанага"
#: builtin/mainmenu/tab_online.lua
-msgid "Favorite"
+#, fuzzy
+msgid "Favorites"
msgstr "Упадабанае"
#: builtin/mainmenu/tab_online.lua
-msgid "Join Game"
-msgstr "Далучыцца да гульні"
+msgid "Incompatible Servers"
+msgstr ""
#: builtin/mainmenu/tab_online.lua
-msgid "Name / Password"
-msgstr "Імя / Пароль"
+msgid "Join Game"
+msgstr "Далучыцца да гульні"
#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Пінг"
-#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "PvP enabled"
-msgstr "PvP уключаны"
+#, fuzzy
+msgid "Public Servers"
+msgstr "Анансаваць сервер"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Refresh"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Server Description"
+msgstr "Апісанне сервера"
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -957,11 +1050,32 @@ msgstr "Змяніць клавішы"
msgid "Connected Glass"
msgstr "Суцэльнае шкло"
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+#, fuzzy
+msgid "Dynamic shadows"
+msgstr "Цень шрыфту"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Dynamic shadows: "
+msgstr ""
+
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
msgstr "Аздобленае лісце"
#: builtin/mainmenu/tab_settings.lua
+msgid "High"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Low"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Medium"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
msgstr "MIP-тэкстураванне"
@@ -1034,10 +1148,6 @@ msgstr "Мяккае асвятленне"
msgid "Texturing:"
msgstr "Тэкстураванне:"
-#: builtin/mainmenu/tab_settings.lua
-msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "Для ўключэння шэйдэраў неабходна выкарыстоўваць OpenGL."
-
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
msgstr "Танальнае адлюстраванне"
@@ -1051,6 +1161,14 @@ msgid "Trilinear Filter"
msgstr "Трылінейны фільтр"
#: builtin/mainmenu/tab_settings.lua
+msgid "Ultra High"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Very Low"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
msgstr "Дрыготкае лісце"
@@ -1062,7 +1180,7 @@ msgstr "Калыханне вадкасцяў"
msgid "Waving Plants"
msgstr "Дрыготкія расліны"
-#: src/client/client.cpp
+#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Таймаут злучэння."
@@ -1091,7 +1209,8 @@ msgid "Connection error (timed out?)"
msgstr "Памылка злучэння (таймаут?)"
#: src/client/clientlauncher.cpp
-msgid "Could not find or load game \""
+#, fuzzy
+msgid "Could not find or load game: "
msgstr "Немагчыма знайсці ці загрузіць гульню \""
#: src/client/clientlauncher.cpp
@@ -1122,18 +1241,6 @@ msgstr "Не атрымалася адкрыць пададзены файл п
msgid "Provided world path doesn't exist: "
msgstr "Пададзены шлях не існуе: "
-#. ~ DO NOT TRANSLATE THIS LITERALLY!
-#. This is a special string. Put either "no" or "yes"
-#. into the translation field (literally).
-#. Choose "yes" if the language requires use of the fallback
-#. font, "no" otherwise.
-#. The fallback font is (normally) required for languages with
-#. non-Latin script, like Chinese.
-#. When in doubt, test your translation.
-#: src/client/fontengine.cpp
-msgid "needs_fallback_font"
-msgstr "no"
-
#: src/client/game.cpp
msgid ""
"\n"
@@ -1147,14 +1254,6 @@ msgid "- Address: "
msgstr "- Адрас: "
#: src/client/game.cpp
-msgid "- Creative Mode: "
-msgstr "- Творчы рэжым: "
-
-#: src/client/game.cpp
-msgid "- Damage: "
-msgstr "- Пашкоджанні: "
-
-#: src/client/game.cpp
msgid "- Mode: "
msgstr "- Рэжым: "
@@ -1176,6 +1275,16 @@ msgid "- Server Name: "
msgstr "- Назва сервера: "
#: src/client/game.cpp
+#, fuzzy
+msgid "A serialization error occurred:"
+msgstr "Адбылася памылка:"
+
+#: src/client/game.cpp
+#, c-format
+msgid "Access denied. Reason: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Automatic forward disabled"
msgstr "Аўтаматычны рух наперад адключаны"
@@ -1184,6 +1293,22 @@ msgid "Automatic forward enabled"
msgstr "Аўтаматычны рух наперад уключаны"
#: src/client/game.cpp
+msgid "Block bounds hidden"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for all blocks"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for current block"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for nearby blocks"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Camera update disabled"
msgstr "Абнаўленне камеры адключана"
@@ -1192,6 +1317,10 @@ msgid "Camera update enabled"
msgstr "Абнаўленне камеры ўключана"
#: src/client/game.cpp
+msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Change Password"
msgstr "Змяніць пароль"
@@ -1204,6 +1333,11 @@ msgid "Cinematic mode enabled"
msgstr "Кінематаграфічны рэжым уключаны"
#: src/client/game.cpp
+#, fuzzy
+msgid "Client disconnected"
+msgstr "Модынг кліента"
+
+#: src/client/game.cpp
msgid "Client side scripting is disabled"
msgstr "Кліентскія мадыфікацыі выключаныя"
@@ -1212,6 +1346,10 @@ msgid "Connecting to server..."
msgstr "Злучэнне з серверам…"
#: src/client/game.cpp
+msgid "Connection failed for unknown reason"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Continue"
msgstr "Працягнуць"
@@ -1249,6 +1387,11 @@ msgstr ""
"- %s: размова\n"
#: src/client/game.cpp
+#, c-format
+msgid "Couldn't resolve address: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Creating client..."
msgstr "Стварэнне кліента…"
@@ -1377,6 +1520,11 @@ msgid "Minimap currently disabled by game or mod"
msgstr "Мінімапа на дадзены момант адключаная гульнёй альбо мадыфікацыяй"
#: src/client/game.cpp
+#, fuzzy
+msgid "Multiplayer"
+msgstr "Адзіночная гульня"
+
+#: src/client/game.cpp
msgid "Noclip mode disabled"
msgstr "Рэжым руху скрозь сцены адключаны"
@@ -1450,6 +1598,21 @@ msgstr "Гук уключаны"
#: src/client/game.cpp
#, c-format
+msgid "The server is probably running a different version of %s."
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to connect to %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to listen on %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
msgid "Viewing range changed to %d"
msgstr "Бачнасць змененая на %d"
@@ -1518,10 +1681,6 @@ msgid "Caps Lock"
msgstr "Caps Lock"
#: src/client/keycode.cpp
-msgid "Clear"
-msgstr "Ачысціць"
-
-#: src/client/keycode.cpp
msgid "Control"
msgstr "Ctrl"
@@ -1787,6 +1946,15 @@ msgstr "Мінімапа ў рэжыме паверхні, павелічэнн
msgid "Minimap in texture mode"
msgstr "Мінімальны памер тэкстуры"
+#: src/gui/guiChatConsole.cpp
+#, fuzzy
+msgid "Failed to open webpage"
+msgstr "Не атрымалася спампаваць $1"
+
+#: src/gui/guiChatConsole.cpp
+msgid "Opening webpage"
+msgstr ""
+
#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
msgid "Passwords do not match!"
msgstr "Паролі не супадаюць!"
@@ -1815,7 +1983,8 @@ msgid "Proceed"
msgstr "Працягнуць"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "\"Special\" = climb down"
+#, fuzzy
+msgid "\"Aux1\" = climb down"
msgstr "«Адмысловая» = злазіць"
#: src/gui/guiKeyChangeMenu.cpp
@@ -1827,10 +1996,18 @@ msgid "Automatic jumping"
msgstr "Аўтаскок"
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Aux1"
+msgstr ""
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
msgstr "Назад"
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Block bounds"
+msgstr ""
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Change camera"
msgstr "Змяніць камеру"
@@ -1920,10 +2097,6 @@ msgid "Sneak"
msgstr "Красціся"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Special"
-msgstr "Адмысловая"
-
-#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle HUD"
msgstr "HUD"
@@ -1984,7 +2157,8 @@ msgid "Muted"
msgstr "Сцішаны"
#: src/gui/guiVolumeChange.cpp
-msgid "Sound Volume: "
+#, fuzzy, c-format
+msgid "Sound Volume: %d%%"
msgstr "Гучнасць: "
#. ~ Imperative, as in "Enter/type in text".
@@ -2010,9 +2184,10 @@ msgstr ""
"дотыку."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"(Android) Use virtual joystick to trigger \"aux\" button.\n"
-"If enabled, virtual joystick will also tap \"aux\" button when out of main "
+"(Android) Use virtual joystick to trigger \"Aux1\" button.\n"
+"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
"(Android) Выкарыстоўваць віртуальны джойсцік для актывацыі кнопкі \"aux\".\n"
@@ -2235,6 +2410,10 @@ msgstr ""
"(не толькі X11/Android), напрыклад, для 4k-экранаў."
#: src/settings_translation_file.cpp
+msgid "Adjust the detected display density, used for scaling UI elements."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, c-format
msgid ""
"Adjusts the density of the floatland layer.\n"
@@ -2359,6 +2538,16 @@ msgid "Autoscaling mode"
msgstr "Рэжым аўтамаштабавання"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Aux1 key"
+msgstr "Клавіша скока"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Aux1 key for climbing/descending"
+msgstr "Адмысловая клавіша для караскання/спускання"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Клавіша назад"
@@ -2403,10 +2592,6 @@ 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 "Block send optimize distance"
msgstr "Аптымізаваная адлегласць адпраўлення блокаў"
@@ -2516,6 +2701,16 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Chat command time message threshold"
+msgstr "Максімальная колькасць паведамленняў у размове для выключэння"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chat commands"
+msgstr "Загады размовы"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Chat font size"
msgstr "Памер шрыфту"
@@ -2549,8 +2744,9 @@ msgid "Chat toggle key"
msgstr "Клавіша пераключэння размовы"
#: src/settings_translation_file.cpp
-msgid "Chatcommands"
-msgstr "Загады размовы"
+#, fuzzy
+msgid "Chat weblinks"
+msgstr "Размова паказваецца"
#: src/settings_translation_file.cpp
msgid "Chunk size"
@@ -2569,6 +2765,12 @@ msgid "Clean transparent textures"
msgstr "Чыстыя празрыстыя тэкстуры"
#: src/settings_translation_file.cpp
+msgid ""
+"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console "
+"output."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Client"
msgstr "Кліент"
@@ -2613,6 +2815,11 @@ msgid "Colored fog"
msgstr "Каляровы туман"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Colored shadows"
+msgstr "Каляровы туман"
+
+#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of flags to hide in the content repository.\n"
"\"nonfree\" can be used to hide packages which do not qualify as 'free "
@@ -2652,6 +2859,22 @@ msgid "Command key"
msgstr "Клавіша загаду"
#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when saving mapblocks to disk.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when sending mapblocks to the client.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Connect glass"
msgstr "Суцэльнае шкло"
@@ -2747,7 +2970,7 @@ msgstr "Празрыстасць перакрыжавання"
#, fuzzy
msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
-"Also controls the object crosshair color"
+"This also applies to the object crosshair."
msgstr "Празрыстасць перакрыжавання (паміж 0 і 255)."
#: src/settings_translation_file.cpp
@@ -2828,11 +3051,10 @@ msgstr "Прадвызначаная гульня"
#: src/settings_translation_file.cpp
msgid ""
-"Default timeout for cURL, stated in milliseconds.\n"
-"Only has an effect if compiled with cURL."
+"Define shadow filtering quality.\n"
+"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
+"but also uses more resources."
msgstr ""
-"Прадвызначаны таймаўт для cURL, зададзены ў мілісекундах.\n"
-"Уплывае толькі пры кампіляцыі з cURL."
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
@@ -2960,6 +3182,10 @@ msgid "Disallow empty passwords"
msgstr "Забараніць пустыя паролі"
#: src/settings_translation_file.cpp
+msgid "Display Density Scaling Factor"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Даменная назва сервера, што будзе паказвацца ў спісе сервераў."
@@ -3006,6 +3232,19 @@ msgstr ""
"Гэта падтрымка эксперыментальная і API можа змяніцца."
#: src/settings_translation_file.cpp
+msgid ""
+"Enable Poisson disk filtering.\n"
+"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF "
+"filtering."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable colored shadows.\n"
+"On true translucent nodes cast colored shadows. This is expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable console window"
msgstr "Уключаць акно кансолі"
@@ -3132,6 +3371,12 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enables tradeoffs that reduce CPU load or increase rendering performance\n"
+"at the expense of minor visual glitches that do not impact game playability."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr "Інтэрвал друкавання даных прафілявання рухавіка"
@@ -3172,18 +3417,6 @@ msgid "Fallback font path"
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 "Клавіша шпаркасці"
@@ -3200,8 +3433,9 @@ msgid "Fast movement"
msgstr "Шпаркае перамяшчэнне"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Fast movement (via the \"special\" key).\n"
+"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
"Шпаркае перамяшчэнне (з дапамогай клавішы выкарыстання).\n"
@@ -3238,11 +3472,12 @@ msgid "Filmic tone mapping"
msgstr "Кінематаграфічнае танальнае адлюстраванне"
#: src/settings_translation_file.cpp
+#, fuzzy
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."
+"which PNG optimizers usually discard, often resulting in dark or\n"
+"light edges to transparent textures. Apply a filter to clean that up\n"
+"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
"Адфільтраваныя тэкстуры могуць змешваць значэнні RGB з цалкам празрыстымі "
"суседнімі, якія PNG-аптымізатары звычайна адкідваюць, што часам прыводзіць "
@@ -3346,15 +3581,15 @@ msgid "Font size"
msgstr "Памер шрыфту"
#: src/settings_translation_file.cpp
-msgid "Font size of the default font in point (pt)."
+msgid "Font size divisible by"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the fallback font in point (pt)."
+msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the monospace font in point (pt)."
+msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3365,6 +3600,17 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"For pixel-style fonts that do not scale well, this ensures that font sizes "
+"used\n"
+"with this font will always be divisible by this value, in pixels. For "
+"instance,\n"
+"a pixel font 16 pixels tall should have this set to 16, so it will only ever "
+"be\n"
+"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Format of player chat messages. The following strings are valid "
"placeholders:\n"
"@name, @message, @timestamp (optional)"
@@ -3428,10 +3674,6 @@ 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)."
@@ -3464,10 +3706,6 @@ msgid "Full screen"
msgstr "На ўвесь экран"
#: src/settings_translation_file.cpp
-msgid "Full screen BPP"
-msgstr "Глыбіня колеру ў поўнаэкранным рэжыме (бітаў на піксель)"
-
-#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
msgstr "Поўнаэкранны рэжым."
@@ -3488,10 +3726,11 @@ msgid "Global callbacks"
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"
-"and junglegrass, in all other mapgens this flag controls all decorations."
+"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
"Глабальныя параметры генерацыі мапы.\n"
"У генератары мапы 6 параметр «decorations» кіруе ўсімі дэкарацыямі,\n"
@@ -3578,7 +3817,9 @@ msgid "Heat noise"
msgstr "Цеплавы шум"
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+#, fuzzy
+msgid ""
+"Height component of the initial window size. Ignored in fullscreen mode."
msgstr "Вышыня акна падчас запуску."
#: src/settings_translation_file.cpp
@@ -3590,10 +3831,6 @@ 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 "Крутасць пагоркаў"
@@ -3834,9 +4071,9 @@ msgstr ""
"каб не марнаваць дарма магутнасць працэсара."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"If disabled, \"special\" key is used to fly fast if both fly and fast mode "
-"are\n"
+"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
"Калі выключана, то клавіша \"special\" выкарыстоўваецца для хуткага палёту, "
@@ -3866,9 +4103,10 @@ msgstr ""
"На серверы патрабуецца прывілей \"noclip\"."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"If enabled, \"special\" key instead of \"sneak\" key is used for climbing "
-"down and\n"
+"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down "
+"and\n"
"descending."
msgstr ""
"Калі ўключана, то для спускання і апускання будзе выкарыстоўвацца клавіша "
@@ -3928,6 +4166,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If the execution of a chat command takes longer than this specified time in\n"
+"seconds, add the time information to the chat command message"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If the file size of debug.txt exceeds the number of megabytes specified in\n"
"this setting when it is opened, the file is moved to debug.txt.1,\n"
"deleting an older debug.txt.1 if it exists.\n"
@@ -3979,7 +4223,8 @@ msgstr ""
"Звычайна патрабуюцца толькі распрацоўшчыкам ядра"
#: src/settings_translation_file.cpp
-msgid "Instrument chatcommands on registration."
+#, fuzzy
+msgid "Instrument chat commands on registration."
msgstr "Выконваць загады ў размове пры рэгістрацыі."
#: src/settings_translation_file.cpp
@@ -4074,7 +4319,7 @@ msgstr "Інтэрвал паўтору кнопкі джойсціка"
#: src/settings_translation_file.cpp
#, fuzzy
-msgid "Joystick deadzone"
+msgid "Joystick dead zone"
msgstr "Тып джойсціка"
#: src/settings_translation_file.cpp
@@ -5107,11 +5352,6 @@ 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 "Робіць усе вадкасці непразрыстымі"
@@ -5203,6 +5443,11 @@ msgid "Map save interval"
msgstr "Інтэрвал захавання мапы"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Map shadows update frames"
+msgstr "Інтэрвал абнаўлення вадкасці"
+
+#: src/settings_translation_file.cpp
msgid "Mapblock limit"
msgstr "Ліміт блокаў мапы"
@@ -5312,6 +5557,10 @@ msgid "Maximum FPS when the window is not focused, or when the game is paused."
msgstr "Максімальны FPS, калі гульня прыпыненая."
#: src/settings_translation_file.cpp
+msgid "Maximum distance to render shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
msgstr "Максімальная колькасць прымусова загружаемых блокаў"
@@ -5440,12 +5689,21 @@ msgstr ""
"0 - выключыць чаргу, -1 - зрабіць неабмежаванай."
#: src/settings_translation_file.cpp
-msgid "Maximum time in ms a file download (e.g. a mod download) may take."
+#, fuzzy
+msgid ""
+"Maximum time a file download (e.g. a mod download) may take, stated in "
+"milliseconds."
msgstr ""
"Максімальны час у мілісекундах, які можа заняць спампоўванне файла\n"
"(напрыклад спампоўванне мадыфікацыі)."
#: src/settings_translation_file.cpp
+msgid ""
+"Maximum time an interactive request (e.g. server list fetch) may take, "
+"stated in milliseconds."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum users"
msgstr "Максімальная колькасць карыстальнікаў"
@@ -5507,7 +5765,8 @@ msgid "Mod channels"
msgstr "Каналы мадыфікацый"
#: src/settings_translation_file.cpp
-msgid "Modifies the size of the hudbar elements."
+#, fuzzy
+msgid "Modifies the size of the HUD elements."
msgstr "Змяняе памер элеметаў панэлі HUD."
#: src/settings_translation_file.cpp
@@ -5519,6 +5778,11 @@ msgid "Monospace font size"
msgstr "Памер монашырыннага шрыфту"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Monospace font size divisible by"
+msgstr "Памер монашырыннага шрыфту"
+
+#: src/settings_translation_file.cpp
msgid "Mountain height noise"
msgstr "Шум вышыні гор"
@@ -5668,9 +5932,10 @@ msgstr ""
"'On_generated. Для большасці карыстальнікаў найлепшым значэннем можа быць 1."
#: src/settings_translation_file.cpp
+#, fuzzy
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"
+"This is a trade-off between SQLite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
"Колькасць дадатковых блокаў, што могуць адначасова загружацца загадам /"
@@ -5693,11 +5958,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"Open the pause menu when the window's focus is lost. Does not pause if a "
"formspec is\n"
"open."
@@ -5706,10 +5966,12 @@ msgstr ""
"небудзь меню ўжо адкрыта."
#: src/settings_translation_file.cpp
+msgid "Optional override for chat weblink color."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
-"Path of the fallback font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path of the fallback font. Must be a TrueType font.\n"
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
@@ -5734,17 +5996,13 @@ msgstr "Шлях да каталога тэкстур. Усе тэкстуры
#: src/settings_translation_file.cpp
msgid ""
-"Path to the default font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the monospace font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
@@ -5804,6 +6062,11 @@ msgid "Player versus player"
msgstr "Гулец супраць гульца"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Poisson filtering"
+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."
@@ -5858,9 +6121,9 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Prometheus listener address.\n"
-"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
+"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
"enable metrics listener for Prometheus on that address.\n"
-"Metrics can be fetch on http://127.0.0.1:30000/metrics"
+"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6195,6 +6458,35 @@ msgstr ""
"кліентамі ў размову."
#: src/settings_translation_file.cpp
+msgid ""
+"Set the shadow strength.\n"
+"Lower value means lighter shadows, higher value means darker shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the soft shadow radius size.\n"
+"Lower values mean sharper shadows, bigger values mean softer shadows.\n"
+"Minimum value: 1.0; maximum value: 10.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the tilt of Sun/Moon orbit in degrees.\n"
+"Value of 0 means no tilt / vertical orbit.\n"
+"Minimum value: 0.0; maximum value: 60.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Set to true to enable Shadow Mapping.\n"
+"Requires shaders to be enabled."
+msgstr ""
+"Значэнне \"true\" уключае калыханне лісця.\n"
+"Патрабуюцца ўключаныя шэйдэры."
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Set to true to enable waving leaves.\n"
@@ -6222,6 +6514,13 @@ msgstr ""
"Патрабуюцца ўключаныя шэйдэры."
#: src/settings_translation_file.cpp
+msgid ""
+"Sets shadow texture quality to 32 bits.\n"
+"On false, 16 bits texture will be used.\n"
+"This can cause much more artifacts in the shadow."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Shader path"
msgstr "Шлях да шэйдэраў"
@@ -6239,17 +6538,32 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Shadow filter quality"
+msgstr "Якасць здымкаў экрана"
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map max distance in nodes to render shadows"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture in 32 bits"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Shadow map texture size"
+msgstr "Мінімальны памер тэкстуры"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Shadow offset (in pixels) of the default font. If 0, then shadow will not be "
"drawn."
msgstr "Зрух цені шрыфту. Калі 0, то цень не будзе паказвацца."
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid ""
-"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not "
-"be drawn."
-msgstr "Зрух цені шрыфту. Калі 0, то цень не будзе паказвацца."
+msgid "Shadow strength"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
@@ -6273,7 +6587,7 @@ msgstr ""
"Пасля змены мовы патрэбна перазапусціць гульню."
#: src/settings_translation_file.cpp
-msgid "Show nametag backgrounds by default"
+msgid "Show name tag backgrounds by default"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6309,6 +6623,10 @@ msgstr ""
"з галоўнага патоку гульні, тым самым памяншаючы дрыжанне."
#: src/settings_translation_file.cpp
+msgid "Sky Body Orbit Tilt"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Slice w"
msgstr "Частка W"
@@ -6367,16 +6685,13 @@ msgid "Sneaking speed, in nodes per second."
msgstr "Хуткасць крадкоў у вузлах за секунду."
#: src/settings_translation_file.cpp
-msgid "Sound"
-msgstr "Гук"
-
-#: src/settings_translation_file.cpp
-msgid "Special key"
-msgstr "Адмысловая клавіша"
+#, fuzzy
+msgid "Soft shadow radius"
+msgstr "Празрыстасць цені шрыфту"
#: src/settings_translation_file.cpp
-msgid "Special key for climbing/descending"
-msgstr "Адмысловая клавіша для караскання/спускання"
+msgid "Sound"
+msgstr "Гук"
#: src/settings_translation_file.cpp
msgid ""
@@ -6400,6 +6715,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Spread a complete update of shadow map over given amount of frames.\n"
+"Higher values might make shadows laggy, lower values\n"
+"will consume more resources.\n"
+"Minimum value: 1; maximum value: 16"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Spread of light curve boost range.\n"
@@ -6517,6 +6840,13 @@ msgstr "Шлях да тэкстур"
#: src/settings_translation_file.cpp
msgid ""
+"Texture size to render the shadow map on.\n"
+"This must be a power of two.\n"
+"Bigger numbers create better shadows but it is also more expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Textures on a node may be aligned either to the node or to the world.\n"
"The former mode suits better things like machines, furniture, etc., while\n"
"the latter makes stairs and microblocks fit surroundings better.\n"
@@ -6538,7 +6868,7 @@ msgstr "URL рэпазіторыя"
#: src/settings_translation_file.cpp
#, fuzzy
-msgid "The deadzone of the joystick"
+msgid "The dead zone of the joystick"
msgstr "Ідэнтыфікатар джойсціка для выкарыстання"
#: src/settings_translation_file.cpp
@@ -6610,7 +6940,7 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
-"The rendering back-end for Irrlicht.\n"
+"The rendering back-end.\n"
"A restart is required after changing this.\n"
"Note: On Android, stick with OGLES1 if unsure! App may fail to start "
"otherwise.\n"
@@ -6625,9 +6955,10 @@ msgstr ""
"з падтрымкай шэйдэраў."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"The sensitivity of the joystick axes for moving the\n"
-"ingame view frustum around."
+"in-game view frustum around."
msgstr "Адчувальнасць восяў джойсціка пры азіранні."
#: src/settings_translation_file.cpp
@@ -6744,6 +7075,10 @@ msgid "Touch screen threshold"
msgstr "Парог сэнсарнага экрана"
#: src/settings_translation_file.cpp
+msgid "Tradeoffs for performance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr "Шум дрэў"
@@ -6824,8 +7159,9 @@ msgid "Use bilinear filtering when scaling textures."
msgstr "Выкарыстоўваць білінейную фільтрацыю пры маштабаванні тэкстур."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Use mip mapping to scale textures. May slightly increase performance,\n"
+"Use mipmapping to scale textures. May slightly increase performance,\n"
"especially when using a high resolution texture pack.\n"
"Gamma correct downscaling is not supported."
msgstr ""
@@ -6946,7 +7282,8 @@ msgid "Viewing range"
msgstr "Дыяпазон бачнасці"
#: src/settings_translation_file.cpp
-msgid "Virtual joystick triggers aux button"
+#, fuzzy
+msgid "Virtual joystick triggers Aux1 button"
msgstr "Дадатковая кнопка трыгераў віртуальнага джойсціка"
#: src/settings_translation_file.cpp
@@ -7029,6 +7366,11 @@ msgid "Waving plants"
msgstr "Калыханне раслін"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Weblink color"
+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"
@@ -7051,14 +7393,14 @@ msgstr ""
"якія не падтрымліваюць перадачу тэкстур з апаратуры назад."
#: src/settings_translation_file.cpp
+#, fuzzy
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.\n"
+"memory. Powers of 2 are recommended. This setting is ONLY applied if\n"
+"bilinear/trilinear/anisotropic filtering is enabled.\n"
"This is also used as the base node texture size for world-aligned\n"
"texture autoscaling."
msgstr ""
@@ -7075,18 +7417,8 @@ msgstr ""
"сусветнага аўтамасштабавання тэкстур."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
-"Whether FreeType fonts are used, requires FreeType support to be compiled "
-"in.\n"
-"If disabled, bitmap and XML vectors fonts are used instead."
-msgstr ""
-"Выкарыстанне шрыфтоў FreeType. Падтрымка FreeType мусіць быць уключаная "
-"падчас кампіляцыі."
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Whether nametag backgrounds should be shown by default.\n"
+"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
@@ -7133,7 +7465,8 @@ msgid ""
msgstr "Паказваць адладачную інфармацыю (тое ж, што і F5)."
#: src/settings_translation_file.cpp
-msgid "Width component of the initial window size."
+#, fuzzy
+msgid "Width component of the initial window size. Ignored in fullscreen mode."
msgstr "Шырыня кампанента пачатковага памеру акна."
#: src/settings_translation_file.cpp
@@ -7232,34 +7565,23 @@ msgid "Y-level of seabed."
msgstr "Y-узровень марскога дна."
#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when saving mapblocks to disk.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when sending mapblocks to the client.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr "Таймаўт спампоўвання файла па cURL"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "cURL interactive timeout"
+msgstr "Таймаўт cURL"
+
+#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
msgstr "Ліміт адначасовых злучэнняў cURL"
-#: src/settings_translation_file.cpp
-msgid "cURL timeout"
-msgstr "Таймаўт cURL"
+#~ msgid "- Creative Mode: "
+#~ msgstr "- Творчы рэжым: "
+
+#~ msgid "- Damage: "
+#~ msgstr "- Пашкоджанні: "
#~ msgid ""
#~ "0 = parallax occlusion with slope information (faster).\n"
@@ -7268,6 +7590,9 @@ msgstr "Таймаўт cURL"
#~ "0 = паралаксная аклюзія са звесткамі аб нахіле (хутка).\n"
#~ "1 = рэльефнае тэкстураванне (павольней, але якасней)."
+#~ msgid "Address / Port"
+#~ msgstr "Адрас / Порт"
+
#~ msgid ""
#~ "Adjust the gamma encoding for the light tables. Higher numbers are "
#~ "brighter.\n"
@@ -7286,6 +7611,9 @@ msgstr "Таймаўт cURL"
#~ msgid "Back"
#~ msgstr "Назад"
+#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
+#~ msgstr "Біты на піксель (глыбіня колеру) у поўнаэкранным рэжыме."
+
#~ msgid "Bump Mapping"
#~ msgstr "Тэкстураванне маскамі"
@@ -7330,13 +7658,26 @@ msgstr "Таймаўт cURL"
#~ msgstr ""
#~ "Кіруе шырынёй тунэляў. Меншае значэнне стварае больш шырокія тунэлі."
+#~ msgid "Credits"
+#~ msgstr "Падзякі"
+
#~ msgid "Crosshair color (R,G,B)."
#~ msgstr "Колер перакрыжавання (R,G,B)."
+#~ msgid "Damage enabled"
+#~ msgstr "Пашкоджанні ўключаныя"
+
#~ msgid "Darkness sharpness"
#~ msgstr "Рэзкасць цемры"
#~ msgid ""
+#~ "Default timeout for cURL, stated in milliseconds.\n"
+#~ "Only has an effect if compiled with cURL."
+#~ msgstr ""
+#~ "Прадвызначаны таймаўт для cURL, зададзены ў мілісекундах.\n"
+#~ "Уплывае толькі пры кампіляцыі з cURL."
+
+#~ msgid ""
#~ "Defines areas of floatland smooth terrain.\n"
#~ "Smooth floatlands occur when noise > 0."
#~ msgstr ""
@@ -7402,6 +7743,15 @@ msgstr "Таймаўт cURL"
#~ msgid "FPS in pause menu"
#~ msgstr "FPS у меню паўзы"
+#~ msgid "Fallback font shadow"
+#~ msgstr "Цень рэзервовага шрыфту"
+
+#~ msgid "Fallback font shadow alpha"
+#~ msgstr "Празрыстасць цені рэзервовага шрыфту"
+
+#~ msgid "Fallback font size"
+#~ msgstr "Памер рэзервовага шрыфту"
+
#~ msgid "Floatland base height noise"
#~ msgstr "Шум базавай вышыні лятучых астравоў"
@@ -7411,6 +7761,12 @@ msgstr "Таймаўт cURL"
#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)."
#~ msgstr "Празрыстасць цені шрыфту (ад 0 да 255)."
+#~ msgid "FreeType fonts"
+#~ msgstr "Шрыфты FreeType"
+
+#~ msgid "Full screen BPP"
+#~ msgstr "Глыбіня колеру ў поўнаэкранным рэжыме (бітаў на піксель)"
+
#~ msgid "Gamma"
#~ msgstr "Гама"
@@ -7420,6 +7776,9 @@ msgstr "Таймаўт cURL"
#~ msgid "Generate normalmaps"
#~ msgstr "Генерацыя мапы нармаляў"
+#~ msgid "High-precision FPU"
+#~ msgstr "Высокадакладны FPU"
+
#~ msgid "IPv6 support."
#~ msgstr "Падтрымка IPv6."
@@ -7430,6 +7789,9 @@ msgstr "Таймаўт cURL"
#~ "Калі ўключана адначасова з рэжымам палёту, то вызначае напрамак руху "
#~ "адносна кроку гульца."
+#~ msgid "Install: file: \"$1\""
+#~ msgstr "Усталёўка: файл: \"$1\""
+
#~ msgid "Lava depth"
#~ msgstr "Глыбіня лавы"
@@ -7445,6 +7807,11 @@ msgstr "Таймаўт cURL"
#~ msgid "Main menu style"
#~ msgstr "Стыль галоўнага меню"
+#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
+#~ msgstr ""
+#~ "Прымушае DirectX працаваць з LuaJIT. Выключыце, калі гэта выклікае "
+#~ "праблемы."
+
#~ msgid ""
#~ "Map generation attributes specific to Mapgen Carpathian.\n"
#~ "Flags that are not enabled are not modified from the default.\n"
@@ -7486,6 +7853,9 @@ msgstr "Таймаўт cURL"
#~ msgid "Minimap in surface mode, Zoom x4"
#~ msgstr "Мінімапа ў рэжыме паверхні, павелічэнне х4"
+#~ msgid "Name / Password"
+#~ msgstr "Імя / Пароль"
+
#~ msgid "Name/Password"
#~ msgstr "Імя/Пароль"
@@ -7540,6 +7910,9 @@ msgstr "Таймаўт cURL"
#~ msgid "Projecting dungeons"
#~ msgstr "Праектаванне падзямелляў"
+#~ msgid "PvP enabled"
+#~ msgstr "PvP уключаны"
+
#~ msgid "Reset singleplayer world"
#~ msgstr "Скінуць свет адзіночнай гульні"
@@ -7549,6 +7922,18 @@ msgstr "Таймаўт cURL"
#~ msgid "Shadow limit"
#~ msgstr "Ліміт ценяў"
+#, fuzzy
+#~ msgid ""
+#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will "
+#~ "not be drawn."
+#~ msgstr "Зрух цені шрыфту. Калі 0, то цень не будзе паказвацца."
+
+#~ msgid "Special"
+#~ msgstr "Адмысловая"
+
+#~ msgid "Special key"
+#~ msgstr "Адмысловая клавіша"
+
#~ msgid "Start Singleplayer"
#~ msgstr "Пачаць адзіночную гульню"
@@ -7561,6 +7946,9 @@ msgstr "Таймаўт cURL"
#~ msgid "This font will be used for certain languages."
#~ msgstr "Гэты шрыфт будзе выкарыстоўваецца для некаторых моў."
+#~ msgid "To enable shaders the OpenGL driver needs to be used."
+#~ msgstr "Для ўключэння шэйдэраў неабходна выкарыстоўваць OpenGL."
+
#~ msgid "Toggle Cinematic"
#~ msgstr "Кінематаграфічнасць"
@@ -7581,6 +7969,15 @@ msgstr "Таймаўт cURL"
#~ msgid "Waving water"
#~ msgstr "Хваляванне вады"
+#, fuzzy
+#~ msgid ""
+#~ "Whether FreeType fonts are used, requires FreeType support to be compiled "
+#~ "in.\n"
+#~ "If disabled, bitmap and XML vectors fonts are used instead."
+#~ msgstr ""
+#~ "Выкарыстанне шрыфтоў FreeType. Падтрымка FreeType мусіць быць уключаная "
+#~ "падчас кампіляцыі."
+
#~ msgid "Whether dungeons occasionally project from the terrain."
#~ msgstr "Выступ падзямелляў па-над рэльефам."
@@ -7595,3 +7992,10 @@ msgstr "Таймаўт cURL"
#~ msgid "Yes"
#~ msgstr "Так"
+
+#, fuzzy
+#~ msgid "You died."
+#~ msgstr "Вы загінулі"
+
+#~ msgid "needs_fallback_font"
+#~ msgstr "no"
diff --git a/po/bg/minetest.po b/po/bg/minetest.po
index 62011a94a..fb3a096dc 100644
--- a/po/bg/minetest.po
+++ b/po/bg/minetest.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-23 19:03+0100\n"
-"PO-Revision-Date: 2020-08-04 04:41+0000\n"
-"Last-Translator: atomicbeef <teddyg522@gmail.com>\n"
+"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"PO-Revision-Date: 2022-01-10 23:53+0000\n"
+"Last-Translator: 109247019824 <stoyan@gmx.com>\n"
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/minetest/"
"minetest/bg/>\n"
"Language: bg\n"
@@ -17,59 +17,126 @@ 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 4.2-dev\n"
+"X-Generator: Weblate 4.10.1\n"
+
+#: builtin/client/chatcommands.lua
+msgid "Clear the out chat queue"
+msgstr "Изчистване на изходящата опашка на разговорите"
+
+#: builtin/client/chatcommands.lua
+msgid "Empty command."
+msgstr "Празна команда."
+
+#: builtin/client/chatcommands.lua
+msgid "Exit to main menu"
+msgstr "Главно меню"
+
+#: builtin/client/chatcommands.lua
+msgid "Invalid command: "
+msgstr "Недействителна команда: "
+
+#: builtin/client/chatcommands.lua
+msgid "Issued command: "
+msgstr "Подадена команда: "
+
+#: builtin/client/chatcommands.lua
+msgid "List online players"
+msgstr "Играчи на линия"
+
+#: builtin/client/chatcommands.lua
+msgid "Online players: "
+msgstr "Играчи на линия: "
+
+#: builtin/client/chatcommands.lua
+msgid "The out chat queue is now empty."
+msgstr "Изходящата опашка на разговори е изпразнена."
+
+#: builtin/client/chatcommands.lua
+msgid "This command is disabled by server."
+msgstr "Командата е забранена от сървъра."
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
-msgstr "Прераждането"
+msgstr "Прераждане"
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "You died"
-msgstr "Ти умря"
+msgstr "Умряхте"
+
+#: builtin/common/chatcommands.lua
+msgid "Available commands:"
+msgstr "Достъпни команди:"
+
+#: builtin/common/chatcommands.lua
+msgid "Available commands: "
+msgstr "Достъпни команди: "
+
+#: builtin/common/chatcommands.lua
+msgid "Command not available: "
+msgstr "Недостъпни команди: "
+
+#: builtin/common/chatcommands.lua
+msgid "Get help for commands"
+msgstr "Помощ за командите"
+
+#: builtin/common/chatcommands.lua
+msgid ""
+"Use '.help <cmd>' to get more information, or '.help all' to list everything."
+msgstr ""
+"Въведете „.help <cmd>“ за повече информация или „.help all“ за списък с "
+"всички команди."
+
+#: builtin/common/chatcommands.lua
+msgid "[all | <cmd>]"
+msgstr "[all | <команда>]"
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
msgstr "Добре"
#: builtin/fstk/ui.lua
+msgid "<none available>"
+msgstr "<няма достъпни>"
+
+#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
-msgstr "Имаше грешка в Lua скрипт:"
+msgstr "Грешка в скрипт на Lua:"
#: builtin/fstk/ui.lua
msgid "An error occurred:"
-msgstr "Имаше грешка:"
+msgstr "Възникна грешка:"
#: builtin/fstk/ui.lua
msgid "Main menu"
-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
msgid "Protocol version mismatch. "
-msgstr "Версията на протокола е грешна. "
+msgstr "Изданието на протокола не съвпада. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
-msgstr "Сървърт налага версия $1 на протокола. "
+msgstr "Сървърът налага издание $1 на протокола. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
-msgstr "Сървърът подкрепя версии на протокола между $1 и $2. "
+msgstr "Сървърът поддържа изданията на протокола между $1 и $2. "
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
-msgstr "Ние само подкрепяме версия $1 на протокола."
+msgstr "Поддържаме само издание $1 на протокола."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
-msgstr "Ние подкрепяме версии на протокола между $1 и $2."
+msgstr "Поддържаме само изданията на протокола между $1 и $2."
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
@@ -89,35 +156,35 @@ msgstr "Зависимости:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable all"
-msgstr "Деактивиране на всички"
+msgstr "Изключване всички"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable modpack"
-msgstr "Деактивиране на модпака"
+msgstr "Изключване на пакет с модификации"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
-msgstr "Актиривране на всички"
+msgstr "Включване всички"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable modpack"
-msgstr "Активиране на модпака"
+msgstr "Включване на пакет с модификации"
#: builtin/mainmenu/dlg_config_world.lua
msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"characters [a-z0-9_] are allowed."
msgstr ""
-"Активиране на мода \"$1\" беше неуспешно, защото съдържа забранени символи. "
-"Само символите [a-z0-9_] са разрешени."
+"Включването на модификацията „$1“ не е успешно, защото съдържа забранени "
+"символи. Разрешени са само символите [a-z0-9_]."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Find More Mods"
-msgstr "Намиране на Още Модове"
+msgstr "Още модификации"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
-msgstr "Мод:"
+msgstr "Модификация:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No (optional) dependencies"
@@ -125,7 +192,7 @@ msgstr "Няма (незадължителни) зависимости"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No game description provided."
-msgstr "Няма описание за играта."
+msgstr "Играта няма описание."
#: builtin/mainmenu/dlg_config_world.lua
msgid "No hard dependencies"
@@ -133,7 +200,7 @@ msgstr "Няма задължителни зависимости"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No modpack description provided."
-msgstr "Няма описание за модпака."
+msgstr "Пакетът с модификации няма описание."
#: builtin/mainmenu/dlg_config_world.lua
msgid "No optional dependencies"
@@ -146,7 +213,7 @@ msgstr "Незадължителни зависимости:"
#: builtin/mainmenu/dlg_config_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp
msgid "Save"
-msgstr "Записване"
+msgstr "Запазване"
#: builtin/mainmenu/dlg_config_world.lua
msgid "World:"
@@ -154,38 +221,39 @@ msgstr "Свят:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "enabled"
-msgstr "Активиран"
+msgstr "включен"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "\"$1\" already exists. Would you like to overwrite it?"
-msgstr ""
+msgstr "„$1“ вече съществува. Да бъде ли презаписан?"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 and $2 dependencies will be installed."
-msgstr ""
+msgstr "$1 и $2 зависимости ще бъдат инсталирани."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 by $2"
-msgstr ""
+msgstr "$1 от $2"
#: builtin/mainmenu/dlg_contentstore.lua
msgid ""
"$1 downloading,\n"
"$2 queued"
msgstr ""
+"$1 се изтеглят,\n"
+"$2 изчакват"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "$1 downloading..."
-msgstr "Изтегля..."
+msgstr "$1 се изтеглят…"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 required dependencies could not be found."
-msgstr ""
+msgstr "$1 задължителни зависимости не могат да бъдат намерени."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 will be installed, and $2 dependencies will be skipped."
-msgstr ""
+msgstr "$1 ще бъдат инсталирани, а $2 зависимости ще бъдат пропуснати."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "All packages"
@@ -193,27 +261,28 @@ msgstr "Всички пакети"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Already installed"
-msgstr ""
+msgstr "Вече инсталирано"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Back to Main Menu"
-msgstr "Обратно към Главното Меню"
+msgstr "Главно меню"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Base Game:"
-msgstr ""
+msgstr "Основна игра:"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "ContentDB is not available when Minetest was compiled without cURL"
-msgstr "ContentDB не е налично когато Minetest е съставен без cURL"
+msgstr ""
+"Съдържанието от ContentDB не е налично, когато Minetest е компилиран без cURL"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Downloading..."
-msgstr "Изтегля..."
+msgstr "Изтегляне…"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Failed to download $1"
-msgstr "Изтеглянето на $1 беше неуспешно"
+msgstr "Грешка при изтеглянето на $1"
#: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -225,72 +294,73 @@ msgid "Install"
msgstr "Инсталиране"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "Install $1"
-msgstr "Инсталиране"
+msgstr "Инсталиране $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "Install missing dependencies"
-msgstr "Незадължителни зависимости:"
+msgstr "Инсталиране на липсващи зависимости"
+
+#: builtin/mainmenu/dlg_contentstore.lua
+msgid "Install: Unsupported file type or broken archive"
+msgstr "Инсталиране: Неподдържан вид на файл или повреден архив"
#: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
-msgstr "Модове"
+msgstr "Модификации"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No packages could be retrieved"
-msgstr "Получаване на пакети беше неуспешно"
+msgstr "Пакетите не могат да бъдат получени"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No results"
msgstr "Няма резултати"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "No updates"
-msgstr "Актуализация"
+msgstr "Няма обновяване"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Not found"
-msgstr ""
+msgstr "Не е намерено"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Overwrite"
-msgstr ""
+msgstr "Презаписване"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Please check that the base game is correct."
-msgstr ""
+msgstr "Уверете се, че основната игра е правилна."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Queued"
-msgstr ""
+msgstr "Изчакващи"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Texture packs"
-msgstr "Пакети на текстури"
+msgstr "Пакети с текстури"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Uninstall"
-msgstr "Деинсталиране"
+msgstr "Премахване"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update"
-msgstr "Актуализация"
+msgstr "Обновяване"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update All [$1]"
-msgstr ""
+msgstr "Обновяване всички [$1]"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "View more information in a web browser"
-msgstr ""
+msgstr "Вижте повече в браузъра"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
-msgstr "Вече има свят с името \"$1\""
+msgstr "Свят с името „$1“ вече съществува"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Additional terrain"
@@ -298,23 +368,23 @@ msgstr "Допълнителен терен"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Altitude chill"
-msgstr "Студ от височина"
+msgstr "Застудяване във височина"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Altitude dry"
-msgstr "Сух от височина"
+msgstr "Засушаване във височина"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Biome blending"
-msgstr "Смесване между природни зони"
+msgstr "Смесване на биоми"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Biomes"
-msgstr "Природни зони"
+msgstr "Биоми"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caverns"
-msgstr "Пещери"
+msgstr "Големи пещери"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caves"
@@ -326,7 +396,7 @@ msgstr "Създаване"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Decorations"
-msgstr "Украси"
+msgstr "Декорации"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a game, such as Minetest Game, from minetest.net"
@@ -334,7 +404,7 @@ msgstr "Изтегляне на игра, например Minetest Game, от m
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
-msgstr "Изтегли един от minetest.net"
+msgstr "Изтеглете от minetest.net"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -346,11 +416,11 @@ msgstr "Равен терен"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floating landmasses in the sky"
-msgstr "Земни маси в небето"
+msgstr "Плаващи земни маси в небето"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floatlands (experimental)"
-msgstr "Земни маси в небето (експериментално)"
+msgstr "Небесни острови (експериментално)"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Game"
@@ -358,11 +428,11 @@ msgstr "Игра"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
-msgstr "Създаване на нефрактален терен: Морета и под земята"
+msgstr "Създаване на нефрактален терен: Морета и подземен свят"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Hills"
-msgstr "Хълми"
+msgstr "Хълмове"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Humid rivers"
@@ -370,7 +440,7 @@ msgstr "Влажни реки"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Increases humidity around rivers"
-msgstr "Нараства влажност около реки"
+msgstr "Увеличава влажността около реките"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
@@ -378,19 +448,19 @@ msgstr "Езера"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Low humidity and high heat causes shallow or dry rivers"
-msgstr "Ниска влажност и висока топлина причинява ниски или сухи реки"
+msgstr "Ниската влажност и горещините причиняват плитки или пресъхнали реки"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen"
-msgstr "Създаване на света"
+msgstr "Генератор на карти"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen flags"
-msgstr "Флагове за създаване на света"
+msgstr "Настройки на генератора"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mapgen-specific flags"
-msgstr "Флагове спесифични за създване на света"
+msgstr "Специфични за генератора настройки"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mountains"
@@ -410,11 +480,11 @@ msgstr "Няма избрана игра"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces heat with altitude"
-msgstr "Намалява топлина с височина"
+msgstr "Намалява топлината във височина"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces humidity with altitude"
-msgstr "Намалява влажност с височина"
+msgstr "Намалява влажността във височина"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Rivers"
@@ -431,35 +501,35 @@ msgstr "Семе"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Smooth transition between biomes"
-msgstr "Гладка промяна между природни зони"
+msgstr "Плавен преход между биомите"
#: builtin/mainmenu/dlg_create_world.lua
msgid ""
"Structures appearing on the terrain (no effect on trees and jungle grass "
"created by v6)"
msgstr ""
-"Появяване на структури на терена (няма ефект на трева от джунгла и дървета "
-"създадени от v6)"
+"Структури, появяващи се върху терена (няма ефект върху дърветата и тревата в "
+"джунглата, създадени от v6)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Structures appearing on the terrain, typically trees and plants"
-msgstr "Появяване на структури на терена, типично дървета и растения"
+msgstr "Структури, появяващи се върху терена, обикновено дървета и растения"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert"
-msgstr "Умерен, Пустиня"
+msgstr "Умерен климат, пустиня"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle"
-msgstr "Умерен, Пустиня, Джунгла"
+msgstr "Умерен климат, пустиня, джунгла"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle, Tundra, Taiga"
-msgstr "Умерен, Пустиня, Джунгла, Тундра, Тайга"
+msgstr "Умерен климат, пустиня, джунгла, тундра, тайга"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Terrain surface erosion"
-msgstr "Ерозия на повърхност на терен"
+msgstr "Ерозия на земната повърхност"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Trees and jungle grass"
@@ -467,7 +537,7 @@ msgstr "Трева в джунглата и дървета"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Vary river depth"
-msgstr "Вариране на дълбочина на реки"
+msgstr "Промяна в дълбочината на реките"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Very large caverns deep in the underground"
@@ -475,7 +545,7 @@ msgstr "Много големи пещери дълбоко под земята"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Warning: The Development Test is meant for developers."
-msgstr "Внимание: Тестът за Развитие е предназначен за разработници."
+msgstr "Внимание: Тестът за разработка е предназначен за разработчици."
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
@@ -483,29 +553,29 @@ msgstr "Име на света"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no games installed."
-msgstr "Нямаш инсалирани игри."
+msgstr "Няма инсталирани игри."
#: builtin/mainmenu/dlg_delete_content.lua
msgid "Are you sure you want to delete \"$1\"?"
-msgstr "Сигурен ли си че искаш да изтриваш \"$1\"?"
+msgstr "Сигурни ли сте, че искате да премахнете „$1“?"
#: builtin/mainmenu/dlg_delete_content.lua
#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua
#: src/client/keycode.cpp
msgid "Delete"
-msgstr "Изтриване"
+msgstr "Премахване"
#: builtin/mainmenu/dlg_delete_content.lua
msgid "pkgmgr: failed to delete \"$1\""
-msgstr "pkgmgr: Изтриване на \"$1\" беше неуспешно"
+msgstr "pkgmgr: грешка при премахване на „$1“"
#: builtin/mainmenu/dlg_delete_content.lua
msgid "pkgmgr: invalid path \"$1\""
-msgstr "pkgmgr: Грешна пътека \"$1\""
+msgstr "pkgmgr: недействителен път „$1“"
#: builtin/mainmenu/dlg_delete_world.lua
msgid "Delete World \"$1\"?"
-msgstr "Да изтриe ли света \"$1\"?"
+msgstr "Премахване на света „$1“?"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
@@ -513,40 +583,39 @@ msgstr "Приемане"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Rename Modpack:"
-msgstr "Преименуване на модпак:"
+msgstr "Преименуване на пакет модификации:"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid ""
"This modpack has an explicit name given in its modpack.conf which will "
"override any renaming here."
msgstr ""
-"Този модпак има изрично име дадено в неговия modpack.conf, което ще отменя "
-"всяко преименуване тука."
+"Този пакет с модификации има изрично зададено име в modpack.conf, което ще "
+"отмени всяко преименуване."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "(No description of setting given)"
-msgstr ""
+msgstr "(Настройката няма описание)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "2D Noise"
-msgstr ""
+msgstr "Двуизмерен шум"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
-msgstr ""
+msgstr "Главно меню"
#: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
msgid "Browse"
-msgstr "Преглеждане"
+msgstr "Разглеждане"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Изключено"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Edit"
-msgstr ""
+msgstr "Редактиране"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Enabled"
@@ -554,69 +623,68 @@ msgstr "Включено"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Lacunarity"
-msgstr ""
+msgstr "Лакунарност"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Octaves"
-msgstr ""
+msgstr "Октави"
#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Offset"
-msgstr "Изместване"
+msgstr "Отместване"
#: builtin/mainmenu/dlg_settings_advanced.lua
-msgid "Persistance"
-msgstr ""
+#, fuzzy
+msgid "Persistence"
+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 "Restore Default"
-msgstr ""
+msgstr "По подразбиране"
#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
-#, fuzzy
msgid "Scale"
msgstr "Мащаб"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
msgstr "Търсене"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select directory"
-msgstr ""
+msgstr "Избор на папка"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select file"
-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 at least $1."
-msgstr ""
+msgstr "Стойността трябва да е най-малко $1."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must not be larger than $1."
-msgstr ""
+msgstr "Стойността трябва да е най-много $1."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "X"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
msgid "X spread"
-msgstr "Разпространение на Х-оста"
+msgstr "Разпределение по X"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Y"
@@ -624,7 +692,7 @@ msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Y spread"
-msgstr "Разпространение на У-оста"
+msgstr "Разпределение по Y"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Z"
@@ -632,7 +700,7 @@ msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Z spread"
-msgstr ""
+msgstr "Разпределение по Z"
#. ~ "absvalue" is a noise parameter flag.
#. It is short for "absolute value".
@@ -647,7 +715,7 @@ msgstr ""
#. for noise settings in main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "defaults"
-msgstr ""
+msgstr "подразбирани"
#. ~ "eased" is a noise parameter flag.
#. It is used to make the map smoother and
@@ -659,15 +727,15 @@ msgstr ""
#: builtin/mainmenu/pkgmgr.lua
msgid "$1 (Enabled)"
-msgstr ""
+msgstr "$1 (включено)"
#: builtin/mainmenu/pkgmgr.lua
msgid "$1 mods"
-msgstr ""
+msgstr "$1 модификации"
#: builtin/mainmenu/pkgmgr.lua
msgid "Failed to install $1 to $2"
-msgstr ""
+msgstr "Грешка при инсталиране на $1 в $2"
#: builtin/mainmenu/pkgmgr.lua
msgid "Install Mod: Unable to find real mod name for: $1"
@@ -678,14 +746,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1"
msgstr ""
#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: Unsupported file type \"$1\" or broken archive"
-msgstr ""
-
-#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: file: \"$1\""
-msgstr ""
-
-#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
msgstr ""
@@ -707,224 +767,241 @@ msgstr ""
#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp
msgid "Loading..."
-msgstr "Зарежда..."
+msgstr "Зареждане…"
#: builtin/mainmenu/serverlistmgr.lua
msgid "Public server list is disabled"
-msgstr ""
+msgstr "Списъкът с обществени сървъри е изключен"
#: builtin/mainmenu/serverlistmgr.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
-"Опитай да включиш публичния списък на сървъри отново и си провай интернет "
-"връзката."
+"Включете списъка на обществени сървъри и проверете връзката с интернет."
+
+#: builtin/mainmenu/tab_about.lua
+msgid "About"
+msgstr "Относно"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active Contributors"
+msgstr "Активни сътрудници"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active renderer:"
+msgstr "Активен визуализатор:"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Core Developers"
+msgstr "Основни разработчици"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Open User Data Directory"
+msgstr "Папка с данни"
+
+#: builtin/mainmenu/tab_about.lua
+msgid ""
+"Opens the directory that contains user-provided worlds, games, mods,\n"
+"and texture packs in a file manager / explorer."
+msgstr ""
+"Отваря папката, съдържаща предоставените от потребителя\n"
+"светове, игри, модификации и текстури."
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Contributors"
+msgstr "Предишни сътрудници"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Core Developers"
+msgstr "Предишни основни разработчици"
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
-msgstr ""
+msgstr "Преглед на съдържание онлайн"
#: builtin/mainmenu/tab_content.lua
msgid "Content"
-msgstr ""
+msgstr "Съдържание"
#: builtin/mainmenu/tab_content.lua
msgid "Disable Texture Pack"
-msgstr ""
+msgstr "Изкл. на пакет с текстури"
#: builtin/mainmenu/tab_content.lua
msgid "Information:"
-msgstr ""
+msgstr "Описание:"
#: builtin/mainmenu/tab_content.lua
msgid "Installed Packages:"
-msgstr ""
+msgstr "Инсталирани пакети:"
#: builtin/mainmenu/tab_content.lua
msgid "No dependencies."
-msgstr ""
+msgstr "Няма зависимости."
#: builtin/mainmenu/tab_content.lua
msgid "No package description available"
-msgstr ""
+msgstr "Пакетът няма описание"
#: builtin/mainmenu/tab_content.lua
msgid "Rename"
-msgstr ""
+msgstr "Преименуване"
#: builtin/mainmenu/tab_content.lua
msgid "Uninstall Package"
-msgstr ""
+msgstr "Премахване на пакет"
#: builtin/mainmenu/tab_content.lua
msgid "Use Texture Pack"
-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 "Open User Data Directory"
-msgstr ""
-
-#: builtin/mainmenu/tab_credits.lua
-msgid ""
-"Opens the directory that contains user-provided worlds, games, mods,\n"
-"and texture packs in a file manager / explorer."
-msgstr ""
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Previous Contributors"
-msgstr ""
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Previous Core Developers"
-msgstr ""
+msgstr "Вкл. на пакет с текстури"
#: builtin/mainmenu/tab_local.lua
msgid "Announce Server"
-msgstr ""
+msgstr "Обявяване на сървъра"
#: builtin/mainmenu/tab_local.lua
msgid "Bind Address"
-msgstr ""
+msgstr "Адрес за свързване"
#: builtin/mainmenu/tab_local.lua
msgid "Creative Mode"
-msgstr ""
+msgstr "Творчески режим"
#: builtin/mainmenu/tab_local.lua
msgid "Enable Damage"
-msgstr ""
+msgstr "Получаване на щети"
#: builtin/mainmenu/tab_local.lua
msgid "Host Game"
-msgstr ""
+msgstr "Създаване на игра"
#: builtin/mainmenu/tab_local.lua
msgid "Host Server"
-msgstr ""
+msgstr "Създаване на сървър"
#: builtin/mainmenu/tab_local.lua
msgid "Install games from ContentDB"
-msgstr ""
+msgstr "Инсталиране на игри от ContentDB"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Name"
-msgstr ""
+msgstr "Име"
#: builtin/mainmenu/tab_local.lua
msgid "New"
-msgstr ""
+msgstr "Създаване"
#: builtin/mainmenu/tab_local.lua
msgid "No world created or selected!"
-msgstr ""
+msgstr "Не е създаден или избран свят!"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Password"
-msgstr ""
+msgstr "Парола"
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
-msgstr ""
+msgstr "Започване на игра"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
-msgstr ""
+msgstr "Порт"
#: builtin/mainmenu/tab_local.lua
msgid "Select Mods"
-msgstr ""
+msgstr "Модификации"
#: builtin/mainmenu/tab_local.lua
msgid "Select World:"
-msgstr ""
+msgstr "Избор на свят:"
#: builtin/mainmenu/tab_local.lua
msgid "Server Port"
-msgstr ""
+msgstr "Порт на сървъра"
#: builtin/mainmenu/tab_local.lua
msgid "Start Game"
-msgstr ""
+msgstr "Създаване на игра"
#: builtin/mainmenu/tab_online.lua
-msgid "Address / Port"
-msgstr ""
+msgid "Address"
+msgstr "Адрес"
+
+#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
+msgid "Clear"
+msgstr "Изчистване"
#: builtin/mainmenu/tab_online.lua
msgid "Connect"
-msgstr ""
+msgstr "Свързване"
#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
-msgstr ""
+msgstr "Творчески режим"
+#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "Damage enabled"
-msgstr ""
+msgid "Damage / PvP"
+msgstr "Щети / PvP"
#: builtin/mainmenu/tab_online.lua
msgid "Del. Favorite"
-msgstr ""
+msgstr "Премах. любим"
#: builtin/mainmenu/tab_online.lua
-msgid "Favorite"
-msgstr ""
+msgid "Favorites"
+msgstr "Любими"
#: builtin/mainmenu/tab_online.lua
-msgid "Join Game"
-msgstr ""
+msgid "Incompatible Servers"
+msgstr "Несъвместими сървъри"
#: builtin/mainmenu/tab_online.lua
-msgid "Name / Password"
-msgstr ""
+msgid "Join Game"
+msgstr "Включване към игра"
#: builtin/mainmenu/tab_online.lua
msgid "Ping"
-msgstr ""
+msgstr "Ping"
-#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "PvP enabled"
-msgstr ""
+msgid "Public Servers"
+msgstr "Обществени сървъри"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Refresh"
+msgstr "Презареждане"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Server Description"
+msgstr "Описание на сървър"
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
-msgstr ""
+msgstr "2x"
#: builtin/mainmenu/tab_settings.lua
msgid "3D Clouds"
-msgstr ""
+msgstr "Тримерни облаци"
#: 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 "All Settings"
-msgstr ""
+msgstr "Всички настройки"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
-msgstr ""
+msgstr "Сгласяне:"
#: builtin/mainmenu/tab_settings.lua
msgid "Autosave Screen Size"
-msgstr ""
+msgstr "Авт. запазване на размера"
#: builtin/mainmenu/tab_settings.lua
msgid "Bilinear Filter"
@@ -932,63 +1009,86 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua src/client/game.cpp
msgid "Change Keys"
-msgstr ""
+msgstr "Промяна на клавиши"
#: builtin/mainmenu/tab_settings.lua
msgid "Connected Glass"
-msgstr ""
+msgstr "Свързано стъкло"
+
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Dynamic shadows"
+msgstr "Динамични сенки"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Dynamic shadows: "
+msgstr "Динамични сенки: "
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
-msgstr ""
+msgstr "Луксозни листа"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "High"
+msgstr "Силни"
#: builtin/mainmenu/tab_settings.lua
+msgid "Low"
+msgstr "Слаби"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Medium"
+msgstr "Нормални"
+
+#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
msgid "Mipmap"
-msgstr ""
+msgstr "Миникарта"
#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
msgid "Mipmap + Aniso. Filter"
-msgstr ""
+msgstr "Миникарта + анизо. филтър"
#: builtin/mainmenu/tab_settings.lua
msgid "No Filter"
-msgstr ""
+msgstr "Без филтър"
#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
msgid "No Mipmap"
-msgstr ""
+msgstr "Без миникарта"
#: 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
msgid "None"
-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
msgid "Particles"
-msgstr ""
+msgstr "Частици"
#: builtin/mainmenu/tab_settings.lua
msgid "Screen:"
-msgstr ""
+msgstr "Екран:"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
-msgstr ""
+msgstr "Настройки"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Shaders"
@@ -1005,19 +1105,15 @@ 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 ""
-
-#: builtin/mainmenu/tab_settings.lua
-msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr ""
+msgstr "Текстуриране:"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
@@ -1025,43 +1121,51 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Touchthreshold: (px)"
-msgstr ""
+msgstr "Праг на докосване: (px)"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
+msgid "Ultra High"
+msgstr "Много силни"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Very Low"
+msgstr "Много слаби"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
-msgstr ""
+msgstr "Поклащащи се листа"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Liquids"
-msgstr ""
+msgstr "Поклащащи се течности"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Plants"
-msgstr ""
+msgstr "Поклащащи се растения"
-#: src/client/client.cpp
+#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
-msgstr ""
+msgstr "Времето за свързване изтече."
#: src/client/client.cpp
msgid "Done!"
-msgstr ""
+msgstr "Готово!"
#: src/client/client.cpp
msgid "Initializing nodes"
-msgstr ""
+msgstr "Иницииране на възли"
#: src/client/client.cpp
msgid "Initializing nodes..."
-msgstr ""
+msgstr "Иницииране на възли…"
#: src/client/client.cpp
msgid "Loading textures..."
-msgstr ""
+msgstr "Зареждане на текстури…"
#: src/client/client.cpp
msgid "Rebuilding shaders..."
@@ -1069,11 +1173,11 @@ msgstr ""
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
-msgstr ""
+msgstr "Грешка при свързване (изтекло време?)"
#: src/client/clientlauncher.cpp
-msgid "Could not find or load game \""
-msgstr ""
+msgid "Could not find or load game: "
+msgstr "Не може да бъде намерена или заредена игра: "
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
@@ -1081,118 +1185,140 @@ 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 ""
+msgstr "Изберете име!"
#: src/client/clientlauncher.cpp
msgid "Provided password file failed to open: "
-msgstr ""
+msgstr "Файлът с пароли не се отваря: "
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
-msgstr ""
-
-#. ~ DO NOT TRANSLATE THIS LITERALLY!
-#. This is a special string. Put either "no" or "yes"
-#. into the translation field (literally).
-#. Choose "yes" if the language requires use of the fallback
-#. font, "no" otherwise.
-#. The fallback font is (normally) required for languages with
-#. non-Latin script, like Chinese.
-#. When in doubt, test your translation.
-#: src/client/fontengine.cpp
-msgid "needs_fallback_font"
-msgstr "no"
+msgstr "Зададеният път към света не съществува: "
#: src/client/game.cpp
msgid ""
"\n"
"Check debug.txt for details."
msgstr ""
+"\n"
+"Прегледайте debug.txt за повече информация."
#: src/client/game.cpp
msgid "- Address: "
-msgstr ""
-
-#: src/client/game.cpp
-msgid "- Creative Mode: "
-msgstr ""
-
-#: src/client/game.cpp
-msgid "- Damage: "
-msgstr ""
+msgstr "- Адрес: "
#: src/client/game.cpp
msgid "- Mode: "
-msgstr ""
+msgstr "- Режим: "
#: src/client/game.cpp
msgid "- Port: "
-msgstr ""
+msgstr "- Порт: "
#: src/client/game.cpp
msgid "- Public: "
-msgstr ""
+msgstr "- Обществен: "
#. ~ PvP = Player versus Player
#: src/client/game.cpp
+#, fuzzy
msgid "- PvP: "
-msgstr ""
+msgstr "- PvP: "
#: src/client/game.cpp
msgid "- Server Name: "
-msgstr ""
+msgstr "- Име на сървър: "
+
+#: src/client/game.cpp
+#, fuzzy
+msgid "A serialization error occurred:"
+msgstr "Възникна грешка:"
+
+#: src/client/game.cpp
+#, c-format
+msgid "Access denied. Reason: %s"
+msgstr "Достъпът е отказан. Причина: %s"
#: src/client/game.cpp
msgid "Automatic forward disabled"
-msgstr ""
+msgstr "Автоматичното движение напред е изключено"
#: src/client/game.cpp
msgid "Automatic forward enabled"
+msgstr "Автоматичното движение напред е включено"
+
+#: src/client/game.cpp
+#, fuzzy
+msgid "Block bounds hidden"
+msgstr "Граници на блокове"
+
+#: src/client/game.cpp
+msgid "Block bounds shown for all blocks"
msgstr ""
#: src/client/game.cpp
-msgid "Camera update disabled"
+msgid "Block bounds shown for current block"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for nearby blocks"
msgstr ""
#: src/client/game.cpp
+msgid "Camera update disabled"
+msgstr "Опресняването на екрана при движение е изключено"
+
+#: src/client/game.cpp
msgid "Camera update enabled"
+msgstr "Опресняването на екрана при движение е включено"
+
+#: src/client/game.cpp
+msgid "Can't show block bounds (need 'basic_debug' privilege)"
msgstr ""
#: src/client/game.cpp
msgid "Change Password"
-msgstr ""
+msgstr "Промяна на парола"
#: src/client/game.cpp
msgid "Cinematic mode disabled"
-msgstr ""
+msgstr "Кинематографичният режим е изключен"
#: src/client/game.cpp
msgid "Cinematic mode enabled"
-msgstr ""
+msgstr "Кинематографичният режим е включен"
+
+#: src/client/game.cpp
+msgid "Client disconnected"
+msgstr "Клиентът е изключен"
#: src/client/game.cpp
msgid "Client side scripting is disabled"
-msgstr ""
+msgstr "Изпълняване на скриптове от страната на клиента е изключено"
#: src/client/game.cpp
msgid "Connecting to server..."
-msgstr ""
+msgstr "Свързване със сървър…"
+
+#: src/client/game.cpp
+msgid "Connection failed for unknown reason"
+msgstr "Грешка във връзката поради неизвестна причина"
#: src/client/game.cpp
msgid "Continue"
-msgstr ""
+msgstr "Продължаване"
#: src/client/game.cpp
#, c-format
@@ -1212,14 +1338,33 @@ msgid ""
"- Mouse wheel: select item\n"
"- %s: chat\n"
msgstr ""
+"Управление:\n"
+"- %s: движение напред\n"
+"- %s: движение назад\n"
+"- %s: движение наляво\n"
+"- %s: движение надясно\n"
+"- %s: скачане/катерене\n"
+"- %s: копаене/удар\n"
+"- %s: поставяне/използване\n"
+"- %s: промъкване/слизане\n"
+"- %s: пускане на предмет\n"
+"- %s: инвентар\n"
+"- мишка: завъртане/разглеждане\n"
+"- колелце на мишка: избор на предмет\n"
+"- %s: разговор\n"
#: src/client/game.cpp
-msgid "Creating client..."
+#, c-format
+msgid "Couldn't resolve address: %s"
msgstr ""
#: src/client/game.cpp
+msgid "Creating client..."
+msgstr "Създаване на клиент…"
+
+#: src/client/game.cpp
msgid "Creating server..."
-msgstr ""
+msgstr "Създаване на сървър…"
#: src/client/game.cpp
msgid "Debug info and profiler graph hidden"
@@ -1251,67 +1396,67 @@ msgstr ""
#: src/client/game.cpp
msgid "Disabled unlimited viewing range"
-msgstr ""
+msgstr "Неограниченият обхват на видимост е изключен"
#: src/client/game.cpp
msgid "Enabled unlimited viewing range"
-msgstr ""
+msgstr "Неограниченият обхват на видимост е включен"
#: src/client/game.cpp
msgid "Exit to Menu"
-msgstr ""
+msgstr "Изход към менюто"
#: src/client/game.cpp
msgid "Exit to OS"
-msgstr ""
+msgstr "Изход към ОС"
#: src/client/game.cpp
msgid "Fast mode disabled"
-msgstr ""
+msgstr "Режимът на бързо движение е изключен"
#: src/client/game.cpp
msgid "Fast mode enabled"
-msgstr ""
+msgstr "Режимът на бързо движение е включен"
#: src/client/game.cpp
msgid "Fast mode enabled (note: no 'fast' privilege)"
-msgstr ""
+msgstr "Режимът на бързо движение е включен (заб.: липсва правото „fast“)"
#: src/client/game.cpp
msgid "Fly mode disabled"
-msgstr ""
+msgstr "Режимът на летене е изключен"
#: src/client/game.cpp
msgid "Fly mode enabled"
-msgstr ""
+msgstr "Режимът на летене е включен"
#: src/client/game.cpp
msgid "Fly mode enabled (note: no 'fly' privilege)"
-msgstr ""
+msgstr "Режимът на летене е включен (заб.: липсва правото „fly“)"
#: src/client/game.cpp
msgid "Fog disabled"
-msgstr ""
+msgstr "Мъглата е изключена"
#: src/client/game.cpp
msgid "Fog enabled"
-msgstr ""
+msgstr "Мъглата е включена"
#: src/client/game.cpp
msgid "Game info:"
-msgstr ""
+msgstr "Информация за играта:"
#: src/client/game.cpp
msgid "Game paused"
-msgstr ""
+msgstr "Играта е на пауза"
#: src/client/game.cpp
msgid "Hosting server"
-msgstr ""
+msgstr "Домакин на играта"
#: src/client/game.cpp
msgid "Item definitions..."
-msgstr ""
+msgstr "Дефиниции на предмети…"
#: src/client/game.cpp
msgid "KiB/s"
@@ -1319,7 +1464,7 @@ msgstr ""
#: src/client/game.cpp
msgid "Media..."
-msgstr ""
+msgstr "Медия…"
#: src/client/game.cpp
msgid "MiB/s"
@@ -1327,160 +1472,175 @@ msgstr ""
#: src/client/game.cpp
msgid "Minimap currently disabled by game or mod"
-msgstr ""
+msgstr "Картата е спряна или от играта, или от модификация"
+
+#: src/client/game.cpp
+msgid "Multiplayer"
+msgstr "Множество играчи"
#: src/client/game.cpp
msgid "Noclip mode disabled"
-msgstr ""
+msgstr "Режимът „без изрязване“ е изключен"
#: src/client/game.cpp
msgid "Noclip mode enabled"
-msgstr ""
+msgstr "Режимът „без изрязване“ е включен"
#: src/client/game.cpp
msgid "Noclip mode enabled (note: no 'noclip' privilege)"
-msgstr ""
+msgstr "Режимът „без изрязване“ е включен (заб.: липсва правото „noclip“)"
#: src/client/game.cpp
msgid "Node definitions..."
-msgstr ""
+msgstr "Дефиниции на възли…"
#: src/client/game.cpp
msgid "Off"
-msgstr ""
+msgstr "Изключено"
#: src/client/game.cpp
msgid "On"
-msgstr ""
+msgstr "Включено"
#: src/client/game.cpp
msgid "Pitch move mode disabled"
-msgstr ""
+msgstr "Режимът „промяна на височината“ е изключен"
#: src/client/game.cpp
msgid "Pitch move mode enabled"
-msgstr ""
+msgstr "Режимът „промяна на височината“ е включен"
#: src/client/game.cpp
msgid "Profiler graph shown"
-msgstr ""
+msgstr "Графиката на профилатора е показана"
#: src/client/game.cpp
msgid "Remote server"
-msgstr ""
+msgstr "Отдалечен сървър"
#: src/client/game.cpp
msgid "Resolving address..."
-msgstr ""
+msgstr "Намиране на адрес…"
#: src/client/game.cpp
msgid "Shutting down..."
-msgstr ""
+msgstr "Изключване…"
#: src/client/game.cpp
msgid "Singleplayer"
-msgstr ""
+msgstr "Един играч"
#: src/client/game.cpp
msgid "Sound Volume"
-msgstr ""
+msgstr "Сила на звука"
#: src/client/game.cpp
msgid "Sound muted"
-msgstr ""
+msgstr "Звукът е заглушен"
#: src/client/game.cpp
msgid "Sound system is disabled"
-msgstr ""
+msgstr "Системата за звук е изключена"
#: src/client/game.cpp
msgid "Sound system is not supported on this build"
-msgstr ""
+msgstr "В това издание не се поддържа звукова система"
#: src/client/game.cpp
msgid "Sound unmuted"
+msgstr "Звукът е пуснат"
+
+#: src/client/game.cpp
+#, c-format
+msgid "The server is probably running a different version of %s."
+msgstr "Сървърът вероятно използва друго издание на %s."
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to connect to %s because IPv6 is disabled"
msgstr ""
#: src/client/game.cpp
#, c-format
-msgid "Viewing range changed to %d"
+msgid "Unable to listen on %s because IPv6 is disabled"
msgstr ""
#: src/client/game.cpp
#, c-format
+msgid "Viewing range changed to %d"
+msgstr "Обхватът на видимостта е променен на %d"
+
+#: src/client/game.cpp
+#, c-format
msgid "Viewing range is at maximum: %d"
-msgstr ""
+msgstr "Обхватът на видимостта е на своя максимум: %d"
#: src/client/game.cpp
#, c-format
msgid "Viewing range is at minimum: %d"
-msgstr ""
+msgstr "Обхватът на видимостта е на своя минимум: %d"
#: src/client/game.cpp
#, c-format
msgid "Volume changed to %d%%"
-msgstr ""
+msgstr "Силата на звука е променена на %d%%"
#: src/client/game.cpp
msgid "Wireframe shown"
-msgstr ""
+msgstr "Показани са телените рамки"
#: src/client/game.cpp
msgid "Zoom currently disabled by game or mod"
-msgstr ""
+msgstr "Мащабирането е спряно или от играта, или от модификация"
#: src/client/game.cpp
msgid "ok"
-msgstr ""
+msgstr "добре"
#: src/client/gameui.cpp
msgid "Chat hidden"
-msgstr ""
+msgstr "Разговорите са скрити"
#: src/client/gameui.cpp
msgid "Chat shown"
-msgstr ""
+msgstr "Разговорите са видими"
#: src/client/gameui.cpp
msgid "HUD hidden"
-msgstr ""
+msgstr "HUD скрит"
#: src/client/gameui.cpp
msgid "HUD shown"
-msgstr ""
+msgstr "HUD видим"
#: src/client/gameui.cpp
msgid "Profiler hidden"
-msgstr ""
+msgstr "Профилаторът е скрит"
#: src/client/gameui.cpp
#, c-format
msgid "Profiler shown (page %d of %d)"
-msgstr ""
+msgstr "Профилаторът е видим (страница %d от %d)"
#: src/client/keycode.cpp
msgid "Apps"
-msgstr ""
+msgstr "Приложения"
#: src/client/keycode.cpp
msgid "Backspace"
-msgstr ""
+msgstr "Backspace"
#: src/client/keycode.cpp
msgid "Caps Lock"
-msgstr ""
-
-#: src/client/keycode.cpp
-msgid "Clear"
-msgstr ""
+msgstr "Caps Lock"
#: src/client/keycode.cpp
msgid "Control"
-msgstr ""
+msgstr "Control"
#: src/client/keycode.cpp
msgid "Down"
-msgstr ""
+msgstr "Надолу"
#: src/client/keycode.cpp
msgid "End"
@@ -1528,27 +1688,27 @@ msgstr ""
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Left"
-msgstr ""
+msgstr "Наляво"
#: src/client/keycode.cpp
msgid "Left Button"
-msgstr ""
+msgstr "Ляв бутон"
#: src/client/keycode.cpp
msgid "Left Control"
-msgstr ""
+msgstr "Ляв Control"
#: src/client/keycode.cpp
msgid "Left Menu"
-msgstr ""
+msgstr "Ляв Menu"
#: src/client/keycode.cpp
msgid "Left Shift"
-msgstr ""
+msgstr "Ляв Shift"
#: src/client/keycode.cpp
msgid "Left Windows"
-msgstr ""
+msgstr "Ляв Windows"
#. ~ Key name, common on Windows keyboards
#: src/client/keycode.cpp
@@ -1557,7 +1717,7 @@ msgstr ""
#: src/client/keycode.cpp
msgid "Middle Button"
-msgstr ""
+msgstr "Среден бутон"
#: src/client/keycode.cpp
msgid "Num Lock"
@@ -1654,31 +1814,31 @@ msgstr ""
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Right"
-msgstr ""
+msgstr "Дясно"
#: src/client/keycode.cpp
msgid "Right Button"
-msgstr ""
+msgstr "Десен бутон"
#: src/client/keycode.cpp
msgid "Right Control"
-msgstr ""
+msgstr "Десен Control"
#: src/client/keycode.cpp
msgid "Right Menu"
-msgstr ""
+msgstr "Десен Menu"
#: src/client/keycode.cpp
msgid "Right Shift"
-msgstr ""
+msgstr "Десен Shift"
#: src/client/keycode.cpp
msgid "Right Windows"
-msgstr ""
+msgstr "Десен Windows"
#: src/client/keycode.cpp
msgid "Scroll Lock"
-msgstr ""
+msgstr "Scroll Lock"
#. ~ Key name
#: src/client/keycode.cpp
@@ -1687,27 +1847,27 @@ msgstr ""
#: src/client/keycode.cpp
msgid "Shift"
-msgstr ""
+msgstr "Shift"
#: src/client/keycode.cpp
msgid "Sleep"
-msgstr ""
+msgstr "Sleep"
#: src/client/keycode.cpp
msgid "Snapshot"
-msgstr ""
+msgstr "Снимка на екрана"
#: src/client/keycode.cpp
msgid "Space"
-msgstr ""
+msgstr "Интервал"
#: src/client/keycode.cpp
msgid "Tab"
-msgstr ""
+msgstr "Табулатор"
#: src/client/keycode.cpp
msgid "Up"
-msgstr ""
+msgstr "Нагоре"
#: src/client/keycode.cpp
msgid "X Button 1"
@@ -1719,33 +1879,41 @@ msgstr ""
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Zoom"
-msgstr ""
+msgstr "Мащабиране"
#: src/client/minimap.cpp
msgid "Minimap hidden"
-msgstr ""
+msgstr "Картата е скрита"
#: src/client/minimap.cpp
#, c-format
msgid "Minimap in radar mode, Zoom x%d"
-msgstr ""
+msgstr "Картата е в режим на радар, мащаб x%d"
#: src/client/minimap.cpp
#, c-format
msgid "Minimap in surface mode, Zoom x%d"
-msgstr ""
+msgstr "Картата е в режим на повърхност, мащаб x%d"
#: src/client/minimap.cpp
msgid "Minimap in texture mode"
-msgstr ""
+msgstr "Картата е в режим на текстура"
+
+#: src/gui/guiChatConsole.cpp
+msgid "Failed to open webpage"
+msgstr "Грешка при отваряне на страница"
+
+#: src/gui/guiChatConsole.cpp
+msgid "Opening webpage"
+msgstr "Отваряне на страница"
#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
msgid "Passwords do not match!"
-msgstr ""
+msgstr "Паролите не съвпадат!"
#: src/gui/guiConfirmRegistration.cpp
msgid "Register and Join"
-msgstr ""
+msgstr "Регистриране и вход"
#: src/gui/guiConfirmRegistration.cpp
#, c-format
@@ -1756,188 +1924,199 @@ msgid ""
"Please retype your password and click 'Register and Join' to confirm account "
"creation, or click 'Cancel' to abort."
msgstr ""
+"На път сте да влезете в сървъра с име „%s“ за първи път.\n"
+"Ако продължите нова сметка с тези данни ще бъде създадена на сървъра.\n"
+"Въведете паролата отново и натиснете „Регистриране и вход“, за да потвърдите "
+"или „Отказ“ за връщане обратно."
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
-msgstr ""
+msgstr "Напред"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "\"Special\" = climb down"
-msgstr ""
+msgid "\"Aux1\" = climb down"
+msgstr "„Aux1“ = слизане"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Autoforward"
-msgstr ""
+msgstr "Автоматично напред"
#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Automatic jumping"
-msgstr ""
+msgstr "Автоматично скачане"
+
+#: src/gui/guiKeyChangeMenu.cpp
+msgid "Aux1"
+msgstr "Aux1"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
-msgstr ""
+msgstr "Назад"
+
+#: src/gui/guiKeyChangeMenu.cpp
+msgid "Block bounds"
+msgstr "Граници на блокове"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Change camera"
-msgstr ""
+msgstr "Промяна на камера"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Chat"
-msgstr ""
+msgstr "Разговори"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Command"
-msgstr ""
+msgstr "Команда"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Console"
-msgstr ""
+msgstr "Конзола"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Dec. range"
-msgstr ""
+msgstr "Намал. на обхвата"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Dec. volume"
-msgstr ""
+msgstr "Намал. на звука"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Double tap \"jump\" to toggle fly"
-msgstr ""
+msgstr "Двоен „скок“ превключва летене"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Drop"
-msgstr ""
+msgstr "Пускане предмет"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Forward"
-msgstr ""
+msgstr "Напред"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inc. range"
-msgstr ""
+msgstr "Увелич. на обхвата"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inc. volume"
-msgstr ""
+msgstr "Увелич. на звука"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inventory"
-msgstr ""
+msgstr "Инвентар"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Jump"
-msgstr ""
+msgstr "Скок"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Key already in use"
-msgstr ""
+msgstr "Клавишът вече се ползва"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
msgstr ""
+"Клавишни комбинации (Ако екранът изглежда счупен махнете нещата от minetest."
+"conf)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
-msgstr ""
+msgstr "Местна команда"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Mute"
-msgstr ""
+msgstr "Заглушаване"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Next item"
-msgstr ""
+msgstr "След. предмет"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Prev. item"
-msgstr ""
+msgstr "Пред. предмет"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Range select"
-msgstr ""
+msgstr "Обхват видимост"
#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Screenshot"
-msgstr ""
+msgstr "Снимка на екрана"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Sneak"
-msgstr ""
-
-#: src/gui/guiKeyChangeMenu.cpp
-msgid "Special"
-msgstr ""
+msgstr "Промъкване"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle HUD"
-msgstr ""
+msgstr "Превкл. HUD"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle chat log"
-msgstr ""
+msgstr "Превкл. разговори"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle fast"
-msgstr ""
+msgstr "Превкл. бързина"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle fly"
-msgstr ""
+msgstr "Превкл. полет"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle fog"
-msgstr ""
+msgstr "Превкл. мъгла"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle minimap"
-msgstr ""
+msgstr "Превкл. карта"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle noclip"
-msgstr ""
+msgstr "Превкл. изрязване"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle pitchmove"
-msgstr ""
+msgstr "Превкл. „pitchmove“"
#: src/gui/guiKeyChangeMenu.cpp
msgid "press key"
-msgstr ""
+msgstr "избор бутон"
#: src/gui/guiPasswordChange.cpp
msgid "Change"
-msgstr ""
+msgstr "Променяне"
#: src/gui/guiPasswordChange.cpp
msgid "Confirm Password"
-msgstr ""
+msgstr "Потвърж. на парола"
#: src/gui/guiPasswordChange.cpp
msgid "New Password"
-msgstr ""
+msgstr "Нова парола"
#: src/gui/guiPasswordChange.cpp
msgid "Old Password"
-msgstr ""
+msgstr "Стара парола"
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
-msgstr ""
+msgstr "Изход"
#: src/gui/guiVolumeChange.cpp
msgid "Muted"
-msgstr ""
+msgstr "Без звук"
#: src/gui/guiVolumeChange.cpp
-msgid "Sound Volume: "
-msgstr ""
+#, c-format
+msgid "Sound Volume: %d%%"
+msgstr "Сила на звука: %d%%"
#. ~ Imperative, as in "Enter/type in text".
#. Don't forget the space.
#: src/gui/modalMenu.cpp
msgid "Enter "
-msgstr ""
+msgstr "Въведете "
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
@@ -1954,8 +2133,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"(Android) Use virtual joystick to trigger \"aux\" button.\n"
-"If enabled, virtual joystick will also tap \"aux\" button when out of main "
+"(Android) Use virtual joystick to trigger \"Aux1\" button.\n"
+"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
@@ -2138,6 +2317,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Adjust the detected display density, used for scaling UI elements."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, c-format
msgid ""
"Adjusts the density of the floatland layer.\n"
@@ -2235,21 +2418,29 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Automatically jump up single-node obstacles."
-msgstr ""
+msgstr "Автоматично прескача препятствия от единични възли."
#: src/settings_translation_file.cpp
msgid "Automatically report to the serverlist."
-msgstr ""
+msgstr "Автоматично докладване в списъка на сървърите."
#: src/settings_translation_file.cpp
msgid "Autosave screen size"
-msgstr ""
+msgstr "Автоматично запазване на размера на екрана"
#: src/settings_translation_file.cpp
msgid "Autoscaling mode"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Aux1 key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Aux1 key for climbing/descending"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr ""
@@ -2283,7 +2474,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Bind address"
-msgstr ""
+msgstr "Адрес за свързване"
#: src/settings_translation_file.cpp
msgid "Biome API temperature and humidity noise parameters"
@@ -2294,10 +2485,6 @@ 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 "Block send optimize distance"
msgstr ""
@@ -2396,6 +2583,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Chat command time message threshold"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chat commands"
+msgstr "Команда"
+
+#: src/settings_translation_file.cpp
msgid "Chat font size"
msgstr ""
@@ -2428,8 +2624,9 @@ msgid "Chat toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Chatcommands"
-msgstr ""
+#, fuzzy
+msgid "Chat weblinks"
+msgstr "Разговорите са видими"
#: src/settings_translation_file.cpp
msgid "Chunk size"
@@ -2448,6 +2645,12 @@ msgid "Clean transparent textures"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console "
+"output."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Client"
msgstr ""
@@ -2492,6 +2695,10 @@ msgid "Colored fog"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Colored shadows"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of flags to hide in the content repository.\n"
"\"nonfree\" can be used to hide packages which do not qualify as 'free "
@@ -2519,6 +2726,22 @@ msgid "Command key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when saving mapblocks to disk.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when sending mapblocks to the client.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Connect glass"
msgstr ""
@@ -2528,19 +2751,19 @@ 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 ""
+msgstr "Височина на конзолата"
#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
@@ -2574,10 +2797,14 @@ msgid ""
"Examples:\n"
"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged."
msgstr ""
+"Управлява дължината на цикъла ден/нощ.\n"
+"Пример:\n"
+"72 = 20 мин, 360 = 4 мин, 1 = 24 часа, 0 = ден/нощ/каквото е остава без "
+"промяна."
#: src/settings_translation_file.cpp
msgid "Controls sinking speed in liquid."
-msgstr ""
+msgstr "Управлява скоростта на потъване в течности."
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -2609,7 +2836,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
-"Also controls the object crosshair color"
+"This also applies to the object crosshair."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2678,7 +2905,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Default report format"
-msgstr ""
+msgstr "Формат на отчета по подразбиране"
#: src/settings_translation_file.cpp
msgid "Default stack size"
@@ -2686,8 +2913,9 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Default timeout for cURL, stated in milliseconds.\n"
-"Only has an effect if compiled with cURL."
+"Define shadow filtering quality.\n"
+"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
+"but also uses more resources."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2805,6 +3033,10 @@ msgid "Disallow empty passwords"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Display Density Scaling Factor"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -2849,6 +3081,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enable Poisson disk filtering.\n"
+"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF "
+"filtering."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable colored shadows.\n"
+"On true translucent nodes cast colored shadows. This is expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable console window"
msgstr ""
@@ -2957,6 +3202,12 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enables tradeoffs that reduce CPU load or increase rendering performance\n"
+"at the expense of minor visual glitches that do not impact game playability."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -2995,18 +3246,6 @@ msgid "Fallback font path"
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 ""
@@ -3024,7 +3263,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Fast movement (via the \"special\" key).\n"
+"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
@@ -3058,9 +3297,9 @@ 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."
+"which PNG optimizers usually discard, often resulting in dark or\n"
+"light edges to transparent textures. Apply a filter to clean that up\n"
+"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3152,15 +3391,15 @@ msgid "Font size"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the default font in point (pt)."
+msgid "Font size divisible by"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the fallback font in point (pt)."
+msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the monospace font in point (pt)."
+msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3171,6 +3410,17 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"For pixel-style fonts that do not scale well, this ensures that font sizes "
+"used\n"
+"with this font will always be divisible by this value, in pixels. For "
+"instance,\n"
+"a pixel font 16 pixels tall should have this set to 16, so it will only ever "
+"be\n"
+"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Format of player chat messages. The following strings are valid "
"placeholders:\n"
"@name, @message, @timestamp (optional)"
@@ -3229,10 +3479,6 @@ 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)."
@@ -3257,10 +3503,6 @@ msgid "Full screen"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Full screen BPP"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
msgstr ""
@@ -3284,7 +3526,7 @@ msgstr ""
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."
+"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3353,7 +3595,8 @@ msgid "Heat noise"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Height component of the initial window size. Ignored in fullscreen mode."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3365,10 +3608,6 @@ msgid "Height select noise"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "High-precision FPU"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Hill steepness"
msgstr ""
@@ -3599,8 +3838,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"If disabled, \"special\" key is used to fly fast if both fly and fast mode "
-"are\n"
+"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
@@ -3622,8 +3860,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"If enabled, \"special\" key instead of \"sneak\" key is used for climbing "
-"down and\n"
+"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down "
+"and\n"
"descending."
msgstr ""
@@ -3669,6 +3907,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If the execution of a chat command takes longer than this specified time in\n"
+"seconds, add the time information to the chat command message"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If the file size of debug.txt exceeds the number of megabytes specified in\n"
"this setting when it is opened, the file is moved to debug.txt.1,\n"
"deleting an older debug.txt.1 if it exists.\n"
@@ -3714,7 +3958,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrument chatcommands on registration."
+msgid "Instrument chat commands on registration."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3798,7 +4042,7 @@ msgid "Joystick button repetition interval"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Joystick deadzone"
+msgid "Joystick dead zone"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4396,7 +4640,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Large cave proportion flooded"
-msgstr ""
+msgstr "Голяма част от пещерите са наводнени"
#: src/settings_translation_file.cpp
msgid "Large chat console key"
@@ -4556,10 +4800,6 @@ msgid ""
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 ""
@@ -4631,6 +4871,10 @@ msgid "Map save interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Map shadows update frames"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mapblock limit"
msgstr ""
@@ -4739,6 +4983,10 @@ msgid "Maximum FPS when the window is not focused, or when the game is paused."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum distance to render shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
msgstr ""
@@ -4844,7 +5092,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum time in ms a file download (e.g. a mod download) may take."
+msgid ""
+"Maximum time a file download (e.g. a mod download) may take, stated in "
+"milliseconds."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum time an interactive request (e.g. server list fetch) may take, "
+"stated in milliseconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4908,7 +5164,7 @@ msgid "Mod channels"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Modifies the size of the hudbar elements."
+msgid "Modifies the size of the HUD elements."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4920,6 +5176,10 @@ msgid "Monospace font size"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Monospace font size divisible by"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mountain height noise"
msgstr ""
@@ -5040,7 +5300,7 @@ 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"
+"This is a trade-off between SQLite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
@@ -5059,21 +5319,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"Open the pause menu when the window's focus is lost. Does not pause if a "
"formspec is\n"
"open."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Optional override for chat weblink color."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
-"Path of the fallback font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path of the fallback font. Must be a TrueType font.\n"
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
@@ -5096,17 +5353,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the default font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the monospace font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
@@ -5150,7 +5403,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Player name"
-msgstr ""
+msgstr "Име на играча"
#: src/settings_translation_file.cpp
msgid "Player transfer distance"
@@ -5161,6 +5414,10 @@ msgid "Player versus player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Poisson filtering"
+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."
@@ -5205,14 +5462,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Prometheus listener address.\n"
-"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
+"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
"enable metrics listener for Prometheus on that address.\n"
-"Metrics can be fetch on http://127.0.0.1:30000/metrics"
+"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Proportion of large caves that contain liquid."
-msgstr ""
+msgstr "Частта от големи пещери, които съдържат течност."
#: src/settings_translation_file.cpp
msgid ""
@@ -5247,7 +5504,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Remote port"
-msgstr ""
+msgstr "Отдалечен порт"
#: src/settings_translation_file.cpp
msgid ""
@@ -5458,7 +5715,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Server address"
-msgstr ""
+msgstr "Адрес на сървър"
#: src/settings_translation_file.cpp
msgid "Server description"
@@ -5470,7 +5727,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Server port"
-msgstr ""
+msgstr "Порт на сървъра"
#: src/settings_translation_file.cpp
msgid "Server side occlusion culling"
@@ -5496,6 +5753,32 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Set the shadow strength.\n"
+"Lower value means lighter shadows, higher value means darker shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the soft shadow radius size.\n"
+"Lower values mean sharper shadows, bigger values mean softer shadows.\n"
+"Minimum value: 1.0; maximum value: 10.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the tilt of Sun/Moon orbit in degrees.\n"
+"Value of 0 means no tilt / vertical orbit.\n"
+"Minimum value: 0.0; maximum value: 60.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true to enable Shadow Mapping.\n"
+"Requires shaders to be enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Set to true to enable waving leaves.\n"
"Requires shaders to be enabled."
msgstr ""
@@ -5513,6 +5796,13 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Sets shadow texture quality to 32 bits.\n"
+"On false, 16 bits texture will be used.\n"
+"This can cause much more artifacts in the shadow."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Shader path"
msgstr ""
@@ -5525,15 +5815,29 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Shadow filter quality"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map max distance in nodes to render shadows"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture in 32 bits"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture size"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Shadow offset (in pixels) of the default font. If 0, then shadow will not be "
"drawn."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not "
-"be drawn."
+msgid "Shadow strength"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5555,7 +5859,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Show nametag backgrounds by default"
+msgid "Show name tag backgrounds by default"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5580,6 +5884,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Sky Body Orbit Tilt"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Slice w"
msgstr ""
@@ -5634,15 +5942,11 @@ msgid "Sneaking speed, in nodes per second."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Sound"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Special key"
+msgid "Soft shadow radius"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Special key for climbing/descending"
+msgid "Sound"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5662,6 +5966,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Spread a complete update of shadow map over given amount of frames.\n"
+"Higher values might make shadows laggy, lower values\n"
+"will consume more resources.\n"
+"Minimum value: 1; maximum value: 16"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Spread of light curve boost range.\n"
"Controls the width of the range to be boosted.\n"
"Standard deviation of the light curve boost Gaussian."
@@ -5768,6 +6080,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Texture size to render the shadow map on.\n"
+"This must be a power of two.\n"
+"Bigger numbers create better shadows but it is also more expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Textures on a node may be aligned either to the node or to the world.\n"
"The former mode suits better things like machines, furniture, etc., while\n"
"the latter makes stairs and microblocks fit surroundings better.\n"
@@ -5781,7 +6100,7 @@ msgid "The URL for the content repository"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "The deadzone of the joystick"
+msgid "The dead zone of the joystick"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5839,7 +6158,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"The rendering back-end for Irrlicht.\n"
+"The rendering back-end.\n"
"A restart is required after changing this.\n"
"Note: On Android, stick with OGLES1 if unsure! App may fail to start "
"otherwise.\n"
@@ -5850,7 +6169,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"The sensitivity of the joystick axes for moving the\n"
-"ingame view frustum around."
+"in-game view frustum around."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5944,6 +6263,10 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Tradeoffs for performance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6013,7 +6336,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Use mip mapping to scale textures. May slightly increase performance,\n"
+"Use mipmapping to scale textures. May slightly increase performance,\n"
"especially when using a high resolution texture pack.\n"
"Gamma correct downscaling is not supported."
msgstr ""
@@ -6126,7 +6449,7 @@ msgid "Viewing range"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Virtual joystick triggers aux button"
+msgid "Virtual joystick triggers Aux1 button"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6197,6 +6520,10 @@ msgid "Waving plants"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Weblink color"
+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"
@@ -6217,23 +6544,15 @@ msgid ""
"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.\n"
+"memory. Powers of 2 are recommended. This setting is ONLY applied if\n"
+"bilinear/trilinear/anisotropic filtering is enabled.\n"
"This is also used as the base node texture size for world-aligned\n"
"texture autoscaling."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Whether FreeType fonts are used, requires FreeType support to be compiled "
-"in.\n"
-"If disabled, bitmap and XML vectors fonts are used instead."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Whether nametag backgrounds should be shown by default.\n"
+"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
@@ -6275,7 +6594,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Width component of the initial window size."
+msgid "Width component of the initial window size. Ignored in fullscreen mode."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6360,34 +6679,31 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when saving mapblocks to disk.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when sending mapblocks to the client.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
+msgid "cURL file download timeout"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "cURL file download timeout"
+msgid "cURL interactive timeout"
msgstr ""
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
msgstr ""
-#: src/settings_translation_file.cpp
-msgid "cURL timeout"
-msgstr ""
+#~ msgid "- Creative Mode: "
+#~ msgstr "- Творчески режим: "
+
+#~ msgid "- Damage: "
+#~ msgstr "- Щети: "
+
+#~ msgid "Install: file: \"$1\""
+#~ msgstr "Инсталиране: файл: „$1“"
#~ msgid "View"
#~ msgstr "Гледане"
+
+#~ msgid "You died."
+#~ msgstr "Умряхте."
+
+#~ msgid "needs_fallback_font"
+#~ msgstr "no"
diff --git a/po/ca/minetest.po b/po/ca/minetest.po
index f9aecf265..b23999744 100644
--- a/po/ca/minetest.po
+++ b/po/ca/minetest.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Catalan (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-23 19:03+0100\n"
+"POT-Creation-Date: 2022-01-25 23:19+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/minetest/"
@@ -14,6 +14,47 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.9-dev\n"
+#: builtin/client/chatcommands.lua
+msgid "Clear the out chat queue"
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Empty command."
+msgstr "Comands de xat"
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Exit to main menu"
+msgstr "Eixir al menú"
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Invalid command: "
+msgstr "Comands de xat"
+
+#: builtin/client/chatcommands.lua
+msgid "Issued command: "
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "List online players"
+msgstr "Un jugador"
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Online players: "
+msgstr "Un jugador"
+
+#: builtin/client/chatcommands.lua
+msgid "The out chat queue is now empty."
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "This command is disabled by server."
+msgstr ""
+
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
msgstr "Reaparèixer"
@@ -23,11 +64,42 @@ msgstr "Reaparèixer"
msgid "You died"
msgstr "Has mort."
+#: builtin/common/chatcommands.lua
+#, fuzzy
+msgid "Available commands:"
+msgstr "Comands de xat"
+
+#: builtin/common/chatcommands.lua
+#, fuzzy
+msgid "Available commands: "
+msgstr "Comands de xat"
+
+#: builtin/common/chatcommands.lua
+msgid "Command not available: "
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "Get help for commands"
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid ""
+"Use '.help <cmd>' to get more information, or '.help all' to list everything."
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "[all | <cmd>]"
+msgstr ""
+
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
msgstr ""
#: builtin/fstk/ui.lua
+msgid "<none available>"
+msgstr ""
+
+#: builtin/fstk/ui.lua
#, fuzzy
msgid "An error occurred in a Lua script:"
msgstr "S'ha produït un error en un script Lua, com per exemple un mod."
@@ -247,6 +319,13 @@ msgid "Install missing dependencies"
msgstr "Dependències opcionals:"
#: builtin/mainmenu/dlg_contentstore.lua
+#, fuzzy
+msgid "Install: Unsupported file type or broken archive"
+msgstr ""
+"\n"
+"Instal·lar mod: Format de arxiu \"$1\" no suportat o arxiu corrupte"
+
+#: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Mods"
@@ -566,7 +645,7 @@ msgstr "< Torna a la pàgina de configuració"
msgid "Browse"
msgstr "Navegar"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Desactivat"
@@ -591,7 +670,7 @@ msgid "Offset"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
-msgid "Persistance"
+msgid "Persistence"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -610,7 +689,7 @@ msgstr "Restablir per defecte"
msgid "Scale"
msgstr ""
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
msgstr "Buscar"
@@ -712,18 +791,6 @@ msgstr ""
#: builtin/mainmenu/pkgmgr.lua
#, fuzzy
-msgid "Install: Unsupported file type \"$1\" or broken archive"
-msgstr ""
-"\n"
-"Instal·lar mod: Format de arxiu \"$1\" no suportat o arxiu corrupte"
-
-#: builtin/mainmenu/pkgmgr.lua
-#, fuzzy
-msgid "Install: file: \"$1\""
-msgstr "Instal·lar mod: Arxiu: \"$1\""
-
-#: builtin/mainmenu/pkgmgr.lua
-#, fuzzy
msgid "Unable to find a valid mod or modpack"
msgstr ""
"Instal·lar mod: Impossible de trobar el nom de la carpeta adequat per al "
@@ -763,6 +830,42 @@ msgstr ""
"Intenta tornar a habilitar la llista de servidors públics i comprovi la seva "
"connexió a Internet ."
+#: builtin/mainmenu/tab_about.lua
+msgid "About"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active Contributors"
+msgstr "Col·laboradors Actius"
+
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Active renderer:"
+msgstr "Rang d'enviament de l'objecte actiu"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Core Developers"
+msgstr "Desenvolupadors del nucli"
+
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Open User Data Directory"
+msgstr "Selecciona el fitxer del mod:"
+
+#: builtin/mainmenu/tab_about.lua
+msgid ""
+"Opens the directory that contains user-provided worlds, games, mods,\n"
+"and texture packs in a file manager / explorer."
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Contributors"
+msgstr "Antics Col·laboradors"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Core Developers"
+msgstr "Antics Desenvolupadors del nucli"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr ""
@@ -810,37 +913,6 @@ msgstr "Desinstal·lar el mod seleccionat"
msgid "Use Texture Pack"
msgstr "Textures"
-#: builtin/mainmenu/tab_credits.lua
-msgid "Active Contributors"
-msgstr "Col·laboradors Actius"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Core Developers"
-msgstr "Desenvolupadors del nucli"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Credits"
-msgstr "Crèdits"
-
-#: builtin/mainmenu/tab_credits.lua
-#, fuzzy
-msgid "Open User Data Directory"
-msgstr "Selecciona el fitxer del mod:"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid ""
-"Opens the directory that contains user-provided worlds, games, mods,\n"
-"and texture packs in a file manager / explorer."
-msgstr ""
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Previous Contributors"
-msgstr "Antics Col·laboradors"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Previous Core Developers"
-msgstr "Antics Desenvolupadors del nucli"
-
#: builtin/mainmenu/tab_local.lua
msgid "Announce Server"
msgstr "Anunciar servidor"
@@ -871,7 +943,7 @@ msgstr "Servidor"
msgid "Install games from ContentDB"
msgstr ""
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Name"
msgstr ""
@@ -883,7 +955,7 @@ msgstr "Nou"
msgid "No world created or selected!"
msgstr "No s'ha creat ningun món o no s'ha seleccionat!"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Password"
msgstr "Nova contrasenya"
@@ -892,7 +964,7 @@ msgstr "Nova contrasenya"
msgid "Play Game"
msgstr "Jugar Joc"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
msgstr "Port"
@@ -915,8 +987,13 @@ msgid "Start Game"
msgstr "Ocultar Joc"
#: builtin/mainmenu/tab_online.lua
-msgid "Address / Port"
-msgstr "Adreça / Port"
+#, fuzzy
+msgid "Address"
+msgstr "Adreça BIND"
+
+#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
+msgid "Clear"
+msgstr "Netejar"
#: builtin/mainmenu/tab_online.lua
msgid "Connect"
@@ -926,35 +1003,47 @@ msgstr "Connectar"
msgid "Creative mode"
msgstr "Mode creatiu"
+#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "Damage enabled"
-msgstr "Dany activat"
+#, fuzzy
+msgid "Damage / PvP"
+msgstr "Dany"
#: builtin/mainmenu/tab_online.lua
msgid "Del. Favorite"
msgstr "Esborra preferit"
#: builtin/mainmenu/tab_online.lua
-msgid "Favorite"
+#, fuzzy
+msgid "Favorites"
msgstr "Preferit"
#: builtin/mainmenu/tab_online.lua
+msgid "Incompatible Servers"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Join Game"
msgstr "Ocultar Joc"
#: builtin/mainmenu/tab_online.lua
-msgid "Name / Password"
-msgstr "Nom / Contrasenya"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Ping"
-#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "PvP enabled"
-msgstr "PvP activat"
+#, fuzzy
+msgid "Public Servers"
+msgstr "Anunciar servidor"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Refresh"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Server Description"
+msgstr "Port del Servidor"
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -998,11 +1087,31 @@ msgstr "Configurar Controls"
msgid "Connected Glass"
msgstr "Vidres connectats"
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Dynamic shadows"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Dynamic shadows: "
+msgstr ""
+
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
msgstr "Fulles Boniques"
#: builtin/mainmenu/tab_settings.lua
+msgid "High"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Low"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Medium"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
msgstr "Mipmap"
@@ -1074,10 +1183,6 @@ msgstr "Il·luminació suau"
msgid "Texturing:"
msgstr "Texturització:"
-#: builtin/mainmenu/tab_settings.lua
-msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "Per habilitar les ombres el controlador OpenGL ha ser utilitzat."
-
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
msgstr ""
@@ -1092,6 +1197,14 @@ msgid "Trilinear Filter"
msgstr "Filtratge Trilineal"
#: builtin/mainmenu/tab_settings.lua
+msgid "Ultra High"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Very Low"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
msgstr "Moviment de les Fulles"
@@ -1104,7 +1217,7 @@ msgstr "Moviment de les Fulles"
msgid "Waving Plants"
msgstr "Moviment de Plantes"
-#: src/client/client.cpp
+#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Temps d'espera de la connexió esgotat."
@@ -1133,7 +1246,8 @@ msgid "Connection error (timed out?)"
msgstr "Error de connexió (¿temps esgotat?)"
#: src/client/clientlauncher.cpp
-msgid "Could not find or load game \""
+#, fuzzy
+msgid "Could not find or load game: "
msgstr "No es pot trobar o carregar el joc \""
#: src/client/clientlauncher.cpp
@@ -1164,18 +1278,6 @@ msgstr ""
msgid "Provided world path doesn't exist: "
msgstr "La ruta del món especificat no existeix: "
-#. ~ DO NOT TRANSLATE THIS LITERALLY!
-#. This is a special string. Put either "no" or "yes"
-#. into the translation field (literally).
-#. Choose "yes" if the language requires use of the fallback
-#. font, "no" otherwise.
-#. The fallback font is (normally) required for languages with
-#. non-Latin script, like Chinese.
-#. When in doubt, test your translation.
-#: src/client/fontengine.cpp
-msgid "needs_fallback_font"
-msgstr "no"
-
#: src/client/game.cpp
msgid ""
"\n"
@@ -1190,16 +1292,6 @@ msgid "- Address: "
msgstr "Adreça BIND"
#: src/client/game.cpp
-#, fuzzy
-msgid "- Creative Mode: "
-msgstr "Mode Creatiu"
-
-#: src/client/game.cpp
-#, fuzzy
-msgid "- Damage: "
-msgstr "Dany"
-
-#: src/client/game.cpp
msgid "- Mode: "
msgstr ""
@@ -1224,6 +1316,16 @@ msgstr ""
#: src/client/game.cpp
#, fuzzy
+msgid "A serialization error occurred:"
+msgstr "Ha ocorregut un error:"
+
+#: src/client/game.cpp
+#, c-format
+msgid "Access denied. Reason: %s"
+msgstr ""
+
+#: src/client/game.cpp
+#, fuzzy
msgid "Automatic forward disabled"
msgstr "Tecla Avançar"
@@ -1233,6 +1335,22 @@ msgid "Automatic forward enabled"
msgstr "Tecla Avançar"
#: src/client/game.cpp
+msgid "Block bounds hidden"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for all blocks"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for current block"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for nearby blocks"
+msgstr ""
+
+#: src/client/game.cpp
#, fuzzy
msgid "Camera update disabled"
msgstr "Tecla alternativa per a l'actualització de la càmera"
@@ -1243,6 +1361,10 @@ msgid "Camera update enabled"
msgstr "Tecla alternativa per a l'actualització de la càmera"
#: src/client/game.cpp
+msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Change Password"
msgstr "Canviar contrasenya"
@@ -1257,6 +1379,11 @@ msgid "Cinematic mode enabled"
msgstr "Tecla mode cinematogràfic"
#: src/client/game.cpp
+#, fuzzy
+msgid "Client disconnected"
+msgstr "Client"
+
+#: src/client/game.cpp
msgid "Client side scripting is disabled"
msgstr ""
@@ -1265,6 +1392,10 @@ msgid "Connecting to server..."
msgstr "Connectant al servidor ..."
#: src/client/game.cpp
+msgid "Connection failed for unknown reason"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Continue"
msgstr "Continuar"
@@ -1299,6 +1430,11 @@ msgstr ""
"- T: xat\n"
#: src/client/game.cpp
+#, c-format
+msgid "Couldn't resolve address: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Creating client..."
msgstr "Creant client ..."
@@ -1434,6 +1570,11 @@ msgid "Minimap currently disabled by game or mod"
msgstr ""
#: src/client/game.cpp
+#, fuzzy
+msgid "Multiplayer"
+msgstr "Un jugador"
+
+#: src/client/game.cpp
msgid "Noclip mode disabled"
msgstr ""
@@ -1511,6 +1652,21 @@ msgstr "Volum del so"
#: src/client/game.cpp
#, c-format
+msgid "The server is probably running a different version of %s."
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to connect to %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to listen on %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
msgid "Viewing range changed to %d"
msgstr ""
@@ -1581,10 +1737,6 @@ msgid "Caps Lock"
msgstr ""
#: src/client/keycode.cpp
-msgid "Clear"
-msgstr "Netejar"
-
-#: src/client/keycode.cpp
msgid "Control"
msgstr "Control"
@@ -1856,6 +2008,15 @@ msgstr ""
msgid "Minimap in texture mode"
msgstr ""
+#: src/gui/guiChatConsole.cpp
+#, fuzzy
+msgid "Failed to open webpage"
+msgstr "Error al instal·lar $1 en $2"
+
+#: src/gui/guiChatConsole.cpp
+msgid "Opening webpage"
+msgstr ""
+
#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
msgid "Passwords do not match!"
msgstr "Les contrasenyes no coincideixen!"
@@ -1880,7 +2041,7 @@ msgstr "Continuar"
#: src/gui/guiKeyChangeMenu.cpp
#, fuzzy
-msgid "\"Special\" = climb down"
+msgid "\"Aux1\" = climb down"
msgstr "\"Utilitzar\" = Descendir"
#: src/gui/guiKeyChangeMenu.cpp
@@ -1893,10 +2054,18 @@ msgid "Automatic jumping"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Aux1"
+msgstr ""
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
msgstr "Arrere"
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Block bounds"
+msgstr ""
+
+#: src/gui/guiKeyChangeMenu.cpp
#, fuzzy
msgid "Change camera"
msgstr "Configurar controls"
@@ -1991,10 +2160,6 @@ msgid "Sneak"
msgstr "Discreció"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Special"
-msgstr ""
-
-#: src/gui/guiKeyChangeMenu.cpp
#, fuzzy
msgid "Toggle HUD"
msgstr "Activar volar"
@@ -2061,7 +2226,8 @@ msgid "Muted"
msgstr "Utilitza la tecla"
#: src/gui/guiVolumeChange.cpp
-msgid "Sound Volume: "
+#, fuzzy, c-format
+msgid "Sound Volume: %d%%"
msgstr "Volum de so: "
#. ~ Imperative, as in "Enter/type in text".
@@ -2085,8 +2251,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"(Android) Use virtual joystick to trigger \"aux\" button.\n"
-"If enabled, virtual joystick will also tap \"aux\" button when out of main "
+"(Android) Use virtual joystick to trigger \"Aux1\" button.\n"
+"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
@@ -2298,6 +2464,10 @@ msgstr ""
"X11/Sols Android) Ex. per a pantalles amb 4K."
#: src/settings_translation_file.cpp
+msgid "Adjust the detected display density, used for scaling UI elements."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, c-format
msgid ""
"Adjusts the density of the floatland layer.\n"
@@ -2414,6 +2584,16 @@ msgid "Autoscaling mode"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Aux1 key"
+msgstr "Tecla botar"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Aux1 key for climbing/descending"
+msgstr "Utilitzar la tecla \"utilitzar\" per escalar/descendir"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Tecla de retrocés"
@@ -2460,10 +2640,6 @@ 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."
-
-#: src/settings_translation_file.cpp
msgid "Block send optimize distance"
msgstr ""
@@ -2568,6 +2744,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Chat command time message threshold"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chat commands"
+msgstr "Comands de xat"
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Chat font size"
msgstr "Mida del chunk"
@@ -2603,8 +2788,8 @@ msgid "Chat toggle key"
msgstr "Tecla alternativa per al xat"
#: src/settings_translation_file.cpp
-msgid "Chatcommands"
-msgstr "Comands de xat"
+msgid "Chat weblinks"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Chunk size"
@@ -2623,6 +2808,12 @@ msgid "Clean transparent textures"
msgstr "Netejar textures transparents"
#: src/settings_translation_file.cpp
+msgid ""
+"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console "
+"output."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Client"
msgstr "Client"
@@ -2669,6 +2860,11 @@ msgid "Colored fog"
msgstr "Boira de color"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Colored shadows"
+msgstr "Boira de color"
+
+#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of flags to hide in the content repository.\n"
"\"nonfree\" can be used to hide packages which do not qualify as 'free "
@@ -2703,6 +2899,22 @@ msgid "Command key"
msgstr "Tecla comandament"
#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when saving mapblocks to disk.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when sending mapblocks to the client.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Connect glass"
msgstr "Connectar vidre"
@@ -2801,7 +3013,7 @@ msgstr "Punt de mira Alpha"
#: src/settings_translation_file.cpp
msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
-"Also controls the object crosshair color"
+"This also applies to the object crosshair."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2882,11 +3094,10 @@ msgstr "Joc per defecte"
#: src/settings_translation_file.cpp
msgid ""
-"Default timeout for cURL, stated in milliseconds.\n"
-"Only has an effect if compiled with cURL."
+"Define shadow filtering quality.\n"
+"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
+"but also uses more resources."
msgstr ""
-"Temporització per defecte per a cURL, manifestat en mil·lisegons.\n"
-"Només té un efecte si és compilat amb cURL."
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
@@ -3006,6 +3217,10 @@ msgid "Disallow empty passwords"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Display Density Scaling Factor"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3051,6 +3266,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enable Poisson disk filtering.\n"
+"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF "
+"filtering."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable colored shadows.\n"
+"On true translucent nodes cast colored shadows. This is expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable console window"
msgstr ""
@@ -3159,6 +3387,12 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enables tradeoffs that reduce CPU load or increase rendering performance\n"
+"at the expense of minor visual glitches that do not impact game playability."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3197,18 +3431,6 @@ msgid "Fallback font path"
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 ""
@@ -3227,7 +3449,7 @@ msgstr "Moviment ràpid"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
-"Fast movement (via the \"special\" key).\n"
+"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
"Moviment ràpid (via utilitzar clau).\n"
@@ -3263,9 +3485,9 @@ 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."
+"which PNG optimizers usually discard, often resulting in dark or\n"
+"light edges to transparent textures. Apply a filter to clean that up\n"
+"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3358,15 +3580,15 @@ msgid "Font size"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the default font in point (pt)."
+msgid "Font size divisible by"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the fallback font in point (pt)."
+msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the monospace font in point (pt)."
+msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3377,6 +3599,17 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"For pixel-style fonts that do not scale well, this ensures that font sizes "
+"used\n"
+"with this font will always be divisible by this value, in pixels. For "
+"instance,\n"
+"a pixel font 16 pixels tall should have this set to 16, so it will only ever "
+"be\n"
+"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Format of player chat messages. The following strings are valid "
"placeholders:\n"
"@name, @message, @timestamp (optional)"
@@ -3435,10 +3668,6 @@ 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)."
@@ -3463,10 +3692,6 @@ msgid "Full screen"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Full screen BPP"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
msgstr ""
@@ -3490,7 +3715,7 @@ msgstr ""
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."
+"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3562,7 +3787,8 @@ msgid "Heat noise"
msgstr "Soroll de cova #1"
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Height component of the initial window size. Ignored in fullscreen mode."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3575,10 +3801,6 @@ msgid "Height select noise"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "High-precision FPU"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Hill steepness"
msgstr ""
@@ -3813,8 +4035,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"If disabled, \"special\" key is used to fly fast if both fly and fast mode "
-"are\n"
+"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
@@ -3836,8 +4057,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"If enabled, \"special\" key instead of \"sneak\" key is used for climbing "
-"down and\n"
+"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down "
+"and\n"
"descending."
msgstr ""
@@ -3883,6 +4104,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If the execution of a chat command takes longer than this specified time in\n"
+"seconds, add the time information to the chat command message"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If the file size of debug.txt exceeds the number of megabytes specified in\n"
"this setting when it is opened, the file is moved to debug.txt.1,\n"
"deleting an older debug.txt.1 if it exists.\n"
@@ -3929,7 +4156,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrument chatcommands on registration."
+msgid "Instrument chat commands on registration."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4014,7 +4241,7 @@ msgid "Joystick button repetition interval"
msgstr "Interval de repetició del click dret"
#: src/settings_translation_file.cpp
-msgid "Joystick deadzone"
+msgid "Joystick dead zone"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4993,10 +5220,6 @@ msgid ""
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 ""
@@ -5068,6 +5291,10 @@ msgid "Map save interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Map shadows update frames"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mapblock limit"
msgstr ""
@@ -5185,6 +5412,10 @@ msgid "Maximum FPS when the window is not focused, or when the game is paused."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum distance to render shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
msgstr ""
@@ -5290,7 +5521,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum time in ms a file download (e.g. a mod download) may take."
+msgid ""
+"Maximum time a file download (e.g. a mod download) may take, stated in "
+"milliseconds."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum time an interactive request (e.g. server list fetch) may take, "
+"stated in milliseconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5354,7 +5593,7 @@ msgid "Mod channels"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Modifies the size of the hudbar elements."
+msgid "Modifies the size of the HUD elements."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5366,6 +5605,10 @@ msgid "Monospace font size"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Monospace font size divisible by"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mountain height noise"
msgstr ""
@@ -5487,7 +5730,7 @@ 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"
+"This is a trade-off between SQLite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
@@ -5506,21 +5749,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"Open the pause menu when the window's focus is lost. Does not pause if a "
"formspec is\n"
"open."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Optional override for chat weblink color."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
-"Path of the fallback font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path of the fallback font. Must be a TrueType font.\n"
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
@@ -5543,17 +5783,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the default font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the monospace font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
@@ -5611,6 +5847,11 @@ msgid "Player versus player"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Poisson filtering"
+msgstr "Filtre bilineal"
+
+#: src/settings_translation_file.cpp
msgid ""
"Port to connect to (UDP).\n"
"Note that the port field in the main menu overrides this setting."
@@ -5655,9 +5896,9 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Prometheus listener address.\n"
-"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
+"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
"enable metrics listener for Prometheus on that address.\n"
-"Metrics can be fetch on http://127.0.0.1:30000/metrics"
+"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5970,6 +6211,32 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Set the shadow strength.\n"
+"Lower value means lighter shadows, higher value means darker shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the soft shadow radius size.\n"
+"Lower values mean sharper shadows, bigger values mean softer shadows.\n"
+"Minimum value: 1.0; maximum value: 10.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the tilt of Sun/Moon orbit in degrees.\n"
+"Value of 0 means no tilt / vertical orbit.\n"
+"Minimum value: 0.0; maximum value: 60.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true to enable Shadow Mapping.\n"
+"Requires shaders to be enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Set to true to enable waving leaves.\n"
"Requires shaders to be enabled."
msgstr ""
@@ -5987,6 +6254,13 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Sets shadow texture quality to 32 bits.\n"
+"On false, 16 bits texture will be used.\n"
+"This can cause much more artifacts in the shadow."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Shader path"
msgstr "Ombres"
@@ -6000,15 +6274,29 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Shadow filter quality"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map max distance in nodes to render shadows"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture in 32 bits"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture size"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Shadow offset (in pixels) of the default font. If 0, then shadow will not be "
"drawn."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not "
-"be drawn."
+msgid "Shadow strength"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6030,7 +6318,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Show nametag backgrounds by default"
+msgid "Show name tag backgrounds by default"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6055,6 +6343,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Sky Body Orbit Tilt"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Slice w"
msgstr ""
@@ -6113,18 +6405,13 @@ msgid "Sneaking speed, in nodes per second."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Sound"
-msgstr ""
-
-#: src/settings_translation_file.cpp
#, fuzzy
-msgid "Special key"
-msgstr "Tecla sigil"
+msgid "Soft shadow radius"
+msgstr "Radi del núvol"
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Special key for climbing/descending"
-msgstr "Utilitzar la tecla \"utilitzar\" per escalar/descendir"
+msgid "Sound"
+msgstr ""
#: src/settings_translation_file.cpp
msgid ""
@@ -6143,6 +6430,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Spread a complete update of shadow map over given amount of frames.\n"
+"Higher values might make shadows laggy, lower values\n"
+"will consume more resources.\n"
+"Minimum value: 1; maximum value: 16"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Spread of light curve boost range.\n"
"Controls the width of the range to be boosted.\n"
"Standard deviation of the light curve boost Gaussian."
@@ -6250,6 +6545,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Texture size to render the shadow map on.\n"
+"This must be a power of two.\n"
+"Bigger numbers create better shadows but it is also more expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Textures on a node may be aligned either to the node or to the world.\n"
"The former mode suits better things like machines, furniture, etc., while\n"
"the latter makes stairs and microblocks fit surroundings better.\n"
@@ -6263,7 +6565,7 @@ msgid "The URL for the content repository"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "The deadzone of the joystick"
+msgid "The dead zone of the joystick"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6321,7 +6623,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"The rendering back-end for Irrlicht.\n"
+"The rendering back-end.\n"
"A restart is required after changing this.\n"
"Note: On Android, stick with OGLES1 if unsure! App may fail to start "
"otherwise.\n"
@@ -6332,7 +6634,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"The sensitivity of the joystick axes for moving the\n"
-"ingame view frustum around."
+"in-game view frustum around."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6433,6 +6735,10 @@ msgid "Touch screen threshold"
msgstr "Llindar tàctil (px)"
#: src/settings_translation_file.cpp
+msgid "Tradeoffs for performance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6503,7 +6809,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Use mip mapping to scale textures. May slightly increase performance,\n"
+"Use mipmapping to scale textures. May slightly increase performance,\n"
"especially when using a high resolution texture pack.\n"
"Gamma correct downscaling is not supported."
msgstr ""
@@ -6617,7 +6923,7 @@ msgid "Viewing range"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Virtual joystick triggers aux button"
+msgid "Virtual joystick triggers Aux1 button"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6692,6 +6998,10 @@ msgid "Waving plants"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Weblink color"
+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"
@@ -6712,23 +7022,15 @@ msgid ""
"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.\n"
+"memory. Powers of 2 are recommended. This setting is ONLY applied if\n"
+"bilinear/trilinear/anisotropic filtering is enabled.\n"
"This is also used as the base node texture size for world-aligned\n"
"texture autoscaling."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Whether FreeType fonts are used, requires FreeType support to be compiled "
-"in.\n"
-"If disabled, bitmap and XML vectors fonts are used instead."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Whether nametag backgrounds should be shown by default.\n"
+"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
@@ -6770,7 +7072,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Width component of the initial window size."
+msgid "Width component of the initial window size. Ignored in fullscreen mode."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6859,34 +7161,24 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when saving mapblocks to disk.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when sending mapblocks to the client.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
+msgid "cURL file download timeout"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "cURL file download timeout"
+msgid "cURL interactive timeout"
msgstr ""
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
msgstr ""
-#: src/settings_translation_file.cpp
-msgid "cURL timeout"
-msgstr ""
+#, fuzzy
+#~ msgid "- Creative Mode: "
+#~ msgstr "Mode Creatiu"
+
+#, fuzzy
+#~ msgid "- Damage: "
+#~ msgstr "Dany"
#~ msgid ""
#~ "0 = parallax occlusion with slope information (faster).\n"
@@ -6895,6 +7187,9 @@ msgstr ""
#~ "0 = oclusió de la paral.laxi amb informació d'inclinació (més ràpid).\n"
#~ "1 = mapa de relleu (més lent, més precís)."
+#~ msgid "Address / Port"
+#~ msgstr "Adreça / Port"
+
#, fuzzy
#~ msgid ""
#~ "Adjust the gamma encoding for the light tables. Higher numbers are "
@@ -6911,6 +7206,10 @@ msgstr ""
#~ msgid "Back"
#~ msgstr "Enrere"
+#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
+#~ msgstr ""
+#~ "Bits per píxel (profunditat de color) en el mode de pantalla completa."
+
#~ msgid "Bump Mapping"
#~ msgstr "Mapat de relleu"
@@ -6927,9 +7226,22 @@ msgstr ""
#~ msgstr ""
#~ "Controla l'amplada dels túnels, un valor més petit crea túnels més amples."
+#~ msgid "Credits"
+#~ msgstr "Crèdits"
+
#~ msgid "Crosshair color (R,G,B)."
#~ msgstr "Color del punt de mira (R, G, B)."
+#~ msgid "Damage enabled"
+#~ msgstr "Dany activat"
+
+#~ msgid ""
+#~ "Default timeout for cURL, stated in milliseconds.\n"
+#~ "Only has an effect if compiled with cURL."
+#~ msgstr ""
+#~ "Temporització per defecte per a cURL, manifestat en mil·lisegons.\n"
+#~ "Només té un efecte si és compilat amb cURL."
+
#, fuzzy
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "Descarregant $1, si us plau esperi ..."
@@ -6941,6 +7253,10 @@ msgstr ""
#~ msgid "Generate Normal Maps"
#~ msgstr "Generar Mapes Normals"
+#, fuzzy
+#~ msgid "Install: file: \"$1\""
+#~ msgstr "Instal·lar mod: Arxiu: \"$1\""
+
#~ msgid "Main"
#~ msgstr "Principal"
@@ -6948,6 +7264,9 @@ msgstr ""
#~ msgid "Main menu style"
#~ msgstr "Menú principal"
+#~ msgid "Name / Password"
+#~ msgstr "Nom / Contrasenya"
+
#~ msgid "Name/Password"
#~ msgstr "Nom/Contrasenya"
@@ -6964,6 +7283,9 @@ msgstr ""
#~ msgid "Parallax occlusion scale"
#~ msgstr "Oclusió de paral·laxi"
+#~ msgid "PvP enabled"
+#~ msgstr "PvP activat"
+
#, fuzzy
#~ msgid "Reset singleplayer world"
#~ msgstr "Reiniciar el mon individual"
@@ -6972,11 +7294,25 @@ msgstr ""
#~ msgid "Select Package File:"
#~ msgstr "Selecciona el fitxer del mod:"
+#, fuzzy
+#~ msgid "Special key"
+#~ msgstr "Tecla sigil"
+
#~ msgid "Start Singleplayer"
#~ msgstr "Començar Un Jugador"
+#~ msgid "To enable shaders the OpenGL driver needs to be used."
+#~ msgstr "Per habilitar les ombres el controlador OpenGL ha ser utilitzat."
+
#~ msgid "Toggle Cinematic"
#~ msgstr "Activar Cinematogràfic"
#~ msgid "Yes"
#~ msgstr "Sí"
+
+#, fuzzy
+#~ msgid "You died."
+#~ msgstr "Has mort."
+
+#~ msgid "needs_fallback_font"
+#~ msgstr "no"
diff --git a/po/cs/minetest.po b/po/cs/minetest.po
index 1bb3a4336..811c39f06 100644
--- a/po/cs/minetest.po
+++ b/po/cs/minetest.po
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Czech (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-23 19:03+0100\n"
-"PO-Revision-Date: 2021-02-03 04:31+0000\n"
-"Last-Translator: Vít Skalický <vit.skalicky@email.cz>\n"
+"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"PO-Revision-Date: 2021-11-22 18:50+0000\n"
+"Last-Translator: Ondřej Pfrogner <ondrej.andre.pfrogner@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/minetest/minetest/"
"cs/>\n"
"Language: cs\n"
@@ -12,7 +12,43 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 4.5-dev\n"
+"X-Generator: Weblate 4.10-dev\n"
+
+#: builtin/client/chatcommands.lua
+msgid "Clear the out chat queue"
+msgstr "Vyprázdnit frontu odchozího chatu"
+
+#: builtin/client/chatcommands.lua
+msgid "Empty command."
+msgstr "Prázdný příkaz."
+
+#: builtin/client/chatcommands.lua
+msgid "Exit to main menu"
+msgstr "Odejít do hlavní nabídky"
+
+#: builtin/client/chatcommands.lua
+msgid "Invalid command: "
+msgstr "Neplatný příkaz: "
+
+#: builtin/client/chatcommands.lua
+msgid "Issued command: "
+msgstr "Zadaný příkaz: "
+
+#: builtin/client/chatcommands.lua
+msgid "List online players"
+msgstr "Vypsat připojené hráče"
+
+#: builtin/client/chatcommands.lua
+msgid "Online players: "
+msgstr "Připojení hráči: "
+
+#: builtin/client/chatcommands.lua
+msgid "The out chat queue is now empty."
+msgstr "Fronta odchozího chatu je nyní prázdná."
+
+#: builtin/client/chatcommands.lua
+msgid "This command is disabled by server."
+msgstr "Server zakázal tento příkaz."
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
@@ -22,9 +58,41 @@ msgstr "Oživit"
msgid "You died"
msgstr "Zemřel jsi"
+#: builtin/common/chatcommands.lua
+msgid "Available commands:"
+msgstr "Příkazy k dispozici:"
+
+#: builtin/common/chatcommands.lua
+msgid "Available commands: "
+msgstr "Příkazy k dispozici: "
+
+#: builtin/common/chatcommands.lua
+msgid "Command not available: "
+msgstr "Příkaz není k dispozici: "
+
+#: builtin/common/chatcommands.lua
+msgid "Get help for commands"
+msgstr "Získat nápovědu pro příkazy"
+
+#: builtin/common/chatcommands.lua
+msgid ""
+"Use '.help <cmd>' to get more information, or '.help all' to list everything."
+msgstr ""
+"Použij \".help <příkaz>\" pro obdržení více informací, nebo \".help all\" "
+"pro celý výpis."
+
+#: builtin/common/chatcommands.lua
+msgid "[all | <cmd>]"
+msgstr "[all | <příkaz>]"
+
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
-msgstr "OK"
+msgstr "Dobře"
+
+#: builtin/fstk/ui.lua
+#, fuzzy
+msgid "<none available>"
+msgstr "Příkaz není k dispozici: "
#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
@@ -44,7 +112,7 @@ msgstr "Znovu se připojit"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
-msgstr "Server vyžaduje znovupřipojení se:"
+msgstr "Server vyžaduje opětovné připojení:"
#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
@@ -157,7 +225,7 @@ msgstr "\"$1\" již existuje. Chcete jej přepsat?"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 and $2 dependencies will be installed."
-msgstr ""
+msgstr "Budou nainstalovány závislosti $1 a $2."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 by $2"
@@ -177,38 +245,36 @@ msgstr "$1 se stahuje..."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 required dependencies could not be found."
-msgstr ""
+msgstr "$1 požadovaných závislostí nebylo nalezeno."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 will be installed, and $2 dependencies will be skipped."
-msgstr ""
+msgstr "$1 závislostí bude nainstalováno a $2 bude vynecháno."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "All packages"
msgstr "Všechny balíčky"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "Already installed"
-msgstr "Klávesa je již používána"
+msgstr "Již nainstalováno"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Back to Main Menu"
msgstr "Zpět do hlavní nabídky"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "Base Game:"
-msgstr "Založit hru"
+msgstr "Základní hra:"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "ContentDB is not available when Minetest was compiled without cURL"
msgstr ""
+"ContentDB není přístupná pokud byl Minetest kompilován bez použití cURL"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "Downloading..."
-msgstr "Nahrávám..."
+msgstr "Stahuji..."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Failed to download $1"
@@ -224,14 +290,18 @@ msgid "Install"
msgstr "Instalovat"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "Install $1"
-msgstr "Instalovat"
+msgstr "Instalovat $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "Install missing dependencies"
-msgstr "Volitelné závislosti:"
+msgstr "Instalovat chybějící závislosti"
+
+#: builtin/mainmenu/dlg_contentstore.lua
+#, fuzzy
+msgid "Install: Unsupported file type or broken archive"
+msgstr ""
+"Instalace rozšíření: poškozený archiv nebo nepodporovaný typ souboru \"$1\""
#: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -247,25 +317,24 @@ msgid "No results"
msgstr "Žádné výsledky"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "No updates"
-msgstr "Aktualizovat"
+msgstr "Žádné aktualizace"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Not found"
-msgstr ""
+msgstr "Nenalezeno"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Overwrite"
-msgstr ""
+msgstr "Přepsat"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Please check that the base game is correct."
-msgstr ""
+msgstr "Ověř prosím, zda je základní hra v pořádku."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Queued"
-msgstr ""
+msgstr "Ve frontě"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Texture packs"
@@ -281,57 +350,51 @@ msgstr "Aktualizovat"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update All [$1]"
-msgstr ""
+msgstr "Aktualizovat vše [$1]"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "View more information in a web browser"
-msgstr ""
+msgstr "Zobrazit více informací v prohlížeči"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
-msgstr "Svět s názvem \"$1\" už existuje"
+msgstr "Svět s názvem \"$1\" již existuje"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Additional terrain"
-msgstr ""
+msgstr "Další terén"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Altitude chill"
-msgstr "Výškové ochlazení"
+msgstr "Teplota (výšková)"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Altitude dry"
-msgstr "Výškové ochlazení"
+msgstr "Vlhkost (výšková)"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Biome blending"
-msgstr "Šum biomů"
+msgstr "Prolínání biomů"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Biomes"
-msgstr "Šum biomů"
+msgstr "Biomy"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Caverns"
-msgstr "Šum jeskynních dutin"
+msgstr "Jeskyně (velké)"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Caves"
-msgstr "Oktávy"
+msgstr "Jeskyně (malé)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
msgstr "Vytvořit"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Decorations"
-msgstr "Iterace"
+msgstr "Dekorace"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a game, such as Minetest Game, from minetest.net"
@@ -342,23 +405,20 @@ msgid "Download one from minetest.net"
msgstr "Stáhněte si jednu z minetest.net"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Dungeons"
-msgstr "Šum hřbetů"
+msgstr "Žaláře"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Flat terrain"
-msgstr ""
+msgstr "Plochý terén"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Floating landmasses in the sky"
-msgstr "Koncentrace hor na létajících ostrovech"
+msgstr "Krajina vznášející se na nebi"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Floatlands (experimental)"
-msgstr "Výška létajících ostrovů"
+msgstr "Létající ostrovy (experimentální)"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Game"
@@ -366,28 +426,27 @@ msgstr "Hra"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
-msgstr ""
+msgstr "Generovat terén bez použití fraktálů: Oceány a podzemí"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Hills"
-msgstr ""
+msgstr "Kopce"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Humid rivers"
-msgstr "Ovladač grafiky"
+msgstr "Vodnost řek"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Increases humidity around rivers"
-msgstr ""
+msgstr "Zvyšuje vlhkost v okolí řek"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
-msgstr ""
+msgstr "Jezera"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Low humidity and high heat causes shallow or dry rivers"
-msgstr ""
+msgstr "Nízká vlhkost a vysoké teploty mají za následek mělké či vyschlé řeky"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen"
@@ -395,24 +454,23 @@ msgstr "Generátor mapy"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen flags"
-msgstr "Nastavení generátoru mapy"
+msgstr "Nastavení pro Generátor mapy"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Mapgen-specific flags"
-msgstr "Mapgen údolí"
+msgstr "Nastavení pro Generátor mapy"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mountains"
-msgstr ""
+msgstr "Hory"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mud flow"
-msgstr ""
+msgstr "Eroze"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Network of tunnels and caves"
-msgstr ""
+msgstr "Jeskynní systém"
#: builtin/mainmenu/dlg_create_world.lua
msgid "No game selected"
@@ -420,20 +478,19 @@ msgstr "Není vybrána žádná hra"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces heat with altitude"
-msgstr ""
+msgstr "Snižuje teplotu a nadmořskou výšku"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces humidity with altitude"
-msgstr ""
+msgstr "Snižuje vlhkost s rostoucí nadmořskou výškou"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Rivers"
-msgstr "Velikost řeky"
+msgstr "Řeky"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Sea level rivers"
-msgstr ""
+msgstr "Řeky v úrovni mořské hladiny"
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -442,51 +499,51 @@ msgstr "Seedové číslo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Smooth transition between biomes"
-msgstr ""
+msgstr "Pozvolný přechod mezi biomy"
#: builtin/mainmenu/dlg_create_world.lua
msgid ""
"Structures appearing on the terrain (no effect on trees and jungle grass "
"created by v6)"
msgstr ""
+"Povrchové struktury (nemá vliv na stromy a tropickou trávu vytvořené ve v6 a "
+"později)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Structures appearing on the terrain, typically trees and plants"
-msgstr ""
+msgstr "Povrchové struktury, především stromy a rostliny"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert"
-msgstr ""
+msgstr "Mírné, Poušť"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle"
-msgstr ""
+msgstr "Mírné, Poušť, Džungle"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle, Tundra, Taiga"
-msgstr ""
+msgstr "Mírné, Poušť, Džungle, Tundra, Tajga"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Terrain surface erosion"
-msgstr ""
+msgstr "Povrchová eroze"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Trees and jungle grass"
-msgstr ""
+msgstr "Stromy a tropická tráva"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Vary river depth"
-msgstr "Hloubka řeky"
+msgstr "Proměnná hloubka řek"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Very large caverns deep in the underground"
-msgstr ""
+msgstr "Veliké jeskyně hluboko pod zemí"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "Warning: The Development Test is meant for developers."
-msgstr "Varování: \"Minimal development test\" je zamýšlen pouze pro vývojáře."
+msgstr "Varování: Development Test je určen pro vývojáře."
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
@@ -550,7 +607,7 @@ msgstr "< Zpět do Nastavení"
msgid "Browse"
msgstr "Procházet"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Vypnuto"
@@ -575,7 +632,8 @@ msgid "Offset"
msgstr "Odstup"
#: builtin/mainmenu/dlg_settings_advanced.lua
-msgid "Persistance"
+#, fuzzy
+msgid "Persistence"
msgstr "Urputnost"
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -594,7 +652,7 @@ msgstr "Obnovit výchozí"
msgid "Scale"
msgstr "Přiblížení"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
msgstr "Hledat"
@@ -688,15 +746,6 @@ msgstr ""
"balíček $1"
#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: Unsupported file type \"$1\" or broken archive"
-msgstr ""
-"Instalace rozšíření: poškozený archiv nebo nepodporovaný typ souboru \"$1\""
-
-#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: file: \"$1\""
-msgstr "Instalace: soubor: \"$1\""
-
-#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
msgstr "Platné rozšíření nebylo nalezeno"
@@ -721,9 +770,8 @@ msgid "Loading..."
msgstr "Nahrávám..."
#: builtin/mainmenu/serverlistmgr.lua
-#, fuzzy
msgid "Public server list is disabled"
-msgstr "Uživatelské skripty nejsou povoleny"
+msgstr "Seznam veřejných serverů je vypnut"
#: builtin/mainmenu/serverlistmgr.lua
msgid "Try reenabling public serverlist and check your internet connection."
@@ -731,6 +779,42 @@ msgstr ""
"Zkuste znovu povolit seznam veřejných serverů a zkontrolujte své internetové "
"připojení."
+#: builtin/mainmenu/tab_about.lua
+msgid "About"
+msgstr "O nás"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active Contributors"
+msgstr "Aktivní přispěvatelé"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active renderer:"
+msgstr "Aktivní renderer:"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Core Developers"
+msgstr "Hlavní vývojáři"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Open User Data Directory"
+msgstr "Otevřít uživatelský adresář"
+
+#: builtin/mainmenu/tab_about.lua
+msgid ""
+"Opens the directory that contains user-provided worlds, games, mods,\n"
+"and texture packs in a file manager / explorer."
+msgstr ""
+"Ve správci souborů otevře adresář obsahující uživatelské světy, hry,\n"
+"mody a balíčky textur."
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Contributors"
+msgstr "Bývalí přispěvatelé"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Core Developers"
+msgstr "Bývalí klíčoví vývojáři"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Procházet online obsah"
@@ -771,37 +855,6 @@ msgstr "Odinstalovat balíček"
msgid "Use Texture Pack"
msgstr "Použít Rozšíření Textur"
-#: builtin/mainmenu/tab_credits.lua
-msgid "Active Contributors"
-msgstr "Aktivní přispěvatelé"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Core Developers"
-msgstr "Hlavní vývojáři"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Credits"
-msgstr "Autoři"
-
-#: builtin/mainmenu/tab_credits.lua
-#, fuzzy
-msgid "Open User Data Directory"
-msgstr "Vyberte adresář"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid ""
-"Opens the directory that contains user-provided worlds, games, mods,\n"
-"and texture packs in a file manager / explorer."
-msgstr ""
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Previous Contributors"
-msgstr "Bývalí přispěvatelé"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Previous Core Developers"
-msgstr "Bývalí klíčoví vývojáři"
-
#: builtin/mainmenu/tab_local.lua
msgid "Announce Server"
msgstr "Uveřejnit server"
@@ -828,11 +881,11 @@ msgstr "Založit server"
#: builtin/mainmenu/tab_local.lua
msgid "Install games from ContentDB"
-msgstr ""
+msgstr "Instalovat hry z ContentDB"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Name"
-msgstr ""
+msgstr "Jméno"
#: builtin/mainmenu/tab_local.lua
msgid "New"
@@ -842,23 +895,21 @@ msgstr "Nový"
msgid "No world created or selected!"
msgstr "Žádný svět nebyl vytvořen ani vybrán!"
-#: builtin/mainmenu/tab_local.lua
-#, fuzzy
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Password"
-msgstr "Nové heslo"
+msgstr "Heslo"
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Spustit hru"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
msgstr "Port"
#: builtin/mainmenu/tab_local.lua
-#, fuzzy
msgid "Select Mods"
-msgstr "Vyberte svět:"
+msgstr "Vybrat mody"
#: builtin/mainmenu/tab_local.lua
msgid "Select World:"
@@ -873,8 +924,12 @@ msgid "Start Game"
msgstr "Spustit hru"
#: builtin/mainmenu/tab_online.lua
-msgid "Address / Port"
-msgstr "Adresa / Port"
+msgid "Address"
+msgstr "Adresa"
+
+#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
+msgid "Clear"
+msgstr "Vyčistit"
#: builtin/mainmenu/tab_online.lua
msgid "Connect"
@@ -884,34 +939,42 @@ msgstr "Připojit"
msgid "Creative mode"
msgstr "Kreativní mód"
+#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "Damage enabled"
-msgstr "Zranění povoleno"
+msgid "Damage / PvP"
+msgstr "Zranění / PvP"
#: builtin/mainmenu/tab_online.lua
msgid "Del. Favorite"
msgstr "Smazat oblíbené"
#: builtin/mainmenu/tab_online.lua
-msgid "Favorite"
+msgid "Favorites"
msgstr "Oblíbené"
#: builtin/mainmenu/tab_online.lua
-msgid "Join Game"
-msgstr "Připojit se ke hře"
+msgid "Incompatible Servers"
+msgstr "Nekompatibilní server"
#: builtin/mainmenu/tab_online.lua
-msgid "Name / Password"
-msgstr "Jméno / Heslo"
+msgid "Join Game"
+msgstr "Připojit se ke hře"
#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Ping"
-#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "PvP enabled"
-msgstr "PvP (hráč proti hráči) povoleno"
+msgid "Public Servers"
+msgstr "Veřejné servery"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Refresh"
+msgstr "Obnovit"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Server Description"
+msgstr "Popis serveru"
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -953,13 +1016,33 @@ msgstr "Změnit klávesy"
msgid "Connected Glass"
msgstr "Propojené sklo"
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Dynamic shadows"
+msgstr "Dynamické stíny"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Dynamic shadows: "
+msgstr "Dynamické stíny: "
+
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
msgstr "Vícevrstevné listí"
#: builtin/mainmenu/tab_settings.lua
+msgid "High"
+msgstr "Vysoké"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Low"
+msgstr "Nízké"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Medium"
+msgstr "Střední"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
-msgstr "Mipmapy zapnuté"
+msgstr "Mipmapy"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap + Aniso. Filter"
@@ -1010,9 +1093,8 @@ msgid "Shaders"
msgstr "Shadery"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Shaders (experimental)"
-msgstr "Výška létajících ostrovů"
+msgstr "Shader (experimentální)"
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (unavailable)"
@@ -1030,10 +1112,6 @@ msgstr "Plynulé osvětlení"
msgid "Texturing:"
msgstr "Texturování:"
-#: builtin/mainmenu/tab_settings.lua
-msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "Pro zapnutí shaderů musíte používat OpenGL ovladač."
-
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
msgstr "Tone mapping"
@@ -1047,6 +1125,14 @@ msgid "Trilinear Filter"
msgstr "Trilineární filtr"
#: builtin/mainmenu/tab_settings.lua
+msgid "Ultra High"
+msgstr "Velmi vysoké"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Very Low"
+msgstr "Vylmi nízké"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
msgstr "Vlnění listů"
@@ -1058,7 +1144,7 @@ msgstr "Vlnění Kapalin"
msgid "Waving Plants"
msgstr "Vlnění rostlin"
-#: src/client/client.cpp
+#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Vypršel časový limit připojení."
@@ -1087,7 +1173,8 @@ msgid "Connection error (timed out?)"
msgstr "Chyba spojení (vypršel čas?)"
#: src/client/clientlauncher.cpp
-msgid "Could not find or load game \""
+#, fuzzy
+msgid "Could not find or load game: "
msgstr "Hru nebylo možné nahrát nebo najít \""
#: src/client/clientlauncher.cpp
@@ -1119,18 +1206,6 @@ msgstr "Soubor s heslem nebylo možné otevřít: "
msgid "Provided world path doesn't exist: "
msgstr "Uvedená cesta ke světu neexistuje: "
-#. ~ DO NOT TRANSLATE THIS LITERALLY!
-#. This is a special string. Put either "no" or "yes"
-#. into the translation field (literally).
-#. Choose "yes" if the language requires use of the fallback
-#. font, "no" otherwise.
-#. The fallback font is (normally) required for languages with
-#. non-Latin script, like Chinese.
-#. When in doubt, test your translation.
-#: src/client/fontengine.cpp
-msgid "needs_fallback_font"
-msgstr "no"
-
#: src/client/game.cpp
msgid ""
"\n"
@@ -1144,14 +1219,6 @@ msgid "- Address: "
msgstr "- Adresa: "
#: src/client/game.cpp
-msgid "- Creative Mode: "
-msgstr "- Kreativní mód: "
-
-#: src/client/game.cpp
-msgid "- Damage: "
-msgstr "- Zranění: "
-
-#: src/client/game.cpp
msgid "- Mode: "
msgstr "- Mód: "
@@ -1173,6 +1240,16 @@ msgid "- Server Name: "
msgstr "- Název serveru: "
#: src/client/game.cpp
+#, fuzzy
+msgid "A serialization error occurred:"
+msgstr "Nastala chyba:"
+
+#: src/client/game.cpp
+#, c-format
+msgid "Access denied. Reason: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Automatic forward disabled"
msgstr "Automatický posun vpřed zakázán"
@@ -1181,6 +1258,23 @@ msgid "Automatic forward enabled"
msgstr "Automatický posun vpřed povolen"
#: src/client/game.cpp
+#, fuzzy
+msgid "Block bounds hidden"
+msgstr "Ohraničení bloku"
+
+#: src/client/game.cpp
+msgid "Block bounds shown for all blocks"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for current block"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for nearby blocks"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Camera update disabled"
msgstr "Aktualizace kamery (pohledu) zakázána"
@@ -1189,6 +1283,10 @@ msgid "Camera update enabled"
msgstr "Aktualizace kamery (pohledu) povolena"
#: src/client/game.cpp
+msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Change Password"
msgstr "Změnit heslo"
@@ -1201,6 +1299,11 @@ msgid "Cinematic mode enabled"
msgstr "Filmový režim povolen"
#: src/client/game.cpp
+#, fuzzy
+msgid "Client disconnected"
+msgstr "Lokální mody"
+
+#: src/client/game.cpp
msgid "Client side scripting is disabled"
msgstr "Uživatelské skripty nejsou povoleny"
@@ -1209,11 +1312,15 @@ msgid "Connecting to server..."
msgstr "Připojuji se k serveru..."
#: src/client/game.cpp
+msgid "Connection failed for unknown reason"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Continue"
msgstr "Pokračovat"
#: src/client/game.cpp
-#, fuzzy, c-format
+#, c-format
msgid ""
"Controls:\n"
"- %s: move forwards\n"
@@ -1236,16 +1343,21 @@ msgstr ""
"- %s: pohyb doleva\n"
"- %s: pohyb doprava\n"
"- %s: skok/výstup\n"
+"- %s: těžit/uhodit\n"
+"- %s: umístit/použít\n"
"- %s: plížení/sestup\n"
-"- %s: zahození věci\n"
+"- %s: zahození předmětu\n"
"- %s: inventář\n"
"- Myš: otáčení/rozhlížení\n"
-"- Levé tl. myši: těžit/uhodit\n"
-"- Pravé tl. myši: položit/použít\n"
-"- Kolečko myši: výběr přihrádky\n"
+"- Kolečko myši: výběr předmětu\n"
"- %s: chat\n"
#: src/client/game.cpp
+#, c-format
+msgid "Couldn't resolve address: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Creating client..."
msgstr "Vytvářím klienta..."
@@ -1374,6 +1486,10 @@ msgid "Minimap currently disabled by game or mod"
msgstr "Minimapa je aktuálně zakázána"
#: src/client/game.cpp
+msgid "Multiplayer"
+msgstr "Multiplayer"
+
+#: src/client/game.cpp
msgid "Noclip mode disabled"
msgstr "Režim bez ořezu zakázán"
@@ -1423,7 +1539,7 @@ msgstr "Vypínání..."
#: src/client/game.cpp
msgid "Singleplayer"
-msgstr "Místní hra"
+msgstr "Singleplayer"
#: src/client/game.cpp
msgid "Sound Volume"
@@ -1435,11 +1551,11 @@ msgstr "Zvuk vypnut"
#: src/client/game.cpp
msgid "Sound system is disabled"
-msgstr ""
+msgstr "Zvukový systém je vypnutý"
#: src/client/game.cpp
msgid "Sound system is not supported on this build"
-msgstr ""
+msgstr "Zvukový systém není v této verzi podporovaný"
#: src/client/game.cpp
msgid "Sound unmuted"
@@ -1447,6 +1563,21 @@ msgstr "Zvuk zapnut"
#: src/client/game.cpp
#, c-format
+msgid "The server is probably running a different version of %s."
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to connect to %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to listen on %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
msgid "Viewing range changed to %d"
msgstr "Omezení dohlédnutí upraveno na %d"
@@ -1515,10 +1646,6 @@ msgid "Caps Lock"
msgstr "Caps Lock"
#: src/client/keycode.cpp
-msgid "Clear"
-msgstr "Vyčistit"
-
-#: src/client/keycode.cpp
msgid "Control"
msgstr "Control"
@@ -1770,19 +1897,27 @@ msgid "Minimap hidden"
msgstr "Minimapa je skryta"
#: src/client/minimap.cpp
-#, fuzzy, c-format
+#, c-format
msgid "Minimap in radar mode, Zoom x%d"
-msgstr "Minimapa v režimu radar, Přiblížení x1"
+msgstr "Minimapa v režimu Radar, Přiblížení x%d"
#: src/client/minimap.cpp
-#, fuzzy, c-format
+#, c-format
msgid "Minimap in surface mode, Zoom x%d"
-msgstr "Minimapa v režimu povrch, Přiblížení x1"
+msgstr "Minimapa v režimu Povrch, Přiblížení x%d"
#: src/client/minimap.cpp
-#, fuzzy
msgid "Minimap in texture mode"
-msgstr "Minimální velikost textury k filtrování"
+msgstr "Minimapa v režimu Textura"
+
+#: src/gui/guiChatConsole.cpp
+#, fuzzy
+msgid "Failed to open webpage"
+msgstr "Selhalo stažení $1"
+
+#: src/gui/guiChatConsole.cpp
+msgid "Opening webpage"
+msgstr ""
#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
msgid "Passwords do not match!"
@@ -1812,8 +1947,8 @@ msgid "Proceed"
msgstr "Pokračovat"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "\"Special\" = climb down"
-msgstr "„Speciální“ = sestoupit dolů"
+msgid "\"Aux1\" = climb down"
+msgstr "\"Aux1\" = sestoupit"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Autoforward"
@@ -1824,10 +1959,18 @@ msgid "Automatic jumping"
msgstr "Automaticky skákat"
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Aux1"
+msgstr "Aux1"
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
msgstr "Vzad"
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Block bounds"
+msgstr "Ohraničení bloku"
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Change camera"
msgstr "Změnit nastavení kamery"
@@ -1918,10 +2061,6 @@ msgid "Sneak"
msgstr "Plížit se"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Special"
-msgstr "Speciální"
-
-#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle HUD"
msgstr "Zapnout/Vypnout ovládací prvky"
@@ -1982,7 +2121,8 @@ msgid "Muted"
msgstr "Ztlumeno"
#: src/gui/guiVolumeChange.cpp
-msgid "Sound Volume: "
+#, fuzzy, c-format
+msgid "Sound Volume: %d%%"
msgstr "Hlasitost: "
#. ~ Imperative, as in "Enter/type in text".
@@ -2008,12 +2148,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"(Android) Use virtual joystick to trigger \"aux\" button.\n"
-"If enabled, virtual joystick will also tap \"aux\" button when out of main "
+"(Android) Use virtual joystick to trigger \"Aux1\" button.\n"
+"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
-"(Android) Použít virtuální joystick pro stisknutí tlačítka 'aux'.\n"
-"Pokud je povoleno, virtuální joystick automaticky stiskne tlačítko 'aux' "
+"(Android) Použít virtuální joystick pro stisk tlačítka \"Aux1\".\n"
+"Pokud je povoleno, virtuální joystick automaticky stiskne tlačítko \"Aux1\" "
"pokud je mimo hlavní kruh."
#: src/settings_translation_file.cpp
@@ -2091,9 +2231,8 @@ msgid "3D mode"
msgstr "Režim 3D zobrazení"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "3D mode parallax strength"
-msgstr "Síla parallax occlusion"
+msgstr "Intezita Parallax ve 3D modu"
#: src/settings_translation_file.cpp
msgid "3D noise defining giant caverns."
@@ -2114,6 +2253,11 @@ msgid ""
"to be adjusted, as floatland tapering functions best when this noise has\n"
"a value range of approximately -2.0 to 2.0."
msgstr ""
+"3D šum definující strukturu létajících ostrovů.\n"
+"Pokud je odlišný od výchozího, může být nutné upravit\n"
+"\"měřítko\" šumu (výchozí 0.7), jelikož zužování (obrácené hory)\n"
+"létajících ostrovů funguje nejlépe pokud je šum v rozmezí přibližně -2.0 až "
+"2.0."
#: src/settings_translation_file.cpp
msgid "3D noise defining structure of river canyon walls."
@@ -2129,7 +2273,7 @@ msgstr "3D šum definující horské převisy, atp. Typicky malé odchylky."
#: src/settings_translation_file.cpp
msgid "3D noise that determines number of dungeons per mapchunk."
-msgstr "3D šum, který definuje počet žalářů na kusu mapy."
+msgstr "3D šum definující počet žalářů na kusu mapy."
#: src/settings_translation_file.cpp
msgid ""
@@ -2178,12 +2322,11 @@ msgstr "Interval Aktivní Blokové Modifikace (ABM)"
#: src/settings_translation_file.cpp
msgid "ABM time budget"
-msgstr ""
+msgstr "ABM použitelný čas"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Absolute limit of queued blocks to emerge"
-msgstr "Maximální počet emerge front"
+msgstr "Maximální počet připravených bloků ve frontě"
#: src/settings_translation_file.cpp
msgid "Acceleration in air"
@@ -2232,6 +2375,10 @@ msgstr ""
"například s 4k obrazovkami."
#: src/settings_translation_file.cpp
+msgid "Adjust the detected display density, used for scaling UI elements."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, c-format
msgid ""
"Adjusts the density of the floatland layer.\n"
@@ -2240,6 +2387,11 @@ msgid ""
"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n"
"to be sure) creates a solid floatland layer."
msgstr ""
+"Upravit hustotu roviny létajících ostrovů.\n"
+"Zvýšením hodnoty se zvýší hustota. Hodnota může být kladná i záporná.\n"
+"Hodnota = 0.0: 50% světa tvoří létajících ostrovy.\n"
+"Hodnota = 2.0 (může být i vyšší v závislosti na “mgv7_np_floatland“,\n"
+"nutno vždy otestovat) vytvoří souvislou vrstvu létajících ostrovů."
#: src/settings_translation_file.cpp
msgid "Advanced"
@@ -2253,6 +2405,11 @@ msgid ""
"This only has significant effect on daylight and artificial\n"
"light, it has very little effect on natural night light."
msgstr ""
+"Změní křivku světla použitím \"gamma korekce\".\n"
+"Vysoké hodnoty zesvětlí málo a středně osvětlené prostory.\n"
+"Hodnota \"1.0\" nastaví výchozí křivku.\n"
+"Tato úprava slouží především pro úpravu denního\n"
+"a umělého osvětlení a má pouze malý dopad na noční osvětlení."
#: src/settings_translation_file.cpp
msgid "Always fly and fast"
@@ -2279,9 +2436,8 @@ msgid "Announce server"
msgstr "Zveřejnit server"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Announce to this serverlist."
-msgstr "Zveřejnit server"
+msgstr "Oznámit tomuto seznamu serverů."
#: src/settings_translation_file.cpp
msgid "Append item name"
@@ -2312,7 +2468,6 @@ msgid "Ask to reconnect after crash"
msgstr "Zeptat se na znovupřipojení po havárii"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"At this distance the server will aggressively optimize which blocks are sent "
"to\n"
@@ -2326,29 +2481,26 @@ msgid ""
"optimization.\n"
"Stated in mapblocks (16 nodes)."
msgstr ""
-"V této vzdálenosti bude server agresivně optimalizovat, které bloky pošle "
-"klientům.\n"
-"Malé hodnoty mohou mírně zvýšit rychlost, mohou však také způsobit viditelné "
-"nedostatky ve vykreslování.\n"
-"(některé bloky, zvláště pod vodou, v jeskyních a občas i na zemi, nebudou "
-"vykresleny)\n"
-"Nastavení této hodnoty na více než max_block_send_distance zakáže "
-"optimalizaci.\n"
-"Jednotkou je mapblok (16 bloků)"
+"V této vzdálenosti bude server razantně optimalizovat výběr bloků,\n"
+"které pošle klientům.\n"
+"Malé hodnoty mohou zlepšit výkon, však mohou také způsobit chyby\n"
+"ve vykreslování (některé bloky, zvláště pod vodou, v jeskyních\n"
+"a někdy i na zemi, nebudou vykresleny).\n"
+"Nastavení této hodnoty vyšší než max_block_send_distance zakáže vypne\n"
+"tuto optimalizaci.\n"
+"Jednotkou je mapblok (16 bloků)."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Automatic forward key"
-msgstr "Vpřed"
+msgstr "Automaticky vpřed klávesa"
#: src/settings_translation_file.cpp
msgid "Automatically jump up single-node obstacles."
msgstr "Automaticky vyskočit na překážky vysoké 1 blok."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Automatically report to the serverlist."
-msgstr "Automaticky hlásit seznamu serverů."
+msgstr "Automaticky nahlásit do seznamu serverů."
#: src/settings_translation_file.cpp
msgid "Autosave screen size"
@@ -2359,25 +2511,30 @@ msgid "Autoscaling mode"
msgstr "Režim automatického přiblížení"
#: src/settings_translation_file.cpp
+msgid "Aux1 key"
+msgstr "Aux1 klávesa"
+
+#: src/settings_translation_file.cpp
+msgid "Aux1 key for climbing/descending"
+msgstr "Aux1 klávesa pro výstup/sestup"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Vzad"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Base ground level"
-msgstr "Výška povrchu země"
+msgstr "Základní úroveň povrchu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Base terrain height."
-msgstr "Základní výška terénu"
+msgstr "Základní výška terénu."
#: src/settings_translation_file.cpp
msgid "Basic"
msgstr "Základní"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Basic privileges"
msgstr "Základní práva"
@@ -2406,32 +2563,24 @@ msgid "Biome noise"
msgstr "Šum biomů"
#: 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."
-
-#: src/settings_translation_file.cpp
msgid "Block send optimize distance"
msgstr "Optimalizace vzdálenosti vysílání bloku"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Bold and italic font path"
-msgstr "Cesta k neproporcionálnímu písmu"
+msgstr "Cesta k tučnému písmu s kurzívou"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Bold and italic monospace font path"
-msgstr "Cesta k neproporcionálnímu písmu"
+msgstr "Cesta k tučnému proporcionálnímu písmu s kurzívou"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Bold font path"
-msgstr "Cesta k písmu"
+msgstr "Cesta k tučnému písmu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Bold monospace font path"
-msgstr "Cesta k neproporcionálnímu písmu"
+msgstr "Cesta k proporcionálnímu písmu"
#: src/settings_translation_file.cpp
msgid "Build inside player"
@@ -2463,7 +2612,7 @@ msgstr "Klávesa pro přepínání aktualizace pohledu"
#: src/settings_translation_file.cpp
msgid "Cave noise"
-msgstr "Šum jeskyní"
+msgstr "Šum v jeskynních"
#: src/settings_translation_file.cpp
msgid "Cave noise #1"
@@ -2475,7 +2624,7 @@ msgstr "Šum v jeskynních 2"
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr "Šířka jeskyně"
+msgstr "Šířka jeskyní"
#: src/settings_translation_file.cpp
msgid "Cave1 noise"
@@ -2502,43 +2651,49 @@ msgid "Cavern threshold"
msgstr "Práh jeskynních dutin"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Cavern upper limit"
-msgstr "Limit jeskynních dutin"
+msgstr "Horní hranice jeskynních dutin"
#: src/settings_translation_file.cpp
msgid ""
"Center of light curve boost range.\n"
"Where 0.0 is minimum light level, 1.0 is maximum light level."
msgstr ""
+"Střed posílené křivky světla.\n"
+"0.0 odpovídá nejnižší úrovni, 1.0 odpovídá nejvyšší úrovni světla."
+
+#: src/settings_translation_file.cpp
+msgid "Chat command time message threshold"
+msgstr "Doba do zobrazení času pro příkaz v chatu"
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Chat commands"
+msgstr "Příkazy"
+
+#: src/settings_translation_file.cpp
msgid "Chat font size"
-msgstr "Velikost písma"
+msgstr "Velikost písma v chatu"
#: src/settings_translation_file.cpp
msgid "Chat key"
msgstr "Klávesa chatu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Chat log level"
-msgstr "Úroveň minimální důležitosti ladících informací"
+msgstr "Úroveň důležitosti ladících informací"
#: src/settings_translation_file.cpp
msgid "Chat message count limit"
msgstr "Omezení počtu zpráv v Chatu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Chat message format"
-msgstr "Zpráva o havárii"
+msgstr "Formát zpráv v chatu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Chat message kick threshold"
-msgstr "Práh pouštního šumu"
+msgstr "Doba do vyhození zprávy z chatu"
#: src/settings_translation_file.cpp
msgid "Chat message max length"
@@ -2549,8 +2704,9 @@ msgid "Chat toggle key"
msgstr "Klávesa zobrazení chatu"
#: src/settings_translation_file.cpp
-msgid "Chatcommands"
-msgstr "Příkazy"
+#, fuzzy
+msgid "Chat weblinks"
+msgstr "Chat zobrazen"
#: src/settings_translation_file.cpp
msgid "Chunk size"
@@ -2569,6 +2725,12 @@ msgid "Clean transparent textures"
msgstr "Vynulovat průhledné textury"
#: src/settings_translation_file.cpp
+msgid ""
+"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console "
+"output."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Client"
msgstr "Klient"
@@ -2581,9 +2743,8 @@ msgid "Client modding"
msgstr "Lokální mody"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Client side modding restrictions"
-msgstr "Lokální mody"
+msgstr "Omezení modování na straně klienta"
#: src/settings_translation_file.cpp
msgid "Client side node lookup range restriction"
@@ -2614,6 +2775,10 @@ msgid "Colored fog"
msgstr "Barevná mlha"
#: src/settings_translation_file.cpp
+msgid "Colored shadows"
+msgstr "Zbarvené stíny"
+
+#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of flags to hide in the content repository.\n"
"\"nonfree\" can be used to hide packages which do not qualify as 'free "
@@ -2623,6 +2788,13 @@ msgid ""
"These flags are independent from Minetest versions,\n"
"so see a full list at https://content.minetest.net/help/content_flags/"
msgstr ""
+"Seznam nastavení ve formátu CSV sloužící k filtrování obsahu repozitáře.\n"
+"\"nesvobodné\" slouží pro skrytí balíčků, které se podle definice Free "
+"Software Foundation\n"
+"neřadí do \"svobodného softwaru\".\n"
+"Můžete také zadat hodnocení obsahu.\n"
+"Tato nastavení jsou nezávislá na versi Minetestu,\n"
+"kompletní seznam na: https://content.minetest.net/help/content_flags/"
#: src/settings_translation_file.cpp
msgid ""
@@ -2646,6 +2818,22 @@ msgid "Command key"
msgstr "CMD ⌘"
#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when saving mapblocks to disk.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when sending mapblocks to the client.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Connect glass"
msgstr "Propojené sklo"
@@ -2671,16 +2859,15 @@ msgstr "Šírka konzole"
#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
-msgstr ""
+msgstr "ContentDB: Černá listina"
#: src/settings_translation_file.cpp
msgid "ContentDB Max Concurrent Downloads"
-msgstr ""
+msgstr "ContentDB Max. souběžných stahování"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "ContentDB URL"
-msgstr "Pokračovat"
+msgstr "ContentDB-URL"
#: src/settings_translation_file.cpp
msgid "Continuous forward"
@@ -2691,25 +2878,26 @@ msgid ""
"Continuous forward movement, toggled by autoforward key.\n"
"Press the autoforward key again or the backwards movement to disable."
msgstr ""
+"Nepřetržitý pohyb vpřed zapnutý klávesou Automaticky vpřed.\n"
+"Stisk klávesy Automaticky vpřed nebo Dozadu, pohyb zruší."
#: src/settings_translation_file.cpp
msgid "Controls"
msgstr "Ovládání"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Controls length of day/night cycle.\n"
"Examples:\n"
"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged."
msgstr ""
"Ovládání délky denního cyklu.\n"
-"Příklad: 72 = 20 minut, 360 = 4 minutý, 1 = 24 hodin, 0 = zůstává pouze noc "
-"nebo den."
+"Příklad:\n"
+"72 = 20 minut, 360 = 4 minuty, 1 = 24 hodin, 0 = zůstává pouze noc nebo den."
#: src/settings_translation_file.cpp
msgid "Controls sinking speed in liquid."
-msgstr "Ovládá rychlost potápění v kapalinách."
+msgstr "Stanovuje rychlost potápění v kapalinách."
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -2725,6 +2913,9 @@ msgid ""
"Value >= 10.0 completely disables generation of tunnels and avoids the\n"
"intensive noise calculations."
msgstr ""
+"Stanovuje šířku tunelů. Nižší hodnota vytváří širší tunely.\n"
+"Hodnota >= 10.0 úplně vypne generování tunelů, čímž se zruší\n"
+"náročné výpočty šumu."
#: src/settings_translation_file.cpp
msgid "Crash message"
@@ -2742,8 +2933,10 @@ msgstr "Průhlednost zaměřovače"
#, fuzzy
msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
-"Also controls the object crosshair color"
-msgstr "Průhlednost zaměřovače (mezi 0 a 255)."
+"This also applies to the object crosshair."
+msgstr ""
+"Průhlednost zaměřovače (0 až 255).\n"
+"Také určuje barvu zaměřovače"
#: src/settings_translation_file.cpp
msgid "Crosshair color"
@@ -2754,6 +2947,8 @@ msgid ""
"Crosshair color (R,G,B).\n"
"Also controls the object crosshair color"
msgstr ""
+"Barva zaměřovače (R,G,B).\n"
+"Také určuje barvu zaměřovače"
#: src/settings_translation_file.cpp
msgid "DPI"
@@ -2768,9 +2963,8 @@ msgid "Debug info toggle key"
msgstr "Klávesa pro zobrazení ladících informací"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Debug log file size threshold"
-msgstr "Práh pouštního šumu"
+msgstr "Práh velikosti souboru s ladícími informacemi"
#: src/settings_translation_file.cpp
msgid "Debug log level"
@@ -2782,7 +2976,7 @@ msgstr "Klávesa snížení hlasitosti"
#: src/settings_translation_file.cpp
msgid "Decrease this to increase liquid resistance to movement."
-msgstr ""
+msgstr "Snižte toto pro zvýšení odporu kapalin vůči pohybu."
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -2817,17 +3011,19 @@ msgid "Default report format"
msgstr "Výchozí formát reportů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Default stack size"
-msgstr "Výchozí hra"
+msgstr "Výchozí velikost hromádky"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Default timeout for cURL, stated in milliseconds.\n"
-"Only has an effect if compiled with cURL."
+"Define shadow filtering quality.\n"
+"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
+"but also uses more resources."
msgstr ""
-"Výchozí časový limit požadavku pro cURL, v milisekundách.\n"
-"Má vliv, pouze pokud byl program sestaven s cURL."
+"Určit kvalitu filtrování stínů\n"
+"Simuluje efekt měkkých stínů použitím PCF nebo Poissonova disku,\n"
+"za využívá většího výkonu."
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
@@ -2838,14 +3034,12 @@ msgid "Defines areas with sandy beaches."
msgstr "Určuje oblasti s písčitými plážemi."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Defines distribution of higher terrain and steepness of cliffs."
-msgstr "Určuje oblasti vyššího terénu (cliff-top) a ovlivňuje strmost útesů."
+msgstr "Určuje rozmístění vyššího terénu a strmých útesů."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Defines distribution of higher terrain."
-msgstr "Určuje oblasti spadající pod 'terrain_higher' (cliff-top terén)."
+msgstr "Určuje rozmístění vyššího terénu."
#: src/settings_translation_file.cpp
msgid "Defines full size of caverns, smaller values create larger caverns."
@@ -2862,28 +3056,24 @@ msgid "Defines location and terrain of optional hills and lakes."
msgstr "Určuje pozici a terén možných hor a jezer."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Defines the base ground level."
-msgstr "Určuje lesní oblasti a hustotu stromového porostu."
+msgstr "Určuje základní úroveň povrchu."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Defines the depth of the river channel."
-msgstr "Určuje lesní oblasti a hustotu stromového porostu."
+msgstr "Určuje hloubku říčního koryta."
#: src/settings_translation_file.cpp
msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr "Určuje maximální posun hráče v blocích (0 = neomezený)."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Defines the width of the river channel."
-msgstr "Určuje makroskopickou strukturu koryta řeky."
+msgstr "Určuje šířku říčního koryta."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Defines the width of the river valley."
-msgstr "Určuje oblasti, kde stromy nesou plody."
+msgstr "Určuje šířku údolí řeky."
#: src/settings_translation_file.cpp
msgid "Defines tree areas and tree density."
@@ -2911,13 +3101,12 @@ msgid "Deprecated Lua API handling"
msgstr "Zacházení se zastaralým Lua API"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Depth below which you'll find giant caverns."
-msgstr "Hloubka pod kterou najdete velké jeskyně."
+msgstr "Hloubka, pod kterou se nachází velké jeskynní dutiny."
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find large caves."
-msgstr "Hloubka pod kterou najdete velké jeskyně."
+msgstr "Hloubka, pod kterou se nachází velké jeskyně."
#: src/settings_translation_file.cpp
msgid ""
@@ -2932,22 +3121,20 @@ msgid "Desert noise threshold"
msgstr "Práh pouštního šumu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Deserts occur when np_biome exceeds this value.\n"
"When the 'snowbiomes' flag is enabled, this is ignored."
msgstr ""
"Pouště se objeví v místech, kde 'np_biome' přesahuje tuto hodnotu.\n"
-"Pokud je zapnutý nový systém biomů, toto nastavení nemá vliv."
+"Ignorováno, pokud je zapnuté nastavení \"snowbiomes\"."
#: src/settings_translation_file.cpp
msgid "Desynchronize block animation"
msgstr "Nesynchronizovat animace bloků"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Dig key"
-msgstr "Klávesa doprava"
+msgstr "Klávesa těžení"
#: src/settings_translation_file.cpp
msgid "Digging particles"
@@ -2962,6 +3149,10 @@ msgid "Disallow empty passwords"
msgstr "Zakázat prázdná hesla"
#: src/settings_translation_file.cpp
+msgid "Display Density Scaling Factor"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Doménové jméno serveru zobrazované na seznamu serverů."
@@ -2978,28 +3169,28 @@ msgid "Drop item key"
msgstr "Klávesa vyhození předmětu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Dump the mapgen debug information."
-msgstr "Vypsat ladící informace mapgenu."
+msgstr "Vypsat ladící informace z Generátoru mapy."
#: src/settings_translation_file.cpp
msgid "Dungeon maximum Y"
-msgstr ""
+msgstr "Horní hranice Y pro žaláře"
#: src/settings_translation_file.cpp
msgid "Dungeon minimum Y"
-msgstr ""
+msgstr "Dolní hranice Y pro žaláře"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Dungeon noise"
-msgstr "Šum hřbetů"
+msgstr "Šum žalářů"
#: src/settings_translation_file.cpp
msgid ""
"Enable IPv6 support (for both client and server).\n"
"Required for IPv6 connections to work at all."
msgstr ""
+"Zapnout podporu IPv6 (pro klienta i server).\n"
+"Požadováno pro IPv6 připojení."
#: src/settings_translation_file.cpp
msgid ""
@@ -3010,23 +3201,41 @@ msgstr ""
"Tato funkce je experimentální a její API se může změnit."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Enable Poisson disk filtering.\n"
+"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF "
+"filtering."
+msgstr ""
+"Zapnout filtrování Poissoným diskem.\n"
+"Pokud je zapnuto, využívá Poissonův disk pro generování \"měkkých stínů\". V "
+"opačném případě je využito filtrování PCF."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Enable colored shadows.\n"
+"On true translucent nodes cast colored shadows. This is expensive."
+msgstr ""
+"Zanout zbarvené stíny.\n"
+"Po zapnutí vrhají průhledné předměty zbarvené stíny. Toto má velký vliv na "
+"výkon."
+
+#: src/settings_translation_file.cpp
msgid "Enable console window"
msgstr "Povolit konzolové okno"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Enable creative mode for all players"
-msgstr "Zapnout kreativní mód pro nové mapy."
+msgstr "Zapnout kreativní mód pro všechny hráče"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Enable joysticks"
msgstr "Zapnout joysticky"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Enable mod channels support."
-msgstr "Zapnout zabezpečení módů"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Enable mod security"
@@ -3042,13 +3251,15 @@ msgstr "Povolit náhodný uživatelský vstup (pouze pro testování)."
#: src/settings_translation_file.cpp
msgid "Enable register confirmation"
-msgstr ""
+msgstr "Zapnout potvrzení registrace"
#: src/settings_translation_file.cpp
msgid ""
"Enable register confirmation when connecting to server.\n"
"If disabled, new account will be registered automatically."
msgstr ""
+"Zapnout potvrzení registrace pro připojení na server.\n"
+"Pokud je toto vypnuto, je nový účet registrován automaticky."
#: src/settings_translation_file.cpp
msgid ""
@@ -3087,6 +3298,8 @@ msgid ""
"Enable vertex buffer objects.\n"
"This should greatly improve graphics performance."
msgstr ""
+"Zapnout objekty vyrovnávací paměti vertexů.\n"
+"Toto by mělo výrazně zlepšit grafický výkon."
#: src/settings_translation_file.cpp
msgid ""
@@ -3097,15 +3310,14 @@ msgstr ""
"Např.: 0 pro žádné, 1.0 pro normální a 2.0 pro dvojité klepání."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Enable/disable running an IPv6 server.\n"
"Ignored if bind_address is set.\n"
"Needs enable_ipv6 to be enabled."
msgstr ""
-"Povolit/zakázat spouštění IPv6 serveru. IPv6 server může podle\n"
-"systémového nastevení být omezen pouze na klienty s IPv6.\n"
-"Nemá vliv, pokud je 'bind_address' nastaveno."
+"Povolit/zakázat spuštění IPv6 serveru.\n"
+"Ignorováno, pokud je 'bind_address' nastaveno.\n"
+"Je třeba mít povoleno enable_ipv6."
#: src/settings_translation_file.cpp
msgid ""
@@ -3114,6 +3326,10 @@ msgid ""
"appearance of high dynamic range images. Mid-range contrast is slightly\n"
"enhanced, highlights and shadows are gradually compressed."
msgstr ""
+"Zapíná Hableho \"Uncharted 2\" filmové mapování odstínů.\n"
+"Simuluje křivku odstínu fotografického filmu a tím přibližný vzhled\n"
+"obrázků s vysokým dynamickým rozsahem (HDR). Kontrast středních\n"
+"hodnot je lehce zvýšený, vysoké a nízké hodnoty jsou postupně komprimovány."
#: src/settings_translation_file.cpp
msgid "Enables animation of inventory items."
@@ -3134,6 +3350,16 @@ msgid ""
"sound controls will be non-functional.\n"
"Changing this setting requires a restart."
msgstr ""
+"Zapíná zvukový systém.\n"
+"Vypnutí má za náledek úplné ztlumení všech zvuků\n"
+"a zvukového ovládání ve hře.\n"
+"Změna tohoto nastavení vyžaduje restart."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enables tradeoffs that reduce CPU load or increase rendering performance\n"
+"at the expense of minor visual glitches that do not impact game playability."
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
@@ -3152,10 +3378,16 @@ msgid ""
"Values < 1.0 (for example 0.25) create a more defined surface level with\n"
"flatter lowlands, suitable for a solid floatland layer."
msgstr ""
+"Exponent pro zužování létajících ostrovů. Mění míru zúžení.\n"
+"Hodnota = 1.0 vytvoří rovnoměrné přímé zúžení.\n"
+"Hodnoty > 1.0 vytvoří hladké zúžení vhodné pro výchozí oddělené\n"
+"létající ostrovy.\n"
+"Hodnoty < 1.0 (např. 0.25) vytvoří výraznější úroveň povrchu\n"
+"s rovinatějšími nížinami, vhodné pro souvislou vrstvu létajících ostrovů."
#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
-msgstr ""
+msgstr "Snímky za sekundu (FPS) při pauze či hře běžící na pozadí"
#: src/settings_translation_file.cpp
msgid "FSAA"
@@ -3170,21 +3402,8 @@ msgid "Fall bobbing factor"
msgstr "Součinitel houpání pohledu při pádu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Fallback font path"
-msgstr "Záložní písmo"
-
-#: src/settings_translation_file.cpp
-msgid "Fallback font shadow"
-msgstr "Stín záložního písma"
-
-#: src/settings_translation_file.cpp
-msgid "Fallback font shadow alpha"
-msgstr "Průhlednost stínu záložního písma"
-
-#: src/settings_translation_file.cpp
-msgid "Fallback font size"
-msgstr "Velikost záložního písma"
+msgstr "Cesta k záložnímu písmu"
#: src/settings_translation_file.cpp
msgid "Fast key"
@@ -3203,12 +3422,11 @@ msgid "Fast movement"
msgstr "Turbo režim pohybu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
-"Fast movement (via the \"special\" key).\n"
+"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
-"Turbo režim pohybu (pomocí klávesy použít).\n"
+"Turbo režim pohybu (pomocí klávesy \"Aux1\").\n"
"Vyžaduje na serveru přidělené právo \"fast\"."
#: src/settings_translation_file.cpp
@@ -3220,17 +3438,15 @@ msgid "Field of view in degrees."
msgstr "Úhel pohledu ve stupních."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the\n"
"Multiplayer Tab."
msgstr ""
"Soubor v client/serverlist/, který obsahuje oblíbené servery zobrazené na "
-"záložce 'Online hra'."
+"záložce 'Multiplayer'."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Filler depth"
msgstr "Hloubka výplně"
@@ -3243,28 +3459,26 @@ msgid "Filmic tone mapping"
msgstr "Filmový tone mapping"
#: src/settings_translation_file.cpp
-#, fuzzy
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."
+"which PNG optimizers usually discard, often resulting in dark or\n"
+"light edges to transparent textures. Apply a filter to clean that up\n"
+"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
"Okraje filtrovaných textur se mohou mísit s průhlednými sousedními pixely,\n"
-"které PNG optimizery obvykle zahazují. To může vyústit v tmavý nebo světlý\n"
-"lem okolo hran. Zapnutí tohoto filtru problém řeší při načítání textur."
+"které PNG optimizery obvykle zahazují. To může vyústit v tmavé nebo světlé\n"
+"okraje hran. Zapnutí tohoto filtru problém řeší při načítání textur.\n"
+"Toto nastavení je automaticky zapnuto, pokud je povoleno Mip-Mapování."
#: src/settings_translation_file.cpp
msgid "Filtering"
msgstr "Filtrování"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "First of 4 2D noises that together define hill/mountain range height."
-msgstr "První ze dvou 3D šumů, které dohromady definují tunely."
+msgstr "První ze 4 2D šumů, které dohromady definují rozsah výšek kopců/hor."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "First of two 3D noises that together define tunnels."
msgstr "První ze dvou 3D šumů, které dohromady definují tunely."
@@ -3274,42 +3488,35 @@ msgstr "Fixované seedové čislo"
#: src/settings_translation_file.cpp
msgid "Fixed virtual joystick"
-msgstr ""
+msgstr "Nepohyblivý virtuální joystick"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Floatland density"
-msgstr "Koncentrace hor na létajících ostrovech"
+msgstr "Hustota létajících ostrovů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Floatland maximum Y"
-msgstr "Výška hor na létajících ostrovech"
+msgstr "Létajících ostrovy: Max. Y"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Floatland minimum Y"
-msgstr "Výška hor na létajících ostrovech"
+msgstr "Létajících ostrovy: Min. Y"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Floatland noise"
-msgstr "Základní šum létajících ostrovů"
+msgstr "Šum létajících ostrovů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Floatland taper exponent"
-msgstr "Koncentrace hor na létajících ostrovech"
+msgstr "Exponent zúžení létajících ostrovů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Floatland tapering distance"
-msgstr "Základní šum létajících ostrovů"
+msgstr "Vzdálenost zužování létajících ostrovů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Floatland water level"
-msgstr "Výška létajících ostrovů"
+msgstr "Hladina vody na létajících ostrovech"
#: src/settings_translation_file.cpp
msgid "Fly key"
@@ -3324,7 +3531,6 @@ msgid "Fog"
msgstr "Mlha"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Fog start"
msgstr "Začátek mlhy"
@@ -3334,11 +3540,11 @@ msgstr "Klávesa pro přepnutí mlhy"
#: src/settings_translation_file.cpp
msgid "Font bold by default"
-msgstr ""
+msgstr "Tučné písmo jako výchozí"
#: src/settings_translation_file.cpp
msgid "Font italic by default"
-msgstr ""
+msgstr "Kurzíva jako výchozí"
#: src/settings_translation_file.cpp
msgid "Font shadow"
@@ -3353,22 +3559,37 @@ msgid "Font size"
msgstr "Velikost písma"
#: src/settings_translation_file.cpp
-msgid "Font size of the default font in point (pt)."
+msgid "Font size divisible by"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the fallback font in point (pt)."
-msgstr ""
+#, fuzzy
+msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
+msgstr "Velikost výchozího písma v bodech (pt)."
#: src/settings_translation_file.cpp
-msgid "Font size of the monospace font in point (pt)."
-msgstr ""
+#, fuzzy
+msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
+msgstr "Velikost proporcionálního písma v bodech (pt)."
#: src/settings_translation_file.cpp
msgid ""
"Font size of the recent chat text and chat prompt in point (pt).\n"
"Value 0 will use the default font size."
msgstr ""
+"Velikost písma posledního textu a výzvy v chatu v bodech (pt).\n"
+"Výchozí velikost písma se nastaví hodnotou 0."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"For pixel-style fonts that do not scale well, this ensures that font sizes "
+"used\n"
+"with this font will always be divisible by this value, in pixels. For "
+"instance,\n"
+"a pixel font 16 pixels tall should have this set to 16, so it will only ever "
+"be\n"
+"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
+msgstr ""
#: src/settings_translation_file.cpp
msgid ""
@@ -3376,6 +3597,8 @@ msgid ""
"placeholders:\n"
"@name, @message, @timestamp (optional)"
msgstr ""
+"Formát hráčovy zprávy v chatu. Řetězec níže obsahuje platné zástupce:\n"
+"@name, @message, @timestamp (optional)"
#: src/settings_translation_file.cpp
msgid "Format of screenshots."
@@ -3383,50 +3606,45 @@ msgstr "Formát snímků obrazovky."
#: src/settings_translation_file.cpp
msgid "Formspec Default Background Color"
-msgstr ""
+msgstr "Konzole Výchozí barva pozadí"
#: src/settings_translation_file.cpp
msgid "Formspec Default Background Opacity"
-msgstr ""
+msgstr "Konzole Výchozí průhlednost pozadí"
#: src/settings_translation_file.cpp
msgid "Formspec Full-Screen Background Color"
-msgstr ""
+msgstr "Konzole Barva pozadí při zobrazení na celé obrazovce"
#: src/settings_translation_file.cpp
msgid "Formspec Full-Screen Background Opacity"
-msgstr ""
+msgstr "Konzole Průhlednost pozadí při zobrazení na celé obrazovce"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Formspec default background color (R,G,B)."
-msgstr "Barva (R,G,B) pozadí herní chatovací konzole."
+msgstr "Konzole Výchozí barva pozadí (R,G,B)."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Formspec default background opacity (between 0 and 255)."
-msgstr ""
-"Průhlednost pozadí herní chatovací konzole (neprůhlednost, mezi 0 a 255)."
+msgstr "Konzole Výchozí průhlednost pozadí (0 až 255)."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Formspec full-screen background color (R,G,B)."
-msgstr "Barva (R,G,B) pozadí herní chatovací konzole."
+msgstr "Konzole Barva pozadí při zobrazení na celou obrazovku (R,G,B)."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Formspec full-screen background opacity (between 0 and 255)."
msgstr ""
-"Průhlednost pozadí herní chatovací konzole (neprůhlednost, mezi 0 a 255)."
+"Konzole Průhlednost pozadí při zobrazení na celou obrazovku (0 až 255)."
#: src/settings_translation_file.cpp
msgid "Forward key"
msgstr "Vpřed"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Fourth of 4 2D noises that together define hill/mountain range height."
-msgstr "První ze dvou 3D šumů, které dohromady definují tunely."
+msgstr ""
+"Čtvrtý ze čtyř 2D šumů, které dohromady definují rozsah výšek kopců/hor."
#: src/settings_translation_file.cpp
msgid "Fractal type"
@@ -3437,24 +3655,19 @@ msgid "Fraction of the visible distance at which fog starts to be rendered"
msgstr "Podíl viditelné vzdálenosti, na kterém začne být mlha vykreslována"
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "FreeType fonts"
-msgstr "Písma Freetype"
-
-#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are generated for clients, stated in mapblocks (16 "
"nodes)."
msgstr ""
-"Maximální vzdálenost, ve které jsou klientům generovány bloky, určená\n"
-"v mapblocích (16 bloků)."
+"Vzdálenost, ve které jsou klientům generovány bloky, určená v mapblocích (16 "
+"bloků)."
#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
msgstr ""
-"Maximální vzdálenost, ve které jsou klientům odeslány bloky, určená\n"
-"v mapblocích (16 bloků)."
+"Vzdálenost, ze které jsou klientům odesílány bloky, určená v mapblocích (16 "
+"bloků)."
#: src/settings_translation_file.cpp
msgid ""
@@ -3464,16 +3677,17 @@ msgid ""
"to maintain active objects up to this distance in the direction the\n"
"player is looking. (This can avoid mobs suddenly disappearing from view)"
msgstr ""
+"Vzdálenost, na kterou má klient inforamace o objektech,\n"
+"určená v mapblocích (16 bloků).\n"
+"Nastavení této hodnoty výše než active_block_range umožní serveru\n"
+"udržet v paměti aktivní objekty až do této vzdálenosti ve směru hráčova\n"
+"pohledu. (Toto může předejít náhlému mizení postav)"
#: src/settings_translation_file.cpp
msgid "Full screen"
msgstr "Celá obrazovka"
#: src/settings_translation_file.cpp
-msgid "Full screen BPP"
-msgstr "Bitová hloubka v celoobrazovkovém režimu"
-
-#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
msgstr "Celoobrazovkový režim."
@@ -3498,26 +3712,28 @@ msgstr "Globální callback funkce"
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."
+"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
"Globální parametry generování mapy.\n"
-"V mapgenu v6 ovládal příznak 'decorations' všechny dekorace kromě\n"
-"stromů a tropické trávy. V ostatních mapgenech tento příznak řídí\n"
-"všechny dekorace.\n"
-"Neuvedené příznaky zůstávají ve výchozím stavu.\n"
-"Příznaky začínající na 'no' slouží k zakázání možnosti."
+"V Generátoru mapy v6 ovládá nastavení \"decorations\" všechny dekorace\n"
+"kromě stromů a tropické trávy, ve všech ostatních verzích Generátoru mapy\n"
+"ovládá toto nastavení všechny dekorace."
#: src/settings_translation_file.cpp
msgid ""
"Gradient of light curve at maximum light level.\n"
"Controls the contrast of the highest light levels."
msgstr ""
+"Gradient křivky světla na nejvyšší úrovni světla.\n"
+"Určuje kontrast nejvyšších světelných hodnot."
#: src/settings_translation_file.cpp
msgid ""
"Gradient of light curve at minimum light level.\n"
"Controls the contrast of the lowest light levels."
msgstr ""
+"Gradient křivky světla na nejnižší úrovni světla.\n"
+"Určuje kontrast nejnižších světelných hodnot."
#: src/settings_translation_file.cpp
msgid "Graphics"
@@ -3532,14 +3748,12 @@ msgid "Ground level"
msgstr "Výška povrchu země"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Ground noise"
-msgstr "Výška povrchu země"
+msgstr "Šum povrchu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "HTTP mods"
-msgstr "HTTP mody"
+msgstr "HTTP režimy"
#: src/settings_translation_file.cpp
msgid "HUD scale factor"
@@ -3550,7 +3764,6 @@ msgid "HUD toggle key"
msgstr "Klávesa pro přepnutí HUD (Head-Up Display)"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Handling for deprecated Lua API calls:\n"
"- none: Do not log deprecated calls\n"
@@ -3558,7 +3771,7 @@ msgid ""
"- error: abort on usage of deprecated call (suggested for mod developers)."
msgstr ""
"Zacházení s voláními zastaralého Lua API:\n"
-"- legacy: pokusí se napodobit staré chování (výchozí pro release).\n"
+"- none: Nezaznamenávat zastaralá volání\n"
"- log: pokusí se napodobit staré chování a zaznamená backtrace volání\n"
" (výchozí pro debug).\n"
"- error: při volání zastaralé funkce skončit (doporučeno vývojářům modů)."
@@ -3585,8 +3798,11 @@ msgid "Heat noise"
msgstr "Tepelný šum"
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
-msgstr "Výšková část počáteční velikosti okna."
+msgid ""
+"Height component of the initial window size. Ignored in fullscreen mode."
+msgstr ""
+"Výškový parametr počáteční velikosti okna. Ignorováno v režimu na celé "
+"obrazovce."
#: src/settings_translation_file.cpp
msgid "Height noise"
@@ -3597,10 +3813,6 @@ msgid "Height select noise"
msgstr "Šum vybírání výšky"
#: 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 "Strmost kopců"
@@ -3609,24 +3821,20 @@ msgid "Hill threshold"
msgstr "Práh kopců"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hilliness1 noise"
-msgstr "Tepelný šum"
+msgstr "Šum kopcovitosti1"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hilliness2 noise"
-msgstr "Tepelný šum"
+msgstr "Šum kopcovitosti2"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hilliness3 noise"
-msgstr "Tepelný šum"
+msgstr "Šum kopcovitosti3"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hilliness4 noise"
-msgstr "Tepelný šum"
+msgstr "Šum kopcovitosti4"
#: src/settings_translation_file.cpp
msgid "Homepage of server, to be displayed in the serverlist."
@@ -3637,18 +3845,24 @@ msgid ""
"Horizontal acceleration in air when jumping or falling,\n"
"in nodes per second per second."
msgstr ""
+"Horizontální zrychlení ve vzduchu při skoku nebo pádu,\n"
+"určeno v blocích za sekundu za sekundu."
#: src/settings_translation_file.cpp
msgid ""
"Horizontal and vertical acceleration in fast mode,\n"
"in nodes per second per second."
msgstr ""
+"Horizontální a vertikální zrychlení v rychlém režimu,\n"
+"určeno v blocích za sekundu za sekundu."
#: src/settings_translation_file.cpp
msgid ""
"Horizontal and vertical acceleration on ground or when climbing,\n"
"in nodes per second per second."
msgstr ""
+"Horizontální a vertikální zrychlení na zemi nebo při lezení,\n"
+"určeno v blocích za sekundu za sekundu."
#: src/settings_translation_file.cpp
msgid "Hotbar next key"
@@ -3659,169 +3873,136 @@ msgid "Hotbar previous key"
msgstr "Klávesa pro předchozí věc v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 1 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 1 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 10 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 10 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 11 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 11 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 12 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 12 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 13 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 13 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 14 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 14 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 15 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 15 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 16 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 16 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 17 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 17 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 18 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 18 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 19 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 19 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 2 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 2 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 20 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 20 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 21 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 21 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 22 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 22 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 23 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 23 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 24 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 24 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 25 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 25 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 26 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 26 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 27 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 27 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 28 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 28 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 29 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 29 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 3 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 3 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 30 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 30 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 31 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 31 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 32 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 32 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 4 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 4 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 5 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 5 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 6 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 6 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 7 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 7 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 8 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 8 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Hotbar slot 9 key"
-msgstr "Klávesa pro následující věc v liště předmětů"
+msgstr "Klávesa pro přihrádku 9 v liště předmětů"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "How deep to make rivers."
-msgstr "Jak hluboké dělat řeky"
+msgstr "Jak hluboké dělat řeky."
#: src/settings_translation_file.cpp
msgid ""
@@ -3829,6 +4010,9 @@ msgid ""
"If negative, liquid waves will move backwards.\n"
"Requires waving liquids to be enabled."
msgstr ""
+"Rychlost pohybu vln v kapalinách. Vyšší = rychlejší.\n"
+"Záporné hodnoty vytvoří vlny jdoucí pozpátku.\n"
+"Vyžaduje zapnuté vlnění kapalin."
#: src/settings_translation_file.cpp
msgid ""
@@ -3839,9 +4023,8 @@ msgstr ""
"Vyšší hodnota zlepší rychlost programu, ale také způsobí větší spotřebu RAM."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "How wide to make rivers."
-msgstr "Jak široké dělat řeky"
+msgstr "Jak široké dělat řeky."
#: src/settings_translation_file.cpp
msgid "Humidity blend noise"
@@ -3872,15 +4055,12 @@ msgstr ""
"omezit ji vyčkáváním, aby se zbytečně neplýtvalo výkonem CPU."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
-"If disabled, \"special\" key is used to fly fast if both fly and fast mode "
-"are\n"
+"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
-"V zakázaném stavu způsobí, že klávesa \"použít\" je použita k aktivaci "
-"turba\n"
-"v režimu létání."
+"Pokud je vypnuto, klávesa \"Aux1\" je , při zapnutém létání\n"
+"a rychlém režimu, použita k rychlému létání."
#: src/settings_translation_file.cpp
msgid ""
@@ -3906,14 +4086,13 @@ msgstr ""
"K tomu je potřeba mít na serveru oprávnění \"noclip\"."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
-"If enabled, \"special\" key instead of \"sneak\" key is used for climbing "
-"down and\n"
+"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down "
+"and\n"
"descending."
msgstr ""
-"Když zapnuto, místo klávesy \"plížit se\" se ke slézání a potápění používá "
-"klávese \"použít\"."
+"Pokud je zapnuto, je klávesa \"Aux1\" využita pro sestup\n"
+"namísto klávesy \"Plížení\"."
#: src/settings_translation_file.cpp
msgid ""
@@ -3940,6 +4119,8 @@ msgid ""
"If enabled, makes move directions relative to the player's pitch when flying "
"or swimming."
msgstr ""
+"Pokud je zapnuto, je směr pohybu, při létání nebo plavání, závislý na úhlu "
+"hráčova pohledu."
#: src/settings_translation_file.cpp
msgid "If enabled, new players cannot join with an empty password."
@@ -3961,6 +4142,16 @@ msgid ""
"limited\n"
"to this distance from the player to the node."
msgstr ""
+"Pokud je omezení CSM pro vzdálenost bloků povoleno, jsou volání get_node\n"
+"omezena na tuto vzdálenost hráče od bloku."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If the execution of a chat command takes longer than this specified time in\n"
+"seconds, add the time information to the chat command message"
+msgstr ""
+"Pokud je doba výkonu příkazu z chatu delší než zadaný čas v sekundách,\n"
+"přidej informaci o čase do příkazu v chatu"
#: src/settings_translation_file.cpp
msgid ""
@@ -3969,6 +4160,11 @@ msgid ""
"deleting an older debug.txt.1 if it exists.\n"
"debug.txt is only moved if this setting is positive."
msgstr ""
+"Pokud velikost souboru debug.txt po otevření přesáhne počet megabytů určený\n"
+"tímto nastavením, bude soubor přesunut do debug.txt.1 (toto vymaže původní "
+"debug.txt.1,\n"
+"pokud existuje).\n"
+"debug.txt je přesunut pouze pokud je toto nastavení platné."
#: src/settings_translation_file.cpp
msgid "If this is set, players will always (re)spawn at the given position."
@@ -3984,8 +4180,7 @@ msgstr "Ve hře"
#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
-msgstr ""
-"Průhlednost pozadí herní chatovací konzole (neprůhlednost, mezi 0 a 255)."
+msgstr "Průhlednost pozadí herní chatovací konzole (neprůhlednost, 0 až 255)."
#: src/settings_translation_file.cpp
msgid "In-game chat console background color (R,G,B)."
@@ -4003,7 +4198,7 @@ msgstr "Klávesa zvýšení hlasitosti"
#: src/settings_translation_file.cpp
msgid "Initial vertical speed when jumping, in nodes per second."
-msgstr ""
+msgstr "Počáteční vertikální rychlost skoku v blocích za sekundu."
#: src/settings_translation_file.cpp
msgid ""
@@ -4014,7 +4209,8 @@ msgstr ""
"Obvykle využíváno jen vývojáři jádra/builtin"
#: src/settings_translation_file.cpp
-msgid "Instrument chatcommands on registration."
+#, fuzzy
+msgid "Instrument chat commands on registration."
msgstr "Instrumentovat chatovací přikazy při registraci."
#: src/settings_translation_file.cpp
@@ -4068,14 +4264,12 @@ msgid "Invert vertical mouse movement."
msgstr "Obrátit svislý pohyb myši."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Italic font path"
-msgstr "Cesta k neproporcionálnímu písmu"
+msgstr "Cesta k písmu s kurzívou"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Italic monospace font path"
-msgstr "Cesta k neproporcionálnímu písmu"
+msgstr "Cesta k proporcionálnímu písmu s kurzívou"
#: src/settings_translation_file.cpp
msgid "Item entity TTL"
@@ -4092,6 +4286,10 @@ msgid ""
"increases processing load.\n"
"At iterations = 20 this mapgen has a similar load to mapgen V7."
msgstr ""
+"Opakování rekurzivní funkce.\n"
+"Zvýšení hodnoty vede ke zlepšení detailů, ale také zvyšuje nároky na výkon.\n"
+"Při opakování = 20 má tento Generátor mapy podobné nároky jako\n"
+"Generátor mapy v7."
#: src/settings_translation_file.cpp
msgid "Joystick ID"
@@ -4103,20 +4301,18 @@ msgstr "Interval opakování tlačítek joysticku"
#: src/settings_translation_file.cpp
#, fuzzy
-msgid "Joystick deadzone"
-msgstr "Typ joysticku"
+msgid "Joystick dead zone"
+msgstr "Mrtvá zóna joysticku"
#: src/settings_translation_file.cpp
msgid "Joystick frustum sensitivity"
msgstr "Citlivost otáčení pohledu joystickem"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Joystick type"
msgstr "Typ joysticku"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only.\n"
"W component of hypercomplex constant.\n"
@@ -4124,44 +4320,47 @@ msgid ""
"Has no effect on 3D fractals.\n"
"Range roughly -2 to 2."
msgstr ""
-"Julia udává jen: W komponet hyperkomplexu konstantní určení tvaru Julie.\n"
-"Nemá efekt na 3D fraktálech.\n"
-"Rozsah zhruba -2 až 2."
+"Pouze pro set Julia.\n"
+"Komponenta W hyperkomplexní konstanty.\n"
+"Mění tvar fraktálu.\n"
+"Nemá žádný vliv na 3D fraktály.\n"
+"Rozmezí přibližně -2 až 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only.\n"
"X component of hypercomplex constant.\n"
"Alters the shape of the fractal.\n"
"Range roughly -2 to 2."
msgstr ""
-"Julia udává jen: komponet X hyperkomplexu konstantího udávání tvaru julie.\n"
-"Rozsah zhruba -2 až 2."
+"Pouze pro set Julia.\n"
+"Komponenta X hyperkomplexní konstanty.\n"
+"Mění tvar fraktálu.\n"
+"Rozmezí přibližně -2 až 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only.\n"
"Y component of hypercomplex constant.\n"
"Alters the shape of the fractal.\n"
"Range roughly -2 to 2."
msgstr ""
-"Julia udává jen: W komponet hyperkomplexu konstantní určení tvaru Julie.\n"
-"Nemá efekt na 3D fraktálech.\n"
-"Rozsah zhruba -2 až 2."
+"Pouze pro set Julia.\n"
+"Komponenta Y hyperkomplexní konstanty.\n"
+"Mění tvar fraktálu.\n"
+"Rozmezí přibližně -2 až 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only.\n"
"Z component of hypercomplex constant.\n"
"Alters the shape of the fractal.\n"
"Range roughly -2 to 2."
msgstr ""
-"Julia udává jen: W komponet hyperkomplexu konstantní určení tvaru Julie.\n"
-"Nemá efekt na 3D fraktálech.\n"
-"Rozsah zhruba -2 až 2."
+"Pouze pro set Julia.\n"
+"Komponenta Z hyperkomplexní konstanty.\n"
+"Mění tvar fraktálu.\n"
+"Rozmezí přibližně -2 až 2."
#: src/settings_translation_file.cpp
msgid "Julia w"
@@ -4208,13 +4407,12 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Key for digging.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"klávesy pro snížení hlasitosti.\n"
+"Klávesa pro těžení\n"
"viz. http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -4244,6 +4442,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klávesa pro zvýšení hlasitosti\n"
+"viz. http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4251,6 +4452,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klávesa pro skok.\n"
+"viz. See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4258,16 +4462,19 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klávesa pro rychlý pohyb v rychlém režimu.\n"
+"viz. http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Key for moving the player backward.\n"
"Will also disable autoforward, when active.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Klávesa pro odhození právě drženého předmětu.\n"
+"Klávesa pro pohyb hráče zpět.\n"
+"Také vypne automatický pohyb vpřed, pokud je zapnutý.\n"
"viz. http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -4277,6 +4484,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klávesa pro pohyb hráče vpřed.\n"
+"viz. http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4284,6 +4494,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klávesa pro pohyb hráče doleva.\n"
+"viz. http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4291,6 +4504,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klávesa pro pohyb hráče doprava.\n"
+"viz. http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4298,6 +4514,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klávesa pro ztlumení hry.\n"
+"viz. http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4305,6 +4524,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klávesa pro otevření okna chatu za účelem zadání příkazů.\n"
+"viz. http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4857,15 +5079,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
-msgstr ""
+msgstr "Vyhodit hráče, který poslal více jak X zpráv během 10 sekund."
#: src/settings_translation_file.cpp
msgid "Lake steepness"
-msgstr ""
+msgstr "Strmost jezer"
#: src/settings_translation_file.cpp
msgid "Lake threshold"
-msgstr ""
+msgstr "Strmost jezer"
#: src/settings_translation_file.cpp
msgid "Language"
@@ -4873,19 +5095,19 @@ msgstr "Jazyk"
#: src/settings_translation_file.cpp
msgid "Large cave depth"
-msgstr "Hloubka velké jeskyně"
+msgstr "Hloubka velkých jeskyní"
#: src/settings_translation_file.cpp
msgid "Large cave maximum number"
-msgstr ""
+msgstr "Horní hranice velkých jeskyní"
#: src/settings_translation_file.cpp
msgid "Large cave minimum number"
-msgstr ""
+msgstr "Spodní hranice velkých jeskyní"
#: src/settings_translation_file.cpp
msgid "Large cave proportion flooded"
-msgstr ""
+msgstr "Poměr zatopení velkých jeskyní"
#: src/settings_translation_file.cpp
msgid "Large chat console key"
@@ -4902,6 +5124,11 @@ msgid ""
"- Simple: only outer faces, if defined special_tiles are used\n"
"- Opaque: disable transparency"
msgstr ""
+"Styl listí:\n"
+"- Vícevrstevné: všechny plochy jsou viditelné\n"
+"- Jednoduché: pouze vnější plochy, pokud je definováno special_tiles, jsou "
+"použity\n"
+"- Neprůhledné: vypne průhlednost"
#: src/settings_translation_file.cpp
msgid "Left key"
@@ -4913,24 +5140,28 @@ msgid ""
"updated over\n"
"network."
msgstr ""
+"Frekvence aktualizece objektů na serveru.\n"
+"Určeno v délce jedné periody."
#: src/settings_translation_file.cpp
msgid ""
"Length of liquid waves.\n"
"Requires waving liquids to be enabled."
msgstr ""
+"Délka vln v kapalinách.\n"
+"Vyžaduje zapnuté vlnění kapalin."
#: src/settings_translation_file.cpp
msgid "Length of time between Active Block Modifier (ABM) execution cycles"
-msgstr ""
+msgstr "Frekvence vykonání cyklů Active Block Modifieru (ABM)"
#: src/settings_translation_file.cpp
msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "Frekvence vykonání cyklů ČasovačeBloku"
#: src/settings_translation_file.cpp
msgid "Length of time between active block management cycles"
-msgstr ""
+msgstr "Frekvence vykonání cyklů aktivní správy bloků"
#: src/settings_translation_file.cpp
msgid ""
@@ -4943,30 +5174,38 @@ msgid ""
"- info\n"
"- verbose"
msgstr ""
+"Úroveň ladících informací zapsaných do debug.txt:\n"
+"- <nothing> (žádné ladící informace)\n"
+"- none (zprávy budou vypsány bez patřičné úrovně)\n"
+"- error (chyba)\n"
+"- warning (varování)\n"
+"- action (akce)\n"
+"- info (informace)\n"
+"- verbose (slovně)"
#: src/settings_translation_file.cpp
msgid "Light curve boost"
-msgstr ""
+msgstr "Posílení křivky světla"
#: src/settings_translation_file.cpp
msgid "Light curve boost center"
-msgstr ""
+msgstr "Posílení křivky světla Středy"
#: src/settings_translation_file.cpp
msgid "Light curve boost spread"
-msgstr ""
+msgstr "Posílení křivky světla Šíření"
#: src/settings_translation_file.cpp
msgid "Light curve gamma"
-msgstr ""
+msgstr "Křivka světla Gamma"
#: src/settings_translation_file.cpp
msgid "Light curve high gradient"
-msgstr ""
+msgstr "Křivka světla Vysoký gradient"
#: src/settings_translation_file.cpp
msgid "Light curve low gradient"
-msgstr ""
+msgstr "Křivka světla Nízký gradient"
#: src/settings_translation_file.cpp
msgid ""
@@ -4974,6 +5213,9 @@ msgid ""
"Only mapchunks completely within the mapgen limit are generated.\n"
"Value is stored per-world."
msgstr ""
+"Limit generování mapy v blocích, ve všech 6 směrech od (0,0,0).\n"
+"Generují se pouze kusy nacházející se kompletně v zadaném limitu.\n"
+"Tato hodnota je unikátní pro každý svět."
#: src/settings_translation_file.cpp
msgid ""
@@ -4983,39 +5225,43 @@ msgid ""
"- Downloads performed by main menu (e.g. mod manager).\n"
"Only has an effect if compiled with cURL."
msgstr ""
+"Omezuje počet paralelních HTTP požadavků. Má vliv na:\n"
+"- Načítání multimédií, pokud server používá nastavení remote_media.\n"
+"- Stahování seznamu serverů a oznámení na serveru.\n"
+"- Stahování prováděná přes hlavní nabídku (např. Správce modů).\n"
+"Má vliv pouze v případě kompilace přes cURL."
#: src/settings_translation_file.cpp
msgid "Liquid fluidity"
-msgstr ""
+msgstr "Tekutost kapalin"
#: src/settings_translation_file.cpp
msgid "Liquid fluidity smoothing"
-msgstr ""
+msgstr "Vyhlazení tekutosti kapalin"
#: src/settings_translation_file.cpp
msgid "Liquid loop max"
-msgstr ""
+msgstr "Horní hranice kapalinového cyklu"
#: src/settings_translation_file.cpp
msgid "Liquid queue purge time"
-msgstr ""
+msgstr "Doba vymazání fronty kapalin"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Liquid sinking"
-msgstr "Rychlost sestupu"
+msgstr "Rychlost stékání kapalin"
#: src/settings_translation_file.cpp
msgid "Liquid update interval in seconds."
-msgstr ""
+msgstr "Frekvence aktualizace kapalin v sekundách."
#: src/settings_translation_file.cpp
msgid "Liquid update tick"
-msgstr ""
+msgstr "Jeden cyklus aktualizace kapalin"
#: src/settings_translation_file.cpp
msgid "Load the game profiler"
-msgstr ""
+msgstr "Načíst profilování hry"
#: src/settings_translation_file.cpp
msgid ""
@@ -5023,19 +5269,21 @@ msgid ""
"Provides a /profiler command to access the compiled profile.\n"
"Useful for mod developers and server operators."
msgstr ""
+"Načíst profilování hry pro sběr profilovacích dat.\n"
+"Umožňuje použít příkaz /profiler pro přístup ke zkopilovanému profilu.\n"
+"Užitečné pro vývojáře modů a provozovatele serverů."
#: src/settings_translation_file.cpp
msgid "Loading Block Modifiers"
-msgstr ""
+msgstr "Loading Block Modifiery"
#: src/settings_translation_file.cpp
msgid "Lower Y limit of dungeons."
-msgstr ""
+msgstr "Spodní hranice Y pro žaláře."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Lower Y limit of floatlands."
-msgstr "Maximální počet emerge front"
+msgstr "Spodní hranice Y pro létající ostrovy."
#: src/settings_translation_file.cpp
msgid "Main menu script"
@@ -5045,57 +5293,46 @@ msgstr "Skript hlavní nabídky"
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 ""
+"Barva mlhy a oblohy záleží na denní době (svítání/soumrak) a na směru "
+"pohledu."
#: src/settings_translation_file.cpp
msgid "Makes all liquids opaque"
-msgstr ""
+msgstr "Udělá všechny kapaliny neprůhledné"
#: src/settings_translation_file.cpp
msgid "Map Compression Level for Disk Storage"
-msgstr ""
+msgstr "Úroveň komprese mapy pro pevné úložiště"
#: src/settings_translation_file.cpp
msgid "Map Compression Level for Network Transfer"
-msgstr ""
+msgstr "Úroveň komprese mapy pro přenost internetem"
#: src/settings_translation_file.cpp
msgid "Map directory"
-msgstr ""
+msgstr "Směr mapy"
#: src/settings_translation_file.cpp
msgid "Map generation attributes specific to Mapgen Carpathian."
-msgstr ""
+msgstr "Parametry generování mapy pro Generátor mapy - Carpathian."
#: 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."
msgstr ""
-"Globální parametry generování mapy.\n"
-"V mapgenu v6 ovládal příznak 'decorations' všechny dekorace kromě\n"
-"stromů a tropické trávy. V ostatních mapgenech tento příznak řídí\n"
-"všechny dekorace.\n"
-"Neuvedené příznaky zůstávají ve výchozím stavu.\n"
-"Příznaky začínající na 'no' slouží k zakázání možnosti."
+"Parametry generování mapy pro Generátor mapy - Plocha.\n"
+"Do plochého světa je možné přidat občasná jezera a kopce."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen Fractal.\n"
"'terrain' enables the generation of non-fractal terrain:\n"
"ocean, islands and underground."
msgstr ""
-"Globální parametry generování mapy.\n"
-"V mapgenu v6 ovládal příznak 'decorations' všechny dekorace kromě\n"
-"stromů a tropické trávy. V ostatních mapgenech tento příznak řídí\n"
-"všechny dekorace.\n"
-"Neuvedené příznaky zůstávají ve výchozím stavu.\n"
-"Příznaky začínající na 'no' slouží k zakázání možnosti."
+"Parametry generování mapy pro Generátor mapy - Fraktál.\n"
+"\"terén\" umožňuje generování \"nefraktálového\" terénu:\n"
+"oceány, ostrovy a podzemí."
#: src/settings_translation_file.cpp
msgid ""
@@ -5106,148 +5343,145 @@ msgid ""
"to become shallower and occasionally dry.\n"
"'altitude_dry': Reduces humidity with altitude."
msgstr ""
+"Parametry generování mapy pro Generátor mapy - Údolí.\n"
+"„altitude_chill“: Snižuje teplotu s nadmořskou výškou.\n"
+"„humid_rivers“: Zvyšuje vlhkost podél řek.\n"
+"„vary_river_depth“: Pokud zapnuto, nízká vlhkost a vysoká teplota\n"
+"budou mít za následek mělčí nebo místy úplně vyschlé řeky.\n"
+"„altitude_dry“: Snižuje vlhkost s nadmořskou výškou."
#: src/settings_translation_file.cpp
msgid "Map generation attributes specific to Mapgen v5."
-msgstr ""
+msgstr "Parametry generování mapy pro Generátor mapy v5."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"The 'snowbiomes' flag enables the new 5 biome system.\n"
"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n"
"the 'jungles' flag is ignored."
msgstr ""
-"Globální parametry generování mapy.\n"
-"V mapgenu v6 ovládal příznak 'decorations' všechny dekorace kromě\n"
-"stromů a tropické trávy. V ostatních mapgenech tento příznak řídí\n"
-"všechny dekorace.\n"
-"Neuvedené příznaky zůstávají ve výchozím stavu.\n"
-"Příznaky začínající na 'no' slouží k zakázání možnosti."
+"Parametry generování mapy pro Generátor mapy v6.\n"
+"Nastavení \"snowbiomes\" umožňuje systém 5 biomů.\n"
+"Pokud je nastavení \"snowbiomes\" zapnuto, džungle jsou automaticky\n"
+"zapnuty a nastavení \"jungles\" je ignorováno."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"'ridges': Rivers.\n"
"'floatlands': Floating land masses in the atmosphere.\n"
"'caverns': Giant caves deep underground."
msgstr ""
-"Globální parametry generování mapy.\n"
-"V mapgenu v6 ovládal příznak 'decorations' všechny dekorace kromě\n"
-"stromů a tropické trávy. V ostatních mapgenech tento příznak řídí\n"
-"všechny dekorace.\n"
-"Neuvedené příznaky zůstávají ve výchozím stavu.\n"
-"Příznaky začínající na 'no' slouží k zakázání možnosti."
+"Parametry generování mapy v Generátoru mapy v7.\n"
+"'hřebeny': Rivers.\n"
+"'létající ostrovy': Ostrovy vznášející se v prostoru.\n"
+"'jeskynní dutiny': Obrovské jeskyně hluboko v podzemí."
#: src/settings_translation_file.cpp
msgid "Map generation limit"
-msgstr ""
+msgstr "Limit generování mapy"
#: src/settings_translation_file.cpp
msgid "Map save interval"
msgstr "Interval ukládání mapy"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Map shadows update frames"
+msgstr "Doba aktualizace mapy"
+
+#: src/settings_translation_file.cpp
msgid "Mapblock limit"
-msgstr ""
+msgstr "Limit mapbloků"
#: src/settings_translation_file.cpp
msgid "Mapblock mesh generation delay"
-msgstr ""
+msgstr "Prodleva generování sítě mapbloků"
#: src/settings_translation_file.cpp
msgid "Mapblock mesh generator's MapBlock cache size in MB"
-msgstr ""
+msgstr "Velikost cache paměti v MB Generátoru mapy pro Mapbloky"
#: src/settings_translation_file.cpp
msgid "Mapblock unload timeout"
-msgstr ""
+msgstr "Časový limit pro vymazání Mapbloku z paměti"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen Carpathian"
-msgstr "Mapgen plochy"
+msgstr "Generátor mapy - Carpathian"
#: src/settings_translation_file.cpp
msgid "Mapgen Carpathian specific flags"
-msgstr ""
+msgstr "Nastavení pro Generátor mapy - Carpathian"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen Flat"
-msgstr "Mapgen plochy"
+msgstr "Generátor mapy - Plocha"
#: src/settings_translation_file.cpp
msgid "Mapgen Flat specific flags"
-msgstr ""
+msgstr "Nastavení Generátory mapy - Plocha"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen Fractal"
-msgstr "Mapgen plochy"
+msgstr "Generátor mapy - Fraktál"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen Fractal specific flags"
-msgstr "Mapgen údolí"
+msgstr "Nastavení pro Generátor mapy - Fraktál"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen V5"
-msgstr "Mapgen v5"
+msgstr "Generátor mapy V5"
#: src/settings_translation_file.cpp
msgid "Mapgen V5 specific flags"
-msgstr ""
+msgstr "Nastavení pro Generátor mapy v5"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen V6"
-msgstr "Mapgen v6"
+msgstr "Generátor mapy v6"
#: src/settings_translation_file.cpp
msgid "Mapgen V6 specific flags"
-msgstr ""
+msgstr "Nastavení pro Generátor mapy v6"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen V7"
-msgstr "Mapgen v7"
+msgstr "Generátor mapy v7"
#: src/settings_translation_file.cpp
msgid "Mapgen V7 specific flags"
-msgstr ""
+msgstr "Nastavení pro Generátor mapy v7"
#: src/settings_translation_file.cpp
msgid "Mapgen Valleys"
msgstr "Mapgen údolí"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen Valleys specific flags"
-msgstr "Mapgen údolí"
+msgstr "Nastavení pro Generátor mapy - Údolí"
#: src/settings_translation_file.cpp
msgid "Mapgen debug"
-msgstr "Ladění generátoru mapy"
+msgstr "Ladění Generátoru mapy"
#: src/settings_translation_file.cpp
msgid "Mapgen name"
-msgstr "Jméno generátoru mapy"
+msgstr "Jméno Generátoru mapy"
#: src/settings_translation_file.cpp
msgid "Max block generate distance"
-msgstr ""
+msgstr "Horní hranice vzdálenosti pro generování bloků"
#: src/settings_translation_file.cpp
msgid "Max block send distance"
-msgstr ""
+msgstr "Horní hranice vzdálenosti pro posílání bloků"
#: src/settings_translation_file.cpp
msgid "Max liquids processed per step."
-msgstr ""
+msgstr "Horní hranice počtu kapalin zpracovaných za jeden krok."
#: src/settings_translation_file.cpp
msgid "Max. clearobjects extra blocks"
@@ -5266,6 +5500,10 @@ msgid "Maximum FPS when the window is not focused, or when the game is paused."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum distance to render shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
msgstr ""
@@ -5275,11 +5513,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Maximum limit of random number of large caves per mapchunk."
-msgstr ""
+msgstr "Horní hranice pro náhodný počet velkých jeskyní na kus mapy."
#: src/settings_translation_file.cpp
msgid "Maximum limit of random number of small caves per mapchunk."
-msgstr ""
+msgstr "Horní hranice pro náhodný počet malých jeskyní na kus mapy."
#: src/settings_translation_file.cpp
msgid ""
@@ -5371,7 +5609,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum time in ms a file download (e.g. a mod download) may take."
+msgid ""
+"Maximum time a file download (e.g. a mod download) may take, stated in "
+"milliseconds."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum time an interactive request (e.g. server list fetch) may take, "
+"stated in milliseconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5416,11 +5662,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Minimum limit of random number of large caves per mapchunk."
-msgstr ""
+msgstr "Spodní hranice pro náhodný počet velkých jeskyní na kus mapy."
#: src/settings_translation_file.cpp
msgid "Minimum limit of random number of small caves per mapchunk."
-msgstr ""
+msgstr "Spodní hranice pro náhodný počet malých jeskyní na kus mapy."
#: src/settings_translation_file.cpp
#, fuzzy
@@ -5436,7 +5682,7 @@ msgid "Mod channels"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Modifies the size of the hudbar elements."
+msgid "Modifies the size of the HUD elements."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5448,6 +5694,11 @@ msgid "Monospace font size"
msgstr "Velikost neproporcionálního písma"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Monospace font size divisible by"
+msgstr "Velikost neproporcionálního písma"
+
+#: src/settings_translation_file.cpp
msgid "Mountain height noise"
msgstr ""
@@ -5569,7 +5820,7 @@ 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"
+"This is a trade-off between SQLite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
@@ -5588,21 +5839,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"Open the pause menu when the window's focus is lost. Does not pause if a "
"formspec is\n"
"open."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Optional override for chat weblink color."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
-"Path of the fallback font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path of the fallback font. Must be a TrueType font.\n"
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
@@ -5625,17 +5873,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the default font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the monospace font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
@@ -5693,6 +5937,11 @@ msgid "Player versus player"
msgstr "Hráč proti hráči (PvP)"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Poisson filtering"
+msgstr "Bilineární filtrování"
+
+#: src/settings_translation_file.cpp
msgid ""
"Port to connect to (UDP).\n"
"Note that the port field in the main menu overrides this setting."
@@ -5737,14 +5986,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Prometheus listener address.\n"
-"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
+"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
"enable metrics listener for Prometheus on that address.\n"
-"Metrics can be fetch on http://127.0.0.1:30000/metrics"
+"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Proportion of large caves that contain liquid."
-msgstr ""
+msgstr "Poměr velkých jeskyní s kapalinami."
#: src/settings_translation_file.cpp
msgid ""
@@ -6059,6 +6308,35 @@ msgid "Set the maximum character length of a chat message sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Set the shadow strength.\n"
+"Lower value means lighter shadows, higher value means darker shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the soft shadow radius size.\n"
+"Lower values mean sharper shadows, bigger values mean softer shadows.\n"
+"Minimum value: 1.0; maximum value: 10.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the tilt of Sun/Moon orbit in degrees.\n"
+"Value of 0 means no tilt / vertical orbit.\n"
+"Minimum value: 0.0; maximum value: 60.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Set to true to enable Shadow Mapping.\n"
+"Requires shaders to be enabled."
+msgstr ""
+"Zapne parallax occlusion mapping.\n"
+"Nastavení vyžaduje zapnuté shadery."
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Set to true to enable waving leaves.\n"
@@ -6086,6 +6364,13 @@ msgstr ""
"Nastavení vyžaduje zapnuté shadery."
#: src/settings_translation_file.cpp
+msgid ""
+"Sets shadow texture quality to 32 bits.\n"
+"On false, 16 bits texture will be used.\n"
+"This can cause much more artifacts in the shadow."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Shader path"
msgstr "Cesta k shaderům"
@@ -6099,17 +6384,32 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Shadow filter quality"
+msgstr "Kvalita snímků obrazovky"
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map max distance in nodes to render shadows"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture in 32 bits"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Shadow map texture size"
+msgstr "Minimální velikost textury k filtrování"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Shadow offset (in pixels) of the default font. If 0, then shadow will not be "
"drawn."
msgstr "Odsazení stínu písma, pokud je nastaveno na 0, stín nebude vykreslen."
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid ""
-"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not "
-"be drawn."
-msgstr "Odsazení stínu písma, pokud je nastaveno na 0, stín nebude vykreslen."
+msgid "Shadow strength"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
@@ -6130,8 +6430,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Show nametag backgrounds by default"
-msgstr ""
+#, fuzzy
+msgid "Show name tag backgrounds by default"
+msgstr "Tučné písmo jako výchozí"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
@@ -6146,6 +6447,12 @@ msgid ""
"Altering this value is for special usage, leaving it unchanged is\n"
"recommended."
msgstr ""
+"Velikost kusů mapy vytovřených Generátorem mapy v mapblocích (16 bloků).\n"
+"VAROVÁNÍ!: Hodnota vyšší než 5 nepřináší žádné zlepšení\n"
+"a zvyšuje riziko problémů.\n"
+"Snížení hodnoty zvýší husotou jeskyní a žalářů.\n"
+"Změna hodnoty je pro zvláštní případy, jinak je doporučeno\n"
+"nechat ji na výchozí hodnotě."
#: src/settings_translation_file.cpp
msgid ""
@@ -6155,6 +6462,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Sky Body Orbit Tilt"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Slice w"
msgstr ""
@@ -6164,11 +6475,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Small cave maximum number"
-msgstr ""
+msgstr "Horní hranice počtu malých jeskyní"
#: src/settings_translation_file.cpp
msgid "Small cave minimum number"
-msgstr ""
+msgstr "Spodní hranice počtu malých jeskyní"
#: src/settings_translation_file.cpp
msgid "Small-scale humidity variation for blending biomes on borders."
@@ -6210,18 +6521,13 @@ msgid "Sneaking speed, in nodes per second."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Sound"
-msgstr "Zvuk"
-
-#: src/settings_translation_file.cpp
#, fuzzy
-msgid "Special key"
-msgstr "Klávesa plížení"
+msgid "Soft shadow radius"
+msgstr "Průhlednost stínu písma"
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Special key for climbing/descending"
-msgstr "Klávesa pro výstup/sestup"
+msgid "Sound"
+msgstr "Zvuk"
#: src/settings_translation_file.cpp
msgid ""
@@ -6240,6 +6546,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Spread a complete update of shadow map over given amount of frames.\n"
+"Higher values might make shadows laggy, lower values\n"
+"will consume more resources.\n"
+"Minimum value: 1; maximum value: 16"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Spread of light curve boost range.\n"
"Controls the width of the range to be boosted.\n"
"Standard deviation of the light curve boost Gaussian."
@@ -6348,6 +6662,13 @@ msgstr "Cesta k texturám"
#: src/settings_translation_file.cpp
msgid ""
+"Texture size to render the shadow map on.\n"
+"This must be a power of two.\n"
+"Bigger numbers create better shadows but it is also more expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Textures on a node may be aligned either to the node or to the world.\n"
"The former mode suits better things like machines, furniture, etc., while\n"
"the latter makes stairs and microblocks fit surroundings better.\n"
@@ -6361,7 +6682,7 @@ msgid "The URL for the content repository"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "The deadzone of the joystick"
+msgid "The dead zone of the joystick"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6419,7 +6740,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"The rendering back-end for Irrlicht.\n"
+"The rendering back-end.\n"
"A restart is required after changing this.\n"
"Note: On Android, stick with OGLES1 if unsure! App may fail to start "
"otherwise.\n"
@@ -6430,7 +6751,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"The sensitivity of the joystick axes for moving the\n"
-"ingame view frustum around."
+"in-game view frustum around."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6526,6 +6847,10 @@ msgid "Touch screen threshold"
msgstr "Práh šumu pláže"
#: src/settings_translation_file.cpp
+msgid "Tradeoffs for performance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6596,7 +6921,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Use mip mapping to scale textures. May slightly increase performance,\n"
+"Use mipmapping to scale textures. May slightly increase performance,\n"
"especially when using a high resolution texture pack.\n"
"Gamma correct downscaling is not supported."
msgstr ""
@@ -6652,7 +6977,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Variation of number of caves."
-msgstr ""
+msgstr "Variace počtu jeskyní."
#: src/settings_translation_file.cpp
msgid ""
@@ -6711,7 +7036,7 @@ msgid "Viewing range"
msgstr "Vzdálenost dohledu"
#: src/settings_translation_file.cpp
-msgid "Virtual joystick triggers aux button"
+msgid "Virtual joystick triggers Aux1 button"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6789,6 +7114,11 @@ msgid "Waving plants"
msgstr "Vlnění rostlin"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Weblink color"
+msgstr "Barva obrysu bloku"
+
+#: 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"
@@ -6809,23 +7139,15 @@ msgid ""
"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.\n"
+"memory. Powers of 2 are recommended. This setting is ONLY applied if\n"
+"bilinear/trilinear/anisotropic filtering is enabled.\n"
"This is also used as the base node texture size for world-aligned\n"
"texture autoscaling."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Whether FreeType fonts are used, requires FreeType support to be compiled "
-"in.\n"
-"If disabled, bitmap and XML vectors fonts are used instead."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Whether nametag backgrounds should be shown by default.\n"
+"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
@@ -6867,8 +7189,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Width component of the initial window size."
-msgstr ""
+#, fuzzy
+msgid "Width component of the initial window size. Ignored in fullscreen mode."
+msgstr "Výšková část počáteční velikosti okna."
#: src/settings_translation_file.cpp
msgid "Width of the selection box lines around nodes."
@@ -6917,13 +7240,13 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Y of upper limit of large caves."
-msgstr "Maximální počet emerge front"
+msgstr "Hodnota Y pro horní hranici velkých jeskyní."
#: src/settings_translation_file.cpp
msgid "Y-distance over which caverns expand to full size."
msgstr ""
+"Vzdálenost Y, přes kterou se jeskynní dutiny rozšíří do plné velikosti."
#: src/settings_translation_file.cpp
msgid ""
@@ -6939,7 +7262,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Y-level of cavern upper limit."
-msgstr ""
+msgstr "Úroveň Y horní hranice jeskynních dutin."
#: src/settings_translation_file.cpp
msgid "Y-level of higher terrain that creates cliffs."
@@ -6954,34 +7277,23 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when saving mapblocks to disk.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when sending mapblocks to the client.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
+msgid "cURL file download timeout"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "cURL file download timeout"
-msgstr ""
+#, fuzzy
+msgid "cURL interactive timeout"
+msgstr "cURL timeout"
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
msgstr "cURL limit paralelních stahování"
-#: src/settings_translation_file.cpp
-msgid "cURL timeout"
-msgstr "cURL timeout"
+#~ msgid "- Creative Mode: "
+#~ msgstr "- Kreativní mód: "
+
+#~ msgid "- Damage: "
+#~ msgstr "- Zranění: "
#~ msgid ""
#~ "0 = parallax occlusion with slope information (faster).\n"
@@ -6990,6 +7302,9 @@ msgstr "cURL timeout"
#~ "0 = parallax occlusion s informacemi o sklonu (rychlejší).\n"
#~ "1 = mapování reliéfu (pomalejší, ale přesnější)."
+#~ msgid "Address / Port"
+#~ msgstr "Adresa / Port"
+
#~ msgid ""
#~ "Adjust the gamma encoding for the light tables. Higher numbers are "
#~ "brighter.\n"
@@ -7005,6 +7320,9 @@ msgstr "cURL timeout"
#~ msgid "Back"
#~ msgstr "Zpět"
+#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
+#~ msgstr "Bitová hloubka (bity na pixel) v celoobrazovkovém režimu."
+
#~ msgid "Bump Mapping"
#~ msgstr "Bump mapping"
@@ -7028,9 +7346,22 @@ msgstr "cURL timeout"
#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels."
#~ msgstr "Ovládá šířku tunelů, menší hodnota vytváří širší tunely."
+#~ msgid "Credits"
+#~ msgstr "Autoři"
+
#~ msgid "Crosshair color (R,G,B)."
#~ msgstr "Barva zaměřovače (R,G,B)."
+#~ msgid "Damage enabled"
+#~ msgstr "Zranění povoleno"
+
+#~ msgid ""
+#~ "Default timeout for cURL, stated in milliseconds.\n"
+#~ "Only has an effect if compiled with cURL."
+#~ msgstr ""
+#~ "Výchozí časový limit požadavku pro cURL, v milisekundách.\n"
+#~ "Má vliv, pouze pokud byl program sestaven s cURL."
+
#~ msgid ""
#~ "Defines areas of floatland smooth terrain.\n"
#~ "Smooth floatlands occur when noise > 0."
@@ -7088,12 +7419,27 @@ msgstr "cURL timeout"
#~ msgid "FPS in pause menu"
#~ msgstr "FPS v menu pauzy"
+#~ msgid "Fallback font shadow"
+#~ msgstr "Stín záložního písma"
+
+#~ msgid "Fallback font shadow alpha"
+#~ msgstr "Průhlednost stínu záložního písma"
+
+#~ msgid "Fallback font size"
+#~ msgstr "Velikost záložního písma"
+
#~ msgid "Floatland base height noise"
#~ msgstr "Šum základní výšky létajících ostrovů"
#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)."
#~ msgstr "Neprůhlednost stínu písma (od 0 do 255)."
+#~ msgid "FreeType fonts"
+#~ msgstr "Písma Freetype"
+
+#~ msgid "Full screen BPP"
+#~ msgstr "Bitová hloubka v celoobrazovkovém režimu"
+
#~ msgid "Gamma"
#~ msgstr "Gamma"
@@ -7103,12 +7449,18 @@ msgstr "cURL timeout"
#~ msgid "Generate normalmaps"
#~ msgstr "Generovat normálové mapy"
+#~ msgid "High-precision FPU"
+#~ msgstr "Výpočty ve FPU s vysokou přesností"
+
#~ msgid "IPv6 support."
#~ msgstr ""
#~ "Nastavuje reálnou délku dne.\n"
#~ "Např.: 72 = 20 minut, 360 = 4 minuty, 1 = 24 hodin, 0 = čas zůstává stále "
#~ "stejný."
+#~ msgid "Install: file: \"$1\""
+#~ msgstr "Instalace: soubor: \"$1\""
+
#, fuzzy
#~ msgid "Lava depth"
#~ msgstr "Hloubka velké jeskyně"
@@ -7132,6 +7484,9 @@ msgstr "cURL timeout"
#~ msgid "Minimap in surface mode, Zoom x4"
#~ msgstr "Minimapa v režimu povrch, Přiblížení x4"
+#~ msgid "Name / Password"
+#~ msgstr "Jméno / Heslo"
+
#~ msgid "Name/Password"
#~ msgstr "Jméno/Heslo"
@@ -7160,6 +7515,9 @@ msgstr "cURL timeout"
#~ msgid "Parallax occlusion scale"
#~ msgstr "Škála parallax occlusion"
+#~ msgid "PvP enabled"
+#~ msgstr "PvP (hráč proti hráči) povoleno"
+
#~ msgid "Reset singleplayer world"
#~ msgstr "Reset místního světa"
@@ -7167,12 +7525,29 @@ msgstr "cURL timeout"
#~ msgid "Select Package File:"
#~ msgstr "Vybrat soubor s modem:"
+#, fuzzy
+#~ msgid ""
+#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will "
+#~ "not be drawn."
+#~ msgstr ""
+#~ "Odsazení stínu písma, pokud je nastaveno na 0, stín nebude vykreslen."
+
+#~ msgid "Special"
+#~ msgstr "Speciální"
+
+#, fuzzy
+#~ msgid "Special key"
+#~ msgstr "Klávesa plížení"
+
#~ msgid "Start Singleplayer"
#~ msgstr "Start místní hry"
#~ msgid "Strength of generated normalmaps."
#~ msgstr "Síla vygenerovaných normálových map."
+#~ msgid "To enable shaders the OpenGL driver needs to be used."
+#~ msgstr "Pro zapnutí shaderů musíte používat OpenGL ovladač."
+
#~ msgid "Toggle Cinematic"
#~ msgstr "Plynulá kamera"
@@ -7184,3 +7559,9 @@ msgstr "cURL timeout"
#~ msgid "Yes"
#~ msgstr "Ano"
+
+#~ msgid "You died."
+#~ msgstr "Zemřel jsi."
+
+#~ msgid "needs_fallback_font"
+#~ msgstr "no"
diff --git a/po/da/minetest.po b/po/da/minetest.po
index 5a11a9779..732d9f304 100644
--- a/po/da/minetest.po
+++ b/po/da/minetest.po
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Danish (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-23 19:03+0100\n"
-"PO-Revision-Date: 2020-03-31 10:14+0000\n"
-"Last-Translator: sfan5 <sfan5@live.de>\n"
+"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"PO-Revision-Date: 2022-01-26 12:17+0000\n"
+"Last-Translator: Thomas Wagner Nielsen <thomas@viawords.com>\n"
"Language-Team: Danish <https://hosted.weblate.org/projects/minetest/minetest/"
"da/>\n"
"Language: da\n"
@@ -12,7 +12,46 @@ 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 4.0-dev\n"
+"X-Generator: Weblate 4.11-dev\n"
+
+#: builtin/client/chatcommands.lua
+msgid "Clear the out chat queue"
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Empty command."
+msgstr "Snakkekommandoer"
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Exit to main menu"
+msgstr "Afslut til menu"
+
+#: builtin/client/chatcommands.lua
+msgid "Invalid command: "
+msgstr "Ugyldig kommando: "
+
+#: builtin/client/chatcommands.lua
+msgid "Issued command: "
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "List online players"
+msgstr "Enlig spiller"
+
+#: builtin/client/chatcommands.lua
+msgid "Online players: "
+msgstr "Online-spillere: "
+
+#: builtin/client/chatcommands.lua
+msgid "The out chat queue is now empty."
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "This command is disabled by server."
+msgstr ""
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
@@ -22,11 +61,40 @@ msgstr "Genopstå"
msgid "You died"
msgstr "Du døde"
+#: builtin/common/chatcommands.lua
+msgid "Available commands:"
+msgstr "Tilgængelige kommandoer:"
+
+#: builtin/common/chatcommands.lua
+msgid "Available commands: "
+msgstr "Tilgængelige kommandoer: "
+
+#: builtin/common/chatcommands.lua
+msgid "Command not available: "
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "Get help for commands"
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid ""
+"Use '.help <cmd>' to get more information, or '.help all' to list everything."
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "[all | <cmd>]"
+msgstr ""
+
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
msgstr ""
#: builtin/fstk/ui.lua
+msgid "<none available>"
+msgstr ""
+
+#: builtin/fstk/ui.lua
#, fuzzy
msgid "An error occurred in a Lua script:"
msgstr "Der skete en fejl i Lua scriptet, muligvis af et mod:"
@@ -116,9 +184,8 @@ msgid "Mod:"
msgstr "Mod:"
#: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
msgid "No (optional) dependencies"
-msgstr "Valgfrie afhængigheder:"
+msgstr "Ingen (valgfrie) afhængigheder"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No game description provided."
@@ -238,6 +305,13 @@ msgid "Install missing dependencies"
msgstr "Valgfrie afhængigheder:"
#: builtin/mainmenu/dlg_contentstore.lua
+#, fuzzy
+msgid "Install: Unsupported file type or broken archive"
+msgstr ""
+"Installer mod: Filtypen \"$1\" er enten ikke understøttet, ellers er arkivet "
+"korrupt"
+
+#: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Mods"
@@ -557,7 +631,7 @@ msgstr "< Tilbage til siden Indstillinger"
msgid "Browse"
msgstr "Gennemse"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Deaktiveret"
@@ -583,7 +657,8 @@ msgid "Offset"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
-msgid "Persistance"
+#, fuzzy
+msgid "Persistence"
msgstr "Persistens"
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -602,7 +677,7 @@ msgstr "Gendan standard"
msgid "Scale"
msgstr "Skala"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
msgstr "Søg"
@@ -695,16 +770,6 @@ msgstr ""
"Installer mod: Kunne ikke finde passende mappe navn for samling af mods $1"
#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: Unsupported file type \"$1\" or broken archive"
-msgstr ""
-"Installer mod: Filtypen \"$1\" er enten ikke understøttet, ellers er arkivet "
-"korrupt"
-
-#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: file: \"$1\""
-msgstr "Installer mod: Fil: \"$1\""
-
-#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
msgstr "Kan ikke finde en korrekt mod eller samling af mods"
@@ -738,6 +803,42 @@ msgstr ""
"Prøv at slå den offentlige serverliste fra og til, og tjek din internet "
"forbindelse."
+#: builtin/mainmenu/tab_about.lua
+msgid "About"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active Contributors"
+msgstr "Aktive bidragere"
+
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Active renderer:"
+msgstr "Aktivt objektafsendelsesinterval"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Core Developers"
+msgstr "Primære udviklere"
+
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Open User Data Directory"
+msgstr "Vælg mappe"
+
+#: builtin/mainmenu/tab_about.lua
+msgid ""
+"Opens the directory that contains user-provided worlds, games, mods,\n"
+"and texture packs in a file manager / explorer."
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Contributors"
+msgstr "Tidligere bidragere"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Core Developers"
+msgstr "Tidligere primære udviklere"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Gennemse online indhold"
@@ -778,37 +879,6 @@ msgstr "Afinstaller den valgte pakke"
msgid "Use Texture Pack"
msgstr "Anvend teksturpakker"
-#: builtin/mainmenu/tab_credits.lua
-msgid "Active Contributors"
-msgstr "Aktive bidragere"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Core Developers"
-msgstr "Primære udviklere"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Credits"
-msgstr "Skabt af"
-
-#: builtin/mainmenu/tab_credits.lua
-#, fuzzy
-msgid "Open User Data Directory"
-msgstr "Vælg mappe"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid ""
-"Opens the directory that contains user-provided worlds, games, mods,\n"
-"and texture packs in a file manager / explorer."
-msgstr ""
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Previous Contributors"
-msgstr "Tidligere bidragere"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Previous Core Developers"
-msgstr "Tidligere primære udviklere"
-
#: builtin/mainmenu/tab_local.lua
msgid "Announce Server"
msgstr "Meddelelsesserver"
@@ -837,7 +907,7 @@ msgstr "Host Server"
msgid "Install games from ContentDB"
msgstr ""
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Name"
msgstr ""
@@ -849,7 +919,7 @@ msgstr "Ny"
msgid "No world created or selected!"
msgstr "Ingen verden oprettet eller valgt!"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Password"
msgstr "Nyt kodeord"
@@ -858,7 +928,7 @@ msgstr "Nyt kodeord"
msgid "Play Game"
msgstr "Start spil"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
msgstr "Port"
@@ -881,8 +951,13 @@ msgid "Start Game"
msgstr "Vær vært for spil"
#: builtin/mainmenu/tab_online.lua
-msgid "Address / Port"
-msgstr "Adresse/port"
+#, fuzzy
+msgid "Address"
+msgstr "Adresse"
+
+#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
+msgid "Clear"
+msgstr "Ryd"
#: builtin/mainmenu/tab_online.lua
msgid "Connect"
@@ -892,35 +967,47 @@ msgstr "Forbind"
msgid "Creative mode"
msgstr "Kreativ tilstand"
+#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "Damage enabled"
-msgstr "Skade aktiveret"
+#, fuzzy
+msgid "Damage / PvP"
+msgstr "Skade"
#: builtin/mainmenu/tab_online.lua
msgid "Del. Favorite"
msgstr "Slet favorit"
#: builtin/mainmenu/tab_online.lua
-msgid "Favorite"
+#, fuzzy
+msgid "Favorites"
msgstr "Favorit"
#: builtin/mainmenu/tab_online.lua
+msgid "Incompatible Servers"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Join Game"
msgstr "Vær vært for spil"
#: builtin/mainmenu/tab_online.lua
-msgid "Name / Password"
-msgstr "Navn/adgangskode"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Ping"
-#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "PvP enabled"
-msgstr "Spiller mod spiller aktiveret"
+#, fuzzy
+msgid "Public Servers"
+msgstr "Meddelelsesserver"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Refresh"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Server Description"
+msgstr "Serverbeskrivelse"
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -964,11 +1051,32 @@ msgstr "Skift tastatur-bindinger"
msgid "Connected Glass"
msgstr "Forbundet glas"
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+#, fuzzy
+msgid "Dynamic shadows"
+msgstr "Fontskygge"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Dynamic shadows: "
+msgstr ""
+
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
msgstr "Smukke blade"
#: builtin/mainmenu/tab_settings.lua
+msgid "High"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Low"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Medium"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Mipmap"
msgstr "Mipmap"
@@ -1042,10 +1150,6 @@ msgstr "Glat belysning"
msgid "Texturing:"
msgstr "Teksturering:"
-#: builtin/mainmenu/tab_settings.lua
-msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "For at aktivere dybdeskabere skal OpenGL-driveren bruges."
-
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
msgstr "Toneoversættelse"
@@ -1060,6 +1164,14 @@ msgid "Trilinear Filter"
msgstr "Tri-lineær filtréring"
#: builtin/mainmenu/tab_settings.lua
+msgid "Ultra High"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Very Low"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
msgstr "Bølgende blade"
@@ -1072,7 +1184,7 @@ msgstr "Bølgende blade"
msgid "Waving Plants"
msgstr "Bølgende planter"
-#: src/client/client.cpp
+#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Forbindelses fejl (tidsfristen udløb)."
@@ -1101,8 +1213,8 @@ msgid "Connection error (timed out?)"
msgstr "Forbindelses fejl (udløbelse af tidsfrist?)"
#: src/client/clientlauncher.cpp
-msgid "Could not find or load game \""
-msgstr "Kunne ikke finde eller indlæse spil \""
+msgid "Could not find or load game: "
+msgstr "Kunne ikke finde eller indlæse spillet: "
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
@@ -1133,18 +1245,6 @@ msgstr ""
msgid "Provided world path doesn't exist: "
msgstr "Angivne sti til verdenen findes ikke: "
-#. ~ DO NOT TRANSLATE THIS LITERALLY!
-#. This is a special string. Put either "no" or "yes"
-#. into the translation field (literally).
-#. Choose "yes" if the language requires use of the fallback
-#. font, "no" otherwise.
-#. The fallback font is (normally) required for languages with
-#. non-Latin script, like Chinese.
-#. When in doubt, test your translation.
-#: src/client/fontengine.cpp
-msgid "needs_fallback_font"
-msgstr "no"
-
#: src/client/game.cpp
msgid ""
"\n"
@@ -1158,14 +1258,6 @@ msgid "- Address: "
msgstr "- Adresse: "
#: src/client/game.cpp
-msgid "- Creative Mode: "
-msgstr "- Kreativ tilstand: "
-
-#: src/client/game.cpp
-msgid "- Damage: "
-msgstr "- Skade: "
-
-#: src/client/game.cpp
msgid "- Mode: "
msgstr "- Tilstand: "
@@ -1188,6 +1280,16 @@ msgstr "- Servernavn: "
#: src/client/game.cpp
#, fuzzy
+msgid "A serialization error occurred:"
+msgstr "Der skete en fejl:"
+
+#: src/client/game.cpp
+#, c-format
+msgid "Access denied. Reason: %s"
+msgstr ""
+
+#: src/client/game.cpp
+#, fuzzy
msgid "Automatic forward disabled"
msgstr "Fremadtast"
@@ -1197,6 +1299,22 @@ msgid "Automatic forward enabled"
msgstr "Fremadtast"
#: src/client/game.cpp
+msgid "Block bounds hidden"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for all blocks"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for current block"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for nearby blocks"
+msgstr ""
+
+#: src/client/game.cpp
#, fuzzy
msgid "Camera update disabled"
msgstr "Tast til ændring af kameraopdatering"
@@ -1207,6 +1325,10 @@ msgid "Camera update enabled"
msgstr "Tast til ændring af kameraopdatering"
#: src/client/game.cpp
+msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Change Password"
msgstr "Skift kodeord"
@@ -1221,6 +1343,11 @@ msgid "Cinematic mode enabled"
msgstr "Tast for filmisk tilstand"
#: src/client/game.cpp
+#, fuzzy
+msgid "Client disconnected"
+msgstr "Klient modding"
+
+#: src/client/game.cpp
msgid "Client side scripting is disabled"
msgstr ""
@@ -1229,6 +1356,10 @@ msgid "Connecting to server..."
msgstr "Forbinder til server..."
#: src/client/game.cpp
+msgid "Connection failed for unknown reason"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Continue"
msgstr "Fortsæt"
@@ -1266,6 +1397,11 @@ msgstr ""
"- %s: snakke (chat)\n"
#: src/client/game.cpp
+#, c-format
+msgid "Couldn't resolve address: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Creating client..."
msgstr "Opretter klient ..."
@@ -1402,6 +1538,11 @@ msgid "Minimap currently disabled by game or mod"
msgstr ""
#: src/client/game.cpp
+#, fuzzy
+msgid "Multiplayer"
+msgstr "Enlig spiller"
+
+#: src/client/game.cpp
msgid "Noclip mode disabled"
msgstr ""
@@ -1477,6 +1618,21 @@ msgid "Sound unmuted"
msgstr "Lydniveau"
#: src/client/game.cpp
+#, c-format
+msgid "The server is probably running a different version of %s."
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to connect to %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to listen on %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
#, fuzzy, c-format
msgid "Viewing range changed to %d"
msgstr "Lydstyrke ændret til %d%%"
@@ -1548,10 +1704,6 @@ msgid "Caps Lock"
msgstr "Caps Lock"
#: src/client/keycode.cpp
-msgid "Clear"
-msgstr "Ryd"
-
-#: src/client/keycode.cpp
msgid "Control"
msgstr "Control"
@@ -1817,6 +1969,15 @@ msgstr ""
msgid "Minimap in texture mode"
msgstr ""
+#: src/gui/guiChatConsole.cpp
+#, fuzzy
+msgid "Failed to open webpage"
+msgstr "Kunne ikke hente $1"
+
+#: src/gui/guiChatConsole.cpp
+msgid "Opening webpage"
+msgstr ""
+
#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
msgid "Passwords do not match!"
msgstr "Kodeordene er ikke ens!"
@@ -1841,7 +2002,7 @@ msgstr "Fortsæt"
#: src/gui/guiKeyChangeMenu.cpp
#, fuzzy
-msgid "\"Special\" = climb down"
+msgid "\"Aux1\" = climb down"
msgstr "\"Brug\" = klatre ned"
#: src/gui/guiKeyChangeMenu.cpp
@@ -1854,10 +2015,18 @@ msgid "Automatic jumping"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Aux1"
+msgstr ""
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
msgstr "Baglæns"
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Block bounds"
+msgstr ""
+
+#: src/gui/guiKeyChangeMenu.cpp
#, fuzzy
msgid "Change camera"
msgstr "Skift bindinger"
@@ -1951,10 +2120,6 @@ msgid "Sneak"
msgstr "Snige"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Special"
-msgstr ""
-
-#: src/gui/guiKeyChangeMenu.cpp
#, fuzzy
msgid "Toggle HUD"
msgstr "Omstil flyvning"
@@ -2021,8 +2186,9 @@ msgid "Muted"
msgstr "Lydløs"
#: src/gui/guiVolumeChange.cpp
-msgid "Sound Volume: "
-msgstr "Lydstyrke: "
+#, fuzzy, c-format
+msgid "Sound Volume: %d%%"
+msgstr "Lydstyrke: %d%%"
#. ~ Imperative, as in "Enter/type in text".
#. Don't forget the space.
@@ -2045,8 +2211,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"(Android) Use virtual joystick to trigger \"aux\" button.\n"
-"If enabled, virtual joystick will also tap \"aux\" button when out of main "
+"(Android) Use virtual joystick to trigger \"Aux1\" button.\n"
+"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
@@ -2257,6 +2423,10 @@ msgstr ""
"4k-skærme."
#: src/settings_translation_file.cpp
+msgid "Adjust the detected display density, used for scaling UI elements."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, c-format
msgid ""
"Adjusts the density of the floatland layer.\n"
@@ -2373,6 +2543,16 @@ msgid "Autoscaling mode"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Aux1 key"
+msgstr "Hop-tast"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Aux1 key for climbing/descending"
+msgstr "Tast brugt til at klatre op/ned"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Tilbage-tast"
@@ -2422,10 +2602,6 @@ msgid "Biome noise"
msgstr "Biom stø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."
-
-#: src/settings_translation_file.cpp
msgid "Block send optimize distance"
msgstr ""
@@ -2533,6 +2709,16 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Chat command time message threshold"
+msgstr "Ørkenstøjtærskel"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chat commands"
+msgstr "Snakkekommandoer"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Chat font size"
msgstr "Skriftstørrelse"
@@ -2568,8 +2754,8 @@ msgid "Chat toggle key"
msgstr "Tast for snak (chat)"
#: src/settings_translation_file.cpp
-msgid "Chatcommands"
-msgstr "Snakkekommandoer"
+msgid "Chat weblinks"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Chunk size"
@@ -2588,6 +2774,12 @@ msgid "Clean transparent textures"
msgstr "Rene gennemsigtige teksturer"
#: src/settings_translation_file.cpp
+msgid ""
+"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console "
+"output."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Client"
msgstr "Klient"
@@ -2634,6 +2826,11 @@ msgid "Colored fog"
msgstr "Farvet tåge"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Colored shadows"
+msgstr "Farvet tåge"
+
+#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of flags to hide in the content repository.\n"
"\"nonfree\" can be used to hide packages which do not qualify as 'free "
@@ -2668,6 +2865,22 @@ msgid "Command key"
msgstr "Kommandotast"
#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when saving mapblocks to disk.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when sending mapblocks to the client.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Connect glass"
msgstr "Forbind glas"
@@ -2764,7 +2977,7 @@ msgstr "Crosshair alpha"
#, fuzzy
msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
-"Also controls the object crosshair color"
+"This also applies to the object crosshair."
msgstr "Crosshair alpha (uigennemsigtighed, mellem 0 og 255)."
#: src/settings_translation_file.cpp
@@ -2844,11 +3057,10 @@ msgstr "Standard spil"
#: src/settings_translation_file.cpp
msgid ""
-"Default timeout for cURL, stated in milliseconds.\n"
-"Only has an effect if compiled with cURL."
+"Define shadow filtering quality.\n"
+"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
+"but also uses more resources."
msgstr ""
-"Standardtidsudløb for cURL, angivet i millisekunder.\n"
-"Har kun effekt hvis kompileret med cURL."
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
@@ -2975,6 +3187,10 @@ msgid "Disallow empty passwords"
msgstr "Tillad ikke tomme adgangskoder"
#: src/settings_translation_file.cpp
+msgid "Display Density Scaling Factor"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Domænenavn for server, til visning i serverlisten."
@@ -3022,6 +3238,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enable Poisson disk filtering.\n"
+"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF "
+"filtering."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable colored shadows.\n"
+"On true translucent nodes cast colored shadows. This is expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable console window"
msgstr "Aktivér konsolvindue"
@@ -3148,6 +3377,12 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enables tradeoffs that reduce CPU load or increase rendering performance\n"
+"at the expense of minor visual glitches that do not impact game playability."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr "Udskrivningsinterval for motorprofileringsdata"
@@ -3188,18 +3423,6 @@ msgid "Fallback font path"
msgstr "Reserveskrifttype"
#: src/settings_translation_file.cpp
-msgid "Fallback font shadow"
-msgstr "Skygge for reserveskrifttypen"
-
-#: src/settings_translation_file.cpp
-msgid "Fallback font shadow alpha"
-msgstr "Skyggealfa for reserveskrifttypen"
-
-#: src/settings_translation_file.cpp
-msgid "Fallback font size"
-msgstr "Størrelse for reserveskrifttypen"
-
-#: src/settings_translation_file.cpp
msgid "Fast key"
msgstr "Hurtigtast"
@@ -3218,7 +3441,7 @@ msgstr "Hurtig bevægelse"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
-"Fast movement (via the \"special\" key).\n"
+"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
"Hurtig bevægelse (via tast).\n"
@@ -3260,9 +3483,9 @@ msgstr "Filmisk toneoversættelse"
#, fuzzy
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."
+"which PNG optimizers usually discard, often resulting in dark or\n"
+"light edges to transparent textures. Apply a filter to clean that up\n"
+"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
"Filtrerede teksturer kan blande RGB-værdier med fuldt gennemsigtige naboer,\n"
"som PNG-optimeringsprogrammer normalt fjerner, undertiden resulterende i "
@@ -3368,15 +3591,15 @@ msgid "Font size"
msgstr "Skriftstørrelse"
#: src/settings_translation_file.cpp
-msgid "Font size of the default font in point (pt)."
+msgid "Font size divisible by"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the fallback font in point (pt)."
+msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the monospace font in point (pt)."
+msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3387,6 +3610,17 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"For pixel-style fonts that do not scale well, this ensures that font sizes "
+"used\n"
+"with this font will always be divisible by this value, in pixels. For "
+"instance,\n"
+"a pixel font 16 pixels tall should have this set to 16, so it will only ever "
+"be\n"
+"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Format of player chat messages. The following strings are valid "
"placeholders:\n"
"@name, @message, @timestamp (optional)"
@@ -3454,11 +3688,6 @@ msgid "Fraction of the visible distance at which fog starts to be rendered"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "FreeType fonts"
-msgstr "Freetype-skrifttyper"
-
-#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are generated for clients, stated in mapblocks (16 "
"nodes)."
@@ -3487,10 +3716,6 @@ msgid "Full screen"
msgstr "Fuld skærm"
#: src/settings_translation_file.cpp
-msgid "Full screen BPP"
-msgstr "Fuldskærm BPP"
-
-#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
msgstr "Fuldskærmstilstand."
@@ -3515,7 +3740,7 @@ msgstr "Globale tilbagekald"
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."
+"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
"Globale kortoprettelsesattributter.\n"
"I Mapgen v6 kontrollerer flaget »decorations« alle dekorationer undtagen "
@@ -3606,7 +3831,9 @@ msgid "Heat noise"
msgstr "Varmestøj"
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+#, fuzzy
+msgid ""
+"Height component of the initial window size. Ignored in fullscreen mode."
msgstr "Højdekomponent for den oprindelige vinduestørrelse."
#: src/settings_translation_file.cpp
@@ -3619,10 +3846,6 @@ msgid "Height select noise"
msgstr "Højde Vælg støj"
#: src/settings_translation_file.cpp
-msgid "High-precision FPU"
-msgstr "Højpræcisions FPU"
-
-#: src/settings_translation_file.cpp
msgid "Hill steepness"
msgstr "Bakkestejlhed"
@@ -3864,8 +4087,7 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
-"If disabled, \"special\" key is used to fly fast if both fly and fast mode "
-"are\n"
+"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
"Hvis deaktiveret bruges »brug«-tasten til at flyve hurtig hvis både flyvning "
@@ -3893,8 +4115,8 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
-"If enabled, \"special\" key instead of \"sneak\" key is used for climbing "
-"down and\n"
+"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down "
+"and\n"
"descending."
msgstr ""
"Hvis aktiveret bruges »brug«-tasten i stedet for »snig«-tasten til at klatre "
@@ -3951,6 +4173,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If the execution of a chat command takes longer than this specified time in\n"
+"seconds, add the time information to the chat command message"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If the file size of debug.txt exceeds the number of megabytes specified in\n"
"this setting when it is opened, the file is moved to debug.txt.1,\n"
"deleting an older debug.txt.1 if it exists.\n"
@@ -4003,7 +4231,8 @@ msgstr ""
"Er normalt kun krævet af kerne/indbygningsbidragydere"
#: src/settings_translation_file.cpp
-msgid "Instrument chatcommands on registration."
+#, fuzzy
+msgid "Instrument chat commands on registration."
msgstr "Udstyr chatkommandoer ved registrering."
#: src/settings_translation_file.cpp
@@ -4093,7 +4322,7 @@ msgid "Joystick button repetition interval"
msgstr "Joystick-knaps gentagelsesinterval"
#: src/settings_translation_file.cpp
-msgid "Joystick deadzone"
+msgid "Joystick dead zone"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5164,11 +5393,6 @@ msgstr ""
"sete retning."
#: src/settings_translation_file.cpp
-msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
-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 ""
@@ -5262,6 +5486,11 @@ msgid "Map save interval"
msgstr "Interval for kortlagring"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Map shadows update frames"
+msgstr "Væskeopdateringsudløsning"
+
+#: src/settings_translation_file.cpp
msgid "Mapblock limit"
msgstr "Kortblokbegrænsning"
@@ -5385,6 +5614,10 @@ msgid "Maximum FPS when the window is not focused, or when the game is paused."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum distance to render shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
msgstr ""
@@ -5490,7 +5723,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum time in ms a file download (e.g. a mod download) may take."
+msgid ""
+"Maximum time a file download (e.g. a mod download) may take, stated in "
+"milliseconds."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum time an interactive request (e.g. server list fetch) may take, "
+"stated in milliseconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5556,7 +5797,7 @@ msgid "Mod channels"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Modifies the size of the hudbar elements."
+msgid "Modifies the size of the HUD elements."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5568,6 +5809,10 @@ msgid "Monospace font size"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Monospace font size divisible by"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mountain height noise"
msgstr ""
@@ -5690,7 +5935,7 @@ 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"
+"This is a trade-off between SQLite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
@@ -5709,21 +5954,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"Open the pause menu when the window's focus is lost. Does not pause if a "
"formspec is\n"
"open."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Optional override for chat weblink color."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
-"Path of the fallback font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path of the fallback font. Must be a TrueType font.\n"
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
@@ -5746,17 +5988,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the default font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the monospace font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
@@ -5815,6 +6053,11 @@ msgid "Player versus player"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Poisson filtering"
+msgstr "Bilineær filtrering"
+
+#: src/settings_translation_file.cpp
msgid ""
"Port to connect to (UDP).\n"
"Note that the port field in the main menu overrides this setting."
@@ -5859,9 +6102,9 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Prometheus listener address.\n"
-"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
+"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
"enable metrics listener for Prometheus on that address.\n"
-"Metrics can be fetch on http://127.0.0.1:30000/metrics"
+"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6181,6 +6424,35 @@ msgid "Set the maximum character length of a chat message sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Set the shadow strength.\n"
+"Lower value means lighter shadows, higher value means darker shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the soft shadow radius size.\n"
+"Lower values mean sharper shadows, bigger values mean softer shadows.\n"
+"Minimum value: 1.0; maximum value: 10.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the tilt of Sun/Moon orbit in degrees.\n"
+"Value of 0 means no tilt / vertical orbit.\n"
+"Minimum value: 0.0; maximum value: 60.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Set to true to enable Shadow Mapping.\n"
+"Requires shaders to be enabled."
+msgstr ""
+"Sat til true (sand) aktiverer bølgende blade.\n"
+"Kræver at dybdeskabere er aktiveret."
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Set to true to enable waving leaves.\n"
@@ -6208,6 +6480,13 @@ msgstr ""
"Kræver at dybdeskabere er aktiveret."
#: src/settings_translation_file.cpp
+msgid ""
+"Sets shadow texture quality to 32 bits.\n"
+"On false, 16 bits texture will be used.\n"
+"This can cause much more artifacts in the shadow."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Shader path"
msgstr "Shader sti"
@@ -6226,6 +6505,23 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Shadow filter quality"
+msgstr "Skærmbilledkvalitet"
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map max distance in nodes to render shadows"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture in 32 bits"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture size"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Shadow offset (in pixels) of the default font. If 0, then shadow will not be "
"drawn."
@@ -6233,12 +6529,8 @@ msgstr ""
"Forskydning for skrifttypeskygge, hvis 0 så vil skygge ikke blive tegnet."
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid ""
-"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not "
-"be drawn."
+msgid "Shadow strength"
msgstr ""
-"Forskydning for skrifttypeskygge, hvis 0 så vil skygge ikke blive tegnet."
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
@@ -6259,7 +6551,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Show nametag backgrounds by default"
+msgid "Show name tag backgrounds by default"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6284,6 +6576,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Sky Body Orbit Tilt"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Slice w"
msgstr ""
@@ -6339,18 +6635,13 @@ msgid "Sneaking speed, in nodes per second."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Sound"
-msgstr "Lyd"
-
-#: src/settings_translation_file.cpp
#, fuzzy
-msgid "Special key"
-msgstr "Snigetast"
+msgid "Soft shadow radius"
+msgstr "Alfa for skrifttypeskygge"
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Special key for climbing/descending"
-msgstr "Tast brugt til at klatre op/ned"
+msgid "Sound"
+msgstr "Lyd"
#: src/settings_translation_file.cpp
msgid ""
@@ -6369,6 +6660,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Spread a complete update of shadow map over given amount of frames.\n"
+"Higher values might make shadows laggy, lower values\n"
+"will consume more resources.\n"
+"Minimum value: 1; maximum value: 16"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Spread of light curve boost range.\n"
"Controls the width of the range to be boosted.\n"
"Standard deviation of the light curve boost Gaussian."
@@ -6480,6 +6779,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Texture size to render the shadow map on.\n"
+"This must be a power of two.\n"
+"Bigger numbers create better shadows but it is also more expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Textures on a node may be aligned either to the node or to the world.\n"
"The former mode suits better things like machines, furniture, etc., while\n"
"the latter makes stairs and microblocks fit surroundings better.\n"
@@ -6493,7 +6799,7 @@ msgid "The URL for the content repository"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "The deadzone of the joystick"
+msgid "The dead zone of the joystick"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6552,7 +6858,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"The rendering back-end for Irrlicht.\n"
+"The rendering back-end.\n"
"A restart is required after changing this.\n"
"Note: On Android, stick with OGLES1 if unsure! App may fail to start "
"otherwise.\n"
@@ -6563,7 +6869,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"The sensitivity of the joystick axes for moving the\n"
-"ingame view frustum around."
+"in-game view frustum around."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6659,6 +6965,10 @@ msgid "Touch screen threshold"
msgstr "Strandstøjtærskel"
#: src/settings_translation_file.cpp
+msgid "Tradeoffs for performance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6729,7 +7039,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Use mip mapping to scale textures. May slightly increase performance,\n"
+"Use mipmapping to scale textures. May slightly increase performance,\n"
"especially when using a high resolution texture pack.\n"
"Gamma correct downscaling is not supported."
msgstr ""
@@ -6845,7 +7155,7 @@ msgid "Viewing range"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Virtual joystick triggers aux button"
+msgid "Virtual joystick triggers Aux1 button"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6923,6 +7233,10 @@ msgid "Waving plants"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Weblink color"
+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"
@@ -6943,23 +7257,15 @@ msgid ""
"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.\n"
+"memory. Powers of 2 are recommended. This setting is ONLY applied if\n"
+"bilinear/trilinear/anisotropic filtering is enabled.\n"
"This is also used as the base node texture size for world-aligned\n"
"texture autoscaling."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Whether FreeType fonts are used, requires FreeType support to be compiled "
-"in.\n"
-"If disabled, bitmap and XML vectors fonts are used instead."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Whether nametag backgrounds should be shown by default.\n"
+"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
@@ -7001,8 +7307,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Width component of the initial window size."
-msgstr ""
+#, fuzzy
+msgid "Width component of the initial window size. Ignored in fullscreen mode."
+msgstr "Højdekomponent for den oprindelige vinduestørrelse."
#: src/settings_translation_file.cpp
msgid "Width of the selection box lines around nodes."
@@ -7088,34 +7395,23 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when saving mapblocks to disk.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when sending mapblocks to the client.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
+msgid "cURL file download timeout"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "cURL file download timeout"
-msgstr ""
+#, fuzzy
+msgid "cURL interactive timeout"
+msgstr "cURL-tidsudløb"
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
msgstr ""
-#: src/settings_translation_file.cpp
-msgid "cURL timeout"
-msgstr "cURL-tidsudløb"
+#~ msgid "- Creative Mode: "
+#~ msgstr "- Kreativ tilstand: "
+
+#~ msgid "- Damage: "
+#~ msgstr "- Skade: "
#~ msgid ""
#~ "0 = parallax occlusion with slope information (faster).\n"
@@ -7124,6 +7420,9 @@ msgstr "cURL-tidsudløb"
#~ "0 = parallax-okklusion med kurveinformation (hurtigere).\n"
#~ "1 = relief-oversættelse (langsommere, mere præcis)."
+#~ msgid "Address / Port"
+#~ msgstr "Adresse/port"
+
#~ msgid ""
#~ "Adjust the gamma encoding for the light tables. Higher numbers are "
#~ "brighter.\n"
@@ -7138,6 +7437,9 @@ msgstr "cURL-tidsudløb"
#~ msgid "Back"
#~ msgstr "Tilbage"
+#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
+#~ msgstr "Bit per billedpunkt (a.k.a. farvedybde) i fuldskærmtilstand."
+
#, fuzzy
#~ msgid "Bump Mapping"
#~ msgstr "Bump Mapping"
@@ -7156,14 +7458,27 @@ msgstr "cURL-tidsudløb"
#~ msgstr ""
#~ "Styrer bredden af tunneller. En lavere værdi giver bredere tunneller."
+#~ msgid "Credits"
+#~ msgstr "Skabt af"
+
#~ msgid "Crosshair color (R,G,B)."
#~ msgstr "Crosshair-farve (R,G,B)."
+#~ msgid "Damage enabled"
+#~ msgstr "Skade aktiveret"
+
#, fuzzy
#~ msgid "Darkness sharpness"
#~ msgstr "Søstejlhed"
#~ msgid ""
+#~ "Default timeout for cURL, stated in milliseconds.\n"
+#~ "Only has an effect if compiled with cURL."
+#~ msgstr ""
+#~ "Standardtidsudløb for cURL, angivet i millisekunder.\n"
+#~ "Har kun effekt hvis kompileret med cURL."
+
+#~ msgid ""
#~ "Defines sampling step of texture.\n"
#~ "A higher value results in smoother normal maps."
#~ msgstr ""
@@ -7214,9 +7529,25 @@ msgstr "cURL-tidsudløb"
#~ msgid "FPS in pause menu"
#~ msgstr "FPS i pausemenu"
+#~ msgid "Fallback font shadow"
+#~ msgstr "Skygge for reserveskrifttypen"
+
+#~ msgid "Fallback font shadow alpha"
+#~ msgstr "Skyggealfa for reserveskrifttypen"
+
+#~ msgid "Fallback font size"
+#~ msgstr "Størrelse for reserveskrifttypen"
+
#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)."
#~ msgstr "Alfa for skrifttypeskygge (uigennemsigtighed, mellem 0 og 255)."
+#, fuzzy
+#~ msgid "FreeType fonts"
+#~ msgstr "Freetype-skrifttyper"
+
+#~ msgid "Full screen BPP"
+#~ msgstr "Fuldskærm BPP"
+
#~ msgid "Gamma"
#~ msgstr "Gamma"
@@ -7227,9 +7558,15 @@ msgstr "cURL-tidsudløb"
#~ msgid "Generate normalmaps"
#~ msgstr "Opret normalkort"
+#~ msgid "High-precision FPU"
+#~ msgstr "Højpræcisions FPU"
+
#~ msgid "IPv6 support."
#~ msgstr "Understøttelse af IPv6."
+#~ msgid "Install: file: \"$1\""
+#~ msgstr "Installer mod: Fil: \"$1\""
+
#, fuzzy
#~ msgid "Lava depth"
#~ msgstr "Dybde for stor hule"
@@ -7244,6 +7581,13 @@ msgstr "cURL-tidsudløb"
#~ msgid "Main menu style"
#~ msgstr "Hovedmenuskript"
+#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
+#~ msgstr ""
+#~ "Får DirectX til at fungere med LuaJIT. Deaktiver hvis det giver problemer."
+
+#~ msgid "Name / Password"
+#~ msgstr "Navn/adgangskode"
+
#~ msgid "Name/Password"
#~ msgstr "Navn/kodeord"
@@ -7260,6 +7604,9 @@ msgstr "cURL-tidsudløb"
#~ msgid "Parallax occlusion scale"
#~ msgstr "Parallax-okklusion"
+#~ msgid "PvP enabled"
+#~ msgstr "Spiller mod spiller aktiveret"
+
#~ msgid "Reset singleplayer world"
#~ msgstr "Nulstil spillerverden"
@@ -7270,11 +7617,32 @@ msgstr "cURL-tidsudløb"
#~ msgid "Shadow limit"
#~ msgstr "Skygge grænse"
+#, fuzzy
+#~ msgid ""
+#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will "
+#~ "not be drawn."
+#~ msgstr ""
+#~ "Forskydning for skrifttypeskygge, hvis 0 så vil skygge ikke blive tegnet."
+
+#, fuzzy
+#~ msgid "Special key"
+#~ msgstr "Snigetast"
+
#~ msgid "Start Singleplayer"
#~ msgstr "Enlig spiller"
+#~ msgid "To enable shaders the OpenGL driver needs to be used."
+#~ msgstr "For at aktivere dybdeskabere skal OpenGL-driveren bruges."
+
#~ msgid "Toggle Cinematic"
#~ msgstr "Aktiver filmisk"
#~ msgid "Yes"
#~ msgstr "Ja"
+
+#, fuzzy
+#~ msgid "You died."
+#~ msgstr "Du døde"
+
+#~ msgid "needs_fallback_font"
+#~ msgstr "no"
diff --git a/po/de/minetest.po b/po/de/minetest.po
index f3894fe6f..972359a32 100644
--- a/po/de/minetest.po
+++ b/po/de/minetest.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: German (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-23 19:03+0100\n"
-"PO-Revision-Date: 2021-03-02 15:50+0000\n"
+"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"PO-Revision-Date: 2022-01-29 21:28+0000\n"
"Last-Translator: Wuzzy <almikes@aol.com>\n"
"Language-Team: German <https://hosted.weblate.org/projects/minetest/minetest/"
"de/>\n"
@@ -12,7 +12,43 @@ 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 4.5\n"
+"X-Generator: Weblate 4.11-dev\n"
+
+#: builtin/client/chatcommands.lua
+msgid "Clear the out chat queue"
+msgstr "Die ausgehende Chatwarteschlange leeren"
+
+#: builtin/client/chatcommands.lua
+msgid "Empty command."
+msgstr "Leerer Befehl."
+
+#: builtin/client/chatcommands.lua
+msgid "Exit to main menu"
+msgstr "Zum Hauptmenü verlassen"
+
+#: builtin/client/chatcommands.lua
+msgid "Invalid command: "
+msgstr "Ungültiger Befehl: "
+
+#: builtin/client/chatcommands.lua
+msgid "Issued command: "
+msgstr "Befehl erteilt: "
+
+#: builtin/client/chatcommands.lua
+msgid "List online players"
+msgstr "Online spielende Spieler auflisten"
+
+#: builtin/client/chatcommands.lua
+msgid "Online players: "
+msgstr "Online-Spieler: "
+
+#: builtin/client/chatcommands.lua
+msgid "The out chat queue is now empty."
+msgstr "Die ausgehende Chatwarteschlange ist nun leer."
+
+#: builtin/client/chatcommands.lua
+msgid "This command is disabled by server."
+msgstr "Dieser Befehl ist vom Server deaktiviert."
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
@@ -22,11 +58,42 @@ msgstr "Wiederbeleben"
msgid "You died"
msgstr "Sie sind gestorben"
+#: builtin/common/chatcommands.lua
+msgid "Available commands:"
+msgstr "Verfügbare Befehle:"
+
+#: builtin/common/chatcommands.lua
+msgid "Available commands: "
+msgstr "Verfügbare Befehle: "
+
+#: builtin/common/chatcommands.lua
+msgid "Command not available: "
+msgstr "Befehl nicht verfügbar: "
+
+#: builtin/common/chatcommands.lua
+msgid "Get help for commands"
+msgstr "Hilfe für Befehle erhalten"
+
+#: builtin/common/chatcommands.lua
+msgid ""
+"Use '.help <cmd>' to get more information, or '.help all' to list everything."
+msgstr ""
+"„.help <Befehl>“ benutzen, um mehr Informationen zu erhalten, oder „.help "
+"all“ benutzen, um alles aufzulisten."
+
+#: builtin/common/chatcommands.lua
+msgid "[all | <cmd>]"
+msgstr "[all | <Befehl>]"
+
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
msgstr "OK"
#: builtin/fstk/ui.lua
+msgid "<none available>"
+msgstr "<keine verfügbar>"
+
+#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
msgstr "In einem Lua-Skript ist ein Fehler aufgetreten:"
@@ -230,6 +297,10 @@ msgid "Install missing dependencies"
msgstr "Fehlende Abhängigkeiten installieren"
#: builtin/mainmenu/dlg_contentstore.lua
+msgid "Install: Unsupported file type or broken archive"
+msgstr "Installation: Nicht unterstützter Dateityp oder kaputtes Archiv"
+
+#: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Mods"
@@ -272,7 +343,7 @@ msgstr "Deinstallieren"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update"
-msgstr "Aktualisieren"
+msgstr "Update"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update All [$1]"
@@ -490,7 +561,7 @@ msgstr "Sind Sie sicher, dass „$1“ gelöscht werden soll?"
#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua
#: src/client/keycode.cpp
msgid "Delete"
-msgstr "Entfernen"
+msgstr "Löschen"
#: builtin/mainmenu/dlg_delete_content.lua
msgid "pkgmgr: failed to delete \"$1\""
@@ -536,7 +607,7 @@ msgstr "< Einstellungsseite"
msgid "Browse"
msgstr "Durchsuchen"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Deaktiviert"
@@ -561,7 +632,7 @@ msgid "Offset"
msgstr "Versatz"
#: builtin/mainmenu/dlg_settings_advanced.lua
-msgid "Persistance"
+msgid "Persistence"
msgstr "Persistenz"
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -580,7 +651,7 @@ msgstr "Zurücksetzen"
msgid "Scale"
msgstr "Skalierung"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
msgstr "Suchen"
@@ -674,15 +745,6 @@ msgstr ""
"gefunden werden"
#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: Unsupported file type \"$1\" or broken archive"
-msgstr ""
-"Installation: Nicht unterstützter Dateityp „$1“ oder fehlerhaftes Archiv"
-
-#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: file: \"$1\""
-msgstr "Installation: Datei: „$1“"
-
-#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
msgstr "Keine gültige Mod oder Modpack gefunden"
@@ -716,6 +778,42 @@ msgstr ""
"Versuchen Sie die öffentliche Serverliste neu zu laden und prüfen Sie Ihre "
"Internetverbindung."
+#: builtin/mainmenu/tab_about.lua
+msgid "About"
+msgstr "Über"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active Contributors"
+msgstr "Aktive Mitwirkende"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active renderer:"
+msgstr "Aktiver Renderer:"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Core Developers"
+msgstr "Hauptentwickler"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Open User Data Directory"
+msgstr "Benutzerdatenverzeichnis öffnen"
+
+#: builtin/mainmenu/tab_about.lua
+msgid ""
+"Opens the directory that contains user-provided worlds, games, mods,\n"
+"and texture packs in a file manager / explorer."
+msgstr ""
+"Öffnet das Verzeichnis, welches die Welten, Spiele, Mods und\n"
+"Texturenpakete des Benutzers enthält, im Datei-Manager."
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Contributors"
+msgstr "Frühere Mitwirkende"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Core Developers"
+msgstr "Ehemalige Hauptentwickler"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Onlineinhalte durchsuchen"
@@ -756,38 +854,6 @@ msgstr "Paket deinstallieren"
msgid "Use Texture Pack"
msgstr "Texturenpaket benutzen"
-#: builtin/mainmenu/tab_credits.lua
-msgid "Active Contributors"
-msgstr "Aktive Mitwirkende"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Core Developers"
-msgstr "Hauptentwickler"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Credits"
-msgstr "Mitwirkende"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Open User Data Directory"
-msgstr "Benutzerdatenverzeichnis öffnen"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid ""
-"Opens the directory that contains user-provided worlds, games, mods,\n"
-"and texture packs in a file manager / explorer."
-msgstr ""
-"Öffnet das Verzeichnis, welches die Welten, Spiele, Mods und\n"
-"Texturenpakete des Benutzers enthält, im Datei-Manager."
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Previous Contributors"
-msgstr "Frühere Mitwirkende"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid "Previous Core Developers"
-msgstr "Ehemalige Hauptentwickler"
-
#: builtin/mainmenu/tab_local.lua
msgid "Announce Server"
msgstr "Server veröffentlichen"
@@ -816,7 +882,7 @@ msgstr "Server hosten"
msgid "Install games from ContentDB"
msgstr "Spiele aus ContentDB installieren"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Name"
msgstr "Name"
@@ -828,7 +894,7 @@ msgstr "Neu"
msgid "No world created or selected!"
msgstr "Keine Welt angegeben oder ausgewählt!"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Password"
msgstr "Passwort"
@@ -836,7 +902,7 @@ msgstr "Passwort"
msgid "Play Game"
msgstr "Spiel starten"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
msgstr "Port"
@@ -857,8 +923,12 @@ msgid "Start Game"
msgstr "Spiel starten"
#: builtin/mainmenu/tab_online.lua
-msgid "Address / Port"
-msgstr "Adresse / Port"
+msgid "Address"
+msgstr "Adresse"
+
+#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
+msgid "Clear"
+msgstr "Clear"
#: builtin/mainmenu/tab_online.lua
msgid "Connect"
@@ -868,34 +938,42 @@ msgstr "Verbinden"
msgid "Creative mode"
msgstr "Kreativmodus"
+#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "Damage enabled"
-msgstr "Schaden aktiviert"
+msgid "Damage / PvP"
+msgstr "Schaden / PvP"
#: builtin/mainmenu/tab_online.lua
msgid "Del. Favorite"
msgstr "Favorit löschen"
#: builtin/mainmenu/tab_online.lua
-msgid "Favorite"
-msgstr "Favorit"
+msgid "Favorites"
+msgstr "Favoriten"
#: builtin/mainmenu/tab_online.lua
-msgid "Join Game"
-msgstr "Spiel beitreten"
+msgid "Incompatible Servers"
+msgstr "Inkompatible Server"
#: builtin/mainmenu/tab_online.lua
-msgid "Name / Password"
-msgstr "Name / Passwort"
+msgid "Join Game"
+msgstr "Spiel beitreten"
#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Latenz"
-#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "PvP enabled"
-msgstr "Spielerkampf aktiviert"
+msgid "Public Servers"
+msgstr "Öffentliche Server"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Refresh"
+msgstr "Neu laden"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Server Description"
+msgstr "Serverbeschreibung"
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -937,11 +1015,31 @@ msgstr "Tastenbelegung"
msgid "Connected Glass"
msgstr "Verbundenes Glas"
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Dynamic shadows"
+msgstr "Dynamische Schatten"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Dynamic shadows: "
+msgstr "Dynamische Schatten: "
+
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
msgstr "Schöne Blätter"
#: builtin/mainmenu/tab_settings.lua
+msgid "High"
+msgstr "Hoch"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Low"
+msgstr "Niedrig"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Medium"
+msgstr "Mittel"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
msgstr "Mipmap"
@@ -967,7 +1065,7 @@ msgstr "Blöcke umranden"
#: builtin/mainmenu/tab_settings.lua
msgid "None"
-msgstr "Keines"
+msgstr "Keine"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -1013,10 +1111,6 @@ msgstr "Weiches Licht"
msgid "Texturing:"
msgstr "Texturierung:"
-#: builtin/mainmenu/tab_settings.lua
-msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "Um Shader zu aktivieren, muss der OpenGL-Treiber genutzt werden."
-
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
msgstr "Dynamikkompression"
@@ -1030,6 +1124,14 @@ msgid "Trilinear Filter"
msgstr "Trilinearer Filter"
#: builtin/mainmenu/tab_settings.lua
+msgid "Ultra High"
+msgstr "Sehr hoch"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Very Low"
+msgstr "Sehr niedrig"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
msgstr "Wehende Blätter"
@@ -1041,7 +1143,7 @@ msgstr "Flüssigkeitswellen"
msgid "Waving Plants"
msgstr "Wehende Pflanzen"
-#: src/client/client.cpp
+#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Verbindungsfehler, Zeitüberschreitung."
@@ -1051,7 +1153,7 @@ msgstr "Fertig!"
#: src/client/client.cpp
msgid "Initializing nodes"
-msgstr "Initialisiere Blöcke"
+msgstr "Blöcke initialisieren"
#: src/client/client.cpp
msgid "Initializing nodes..."
@@ -1063,15 +1165,15 @@ msgstr "Lade Texturen …"
#: src/client/client.cpp
msgid "Rebuilding shaders..."
-msgstr "Shader wiederherstellen …"
+msgstr "Shader erneuern…"
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
msgstr "Verbindungsfehler (Zeitüberschreitung?)"
#: src/client/clientlauncher.cpp
-msgid "Could not find or load game \""
-msgstr "Spiel konnte nicht gefunden oder geladen werden: \""
+msgid "Could not find or load game: "
+msgstr "Spiel konnte nicht gefunden oder geladen werden: "
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
@@ -1101,18 +1203,6 @@ msgstr "Fehler beim Öffnen der angegebenen Passwortdatei: "
msgid "Provided world path doesn't exist: "
msgstr "Angegebener Weltpfad existiert nicht: "
-#. ~ DO NOT TRANSLATE THIS LITERALLY!
-#. This is a special string. Put either "no" or "yes"
-#. into the translation field (literally).
-#. Choose "yes" if the language requires use of the fallback
-#. font, "no" otherwise.
-#. The fallback font is (normally) required for languages with
-#. non-Latin script, like Chinese.
-#. When in doubt, test your translation.
-#: src/client/fontengine.cpp
-msgid "needs_fallback_font"
-msgstr "no"
-
#: src/client/game.cpp
msgid ""
"\n"
@@ -1126,14 +1216,6 @@ msgid "- Address: "
msgstr "- Adresse: "
#: src/client/game.cpp
-msgid "- Creative Mode: "
-msgstr "- Kreativmodus: "
-
-#: src/client/game.cpp
-msgid "- Damage: "
-msgstr "- Schaden: "
-
-#: src/client/game.cpp
msgid "- Mode: "
msgstr "- Modus: "
@@ -1155,6 +1237,15 @@ msgid "- Server Name: "
msgstr "- Servername: "
#: src/client/game.cpp
+msgid "A serialization error occurred:"
+msgstr "Ein Serialisierungsfehler ist aufgetreten:"
+
+#: src/client/game.cpp
+#, c-format
+msgid "Access denied. Reason: %s"
+msgstr "Zugriff verweigert. Grund: %s"
+
+#: src/client/game.cpp
msgid "Automatic forward disabled"
msgstr "Vorwärtsautomatik deaktiviert"
@@ -1163,6 +1254,22 @@ msgid "Automatic forward enabled"
msgstr "Vorwärtsautomatik aktiviert"
#: src/client/game.cpp
+msgid "Block bounds hidden"
+msgstr "Blockgrenzen verborgen"
+
+#: src/client/game.cpp
+msgid "Block bounds shown for all blocks"
+msgstr "Blockgrenzen für alle Blöcke angezeigt"
+
+#: src/client/game.cpp
+msgid "Block bounds shown for current block"
+msgstr "Blockgrenzen für aktuellen Block angezeigt"
+
+#: src/client/game.cpp
+msgid "Block bounds shown for nearby blocks"
+msgstr "Blockgrenzen für Blöcke in Nähe angezeigt"
+
+#: src/client/game.cpp
msgid "Camera update disabled"
msgstr "Kameraaktualisierung deaktiviert"
@@ -1171,6 +1278,11 @@ msgid "Camera update enabled"
msgstr "Kameraaktualisierung aktiviert"
#: src/client/game.cpp
+msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgstr ""
+"Blockgrenzen können nicht gezeigt werden („basic_debug“-Privileg benötigt)"
+
+#: src/client/game.cpp
msgid "Change Password"
msgstr "Passwort ändern"
@@ -1183,12 +1295,20 @@ msgid "Cinematic mode enabled"
msgstr "Filmmodus aktiviert"
#: src/client/game.cpp
+msgid "Client disconnected"
+msgstr "Client getrennt"
+
+#: src/client/game.cpp
msgid "Client side scripting is disabled"
msgstr "Clientseitige Skripte sind deaktiviert"
#: src/client/game.cpp
msgid "Connecting to server..."
-msgstr "Verbinde mit Server …"
+msgstr "Mit Server verbinden …"
+
+#: src/client/game.cpp
+msgid "Connection failed for unknown reason"
+msgstr "Verbindung aus unbekanntem Grund fehlgeschlagen"
#: src/client/game.cpp
msgid "Continue"
@@ -1228,6 +1348,11 @@ msgstr ""
"- %s: Chat\n"
#: src/client/game.cpp
+#, c-format
+msgid "Couldn't resolve address: %s"
+msgstr "Adresse konnte nicht aufgelöst werden: %s"
+
+#: src/client/game.cpp
msgid "Creating client..."
msgstr "Client erstellen …"
@@ -1301,7 +1426,7 @@ msgstr "Schnellmodus aktiviert"
#: src/client/game.cpp
msgid "Fast mode enabled (note: no 'fast' privilege)"
-msgstr "Schnellmodus aktiviert (Achtung: Kein „fast“-Privileg)"
+msgstr "Schnellmodus aktiviert (Hinweis: Kein „fast“-Privileg)"
#: src/client/game.cpp
msgid "Fly mode disabled"
@@ -1313,7 +1438,7 @@ msgstr "Flugmodus aktiviert"
#: src/client/game.cpp
msgid "Fly mode enabled (note: no 'fly' privilege)"
-msgstr "Flugmodus aktiviert (Achtung: Kein „fly“-Privileg)"
+msgstr "Flugmodus aktiviert (Hinweis: Kein „fly“-Privileg)"
#: src/client/game.cpp
msgid "Fog disabled"
@@ -1356,6 +1481,10 @@ msgid "Minimap currently disabled by game or mod"
msgstr "Übersichtskarte momentan von Spiel oder Mod deaktiviert"
#: src/client/game.cpp
+msgid "Multiplayer"
+msgstr "Mehrspieler"
+
+#: src/client/game.cpp
msgid "Noclip mode disabled"
msgstr "Geistmodus deaktiviert"
@@ -1365,7 +1494,7 @@ msgstr "Geistmodus aktiviert"
#: src/client/game.cpp
msgid "Noclip mode enabled (note: no 'noclip' privilege)"
-msgstr "Geistmodus aktiviert (Achtung: Kein „noclip“-Privileg)"
+msgstr "Geistmodus aktiviert (Hinweis: Kein „noclip“-Privileg)"
#: src/client/game.cpp
msgid "Node definitions..."
@@ -1429,6 +1558,22 @@ msgstr "Ton nicht mehr stumm"
#: src/client/game.cpp
#, c-format
+msgid "The server is probably running a different version of %s."
+msgstr "Auf dem Server läuft möglicherweise eine andere Version von %s."
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to connect to %s because IPv6 is disabled"
+msgstr ""
+"Verbindung konnte nicht zu %s aufgebaut werden, weil IPv6 deaktiviert ist"
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to listen on %s because IPv6 is disabled"
+msgstr "Konnte nicht auf %s lauschen, weil IPv6 deaktiviert ist"
+
+#: src/client/game.cpp
+#, c-format
msgid "Viewing range changed to %d"
msgstr "Sichtweite geändert auf %d"
@@ -1497,10 +1642,6 @@ msgid "Caps Lock"
msgstr "Feststellt."
#: src/client/keycode.cpp
-msgid "Clear"
-msgstr "Clear"
-
-#: src/client/keycode.cpp
msgid "Control"
msgstr "Strg"
@@ -1765,6 +1906,14 @@ msgstr "Übersichtskarte im Bodenmodus, Zoom ×%d"
msgid "Minimap in texture mode"
msgstr "Übersichtskarte im Texturmodus"
+#: src/gui/guiChatConsole.cpp
+msgid "Failed to open webpage"
+msgstr "Fehler beim Öffnen der Webseite"
+
+#: src/gui/guiChatConsole.cpp
+msgid "Opening webpage"
+msgstr "Webseite öffnen"
+
#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
msgid "Passwords do not match!"
msgstr "Passwörter stimmen nicht überein!"
@@ -1795,8 +1944,8 @@ msgid "Proceed"
msgstr "Fortsetzen"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "\"Special\" = climb down"
-msgstr "„Spezial“ = runter"
+msgid "\"Aux1\" = climb down"
+msgstr "„Aux1“ = runter"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Autoforward"
@@ -1807,10 +1956,18 @@ msgid "Automatic jumping"
msgstr "Auto-Springen"
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Aux1"
+msgstr "Aux1"
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
msgstr "Rückwärts"
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Block bounds"
+msgstr "Blockgrenzen"
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Change camera"
msgstr "Kamerawechsel"
@@ -1901,10 +2058,6 @@ msgid "Sneak"
msgstr "Schleichen"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Special"
-msgstr "Spezial"
-
-#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle HUD"
msgstr "HUD an/aus"
@@ -1965,8 +2118,9 @@ msgid "Muted"
msgstr "Stumm"
#: src/gui/guiVolumeChange.cpp
-msgid "Sound Volume: "
-msgstr "Tonlautstärke: "
+#, c-format
+msgid "Sound Volume: %d%%"
+msgstr "Tonlautstärke: %d%%"
#. ~ Imperative, as in "Enter/type in text".
#. Don't forget the space.
@@ -1992,13 +2146,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"(Android) Use virtual joystick to trigger \"aux\" button.\n"
-"If enabled, virtual joystick will also tap \"aux\" button when out of main "
+"(Android) Use virtual joystick to trigger \"Aux1\" button.\n"
+"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
-"(Android) Den virtuellen Joystick benutzen, um die „Aux“-Taste zu "
+"(Android) Den virtuellen Joystick benutzen, um die „Aux1“-Taste zu "
"betätigen.\n"
-"Falls aktiviert, wird der virtuelle Joystick außerdem die „Aux“-Taste "
+"Falls aktiviert, wird der virtuelle Joystick außerdem die „Aux1“-Taste "
"drücken, wenn er sich außerhalb des Hauptkreises befindet."
#: src/settings_translation_file.cpp
@@ -2235,6 +2389,12 @@ msgid ""
msgstr "DPI des Bildschirms (nicht für X11/Android) z.B. für 4K-Bildschirme."
#: src/settings_translation_file.cpp
+msgid "Adjust the detected display density, used for scaling UI elements."
+msgstr ""
+"Die erfasste Anzeigendichte anpassen, benutzt für die Skalierung von UI-"
+"Elementen."
+
+#: src/settings_translation_file.cpp
#, c-format
msgid ""
"Adjusts the density of the floatland layer.\n"
@@ -2373,6 +2533,14 @@ msgid "Autoscaling mode"
msgstr "Autoskalierungsmodus"
#: src/settings_translation_file.cpp
+msgid "Aux1 key"
+msgstr "Aux1-Taste"
+
+#: src/settings_translation_file.cpp
+msgid "Aux1 key for climbing/descending"
+msgstr "Aux1-Taste zum Klettern/Sinken"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Rückwärtstaste"
@@ -2417,10 +2585,6 @@ 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."
-
-#: src/settings_translation_file.cpp
msgid "Block send optimize distance"
msgstr "Distanz für Sendeoptimierungen von Kartenblöcken"
@@ -2527,6 +2691,14 @@ msgstr ""
"Wobei 0.0 die minimale Lichtstufe und 1.0 die höchste Lichtstufe ist."
#: src/settings_translation_file.cpp
+msgid "Chat command time message threshold"
+msgstr "Chatbefehlzeitnachrichtenschwellwert"
+
+#: src/settings_translation_file.cpp
+msgid "Chat commands"
+msgstr "Chatbefehle"
+
+#: src/settings_translation_file.cpp
msgid "Chat font size"
msgstr "Chat-Schriftgröße"
@@ -2559,8 +2731,8 @@ msgid "Chat toggle key"
msgstr "Taste zum Umschalten des Chatprotokolls"
#: src/settings_translation_file.cpp
-msgid "Chatcommands"
-msgstr "Chatbefehle"
+msgid "Chat weblinks"
+msgstr "Chatweblinks"
#: src/settings_translation_file.cpp
msgid "Chunk size"
@@ -2579,6 +2751,14 @@ msgid "Clean transparent textures"
msgstr "Transparente Texturen säubern"
#: src/settings_translation_file.cpp
+msgid ""
+"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console "
+"output."
+msgstr ""
+"Anklickbare Weblinks (Mittelklick oder Strg+Linksklick) werden in der "
+"Chatkonsolenausgabe aktiviert."
+
+#: src/settings_translation_file.cpp
msgid "Client"
msgstr "Client"
@@ -2623,6 +2803,10 @@ msgid "Colored fog"
msgstr "Gefärbter Nebel"
#: src/settings_translation_file.cpp
+msgid "Colored shadows"
+msgstr "Gefärbte Schatten"
+
+#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of flags to hide in the content repository.\n"
"\"nonfree\" can be used to hide packages which do not qualify as 'free "
@@ -2666,6 +2850,31 @@ msgid "Command key"
msgstr "Befehlstaste"
#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when saving mapblocks to disk.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+"Zu verwendendes Kompressionsniveau, wenn Kartenblöcke auf den Datenträger "
+"gespeichert werden.\n"
+"-1 - Standard-Kompressionsniveau benutzen\n"
+"0 - geringste Kompression, am schnellsten\n"
+"9 - beste Kompression, am langsamsten"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when sending mapblocks to the client.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+"Kompressionsniveau für Kartenblöcke, die zu Clients gesendet werden.\n"
+"-1 - Standard-Kompressionsniveau benutzen\n"
+"0 - keine Kompression, am schnellsten\n"
+"9 - beste Kompression, am langsamsten"
+
+#: src/settings_translation_file.cpp
msgid "Connect glass"
msgstr "Verbundenes Glas"
@@ -2766,10 +2975,10 @@ msgstr "Fadenkreuzundurchsichtigkeit"
#: src/settings_translation_file.cpp
msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
-"Also controls the object crosshair color"
+"This also applies to the object crosshair."
msgstr ""
-"Fadenkreuzundurchsichtigkeit (Wert zwischen 0 und 255).\n"
-"Gilt auch für das Objektfadenkreuz"
+"Fadenkreuz-Alpha (Undurchsichtigkeit, zwischen 0 und 255).\n"
+"Gilt auch für das Objektfadenkreuz."
#: src/settings_translation_file.cpp
msgid "Crosshair color"
@@ -2851,11 +3060,14 @@ msgstr "Standardstapelgröße"
#: src/settings_translation_file.cpp
msgid ""
-"Default timeout for cURL, stated in milliseconds.\n"
-"Only has an effect if compiled with cURL."
+"Define shadow filtering quality.\n"
+"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
+"but also uses more resources."
msgstr ""
-"Standardzeitlimit für cURL, in Millisekunden.\n"
-"Hat nur eine Wirkung, wenn mit cURL kompiliert wurde."
+"Definiert die Schattenfilterqualität.\n"
+"Dies simuliert den weichen Schatteneffekt, indem eine PCF- oder Poisson-"
+"Scheibe angewendet wird,\n"
+"aber dies verbraucht auch mehr Ressourcen."
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
@@ -2985,6 +3197,10 @@ msgid "Disallow empty passwords"
msgstr "Leere Passwörter verbieten"
#: src/settings_translation_file.cpp
+msgid "Display Density Scaling Factor"
+msgstr "Anzeigendichtenskalierungsfaktor"
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Domainname des Servers. Wird in der Serverliste angezeigt."
@@ -3033,6 +3249,25 @@ msgstr ""
"Diese Unterstützung ist experimentell und die API kann sich ändern."
#: src/settings_translation_file.cpp
+msgid ""
+"Enable Poisson disk filtering.\n"
+"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF "
+"filtering."
+msgstr ""
+"Aktiviert eine Poisson-Scheibenfilterung.\n"
+"Falls aktiv, werden Poisson-Scheiben verwendet, um „weiche Schatten“ zu "
+"erzeugen. Ansonsten wird die PCF-Filterung benutzt."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable colored shadows.\n"
+"On true translucent nodes cast colored shadows. This is expensive."
+msgstr ""
+"Aktiviert gefärbte Schatten. \n"
+"Falls aktiv, werden transluzente Blöcke gefärbte Schatten werfen. Dies ist "
+"rechenintensiv."
+
+#: src/settings_translation_file.cpp
msgid "Enable console window"
msgstr "Konsolenfenster aktivieren"
@@ -3177,6 +3412,16 @@ msgstr ""
"Die Änderung dieser Einstellung benötigt einen Neustart."
#: src/settings_translation_file.cpp
+msgid ""
+"Enables tradeoffs that reduce CPU load or increase rendering performance\n"
+"at the expense of minor visual glitches that do not impact game playability."
+msgstr ""
+"Aktiviert Kompromisse, die die CPU-Last verringern oder die Rendering-"
+"Leistung erhöhen\n"
+"auf Kosten kleinerer visueller Fehler, die die Spielbarkeit nicht "
+"beeinträchtigen."
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr "Engine-Profiling-Datenausgabeintervall"
@@ -3224,18 +3469,6 @@ msgid "Fallback font path"
msgstr "Ersatzschriftpfad"
#: src/settings_translation_file.cpp
-msgid "Fallback font shadow"
-msgstr "Ersatzschriftschatten"
-
-#: src/settings_translation_file.cpp
-msgid "Fallback font shadow alpha"
-msgstr "Undurchsichtigkeit des Ersatzschriftschattens"
-
-#: src/settings_translation_file.cpp
-msgid "Fallback font size"
-msgstr "Ersatzschriftgröße"
-
-#: src/settings_translation_file.cpp
msgid "Fast key"
msgstr "Schnelltaste"
@@ -3253,10 +3486,10 @@ msgstr "Schnell bewegen"
#: src/settings_translation_file.cpp
msgid ""
-"Fast movement (via the \"special\" key).\n"
+"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
-"Schnelle Bewegung (mit der „Spezial“-Taste).\n"
+"Schnelle Bewegung (mit der „Aux1“-Taste).\n"
"Dazu wird das „fast“-Privileg auf dem Server benötigt."
#: src/settings_translation_file.cpp
@@ -3291,15 +3524,16 @@ msgstr "Filmische Dynamikkompression"
#: 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."
+"which PNG optimizers usually discard, often resulting in dark or\n"
+"light edges to transparent textures. Apply a filter to clean that up\n"
+"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
-"Gefilterte Texturen können RGB-Werte mit 100% transparenten Nachbarn,\n"
+"Gefilterte Texturen können RGB-Werte mit voll transparenten Nachbarn,\n"
"die PNG-Optimierer üblicherweise verwerfen, mischen. Manchmal\n"
"resultiert dies in einer dunklen oder hellen Kante bei transparenten\n"
-"Texturen. Aktivieren Sie diesen Filter, um dies beim Laden der\n"
-"Texturen aufzuräumen."
+"Texturen. Aktivieren Sie einen Filter, um dies beim Laden der\n"
+"Texturen aufzuräumen. Dies wird automatisch aktiviert, falls Mipmapping "
+"aktiviert ist."
#: src/settings_translation_file.cpp
msgid "Filtering"
@@ -3392,16 +3626,17 @@ msgid "Font size"
msgstr "Schriftgröße"
#: src/settings_translation_file.cpp
-msgid "Font size of the default font in point (pt)."
-msgstr "Schriftgröße der Standardschrift in Punkt (pt)."
+msgid "Font size divisible by"
+msgstr "Schriftgröße teilbar durch"
#: src/settings_translation_file.cpp
-msgid "Font size of the fallback font in point (pt)."
-msgstr "Schriftgröße der Ersatzschrift in Punkt (pt)."
+msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
+msgstr "Schriftgröße der Standardschrift, wobei 1 Einheit = 1 Pixel bei 96 DPI"
#: src/settings_translation_file.cpp
-msgid "Font size of the monospace font in point (pt)."
-msgstr "Schriftgröße der Festbreitenschrift in Punkt (pt)."
+msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
+msgstr ""
+"Schriftgröße der Festbreitenschrift, wobei 1 Einheit = 1 Pixel bei 96 DPI"
#: src/settings_translation_file.cpp
msgid ""
@@ -3414,6 +3649,26 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"For pixel-style fonts that do not scale well, this ensures that font sizes "
+"used\n"
+"with this font will always be divisible by this value, in pixels. For "
+"instance,\n"
+"a pixel font 16 pixels tall should have this set to 16, so it will only ever "
+"be\n"
+"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
+msgstr ""
+"Bei Schriften im Pixelstil, die sich nicht gut skalieren lassen, stellt dies "
+"sicher,\n"
+"dass die mit dieser Schrift verwendeten Schriftgrößen immer durch diesen "
+"Wert\n"
+"in Pixeln teilbar ist. Zum Beispiel: Eine Pixelschrift mit einer Höhe von 16 "
+"Pixeln\n"
+"sollte auf 16 gesetzt werden, so dass sie immer nur die Größe 16, 32, 48 "
+"usw. hat,\n"
+"damit eine Mod, die eine Größe von 25 anfordert, 32 erhält."
+
+#: src/settings_translation_file.cpp
+msgid ""
"Format of player chat messages. The following strings are valid "
"placeholders:\n"
"@name, @message, @timestamp (optional)"
@@ -3483,10 +3738,6 @@ msgstr ""
"rendern"
#: src/settings_translation_file.cpp
-msgid "FreeType fonts"
-msgstr "FreeType-Schriften"
-
-#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are generated for clients, stated in mapblocks (16 "
"nodes)."
@@ -3524,10 +3775,6 @@ msgid "Full screen"
msgstr "Vollbild"
#: src/settings_translation_file.cpp
-msgid "Full screen BPP"
-msgstr "Vollbildfarbtiefe"
-
-#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
msgstr "Vollbildmodus."
@@ -3551,7 +3798,7 @@ msgstr "Globale Rückruffunktionen"
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."
+"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
"Globale Kartengenerierungsattribute.\n"
"Im Kartengenerator v6 wird das „decorations“-Flag alle Dekorationen außer\n"
@@ -3641,8 +3888,10 @@ 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."
+msgid ""
+"Height component of the initial window size. Ignored in fullscreen mode."
+msgstr ""
+"Höhenkomponente der anfänglichen Fenstergröße. Im Vollbildmodus ignoriert."
#: src/settings_translation_file.cpp
msgid "Height noise"
@@ -3653,10 +3902,6 @@ 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"
@@ -3902,11 +4147,10 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"If disabled, \"special\" key is used to fly fast if both fly and fast mode "
-"are\n"
+"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
-"Falls deaktiviert, wird die „Spezial“-Taste benutzt, um schnell zu fliegen,\n"
+"Falls deaktiviert, wird die „Aux1“-Taste benutzt, um schnell zu fliegen,\n"
"wenn sowohl Flug- als auch Schnellmodus aktiviert sind."
#: src/settings_translation_file.cpp
@@ -3936,11 +4180,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"If enabled, \"special\" key instead of \"sneak\" key is used for climbing "
-"down and\n"
+"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down "
+"and\n"
"descending."
msgstr ""
-"Falls aktiviert, wird die „Spezial“-Taste statt der „Schleichen“-Taste zum\n"
+"Falls aktiviert, wird die „Aux1“-Taste statt der „Schleichen“-Taste zum\n"
"Herunterklettern und Sinken benutzt."
#: src/settings_translation_file.cpp
@@ -4002,6 +4246,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If the execution of a chat command takes longer than this specified time in\n"
+"seconds, add the time information to the chat command message"
+msgstr ""
+"Falls die Ausführung eines Chatbefehls länger als diese angegebene Zeit in\n"
+"Sekunden braucht, wird die Zeitinformation an die Chatbefehlsnachricht "
+"angehängt"
+
+#: src/settings_translation_file.cpp
+msgid ""
"If the file size of debug.txt exceeds the number of megabytes specified in\n"
"this setting when it is opened, the file is moved to debug.txt.1,\n"
"deleting an older debug.txt.1 if it exists.\n"
@@ -4061,7 +4314,7 @@ msgstr ""
"Dies wird normalerweise nur von Haupt-/builtin-Entwicklern benötigt"
#: src/settings_translation_file.cpp
-msgid "Instrument chatcommands on registration."
+msgid "Instrument chat commands on registration."
msgstr "Chatbefehle bei ihrer Registrierung instrumentieren."
#: src/settings_translation_file.cpp
@@ -4157,7 +4410,7 @@ msgid "Joystick button repetition interval"
msgstr "Joystick-Button-Wiederholungsrate"
#: src/settings_translation_file.cpp
-msgid "Joystick deadzone"
+msgid "Joystick dead zone"
msgstr "Joystick-Totbereich"
#: src/settings_translation_file.cpp
@@ -5185,12 +5438,6 @@ msgstr ""
"und Blickrichtung abhängig machen."
#: src/settings_translation_file.cpp
-msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
-msgstr ""
-"DirectX mit LuaJIT zusammenarbeiten lassen. Deaktivieren Sie dies, falls es "
-"Probleme verursacht."
-
-#: src/settings_translation_file.cpp
msgid "Makes all liquids opaque"
msgstr "Macht alle Flüssigkeiten undurchsichtig"
@@ -5283,6 +5530,10 @@ msgid "Map save interval"
msgstr "Speicherintervall der Karte"
#: src/settings_translation_file.cpp
+msgid "Map shadows update frames"
+msgstr "Kartenschatten-Aktualisierungsframes"
+
+#: src/settings_translation_file.cpp
msgid "Mapblock limit"
msgstr "Kartenblock-Grenze"
@@ -5393,6 +5644,10 @@ msgstr ""
"Spiel pausiert ist."
#: src/settings_translation_file.cpp
+msgid "Maximum distance to render shadows."
+msgstr "Maximale Distanz zum Rendern von Schatten."
+
+#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
msgstr "Maximal zwangsgeladene Kartenblöcke"
@@ -5528,10 +5783,20 @@ msgstr ""
"zu begrenzen."
#: src/settings_translation_file.cpp
-msgid "Maximum time in ms a file download (e.g. a mod download) may take."
+msgid ""
+"Maximum time a file download (e.g. a mod download) may take, stated in "
+"milliseconds."
+msgstr ""
+"Maximale Zeit in Millisekunden, die das Herunterladen einer Datei (z.B. "
+"einer Mod) dauern darf."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum time an interactive request (e.g. server list fetch) may take, "
+"stated in milliseconds."
msgstr ""
-"Maximale Zeit in ms, die das Herunterladen einer Datei (z.B. einer Mod) "
-"dauern darf."
+"Maximale Zeit in Millisekunden, die eine interaktive Anfrage (z.B. "
+"Serverlistenanfrage) brauchen darf."
#: src/settings_translation_file.cpp
msgid "Maximum users"
@@ -5597,8 +5862,8 @@ msgid "Mod channels"
msgstr "Mod-Kanäle"
#: src/settings_translation_file.cpp
-msgid "Modifies the size of the hudbar elements."
-msgstr "Modifiziert die Größe der HUD-Leistenelemente."
+msgid "Modifies the size of the HUD elements."
+msgstr "Modifiziert die Größe der HUD-Elemente."
#: src/settings_translation_file.cpp
msgid "Monospace font path"
@@ -5609,6 +5874,10 @@ msgid "Monospace font size"
msgstr "Größe der Festbreitenschrift"
#: src/settings_translation_file.cpp
+msgid "Monospace font size divisible by"
+msgstr "Festbreitenschriftgröße teilbar durch"
+
+#: src/settings_translation_file.cpp
msgid "Mountain height noise"
msgstr "Berghöhenrauschen"
@@ -5756,7 +6025,7 @@ 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"
+"This is a trade-off between SQLite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
"Anzahl der zusätzlichen Kartenblöcke, welche mit /clearobjects gleichzeitig\n"
@@ -5780,13 +6049,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255."
-msgstr ""
-"Undurchsichtigkeit (Alpha) des Schattens hinter der Ersatzschrift, zwischen "
-"0 und 255."
-
-#: src/settings_translation_file.cpp
-msgid ""
"Open the pause menu when the window's focus is lost. Does not pause if a "
"formspec is\n"
"open."
@@ -5795,18 +6057,16 @@ msgstr ""
"Wird nicht pausieren, wenn ein Formspec geöffnet ist."
#: src/settings_translation_file.cpp
+msgid "Optional override for chat weblink color."
+msgstr "Optionaler manueller Wert für die Farbe von Chat-Weblinks."
+
+#: src/settings_translation_file.cpp
msgid ""
-"Path of the fallback font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path of the fallback font. Must be a TrueType font.\n"
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
-"Pfad der Ersatzschrift.\n"
-"Falls die „freetype“-Einstellung aktiviert ist: Muss eine TrueType-Schrift "
-"sein.\n"
-"Falls die „freetype“-Einstellung deaktiviert ist: Muss eine Bitmap- oder XML-"
-"Vektor-Schrift sein.\n"
+"Pfad der Ersatzschrift. Muss eine TrueType-Schrift sein.\n"
"Diese Schrift wird für bestimmte Sprachen benutzt, oder, wenn die "
"Standardschrift nicht verfügbar ist."
@@ -5834,31 +6094,19 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the default font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
-"Pfad der Standardschrift.\n"
-"Falls die „freetype“-Einstellung aktiviert ist: Muss eine TrueType-Schrift "
-"sein.\n"
-"Falls die „freetype“-Einstellung deaktiviert ist: Muss eine Bitmap- oder XML-"
-"Vektor-Schrift sein.\n"
+"Pfad der Standardschrift. Muss eine TrueType-Schrift sein.\n"
"Die Ersatzschrift wird benutzt, falls diese Schrift nicht geladen werden "
"kann."
#: src/settings_translation_file.cpp
msgid ""
-"Path to the monospace font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
-"Pfad der Festbreitenschrift.\n"
-"Falls die „freetype“-Einstellung aktiviert ist: Muss eine TrueType-Schrift "
-"sein.\n"
-"Falls die „freetype“-Einstellung deaktiviert ist: Muss eine Bitmap- oder XML-"
-"Vektor-Schrift sein.\n"
+"Pfad der Festbreitenschrift. Muss eine TrueType-Schrift sein.\n"
"Diese Schrift wird z.B. für die Konsole und die Profiler-Anzeige benutzt."
#: src/settings_translation_file.cpp
@@ -5914,6 +6162,10 @@ msgid "Player versus player"
msgstr "Spielerkampf"
#: src/settings_translation_file.cpp
+msgid "Poisson filtering"
+msgstr "Poissonfilter"
+
+#: src/settings_translation_file.cpp
msgid ""
"Port to connect to (UDP).\n"
"Note that the port field in the main menu overrides this setting."
@@ -5968,9 +6220,9 @@ msgstr "Prometheus-Lauschadresse"
#: src/settings_translation_file.cpp
msgid ""
"Prometheus listener address.\n"
-"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
+"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
"enable metrics listener for Prometheus on that address.\n"
-"Metrics can be fetch on http://127.0.0.1:30000/metrics"
+"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
"Prometheus-Lauschadresse.\n"
"Falls Minetest mit der ENABLE_PROMETEUS-Option kompiliert wurde,\n"
@@ -6313,6 +6565,44 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Set the shadow strength.\n"
+"Lower value means lighter shadows, higher value means darker shadows."
+msgstr ""
+"Setzt die Schattenstärke.\n"
+"Ein niedrigerer Wert führt zu schwächeren Schatten, ein höherer Wert führt "
+"zu dunkleren Schatten."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the soft shadow radius size.\n"
+"Lower values mean sharper shadows, bigger values mean softer shadows.\n"
+"Minimum value: 1.0; maximum value: 10.0"
+msgstr ""
+"Setzt den Radius von weichen Schatten.\n"
+"Niedrigere Werte führen zu schärferen Schatten, größere Werte führen zu "
+"weicheren Schatten.\n"
+"Minimalwert: 1.0; Maximalwert: 10.0"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the tilt of Sun/Moon orbit in degrees.\n"
+"Value of 0 means no tilt / vertical orbit.\n"
+"Minimum value: 0.0; maximum value: 60.0"
+msgstr ""
+"Setzt die Neigung vom Sonnen-/Mondorbit in Grad.\n"
+"0 = keine Neigung / vertikaler Orbit.\n"
+"Minimalwert: 0.0; Maximalwert: 60.0"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true to enable Shadow Mapping.\n"
+"Requires shaders to be enabled."
+msgstr ""
+"Auf „wahr“ setzen, um Shadow-Mapping zu aktivieren.\n"
+"Dafür müssen Shader aktiviert sein."
+
+#: src/settings_translation_file.cpp
+msgid ""
"Set to true to enable waving leaves.\n"
"Requires shaders to be enabled."
msgstr ""
@@ -6336,6 +6626,16 @@ msgstr ""
"Dafür müssen Shader aktiviert sein."
#: src/settings_translation_file.cpp
+msgid ""
+"Sets shadow texture quality to 32 bits.\n"
+"On false, 16 bits texture will be used.\n"
+"This can cause much more artifacts in the shadow."
+msgstr ""
+"Setzt die Schattentexturqualität auf 32 Bits.\n"
+"Falls aktiviert, werden 16-Bit-Texturen benutzt.\n"
+"Dies kann zu viel mehr Artefakten im Schatten führen."
+
+#: src/settings_translation_file.cpp
msgid "Shader path"
msgstr "Shader-Pfad"
@@ -6352,6 +6652,22 @@ msgstr ""
"Das funktioniert nur mit dem OpenGL-Grafik-Backend."
#: src/settings_translation_file.cpp
+msgid "Shadow filter quality"
+msgstr "Schattenfilterqualität"
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map max distance in nodes to render shadows"
+msgstr "Maximale Schattenrenderdistanz von Schattenkarten in Blöcken"
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture in 32 bits"
+msgstr "Schattenkartentextur in 32 Bits"
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture size"
+msgstr "Schattenkartentexturengröße"
+
+#: src/settings_translation_file.cpp
msgid ""
"Shadow offset (in pixels) of the default font. If 0, then shadow will not be "
"drawn."
@@ -6360,12 +6676,8 @@ msgstr ""
"der Schatten nicht gezeichnet."
#: src/settings_translation_file.cpp
-msgid ""
-"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not "
-"be drawn."
-msgstr ""
-"Versatz des Schattens hinter der Ersatzschrift (in Pixeln). Falls 0, wird "
-"der Schatten nicht gezeichnet."
+msgid "Shadow strength"
+msgstr "Schattenstärke"
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
@@ -6388,8 +6700,8 @@ msgstr ""
"Nach Änderung ist ein Neustart erforderlich."
#: src/settings_translation_file.cpp
-msgid "Show nametag backgrounds by default"
-msgstr "Namensschildhintergründe standardmäßig anzeigen"
+msgid "Show name tag backgrounds by default"
+msgstr "Standardmäßig Hintergründe für Namensschilder anzeigen"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
@@ -6425,6 +6737,10 @@ msgstr ""
"reduziert."
#: src/settings_translation_file.cpp
+msgid "Sky Body Orbit Tilt"
+msgstr "Himmelskörperorbitneigung"
+
+#: src/settings_translation_file.cpp
msgid "Slice w"
msgstr "w-Ausschnitt"
@@ -6483,16 +6799,12 @@ msgid "Sneaking speed, in nodes per second."
msgstr "Schleichgeschwindigkeit, in Blöcken pro Sekunde."
#: src/settings_translation_file.cpp
-msgid "Sound"
-msgstr "Ton"
+msgid "Soft shadow radius"
+msgstr "Weicher-Schatten-Radius"
#: src/settings_translation_file.cpp
-msgid "Special key"
-msgstr "Spezialtaste"
-
-#: src/settings_translation_file.cpp
-msgid "Special key for climbing/descending"
-msgstr "Spezialtaste zum Klettern/Sinken"
+msgid "Sound"
+msgstr "Ton"
#: src/settings_translation_file.cpp
msgid ""
@@ -6521,6 +6833,19 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Spread a complete update of shadow map over given amount of frames.\n"
+"Higher values might make shadows laggy, lower values\n"
+"will consume more resources.\n"
+"Minimum value: 1; maximum value: 16"
+msgstr ""
+"Eine vollständige Aktualisierung der Schattenkarte über der angegebenen\n"
+"Anzahl Frames ausbreiten. Höhere Werte können dazu führen, dass\n"
+"Schatten langsamer reagieren,\n"
+"niedrigere Werte sind rechenintensiver.\n"
+"Minimalwert: 1; Maximalwert: 16"
+
+#: src/settings_translation_file.cpp
+msgid ""
"Spread of light curve boost range.\n"
"Controls the width of the range to be boosted.\n"
"Standard deviation of the light curve boost Gaussian."
@@ -6651,6 +6976,16 @@ msgstr "Texturenpfad"
#: src/settings_translation_file.cpp
msgid ""
+"Texture size to render the shadow map on.\n"
+"This must be a power of two.\n"
+"Bigger numbers create better shadows but it is also more expensive."
+msgstr ""
+"Texturengröße zum Rendern der Schattenkarte.\n"
+"Dies muss eine Zweierpotenz sein.\n"
+"Größere Werte erzeugen bessere Schatten, aber dies ist auch rechenintensiver."
+
+#: src/settings_translation_file.cpp
+msgid ""
"Textures on a node may be aligned either to the node or to the world.\n"
"The former mode suits better things like machines, furniture, etc., while\n"
"the latter makes stairs and microblocks fit surroundings better.\n"
@@ -6673,7 +7008,7 @@ msgid "The URL for the content repository"
msgstr "Die URL für den Inhaltespeicher"
#: src/settings_translation_file.cpp
-msgid "The deadzone of the joystick"
+msgid "The dead zone of the joystick"
msgstr "Der Totbereich des Joysticks"
#: src/settings_translation_file.cpp
@@ -6751,14 +7086,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"The rendering back-end for Irrlicht.\n"
+"The rendering back-end.\n"
"A restart is required after changing this.\n"
"Note: On Android, stick with OGLES1 if unsure! App may fail to start "
"otherwise.\n"
"On other platforms, OpenGL is recommended.\n"
"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)"
msgstr ""
-"Das Renderer-Backend für Irrlicht.\n"
+"Das Renderer-Backend.\n"
"Ein Neustart ist erforderlich, wenn dies geändert wird.\n"
"Anmerkung: Auf Android belassen Sie dies bei OGLES1, wenn Sie sich unsicher "
"sind.\n"
@@ -6770,7 +7105,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"The sensitivity of the joystick axes for moving the\n"
-"ingame view frustum around."
+"in-game view frustum around."
msgstr ""
"Die Empfindlichkeit der Joystick-Achsen, um den\n"
"Pyramidenstumpf der Spielansicht herumzubewegen."
@@ -6898,6 +7233,10 @@ msgid "Touch screen threshold"
msgstr "Touchscreenschwellwert"
#: src/settings_translation_file.cpp
+msgid "Tradeoffs for performance"
+msgstr "Kompromisse für Performanz"
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr "Bäumerauschen"
@@ -6980,7 +7319,7 @@ msgstr "Bilineare Filterung bei der Skalierung von Texturen benutzen."
#: src/settings_translation_file.cpp
msgid ""
-"Use mip mapping to scale textures. May slightly increase performance,\n"
+"Use mipmapping to scale textures. May slightly increase performance,\n"
"especially when using a high resolution texture pack.\n"
"Gamma correct downscaling is not supported."
msgstr ""
@@ -7112,8 +7451,8 @@ msgid "Viewing range"
msgstr "Sichtweite"
#: src/settings_translation_file.cpp
-msgid "Virtual joystick triggers aux button"
-msgstr "Virtueller Joystick löst Aux-Taste aus"
+msgid "Virtual joystick triggers Aux1 button"
+msgstr "Virtueller Joystick löst Aux1-Taste aus"
#: src/settings_translation_file.cpp
msgid "Volume"
@@ -7192,6 +7531,10 @@ msgid "Waving plants"
msgstr "Wehende Pflanzen"
#: src/settings_translation_file.cpp
+msgid "Weblink color"
+msgstr "Weblinkfarbe"
+
+#: 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"
@@ -7222,9 +7565,8 @@ msgid ""
"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.\n"
+"memory. Powers of 2 are recommended. This setting is ONLY applied if\n"
+"bilinear/trilinear/anisotropic filtering is enabled.\n"
"This is also used as the base node texture size for world-aligned\n"
"texture autoscaling."
msgstr ""
@@ -7234,27 +7576,14 @@ msgstr ""
"die\n"
"minimale Texturengröße für die vergrößerten Texturen; höhere Werte führen\n"
"zu einem schärferen Aussehen, aber erfordern mehr Speicher. Zweierpotenzen\n"
-"werden empfohlen. Ein Wert größer als 1 könnte keinen sichtbaren Effekt\n"
-"hervorbringen, es sei denn, der bilineare, trilineare oder anisotropische "
-"Filter\n"
-"ist aktiviert.\n"
+"werden empfohlen. Diese Einstellung trifft NUR dann in Kraft, falls\n"
+"der bilineare/trilineare/anisotrope Filter aktiviert ist.\n"
"Dies wird außerdem verwendet als die Basisblocktexturengröße für\n"
"welt-ausgerichtete automatische Texturenskalierung."
#: src/settings_translation_file.cpp
msgid ""
-"Whether FreeType fonts are used, requires FreeType support to be compiled "
-"in.\n"
-"If disabled, bitmap and XML vectors fonts are used instead."
-msgstr ""
-"Ob FreeType-Schriften benutzt werden. Dafür muss FreeType-Unterstüzung "
-"einkompiliert worden sein.\n"
-"Falls deaktiviert, werden stattdessen Bitmap- und XML-Vektor-Schriften "
-"benutzt."
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Whether nametag backgrounds should be shown by default.\n"
+"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
"Ob Namensschildhintergründe standardmäßig angezeigt werden sollen.\n"
@@ -7313,8 +7642,9 @@ msgstr ""
"Drücken von F5)."
#: src/settings_translation_file.cpp
-msgid "Width component of the initial window size."
-msgstr "Breiten-Komponente der anfänglichen Fenstergröße."
+msgid "Width component of the initial window size. Ignored in fullscreen mode."
+msgstr ""
+"Breiten-Komponente der anfänglichen Fenstergröße. Im Vollbildmodus ignoriert."
#: src/settings_translation_file.cpp
msgid "Width of the selection box lines around nodes."
@@ -7419,46 +7749,22 @@ msgid "Y-level of seabed."
msgstr "Y-Höhe vom Meeresgrund."
#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when saving mapblocks to disk.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-"ZLib-Kompressionsniveau für Kartenblöcke im Festspeicher.\n"
-"-1 - Zlib-Standard-Kompressionsniveau\n"
-"0 - keine Kompression, am schnellsten\n"
-"9 - beste Kompression, am langsamsten\n"
-"(Niveaus 1-3 verwenden Zlibs „schnelles“ Verfahren, 4-9 das normale "
-"Verfahren)"
-
-#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when sending mapblocks to the client.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-"ZLib-Kompressionsniveau für Kartenblöcke, die zu Clients gesendet werden.\n"
-"-1 - Zlib-Standard-Kompressionsniveau\n"
-"0 - keine Kompression, am schnellsten\n"
-"9 - beste Kompression, am langsamsten\n"
-"(Niveaus 1-3 verwenden Zlibs „schnelles“ Verfahren, 4-9 das normale "
-"Verfahren)"
-
-#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr "cURL-Dateidownload-Zeitüberschreitung"
#: src/settings_translation_file.cpp
+msgid "cURL interactive timeout"
+msgstr "cURL-Interaktiv-Zeitüberschreitung"
+
+#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
msgstr "cURL-Parallel-Begrenzung"
-#: src/settings_translation_file.cpp
-msgid "cURL timeout"
-msgstr "cURL-Zeitüberschreitung"
+#~ msgid "- Creative Mode: "
+#~ msgstr "- Kreativmodus: "
+
+#~ msgid "- Damage: "
+#~ msgstr "- Schaden: "
#~ msgid ""
#~ "0 = parallax occlusion with slope information (faster).\n"
@@ -7467,6 +7773,9 @@ msgstr "cURL-Zeitüberschreitung"
#~ "0 = Parallax-Mapping mit Stufeninformation (schneller).\n"
#~ "1 = Relief-Mapping (langsamer, genauer)."
+#~ msgid "Address / Port"
+#~ msgstr "Adresse / Port"
+
#~ msgid ""
#~ "Adjust the gamma encoding for the light tables. Higher numbers are "
#~ "brighter.\n"
@@ -7486,6 +7795,9 @@ msgstr "cURL-Zeitüberschreitung"
#~ msgid "Back"
#~ msgstr "Rücktaste"
+#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
+#~ msgstr "Bits pro Pixel (Farbtiefe) im Vollbildmodus."
+
#~ msgid "Bump Mapping"
#~ msgstr "Bumpmapping"
@@ -7528,13 +7840,26 @@ msgstr "cURL-Zeitüberschreitung"
#~ "Legt die Breite von Tunneln fest; ein kleinerer Wert erzeugt breitere "
#~ "Tunnel."
+#~ msgid "Credits"
+#~ msgstr "Mitwirkende"
+
#~ msgid "Crosshair color (R,G,B)."
#~ msgstr "Fadenkreuzfarbe (R,G,B)."
+#~ msgid "Damage enabled"
+#~ msgstr "Schaden aktiviert"
+
#~ msgid "Darkness sharpness"
#~ msgstr "Dunkelheits-Steilheit"
#~ msgid ""
+#~ "Default timeout for cURL, stated in milliseconds.\n"
+#~ "Only has an effect if compiled with cURL."
+#~ msgstr ""
+#~ "Standardzeitlimit für cURL, in Millisekunden.\n"
+#~ "Hat nur eine Wirkung, wenn mit cURL kompiliert wurde."
+
+#~ msgid ""
#~ "Defines areas of floatland smooth terrain.\n"
#~ "Smooth floatlands occur when noise > 0."
#~ msgstr ""
@@ -7604,6 +7929,15 @@ msgstr "cURL-Zeitüberschreitung"
#~ msgid "FPS in pause menu"
#~ msgstr "Bildwiederholrate im Pausenmenü"
+#~ msgid "Fallback font shadow"
+#~ msgstr "Ersatzschriftschatten"
+
+#~ msgid "Fallback font shadow alpha"
+#~ msgstr "Undurchsichtigkeit des Ersatzschriftschattens"
+
+#~ msgid "Fallback font size"
+#~ msgstr "Ersatzschriftgröße"
+
#~ msgid "Floatland base height noise"
#~ msgstr "Schwebeland-Basishöhenrauschen"
@@ -7614,6 +7948,15 @@ msgstr "cURL-Zeitüberschreitung"
#~ msgstr ""
#~ "Undurchsichtigkeit des Schattens der Schrift (Wert zwischen 0 und 255)."
+#~ msgid "Font size of the fallback font in point (pt)."
+#~ msgstr "Schriftgröße der Ersatzschrift in Punkt (pt)."
+
+#~ msgid "FreeType fonts"
+#~ msgstr "FreeType-Schriften"
+
+#~ msgid "Full screen BPP"
+#~ msgstr "Vollbildfarbtiefe"
+
#~ msgid "Gamma"
#~ msgstr "Gamma"
@@ -7623,9 +7966,15 @@ msgstr "cURL-Zeitüberschreitung"
#~ msgid "Generate normalmaps"
#~ msgstr "Normalmaps generieren"
+#~ msgid "High-precision FPU"
+#~ msgstr "Hochpräzisions-FPU"
+
#~ msgid "IPv6 support."
#~ msgstr "IPv6-Unterstützung."
+#~ msgid "Install: file: \"$1\""
+#~ msgstr "Installation: Datei: „$1“"
+
#~ msgid "Lava depth"
#~ msgstr "Lavatiefe"
@@ -7641,6 +7990,11 @@ msgstr "cURL-Zeitüberschreitung"
#~ msgid "Main menu style"
#~ msgstr "Hauptmenü-Stil"
+#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
+#~ msgstr ""
+#~ "DirectX mit LuaJIT zusammenarbeiten lassen. Deaktivieren Sie dies, falls "
+#~ "es Probleme verursacht."
+
#~ msgid "Minimap in radar mode, Zoom x2"
#~ msgstr "Übersichtskarte im Radarmodus, Zoom ×2"
@@ -7653,6 +8007,9 @@ msgstr "cURL-Zeitüberschreitung"
#~ msgid "Minimap in surface mode, Zoom x4"
#~ msgstr "Übersichtskarte im Bodenmodus, Zoom ×4"
+#~ msgid "Name / Password"
+#~ msgstr "Name / Passwort"
+
#~ msgid "Name/Password"
#~ msgstr "Name/Passwort"
@@ -7671,6 +8028,13 @@ msgstr "cURL-Zeitüberschreitung"
#~ msgid "Ok"
#~ msgstr "OK"
+#~ msgid ""
+#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and "
+#~ "255."
+#~ msgstr ""
+#~ "Undurchsichtigkeit (Alpha) des Schattens hinter der Ersatzschrift, "
+#~ "zwischen 0 und 255."
+
#~ msgid "Overall bias of parallax occlusion effect, usually scale/2."
#~ msgstr ""
#~ "Startwert des Parallax-Occlusion-Effektes, üblicherweise Skalierung "
@@ -7709,15 +8073,43 @@ msgstr "cURL-Zeitüberschreitung"
#~ msgid "Projecting dungeons"
#~ msgstr "Herausragende Verliese"
+#~ msgid "PvP enabled"
+#~ msgstr "Spielerkampf aktiviert"
+
#~ msgid "Reset singleplayer world"
#~ msgstr "Einzelspielerwelt zurücksetzen"
#~ msgid "Select Package File:"
#~ msgstr "Paket-Datei auswählen:"
+#~ msgid ""
+#~ "Set the shadow update time.\n"
+#~ "Lower value means shadows and map updates faster, but it consume more "
+#~ "resources.\n"
+#~ "Minimun value 0.001 seconds max value 0.2 seconds"
+#~ msgstr ""
+#~ "Setzt die Schattenupdatezeit.\n"
+#~ "Ein niedrigerer Wert bedeutet, dass Schatten und die Karte schneller "
+#~ "aktualisiert werden, aber dies verbraucht mehr Ressourcen.\n"
+#~ "Minimalwert: 0.001 Sekunden. Maximalwert: 0.2 Sekunden.\n"
+#~ "(Beachten Sie die englische Notation mit Punkt als Dezimaltrennzeichen.)"
+
#~ msgid "Shadow limit"
#~ msgstr "Schattenbegrenzung"
+#~ msgid ""
+#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will "
+#~ "not be drawn."
+#~ msgstr ""
+#~ "Versatz des Schattens hinter der Ersatzschrift (in Pixeln). Falls 0, wird "
+#~ "der Schatten nicht gezeichnet."
+
+#~ msgid "Special"
+#~ msgstr "Spezial"
+
+#~ msgid "Special key"
+#~ msgstr "Spezialtaste"
+
#~ msgid "Start Singleplayer"
#~ msgstr "Einzelspieler starten"
@@ -7730,6 +8122,9 @@ msgstr "cURL-Zeitüberschreitung"
#~ msgid "This font will be used for certain languages."
#~ msgstr "Diese Schrift wird von bestimmten Sprachen benutzt."
+#~ msgid "To enable shaders the OpenGL driver needs to be used."
+#~ msgstr "Um Shader zu aktivieren, muss der OpenGL-Treiber genutzt werden."
+
#~ msgid "Toggle Cinematic"
#~ msgstr "Filmmodus umschalten"
@@ -7753,6 +8148,16 @@ msgstr "cURL-Zeitüberschreitung"
#~ msgid "Waving water"
#~ msgstr "Wasserwellen"
+#~ msgid ""
+#~ "Whether FreeType fonts are used, requires FreeType support to be compiled "
+#~ "in.\n"
+#~ "If disabled, bitmap and XML vectors fonts are used instead."
+#~ msgstr ""
+#~ "Ob FreeType-Schriften benutzt werden. Dafür muss FreeType-Unterstüzung "
+#~ "einkompiliert worden sein.\n"
+#~ "Falls deaktiviert, werden stattdessen Bitmap- und XML-Vektor-Schriften "
+#~ "benutzt."
+
#~ msgid "Whether dungeons occasionally project from the terrain."
#~ msgstr "Ob Verliese manchmal aus dem Gelände herausragen."
@@ -7769,3 +8174,9 @@ msgstr "cURL-Zeitüberschreitung"
#~ msgid "Yes"
#~ msgstr "Ja"
+
+#~ msgid "You died."
+#~ msgstr "Sie sind gestorben."
+
+#~ msgid "needs_fallback_font"
+#~ msgstr "no"
diff --git a/po/dv/minetest.po b/po/dv/minetest.po
index 4c4b53954..2ae55d9e9 100644
--- a/po/dv/minetest.po
+++ b/po/dv/minetest.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Dhivehi (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-23 19:03+0100\n"
+"POT-Creation-Date: 2022-01-25 23:19+0100\n"
"PO-Revision-Date: 2019-11-10 15:04+0000\n"
"Last-Translator: Krock <mk939@ymail.com>\n"
"Language-Team: Dhivehi <https://hosted.weblate.org/projects/minetest/"
@@ -14,6 +14,43 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.10-dev\n"
+#: builtin/client/chatcommands.lua
+msgid "Clear the out chat queue"
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "Empty command."
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Exit to main menu"
+msgstr "މެއިން މެނޫ"
+
+#: builtin/client/chatcommands.lua
+msgid "Invalid command: "
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "Issued command: "
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "List online players"
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "Online players: "
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "The out chat queue is now empty."
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "This command is disabled by server."
+msgstr ""
+
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
msgstr "އަލުން ސްޕައުންވޭ"
@@ -22,11 +59,40 @@ msgstr "އަލުން ސްޕައުންވޭ"
msgid "You died"
msgstr "މަރުވީ"
+#: builtin/common/chatcommands.lua
+msgid "Available commands:"
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "Available commands: "
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "Command not available: "
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "Get help for commands"
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid ""
+"Use '.help <cmd>' to get more information, or '.help all' to list everything."
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "[all | <cmd>]"
+msgstr ""
+
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
msgstr ""
#: builtin/fstk/ui.lua
+msgid "<none available>"
+msgstr ""
+
+#: builtin/fstk/ui.lua
#, fuzzy
msgid "An error occurred in a Lua script:"
msgstr "މޮޑެއްފަދަ ލުއޭ ސްކްރިޕްޓެއްގައި މައްސަލައެއް ޖެހިއްޖެ:"
@@ -236,6 +302,10 @@ msgid "Install missing dependencies"
msgstr "ލާޒިމުނޫން ޑިޕެންޑެންސީތައް:"
#: builtin/mainmenu/dlg_contentstore.lua
+msgid "Install: Unsupported file type or broken archive"
+msgstr ""
+
+#: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "މޮޑްތައް"
@@ -539,7 +609,7 @@ msgstr "އަނބުރާ ސެޓިންގްސް ސަފުހާއަށް>"
msgid "Browse"
msgstr "ފުންކޮށް ހޯދާ"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "އޮފްކޮށްފަ"
@@ -564,7 +634,7 @@ msgid "Offset"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
-msgid "Persistance"
+msgid "Persistence"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -583,7 +653,7 @@ msgstr "ޑިފޯލްޓައަށް ރައްދުކުރޭ"
msgid "Scale"
msgstr ""
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
msgstr "ހޯދާ"
@@ -678,15 +748,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1"
msgstr ""
#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: Unsupported file type \"$1\" or broken archive"
-msgstr ""
-
-#: builtin/mainmenu/pkgmgr.lua
-#, fuzzy
-msgid "Install: file: \"$1\""
-msgstr "މޮޑް އަޚާ: ފައިލް:\"1$\""
-
-#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
msgstr ""
@@ -722,6 +783,41 @@ msgstr ""
msgid "Try reenabling public serverlist and check your internet connection."
msgstr "ޕަބްލިކް ސާވަރ ލިސްޓު އަލުން ޖައްސަވާ.އަދި އިންޓަނެޓް ކަނެކްޝަން ޗެކްކުރައްވާ."
+#: builtin/mainmenu/tab_about.lua
+msgid "About"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active Contributors"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active renderer:"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Core Developers"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Open User Data Directory"
+msgstr "މޮޑްގެ ފައިލް އިހްތިޔާރުކުރޭ:"
+
+#: builtin/mainmenu/tab_about.lua
+msgid ""
+"Opens the directory that contains user-provided worlds, games, mods,\n"
+"and texture packs in a file manager / explorer."
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Contributors"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Core Developers"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr ""
@@ -766,37 +862,6 @@ msgstr "އިހްތިޔާރުކުރެވިފައިވާ މޮޑް ޑިލީޓްކުރ
msgid "Use Texture Pack"
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
-#, fuzzy
-msgid "Open User Data Directory"
-msgstr "މޮޑްގެ ފައިލް އިހްތިޔާރުކުރޭ:"
-
-#: builtin/mainmenu/tab_credits.lua
-msgid ""
-"Opens the directory that contains user-provided worlds, games, mods,\n"
-"and texture packs in a file manager / explorer."
-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 "ސާވަރ އިއުލާންކުރޭ"
@@ -825,7 +890,7 @@ msgstr "ސާވަރއެއް ހޮސްޓްކުރޭ"
msgid "Install games from ContentDB"
msgstr ""
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Name"
msgstr ""
@@ -837,7 +902,7 @@ msgstr "އައު"
msgid "No world created or selected!"
msgstr "އެއްވެސް ދުނިޔެއެއް އުފެދިފައެއް ނުވަތަ އިހްތިޔާރުވެފައެއް ނެޠް!"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Password"
msgstr "ޕާސްވޯޑް / ނަން"
@@ -846,7 +911,7 @@ msgstr "ޕާސްވޯޑް / ނަން"
msgid "Play Game"
msgstr "ގޭމް ކުޅޭ"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
msgstr "ޕޯޓް"
@@ -869,9 +934,14 @@ msgid "Start Game"
msgstr "ގޭމް ހޮސްޓްކުރޭ"
#: builtin/mainmenu/tab_online.lua
-msgid "Address / Port"
+#, fuzzy
+msgid "Address"
msgstr "އެޑްރެސް / ޕޯޓް"
+#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
+msgid "Clear"
+msgstr ""
+
#: builtin/mainmenu/tab_online.lua
msgid "Connect"
msgstr "ކަނެކްޓްކުރޭ"
@@ -880,35 +950,46 @@ msgstr "ކަނެކްޓްކުރޭ"
msgid "Creative mode"
msgstr "ކްރިއޭޓިވް މޯޑް"
+#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "Damage enabled"
-msgstr "އަނިޔާވުން ޖައްސާފައި"
+msgid "Damage / PvP"
+msgstr ""
#: builtin/mainmenu/tab_online.lua
msgid "Del. Favorite"
msgstr "އެންމެ ގަޔާނުވޭ"
#: builtin/mainmenu/tab_online.lua
-msgid "Favorite"
+#, fuzzy
+msgid "Favorites"
msgstr "އެންމެ ގަޔާވޭ"
#: builtin/mainmenu/tab_online.lua
+msgid "Incompatible Servers"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Join Game"
msgstr "ގޭމް ހޮސްޓްކުރޭ"
#: builtin/mainmenu/tab_online.lua
-msgid "Name / Password"
-msgstr "ޕާސްވޯޑް / ނަން"
+msgid "Ping"
+msgstr ""
#: builtin/mainmenu/tab_online.lua
-msgid "Ping"
+#, fuzzy
+msgid "Public Servers"
+msgstr "ސާވަރ އިއުލާންކުރޭ"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Refresh"
msgstr ""
-#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "PvP enabled"
-msgstr "ޕީ.ވީ.ޕީ ޖައްސާ"
+#, fuzzy
+msgid "Server Description"
+msgstr "ސާވަރ ޕޯޓް"
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -950,11 +1031,31 @@ msgstr ""
msgid "Connected Glass"
msgstr ""
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Dynamic shadows"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Dynamic shadows: "
+msgstr ""
+
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
+msgid "High"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Low"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Medium"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
msgstr ""
@@ -1026,10 +1127,6 @@ msgstr ""
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 ""
@@ -1043,6 +1140,14 @@ msgid "Trilinear Filter"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
+msgid "Ultra High"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Very Low"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
msgstr ""
@@ -1054,7 +1159,7 @@ msgstr ""
msgid "Waving Plants"
msgstr ""
-#: src/client/client.cpp
+#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr ""
@@ -1083,7 +1188,7 @@ msgid "Connection error (timed out?)"
msgstr ""
#: src/client/clientlauncher.cpp
-msgid "Could not find or load game \""
+msgid "Could not find or load game: "
msgstr ""
#: src/client/clientlauncher.cpp
@@ -1114,18 +1219,6 @@ msgstr ""
msgid "Provided world path doesn't exist: "
msgstr ""
-#. ~ DO NOT TRANSLATE THIS LITERALLY!
-#. This is a special string. Put either "no" or "yes"
-#. into the translation field (literally).
-#. Choose "yes" if the language requires use of the fallback
-#. font, "no" otherwise.
-#. The fallback font is (normally) required for languages with
-#. non-Latin script, like Chinese.
-#. When in doubt, test your translation.
-#: src/client/fontengine.cpp
-msgid "needs_fallback_font"
-msgstr "yes"
-
#: src/client/game.cpp
msgid ""
"\n"
@@ -1137,14 +1230,6 @@ msgid "- Address: "
msgstr ""
#: src/client/game.cpp
-msgid "- Creative Mode: "
-msgstr ""
-
-#: src/client/game.cpp
-msgid "- Damage: "
-msgstr ""
-
-#: src/client/game.cpp
msgid "- Mode: "
msgstr ""
@@ -1166,6 +1251,16 @@ msgid "- Server Name: "
msgstr ""
#: src/client/game.cpp
+#, fuzzy
+msgid "A serialization error occurred:"
+msgstr "މޮޑެއްފަދަ ލުއޭ ސްކްރިޕްޓެއްގައި މައްސަލައެއް ދިމާވެއްޖެ:"
+
+#: src/client/game.cpp
+#, c-format
+msgid "Access denied. Reason: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Automatic forward disabled"
msgstr ""
@@ -1175,6 +1270,22 @@ msgid "Automatic forward enabled"
msgstr "އަނިޔާވުން ޖައްސާފައި"
#: src/client/game.cpp
+msgid "Block bounds hidden"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for all blocks"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for current block"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for nearby blocks"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Camera update disabled"
msgstr ""
@@ -1184,6 +1295,10 @@ msgid "Camera update enabled"
msgstr "އަނިޔާވުން ޖައްސާފައި"
#: src/client/game.cpp
+msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Change Password"
msgstr ""
@@ -1197,6 +1312,10 @@ msgid "Cinematic mode enabled"
msgstr "އަނިޔާވުން ޖައްސާފައި"
#: src/client/game.cpp
+msgid "Client disconnected"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Client side scripting is disabled"
msgstr ""
@@ -1205,6 +1324,10 @@ msgid "Connecting to server..."
msgstr ""
#: src/client/game.cpp
+msgid "Connection failed for unknown reason"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Continue"
msgstr ""
@@ -1228,6 +1351,11 @@ msgid ""
msgstr ""
#: src/client/game.cpp
+#, c-format
+msgid "Couldn't resolve address: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Creating client..."
msgstr ""
@@ -1360,6 +1488,10 @@ msgid "Minimap currently disabled by game or mod"
msgstr ""
#: src/client/game.cpp
+msgid "Multiplayer"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Noclip mode disabled"
msgstr ""
@@ -1434,6 +1566,21 @@ msgstr ""
#: src/client/game.cpp
#, c-format
+msgid "The server is probably running a different version of %s."
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to connect to %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to listen on %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
msgid "Viewing range changed to %d"
msgstr ""
@@ -1502,10 +1649,6 @@ msgid "Caps Lock"
msgstr ""
#: src/client/keycode.cpp
-msgid "Clear"
-msgstr ""
-
-#: src/client/keycode.cpp
msgid "Control"
msgstr ""
@@ -1770,6 +1913,15 @@ msgstr ""
msgid "Minimap in texture mode"
msgstr ""
+#: src/gui/guiChatConsole.cpp
+#, fuzzy
+msgid "Failed to open webpage"
+msgstr "$1 ނޭޅުނު"
+
+#: src/gui/guiChatConsole.cpp
+msgid "Opening webpage"
+msgstr ""
+
#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
msgid "Passwords do not match!"
msgstr ""
@@ -1793,7 +1945,7 @@ msgid "Proceed"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
-msgid "\"Special\" = climb down"
+msgid "\"Aux1\" = climb down"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
@@ -1805,10 +1957,18 @@ msgid "Automatic jumping"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Aux1"
+msgstr ""
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Block bounds"
+msgstr ""
+
+#: src/gui/guiKeyChangeMenu.cpp
#, fuzzy
msgid "Change camera"
msgstr "ފިތްތައް ބަދަލުކުރޭ"
@@ -1898,10 +2058,6 @@ msgid "Sneak"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Special"
-msgstr ""
-
-#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle HUD"
msgstr ""
@@ -1962,7 +2118,8 @@ msgid "Muted"
msgstr ""
#: src/gui/guiVolumeChange.cpp
-msgid "Sound Volume: "
+#, c-format
+msgid "Sound Volume: %d%%"
msgstr ""
#. ~ Imperative, as in "Enter/type in text".
@@ -1986,8 +2143,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"(Android) Use virtual joystick to trigger \"aux\" button.\n"
-"If enabled, virtual joystick will also tap \"aux\" button when out of main "
+"(Android) Use virtual joystick to trigger \"Aux1\" button.\n"
+"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
@@ -2173,6 +2330,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Adjust the detected display density, used for scaling UI elements."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, c-format
msgid ""
"Adjusts the density of the floatland layer.\n"
@@ -2286,6 +2447,14 @@ msgid "Autoscaling mode"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Aux1 key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Aux1 key for climbing/descending"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr ""
@@ -2330,10 +2499,6 @@ 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 "Block send optimize distance"
msgstr ""
@@ -2432,6 +2597,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Chat command time message threshold"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Chat commands"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Chat font size"
msgstr ""
@@ -2464,7 +2637,7 @@ msgid "Chat toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Chatcommands"
+msgid "Chat weblinks"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2484,6 +2657,12 @@ msgid "Clean transparent textures"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console "
+"output."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Client"
msgstr ""
@@ -2528,6 +2707,10 @@ msgid "Colored fog"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Colored shadows"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of flags to hide in the content repository.\n"
"\"nonfree\" can be used to hide packages which do not qualify as 'free "
@@ -2555,6 +2738,22 @@ msgid "Command key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when saving mapblocks to disk.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when sending mapblocks to the client.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Connect glass"
msgstr ""
@@ -2646,7 +2845,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
-"Also controls the object crosshair color"
+"This also applies to the object crosshair."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2725,8 +2924,9 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Default timeout for cURL, stated in milliseconds.\n"
-"Only has an effect if compiled with cURL."
+"Define shadow filtering quality.\n"
+"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
+"but also uses more resources."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2844,6 +3044,10 @@ msgid "Disallow empty passwords"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Display Density Scaling Factor"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -2888,6 +3092,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enable Poisson disk filtering.\n"
+"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF "
+"filtering."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable colored shadows.\n"
+"On true translucent nodes cast colored shadows. This is expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable console window"
msgstr ""
@@ -2996,6 +3213,12 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enables tradeoffs that reduce CPU load or increase rendering performance\n"
+"at the expense of minor visual glitches that do not impact game playability."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3034,18 +3257,6 @@ msgid "Fallback font path"
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 ""
@@ -3063,7 +3274,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Fast movement (via the \"special\" key).\n"
+"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
@@ -3097,9 +3308,9 @@ 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."
+"which PNG optimizers usually discard, often resulting in dark or\n"
+"light edges to transparent textures. Apply a filter to clean that up\n"
+"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3191,15 +3402,15 @@ msgid "Font size"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the default font in point (pt)."
+msgid "Font size divisible by"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the fallback font in point (pt)."
+msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the monospace font in point (pt)."
+msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3210,6 +3421,17 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"For pixel-style fonts that do not scale well, this ensures that font sizes "
+"used\n"
+"with this font will always be divisible by this value, in pixels. For "
+"instance,\n"
+"a pixel font 16 pixels tall should have this set to 16, so it will only ever "
+"be\n"
+"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Format of player chat messages. The following strings are valid "
"placeholders:\n"
"@name, @message, @timestamp (optional)"
@@ -3268,10 +3490,6 @@ 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)."
@@ -3296,10 +3514,6 @@ msgid "Full screen"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Full screen BPP"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
msgstr ""
@@ -3323,7 +3537,7 @@ msgstr ""
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."
+"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3392,7 +3606,8 @@ msgid "Heat noise"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Height component of the initial window size. Ignored in fullscreen mode."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3404,10 +3619,6 @@ msgid "Height select noise"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "High-precision FPU"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Hill steepness"
msgstr ""
@@ -3638,8 +3849,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"If disabled, \"special\" key is used to fly fast if both fly and fast mode "
-"are\n"
+"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
@@ -3661,8 +3871,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"If enabled, \"special\" key instead of \"sneak\" key is used for climbing "
-"down and\n"
+"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down "
+"and\n"
"descending."
msgstr ""
@@ -3708,6 +3918,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If the execution of a chat command takes longer than this specified time in\n"
+"seconds, add the time information to the chat command message"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If the file size of debug.txt exceeds the number of megabytes specified in\n"
"this setting when it is opened, the file is moved to debug.txt.1,\n"
"deleting an older debug.txt.1 if it exists.\n"
@@ -3753,7 +3969,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrument chatcommands on registration."
+msgid "Instrument chat commands on registration."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3837,7 +4053,7 @@ msgid "Joystick button repetition interval"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Joystick deadzone"
+msgid "Joystick dead zone"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4595,10 +4811,6 @@ msgid ""
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 ""
@@ -4670,6 +4882,10 @@ msgid "Map save interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Map shadows update frames"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mapblock limit"
msgstr ""
@@ -4784,6 +5000,10 @@ msgid "Maximum FPS when the window is not focused, or when the game is paused."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum distance to render shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
msgstr ""
@@ -4889,7 +5109,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum time in ms a file download (e.g. a mod download) may take."
+msgid ""
+"Maximum time a file download (e.g. a mod download) may take, stated in "
+"milliseconds."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum time an interactive request (e.g. server list fetch) may take, "
+"stated in milliseconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4953,7 +5181,7 @@ msgid "Mod channels"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Modifies the size of the hudbar elements."
+msgid "Modifies the size of the HUD elements."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4965,6 +5193,10 @@ msgid "Monospace font size"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Monospace font size divisible by"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mountain height noise"
msgstr ""
@@ -5088,7 +5320,7 @@ 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"
+"This is a trade-off between SQLite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
@@ -5107,21 +5339,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"Open the pause menu when the window's focus is lost. Does not pause if a "
"formspec is\n"
"open."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Optional override for chat weblink color."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
-"Path of the fallback font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path of the fallback font. Must be a TrueType font.\n"
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
@@ -5144,17 +5373,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the default font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the monospace font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
@@ -5209,6 +5434,10 @@ msgid "Player versus player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Poisson filtering"
+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."
@@ -5253,9 +5482,9 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Prometheus listener address.\n"
-"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
+"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
"enable metrics listener for Prometheus on that address.\n"
-"Metrics can be fetch on http://127.0.0.1:30000/metrics"
+"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5544,6 +5773,32 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Set the shadow strength.\n"
+"Lower value means lighter shadows, higher value means darker shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the soft shadow radius size.\n"
+"Lower values mean sharper shadows, bigger values mean softer shadows.\n"
+"Minimum value: 1.0; maximum value: 10.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the tilt of Sun/Moon orbit in degrees.\n"
+"Value of 0 means no tilt / vertical orbit.\n"
+"Minimum value: 0.0; maximum value: 60.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true to enable Shadow Mapping.\n"
+"Requires shaders to be enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Set to true to enable waving leaves.\n"
"Requires shaders to be enabled."
msgstr ""
@@ -5561,6 +5816,13 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Sets shadow texture quality to 32 bits.\n"
+"On false, 16 bits texture will be used.\n"
+"This can cause much more artifacts in the shadow."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Shader path"
msgstr ""
@@ -5573,15 +5835,29 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Shadow filter quality"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map max distance in nodes to render shadows"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture in 32 bits"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture size"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Shadow offset (in pixels) of the default font. If 0, then shadow will not be "
"drawn."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not "
-"be drawn."
+msgid "Shadow strength"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5603,7 +5879,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Show nametag backgrounds by default"
+msgid "Show name tag backgrounds by default"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5628,6 +5904,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Sky Body Orbit Tilt"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Slice w"
msgstr ""
@@ -5682,15 +5962,11 @@ msgid "Sneaking speed, in nodes per second."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Sound"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Special key"
+msgid "Soft shadow radius"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Special key for climbing/descending"
+msgid "Sound"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5710,6 +5986,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Spread a complete update of shadow map over given amount of frames.\n"
+"Higher values might make shadows laggy, lower values\n"
+"will consume more resources.\n"
+"Minimum value: 1; maximum value: 16"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Spread of light curve boost range.\n"
"Controls the width of the range to be boosted.\n"
"Standard deviation of the light curve boost Gaussian."
@@ -5816,6 +6100,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Texture size to render the shadow map on.\n"
+"This must be a power of two.\n"
+"Bigger numbers create better shadows but it is also more expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Textures on a node may be aligned either to the node or to the world.\n"
"The former mode suits better things like machines, furniture, etc., while\n"
"the latter makes stairs and microblocks fit surroundings better.\n"
@@ -5829,7 +6120,7 @@ msgid "The URL for the content repository"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "The deadzone of the joystick"
+msgid "The dead zone of the joystick"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5887,7 +6178,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"The rendering back-end for Irrlicht.\n"
+"The rendering back-end.\n"
"A restart is required after changing this.\n"
"Note: On Android, stick with OGLES1 if unsure! App may fail to start "
"otherwise.\n"
@@ -5898,7 +6189,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"The sensitivity of the joystick axes for moving the\n"
-"ingame view frustum around."
+"in-game view frustum around."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5992,6 +6283,10 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Tradeoffs for performance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6061,7 +6356,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Use mip mapping to scale textures. May slightly increase performance,\n"
+"Use mipmapping to scale textures. May slightly increase performance,\n"
"especially when using a high resolution texture pack.\n"
"Gamma correct downscaling is not supported."
msgstr ""
@@ -6174,7 +6469,7 @@ msgid "Viewing range"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Virtual joystick triggers aux button"
+msgid "Virtual joystick triggers Aux1 button"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6245,6 +6540,10 @@ msgid "Waving plants"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Weblink color"
+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"
@@ -6265,23 +6564,15 @@ msgid ""
"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.\n"
+"memory. Powers of 2 are recommended. This setting is ONLY applied if\n"
+"bilinear/trilinear/anisotropic filtering is enabled.\n"
"This is also used as the base node texture size for world-aligned\n"
"texture autoscaling."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Whether FreeType fonts are used, requires FreeType support to be compiled "
-"in.\n"
-"If disabled, bitmap and XML vectors fonts are used instead."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Whether nametag backgrounds should be shown by default.\n"
+"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
@@ -6323,7 +6614,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Width component of the initial window size."
+msgid "Width component of the initial window size. Ignored in fullscreen mode."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6409,38 +6700,23 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when saving mapblocks to disk.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when sending mapblocks to the client.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "cURL parallel limit"
+msgid "cURL interactive timeout"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "cURL timeout"
+msgid "cURL parallel limit"
msgstr ""
#~ msgid "Configure"
#~ msgstr "ބަދަލުގެނޭ"
+#~ msgid "Damage enabled"
+#~ msgstr "އަނިޔާވުން ޖައްސާފައި"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "$1 ޑައުންލޯޑޮކޮށް އިންސްޓޯލްކުރަނީ، މަޑުކުރައްވާ..."
@@ -6448,15 +6724,32 @@ msgstr ""
#~ msgstr "ޕޯސް މެނޫގައި އެފް.ޕީ.އެސް"
#, fuzzy
+#~ msgid "Install: file: \"$1\""
+#~ msgstr "މޮޑް އަޚާ: ފައިލް:\"1$\""
+
+#, fuzzy
#~ msgid "Main menu style"
#~ msgstr "މެއިން މެނޫ ސްކްރިޕްޓް"
+#~ msgid "Name / Password"
+#~ msgstr "ޕާސްވޯޑް / ނަން"
+
#~ msgid "No"
#~ msgstr "ނޫން"
#~ msgid "Ok"
#~ msgstr "emme rangalhu"
+#~ msgid "PvP enabled"
+#~ msgstr "ޕީ.ވީ.ޕީ ޖައްސާ"
+
#, fuzzy
#~ msgid "Select Package File:"
#~ msgstr "މޮޑްގެ ފައިލް އިހްތިޔާރުކުރޭ:"
+
+#, fuzzy
+#~ msgid "You died."
+#~ msgstr "މަރުވީ"
+
+#~ msgid "needs_fallback_font"
+#~ msgstr "yes"
diff --git a/po/el/minetest.po b/po/el/minetest.po
index 3ae9d7017..2bf5854e6 100644
--- a/po/el/minetest.po
+++ b/po/el/minetest.po
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Greek (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-23 19:03+0100\n"
-"PO-Revision-Date: 2021-03-22 18:29+0000\n"
-"Last-Translator: Michalis <michalisntovas@yahoo.gr>\n"
+"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"PO-Revision-Date: 2021-06-07 14:33+0000\n"
+"Last-Translator: THANOS SIOURDAKIS <siourdakisthanos@gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/minetest/minetest/"
"el/>\n"
"Language: el\n"
@@ -12,7 +12,44 @@ 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 4.5.2-dev\n"
+"X-Generator: Weblate 4.7-dev\n"
+
+#: builtin/client/chatcommands.lua
+msgid "Clear the out chat queue"
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "Empty command."
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+#, fuzzy
+msgid "Exit to main menu"
+msgstr "Έξοδος στο Μενού"
+
+#: builtin/client/chatcommands.lua
+msgid "Invalid command: "
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "Issued command: "
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "List online players"
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "Online players: "
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "The out chat queue is now empty."
+msgstr ""
+
+#: builtin/client/chatcommands.lua
+msgid "This command is disabled by server."
+msgstr ""
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
@@ -22,11 +59,40 @@ msgstr ""
msgid "You died"
msgstr "Πέθανες"
+#: builtin/common/chatcommands.lua
+msgid "Available commands:"
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "Available commands: "
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "Command not available: "
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "Get help for commands"
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid ""
+"Use '.help <cmd>' to get more information, or '.help all' to list everything."
+msgstr ""
+
+#: builtin/common/chatcommands.lua
+msgid "[all | <cmd>]"
+msgstr ""
+
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
msgstr "Εντάξει"
#: builtin/fstk/ui.lua
+msgid "<none available>"
+msgstr ""
+
+#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
msgstr "Ένα σφάλμα προέκυψε σε ένα σενάριο Lua:"
@@ -151,7 +217,7 @@ msgstr "ενεργοποιήθηκε"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "\"$1\" already exists. Would you like to overwrite it?"
-msgstr ""
+msgstr "Το \"$1\" ήδη υπάρχει. Θέλετε να το αντικαταστήσετε;"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 and $2 dependencies will be installed."
@@ -168,7 +234,6 @@ msgid ""
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "$1 downloading..."
msgstr "Λήψη ..."
@@ -219,13 +284,17 @@ msgstr "Εγκατάσταση"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install $1"
-msgstr ""
+msgstr "Εγκατάσταση $1"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install missing dependencies"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
+msgid "Install: Unsupported file type or broken archive"
+msgstr ""
+
+#: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr ""
@@ -525,9 +594,9 @@ msgstr ""
msgid "Browse"
msgstr "Περιήγηση"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
-msgstr ""
+msgstr "Απενεργοποιημένο"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Edit"
@@ -550,7 +619,7 @@ msgid "Offset"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
-msgid "Persistance"
+msgid "Persistence"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -569,7 +638,7 @@ msgstr ""
msgid "Scale"
msgstr ""
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
msgstr "Αναζήτηση"
@@ -595,7 +664,7 @@ msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "X"
-msgstr ""
+msgstr "X"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "X spread"
@@ -603,7 +672,7 @@ msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Y"
-msgstr ""
+msgstr "Y"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Y spread"
@@ -611,7 +680,7 @@ msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Z"
-msgstr ""
+msgstr "Z"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Z spread"
@@ -661,14 +730,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1"
msgstr ""
#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: Unsupported file type \"$1\" or broken archive"
-msgstr ""
-
-#: builtin/mainmenu/pkgmgr.lua
-msgid "Install: file: \"$1\""
-msgstr "Εγκατάσταση: αρχείο: \"$1\""
-
-#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
msgstr ""
@@ -702,6 +763,40 @@ msgstr ""
"Δοκιμάστε να ενεργοποιήσετε ξανά τη δημόσια λίστα διακομιστών και ελέγξτε τη "
"σύνδεσή σας στο διαδίκτυο."
+#: builtin/mainmenu/tab_about.lua
+msgid "About"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active Contributors"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Active renderer:"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Core Developers"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Open User Data Directory"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid ""
+"Opens the directory that contains user-provided worlds, games, mods,\n"
+"and texture packs in a file manager / explorer."
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Contributors"
+msgstr ""
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Previous Core Developers"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Περιήγηση διαδικτυακού περιεχομένου"
@@ -736,42 +831,12 @@ msgstr "Μετονομασία"
#: builtin/mainmenu/tab_content.lua
msgid "Uninstall Package"
-msgstr ""
+msgstr "Απεγκατάσταση πακέτου"
#: builtin/mainmenu/tab_content.lua
msgid "Use Texture Pack"
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 "Open User Data Directory"
-msgstr ""
-
-#: builtin/mainmenu/tab_credits.lua
-msgid ""
-"Opens the directory that contains user-provided worlds, games, mods,\n"
-"and texture packs in a file manager / explorer."
-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 ""
@@ -798,9 +863,9 @@ msgstr ""
#: builtin/mainmenu/tab_local.lua
msgid "Install games from ContentDB"
-msgstr ""
+msgstr "Εγκατάσταση παιχνιδιών από το ContentDB"
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Name"
msgstr "Όνομα"
@@ -812,7 +877,7 @@ msgstr "Νέο"
msgid "No world created or selected!"
msgstr ""
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Password"
msgstr "Κωδικός"
@@ -820,7 +885,7 @@ msgstr "Κωδικός"
msgid "Play Game"
msgstr ""
-#: builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
msgstr "Θήρα"
@@ -841,8 +906,13 @@ msgid "Start Game"
msgstr "Εκκίνηση Παιχνιδιού"
#: builtin/mainmenu/tab_online.lua
-msgid "Address / Port"
-msgstr "Διεύθυνση Αποθετηρίου"
+#, fuzzy
+msgid "Address"
+msgstr "- Διεύθυνση: "
+
+#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
+msgid "Clear"
+msgstr "Εκκαθάριση"
#: builtin/mainmenu/tab_online.lua
msgid "Connect"
@@ -852,8 +922,9 @@ msgstr "Σύνδεση"
msgid "Creative mode"
msgstr ""
+#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "Damage enabled"
+msgid "Damage / PvP"
msgstr ""
#: builtin/mainmenu/tab_online.lua
@@ -861,41 +932,49 @@ msgid "Del. Favorite"
msgstr ""
#: builtin/mainmenu/tab_online.lua
-msgid "Favorite"
+msgid "Favorites"
msgstr ""
#: builtin/mainmenu/tab_online.lua
-msgid "Join Game"
+msgid "Incompatible Servers"
msgstr ""
#: builtin/mainmenu/tab_online.lua
-msgid "Name / Password"
-msgstr "Όνομα / Κωδικός"
+msgid "Join Game"
+msgstr ""
#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr ""
-#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-msgid "PvP enabled"
+msgid "Public Servers"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Refresh"
msgstr ""
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Server Description"
+msgstr "Περιγραφή διακομιστή"
+
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr ""
#: 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 "All Settings"
@@ -921,11 +1000,31 @@ msgstr "Αλλαγή πλήκτρων"
msgid "Connected Glass"
msgstr ""
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Dynamic shadows"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Dynamic shadows: "
+msgstr ""
+
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
+msgid "High"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Low"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Medium"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
msgstr ""
@@ -967,7 +1066,7 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Screen:"
-msgstr ""
+msgstr "Οθόνη:"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -997,10 +1096,6 @@ msgstr ""
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 ""
@@ -1014,6 +1109,14 @@ msgid "Trilinear Filter"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
+msgid "Ultra High"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Very Low"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
msgstr ""
@@ -1025,7 +1128,7 @@ msgstr ""
msgid "Waving Plants"
msgstr ""
-#: src/client/client.cpp
+#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr ""
@@ -1054,7 +1157,7 @@ msgid "Connection error (timed out?)"
msgstr ""
#: src/client/clientlauncher.cpp
-msgid "Could not find or load game \""
+msgid "Could not find or load game: "
msgstr ""
#: src/client/clientlauncher.cpp
@@ -1085,18 +1188,6 @@ msgstr ""
msgid "Provided world path doesn't exist: "
msgstr ""
-#. ~ DO NOT TRANSLATE THIS LITERALLY!
-#. This is a special string. Put either "no" or "yes"
-#. into the translation field (literally).
-#. Choose "yes" if the language requires use of the fallback
-#. font, "no" otherwise.
-#. The fallback font is (normally) required for languages with
-#. non-Latin script, like Chinese.
-#. When in doubt, test your translation.
-#: src/client/fontengine.cpp
-msgid "needs_fallback_font"
-msgstr "needs_fallback_font"
-
#: src/client/game.cpp
msgid ""
"\n"
@@ -1108,14 +1199,6 @@ msgid "- Address: "
msgstr "- Διεύθυνση: "
#: src/client/game.cpp
-msgid "- Creative Mode: "
-msgstr ""
-
-#: src/client/game.cpp
-msgid "- Damage: "
-msgstr ""
-
-#: src/client/game.cpp
msgid "- Mode: "
msgstr ""
@@ -1125,7 +1208,7 @@ msgstr "- Θήρα: "
#: src/client/game.cpp
msgid "- Public: "
-msgstr ""
+msgstr "- Δημόσιο: "
#. ~ PvP = Player versus Player
#: src/client/game.cpp
@@ -1137,6 +1220,16 @@ msgid "- Server Name: "
msgstr "- Όνομα Διακομιστή: "
#: src/client/game.cpp
+#, fuzzy
+msgid "A serialization error occurred:"
+msgstr "Παρουσιάστηκε σφάλμα:"
+
+#: src/client/game.cpp
+#, c-format
+msgid "Access denied. Reason: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Automatic forward disabled"
msgstr ""
@@ -1145,6 +1238,22 @@ msgid "Automatic forward enabled"
msgstr ""
#: src/client/game.cpp
+msgid "Block bounds hidden"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for all blocks"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for current block"
+msgstr ""
+
+#: src/client/game.cpp
+msgid "Block bounds shown for nearby blocks"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Camera update disabled"
msgstr ""
@@ -1153,6 +1262,10 @@ msgid "Camera update enabled"
msgstr ""
#: src/client/game.cpp
+msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Change Password"
msgstr ""
@@ -1165,6 +1278,10 @@ msgid "Cinematic mode enabled"
msgstr ""
#: src/client/game.cpp
+msgid "Client disconnected"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Client side scripting is disabled"
msgstr ""
@@ -1173,6 +1290,10 @@ msgid "Connecting to server..."
msgstr ""
#: src/client/game.cpp
+msgid "Connection failed for unknown reason"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Continue"
msgstr "Συνέχεια"
@@ -1196,6 +1317,11 @@ msgid ""
msgstr ""
#: src/client/game.cpp
+#, c-format
+msgid "Couldn't resolve address: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Creating client..."
msgstr ""
@@ -1312,6 +1438,10 @@ msgid "Minimap currently disabled by game or mod"
msgstr ""
#: src/client/game.cpp
+msgid "Multiplayer"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Noclip mode disabled"
msgstr ""
@@ -1385,6 +1515,21 @@ msgstr ""
#: src/client/game.cpp
#, c-format
+msgid "The server is probably running a different version of %s."
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to connect to %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
+msgid "Unable to listen on %s because IPv6 is disabled"
+msgstr ""
+
+#: src/client/game.cpp
+#, c-format
msgid "Viewing range changed to %d"
msgstr ""
@@ -1442,7 +1587,7 @@ msgstr ""
#: src/client/keycode.cpp
msgid "Apps"
-msgstr ""
+msgstr "Εφαρμογές"
#: src/client/keycode.cpp
msgid "Backspace"
@@ -1453,10 +1598,6 @@ msgid "Caps Lock"
msgstr ""
#: src/client/keycode.cpp
-msgid "Clear"
-msgstr "Εκκαθάριση"
-
-#: src/client/keycode.cpp
msgid "Control"
msgstr ""
@@ -1466,7 +1607,7 @@ msgstr "Κάτω"
#: src/client/keycode.cpp
msgid "End"
-msgstr ""
+msgstr "Τέλος"
#: src/client/keycode.cpp
msgid "Erase EOF"
@@ -1506,7 +1647,7 @@ msgstr ""
#: src/client/keycode.cpp
msgid "Insert"
-msgstr ""
+msgstr "Εισαγωγή"
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Left"
@@ -1547,63 +1688,63 @@ msgstr ""
#: src/client/keycode.cpp
msgid "Numpad *"
-msgstr ""
+msgstr "Numpad *"
#: src/client/keycode.cpp
msgid "Numpad +"
-msgstr ""
+msgstr "Numpad +"
#: src/client/keycode.cpp
msgid "Numpad -"
-msgstr ""
+msgstr "Numpad -"
#: src/client/keycode.cpp
msgid "Numpad ."
-msgstr ""
+msgstr "Numpad ."
#: src/client/keycode.cpp
msgid "Numpad /"
-msgstr ""
+msgstr "Numpad /"
#: src/client/keycode.cpp
msgid "Numpad 0"
-msgstr ""
+msgstr "Numpad 0"
#: src/client/keycode.cpp
msgid "Numpad 1"
-msgstr ""
+msgstr "Numpad 1"
#: src/client/keycode.cpp
msgid "Numpad 2"
-msgstr ""
+msgstr "Numpad 2"
#: src/client/keycode.cpp
msgid "Numpad 3"
-msgstr ""
+msgstr "Numpad 3"
#: src/client/keycode.cpp
msgid "Numpad 4"
-msgstr ""
+msgstr "Numpad 4"
#: src/client/keycode.cpp
msgid "Numpad 5"
-msgstr ""
+msgstr "Numpad 5"
#: src/client/keycode.cpp
msgid "Numpad 6"
-msgstr ""
+msgstr "Numpad 6"
#: src/client/keycode.cpp
msgid "Numpad 7"
-msgstr ""
+msgstr "Numpad 7"
#: src/client/keycode.cpp
msgid "Numpad 8"
-msgstr ""
+msgstr "Numpad 8"
#: src/client/keycode.cpp
msgid "Numpad 9"
-msgstr ""
+msgstr "Numpad 9"
#: src/client/keycode.cpp
msgid "OEM Clear"
@@ -1632,7 +1773,7 @@ msgstr "Εκτύπωση"
#: src/client/keycode.cpp
msgid "Return"
-msgstr ""
+msgstr "Επιστροφή"
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Right"
@@ -1665,7 +1806,7 @@ msgstr ""
#. ~ Key name
#: src/client/keycode.cpp
msgid "Select"
-msgstr ""
+msgstr "Επιλογή"
#: src/client/keycode.cpp
msgid "Shift"
@@ -1721,6 +1862,14 @@ msgstr ""
msgid "Minimap in texture mode"
msgstr ""
+#: src/gui/guiChatConsole.cpp
+msgid "Failed to open webpage"
+msgstr ""
+
+#: src/gui/guiChatConsole.cpp
+msgid "Opening webpage"
+msgstr ""
+
#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
msgid "Passwords do not match!"
msgstr ""
@@ -1744,7 +1893,7 @@ msgid "Proceed"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
-msgid "\"Special\" = climb down"
+msgid "\"Aux1\" = climb down"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
@@ -1756,10 +1905,18 @@ msgid "Automatic jumping"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Aux1"
+msgstr ""
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
+msgid "Block bounds"
+msgstr ""
+
+#: src/gui/guiKeyChangeMenu.cpp
msgid "Change camera"
msgstr ""
@@ -1848,10 +2005,6 @@ msgid "Sneak"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Special"
-msgstr ""
-
-#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle HUD"
msgstr ""
@@ -1912,8 +2065,9 @@ msgid "Muted"
msgstr "Σε σίγαση"
#: src/gui/guiVolumeChange.cpp
-msgid "Sound Volume: "
-msgstr ""
+#, fuzzy, c-format
+msgid "Sound Volume: %d%%"
+msgstr "Ένταση ήχου: "
#. ~ Imperative, as in "Enter/type in text".
#. Don't forget the space.
@@ -1936,8 +2090,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"(Android) Use virtual joystick to trigger \"aux\" button.\n"
-"If enabled, virtual joystick will also tap \"aux\" button when out of main "
+"(Android) Use virtual joystick to trigger \"Aux1\" button.\n"
+"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
@@ -1994,7 +2148,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "3D clouds"
-msgstr ""
+msgstr "3D σύννεφα"
#: src/settings_translation_file.cpp
msgid "3D mode"
@@ -2120,6 +2274,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Adjust the detected display density, used for scaling UI elements."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, c-format
msgid ""
"Adjusts the density of the floatland layer.\n"
@@ -2232,6 +2390,14 @@ msgid "Autoscaling mode"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Aux1 key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Aux1 key for climbing/descending"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr ""
@@ -2276,10 +2442,6 @@ 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 "Block send optimize distance"
msgstr ""
@@ -2378,6 +2540,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Chat command time message threshold"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chat commands"
+msgstr "Εντολή"
+
+#: src/settings_translation_file.cpp
msgid "Chat font size"
msgstr ""
@@ -2410,7 +2581,7 @@ msgid "Chat toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Chatcommands"
+msgid "Chat weblinks"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2430,6 +2601,12 @@ msgid "Clean transparent textures"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console "
+"output."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Client"
msgstr ""
@@ -2474,6 +2651,10 @@ msgid "Colored fog"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Colored shadows"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of flags to hide in the content repository.\n"
"\"nonfree\" can be used to hide packages which do not qualify as 'free "
@@ -2501,6 +2682,22 @@ msgid "Command key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when saving mapblocks to disk.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Compression level to use when sending mapblocks to the client.\n"
+"-1 - use default compression level\n"
+"0 - least compression, fastest\n"
+"9 - best compression, slowest"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Connect glass"
msgstr ""
@@ -2591,7 +2788,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
-"Also controls the object crosshair color"
+"This also applies to the object crosshair."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2668,8 +2865,9 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Default timeout for cURL, stated in milliseconds.\n"
-"Only has an effect if compiled with cURL."
+"Define shadow filtering quality.\n"
+"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
+"but also uses more resources."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2787,6 +2985,10 @@ msgid "Disallow empty passwords"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Display Density Scaling Factor"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -2831,6 +3033,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enable Poisson disk filtering.\n"
+"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF "
+"filtering."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable colored shadows.\n"
+"On true translucent nodes cast colored shadows. This is expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable console window"
msgstr ""
@@ -2939,6 +3154,12 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Enables tradeoffs that reduce CPU load or increase rendering performance\n"
+"at the expense of minor visual glitches that do not impact game playability."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -2977,18 +3198,6 @@ msgid "Fallback font path"
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 ""
@@ -3006,7 +3215,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Fast movement (via the \"special\" key).\n"
+"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
@@ -3040,9 +3249,9 @@ 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."
+"which PNG optimizers usually discard, often resulting in dark or\n"
+"light edges to transparent textures. Apply a filter to clean that up\n"
+"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3134,15 +3343,15 @@ msgid "Font size"
msgstr "Μέγεθος γραμματοσειράς"
#: src/settings_translation_file.cpp
-msgid "Font size of the default font in point (pt)."
+msgid "Font size divisible by"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the fallback font in point (pt)."
+msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Font size of the monospace font in point (pt)."
+msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3153,6 +3362,17 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"For pixel-style fonts that do not scale well, this ensures that font sizes "
+"used\n"
+"with this font will always be divisible by this value, in pixels. For "
+"instance,\n"
+"a pixel font 16 pixels tall should have this set to 16, so it will only ever "
+"be\n"
+"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Format of player chat messages. The following strings are valid "
"placeholders:\n"
"@name, @message, @timestamp (optional)"
@@ -3211,10 +3431,6 @@ 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)."
@@ -3239,10 +3455,6 @@ msgid "Full screen"
msgstr "Πλήρης οθόνη"
#: src/settings_translation_file.cpp
-msgid "Full screen BPP"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
msgstr ""
@@ -3266,7 +3478,7 @@ msgstr ""
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."
+"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3335,7 +3547,8 @@ msgid "Heat noise"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Height component of the initial window size. Ignored in fullscreen mode."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3347,10 +3560,6 @@ msgid "Height select noise"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "High-precision FPU"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Hill steepness"
msgstr ""
@@ -3581,8 +3790,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"If disabled, \"special\" key is used to fly fast if both fly and fast mode "
-"are\n"
+"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
@@ -3604,8 +3812,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"If enabled, \"special\" key instead of \"sneak\" key is used for climbing "
-"down and\n"
+"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down "
+"and\n"
"descending."
msgstr ""
@@ -3651,6 +3859,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If the execution of a chat command takes longer than this specified time in\n"
+"seconds, add the time information to the chat command message"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If the file size of debug.txt exceeds the number of megabytes specified in\n"
"this setting when it is opened, the file is moved to debug.txt.1,\n"
"deleting an older debug.txt.1 if it exists.\n"
@@ -3696,7 +3910,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrument chatcommands on registration."
+msgid "Instrument chat commands on registration."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3780,7 +3994,7 @@ msgid "Joystick button repetition interval"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Joystick deadzone"
+msgid "Joystick dead zone"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4538,10 +4752,6 @@ msgid ""
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 ""
@@ -4613,6 +4823,10 @@ msgid "Map save interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Map shadows update frames"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mapblock limit"
msgstr ""
@@ -4721,6 +4935,10 @@ msgid "Maximum FPS when the window is not focused, or when the game is paused."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum distance to render shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
msgstr ""
@@ -4826,7 +5044,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum time in ms a file download (e.g. a mod download) may take."
+msgid ""
+"Maximum time a file download (e.g. a mod download) may take, stated in "
+"milliseconds."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum time an interactive request (e.g. server list fetch) may take, "
+"stated in milliseconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4890,7 +5116,7 @@ msgid "Mod channels"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Modifies the size of the hudbar elements."
+msgid "Modifies the size of the HUD elements."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4902,6 +5128,10 @@ msgid "Monospace font size"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Monospace font size divisible by"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mountain height noise"
msgstr ""
@@ -5022,7 +5252,7 @@ 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"
+"This is a trade-off between SQLite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
@@ -5041,21 +5271,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"Open the pause menu when the window's focus is lost. Does not pause if a "
"formspec is\n"
"open."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Optional override for chat weblink color."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
-"Path of the fallback font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path of the fallback font. Must be a TrueType font.\n"
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
@@ -5078,17 +5305,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the default font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Path to the monospace font.\n"
-"If “freetype” setting is enabled: Must be a TrueType font.\n"
-"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n"
+"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
@@ -5143,6 +5366,10 @@ msgid "Player versus player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Poisson filtering"
+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."
@@ -5187,9 +5414,9 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Prometheus listener address.\n"
-"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
+"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
"enable metrics listener for Prometheus on that address.\n"
-"Metrics can be fetch on http://127.0.0.1:30000/metrics"
+"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5436,23 +5663,23 @@ 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"
@@ -5478,6 +5705,32 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Set the shadow strength.\n"
+"Lower value means lighter shadows, higher value means darker shadows."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the soft shadow radius size.\n"
+"Lower values mean sharper shadows, bigger values mean softer shadows.\n"
+"Minimum value: 1.0; maximum value: 10.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the tilt of Sun/Moon orbit in degrees.\n"
+"Value of 0 means no tilt / vertical orbit.\n"
+"Minimum value: 0.0; maximum value: 60.0"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true to enable Shadow Mapping.\n"
+"Requires shaders to be enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Set to true to enable waving leaves.\n"
"Requires shaders to be enabled."
msgstr ""
@@ -5495,6 +5748,13 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Sets shadow texture quality to 32 bits.\n"
+"On false, 16 bits texture will be used.\n"
+"This can cause much more artifacts in the shadow."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Shader path"
msgstr ""
@@ -5507,15 +5767,29 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Shadow filter quality"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map max distance in nodes to render shadows"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture in 32 bits"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shadow map texture size"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Shadow offset (in pixels) of the default font. If 0, then shadow will not be "
"drawn."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not "
-"be drawn."
+msgid "Shadow strength"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5537,7 +5811,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Show nametag backgrounds by default"
+msgid "Show name tag backgrounds by default"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5562,6 +5836,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Sky Body Orbit Tilt"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Slice w"
msgstr ""
@@ -5616,16 +5894,12 @@ msgid "Sneaking speed, in nodes per second."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Sound"
+msgid "Soft shadow radius"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Special key"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Special key for climbing/descending"
-msgstr ""
+msgid "Sound"
+msgstr "Ήχος"
#: src/settings_translation_file.cpp
msgid ""
@@ -5644,6 +5918,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Spread a complete update of shadow map over given amount of frames.\n"
+"Higher values might make shadows laggy, lower values\n"
+"will consume more resources.\n"
+"Minimum value: 1; maximum value: 16"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Spread of light curve boost range.\n"
"Controls the width of the range to be boosted.\n"
"Standard deviation of the light curve boost Gaussian."
@@ -5750,6 +6032,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Texture size to render the shadow map on.\n"
+"This must be a power of two.\n"
+"Bigger numbers create better shadows but it is also more expensive."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Textures on a node may be aligned either to the node or to the world.\n"
"The former mode suits better things like machines, furniture, etc., while\n"
"the latter makes stairs and microblocks fit surroundings better.\n"
@@ -5763,7 +6052,7 @@ msgid "The URL for the content repository"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "The deadzone of the joystick"
+msgid "The dead zone of the joystick"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5821,7 +6110,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"The rendering back-end for Irrlicht.\n"
+"The rendering back-end.\n"
"A restart is required after changing this.\n"
"Note: On Android, stick with OGLES1 if unsure! App may fail to start "
"otherwise.\n"
@@ -5832,7 +6121,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"The sensitivity of the joystick axes for moving the\n"
-"ingame view frustum around."
+"in-game view frustum around."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5926,6 +6215,10 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Tradeoffs for performance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -5995,7 +6288,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Use mip mapping to scale textures. May slightly increase performance,\n"
+"Use mipmapping to scale textures. May slightly increase performance,\n"
"especially when using a high resolution texture pack.\n"
"Gamma correct downscaling is not supported."
msgstr ""
@@ -6108,12 +6401,12 @@ msgid "Viewing range"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Virtual joystick triggers aux button"
+msgid "Virtual joystick triggers Aux1 button"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Volume"
-msgstr ""
+msgstr "Ένταση"
#: src/settings_translation_file.cpp
msgid ""
@@ -6179,6 +6472,10 @@ msgid "Waving plants"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Weblink color"
+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"
@@ -6199,23 +6496,15 @@ msgid ""
"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.\n"
+"memory. Powers of 2 are recommended. This setting is ONLY applied if\n"
+"bilinear/trilinear/anisotropic filtering is enabled.\n"
"This is also used as the base node texture size for world-aligned\n"
"texture autoscaling."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Whether FreeType fonts are used, requires FreeType support to be compiled "
-"in.\n"
-"If disabled, bitmap and XML vectors fonts are used instead."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Whether nametag backgrounds should be shown by default.\n"
+"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
@@ -6257,7 +6546,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Width component of the initial window size."
+msgid "Width component of the initial window size. Ignored in fullscreen mode."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6342,34 +6631,38 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when saving mapblocks to disk.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"ZLib compression level to use when sending mapblocks to the client.\n"
-"-1 - Zlib's default compression level\n"
-"0 - no compresson, fastest\n"
-"9 - best compression, slowest\n"
-"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
+msgid "cURL file download timeout"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "cURL file download timeout"
+msgid "cURL interactive timeout"
msgstr ""
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
msgstr ""
-#: src/settings_translation_file.cpp
-msgid "cURL timeout"
-msgstr ""
+#~ msgid "Address / Port"
+#~ msgstr "Διεύθυνση / Θήρα"
+
+#~ msgid "Credits"
+#~ msgstr "Μνείες"
+
+#~ msgid "Install: file: \"$1\""
+#~ msgstr "Εγκατάσταση: αρχείο: \"$1\""
+
+#~ msgid "Name / Password"
+#~ msgstr "Όνομα / Κωδικός"
#~ msgid "Ok"
#~ msgstr "Οκ"
+
+#~ msgid "Special key"
+#~ msgstr "Ειδικό πλήκτρο"
+
+#, fuzzy
+#~ msgid "You died."
+#~ msgstr "Πέθανες"
+
+#~ msgid "needs_fallback_font"
+#~ msgstr "needs_fallback_font"
diff --git a/po/eo/minetest.po b/po/eo/minetest.po
index 60e276136..cbb13b904 100644
--- a/po/eo/minetest.po
+++ b/po/eo/minetest.po